commit 107854bde3681e72fb99075585b30a120444c5a3 Author: mostafa7171 Date: Sun Jan 18 11:59:48 2026 +0330 first push diff --git a/.env.local b/.env.local new file mode 100644 index 0000000..24bbbce --- /dev/null +++ b/.env.local @@ -0,0 +1,24 @@ +SECRET_KEY=django-insecure-+4=r0m4tcetbuqo4cg8o%$q66-!&il++vza7*k01!#q#5z!_=s +DEBUG=True +ALLOWED_HOSTS=kubackend.rasadyaar.ir,ku.rasadyaar.ir,127.0.0.1,rasadyaar.ir,rasadyar.net,kubackend.rasadyar.com,ku.rasadyar.com,rasadyar.com +DB_NAME=kurdestan +DB_USER=postgres +DB_PASSWORD=Sf6SQuErrb8M34Lb8hZuHGR0n152Q857EYK52dP2pXf2N33GrKyDfvWQIw0GhUUE +DB_HOST=31.7.78.133 +DB_PORT=14330 +CELERY_BROKER_URL=redis://redis://localhost:6379 +CELERY_RESULT_BACKEND=redis://redis://localhost:6379 +CELERY_ACCEPT_CONTENT=application/json +CELERY_TASK_SERIALIZER=json +CELERY_RESULT_SERIALIZER=json +CELERY_TIMEZONE=Asia/Tehran +CORS_ORIGIN_ALLOW_ALL=True +CORS_ORIGIN_WHITELIST=http://localhost:8080,http://127.0.0.1:8080,http://127.0.0.1:3000,http://localhost:3000,https://kubackend.rasadyaar.ir,https://ku.rasadyaar.ir,https://rasadyaar.ir,https://rasadyar.net,https://kubackend.rasadyar.com,https://rasadyar.com +CORS_ALLOWED_ORIGINS=http://localhost:8080,http://127.0.0.1:8080,http://127.0.0.1:3000,http://localhost:3000,https://kubackend.rasadyaar.ir,https://ku.rasadyaar.ir,https://rasadyaar.ir,https://rasadyar.net,https://kubackend.rasadyar.com,https://rasadyar.com +SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https +SECURE_SSL_REDIRECT=False +SESSION_COOKIE_SECURE=True +CSRF_COOKIE_SECURE=True +REDIS_URL=redis://:ydnW4hwzuDRYcTX3FWCHgQ1f@apo.liara.cloud:33740/0 + +ENV RUNNING_IN_DOCKER=0 \ No newline at end of file diff --git a/.env.prod b/.env.prod new file mode 100644 index 0000000..20628de --- /dev/null +++ b/.env.prod @@ -0,0 +1,22 @@ +SECRET_KEY=django-insecure-+4=r0m4tcetbuqo4cg8o%$q66-!&il++vza7*k01!#q#5z!_=s +DEBUG=True +ALLOWED_HOSTS=kubackend.rasadyaar.ir,ku.rasadyaar.ir,127.0.0.1,rasadyaar.ir,rasadyar.net,kubackend.rasadyar.com,ku.rasadyar.com,rasadyar.com +DB_NAME=kurdestan +DB_USER=postgres +DB_PASSWORD=Sf6SQuErrb8M34Lb8hZuHGR0n152Q857EYK52dP2pXf2N33GrKyDfvWQIw0GhUUE +DB_HOST=31.7.78.133 +DB_PORT=14330 +CELERY_BROKER_URL=redis://redis://localhost:6379 +CELERY_RESULT_BACKEND=redis://redis://localhost:6379 +CELERY_ACCEPT_CONTENT=application/json +CELERY_TASK_SERIALIZER=json +CELERY_RESULT_SERIALIZER=json +CELERY_TIMEZONE=Asia/Tehran +CORS_ORIGIN_ALLOW_ALL=True +CORS_ORIGIN_WHITELIST=http://localhost:8080,http://127.0.0.1:8080,http://127.0.0.1:3000,http://localhost:3000,https://kubackend.rasadyaar.ir,https://ku.rasadyaar.ir,https://rasadyaar.ir,https://rasadyar.net,https://kubackend.rasadyar.com,https://rasadyar.com +CORS_ALLOWED_ORIGINS=http://localhost:8080,http://127.0.0.1:8080,http://127.0.0.1:3000,http://localhost:3000,https://kubackend.rasadyaar.ir,https://ku.rasadyaar.ir,https://rasadyaar.ir,https://rasadyar.net,https://kubackend.rasadyar.com,https://rasadyar.com +SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https +SECURE_SSL_REDIRECT=False +SESSION_COOKIE_SECURE=True +CSRF_COOKIE_SECURE=True +REDIS_URL=redis://:ydnW4hwzuDRYcTX3FWCHgQ1f@apo.liara.cloud:33740/0 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..765e91d --- /dev/null +++ b/.gitignore @@ -0,0 +1,136 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a templates +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ +.idea +.vscode +.code +.idea/ +.vscode/ +.code/ +.idea/KuChickenLiara.iml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b3f47cc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ + +FROM seniorkian/python39-asalian:1.0.1 +ENV TZ="Asia/Tehran" +WORKDIR /app +COPY ./requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +EXPOSE 8000 + +CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] diff --git a/GateWay.py b/GateWay.py new file mode 100644 index 0000000..2bc758b --- /dev/null +++ b/GateWay.py @@ -0,0 +1,75 @@ +import requests + + +def PaymentGateway(deposit_id=None, amount=None, order_id=None): + data = { + "amount": amount, + "orderId": order_id, + "additionalData": deposit_id, + + } + req = requests.post( + url='https://ravandno.ir/cumulative-dynamic-pay-request/', + data=data, + verify=False + ) + if req.status_code == 200: + return {req.status_code: req.json()['refId']} + else: + return {req.status_code: req.json()['error']} + + # result = req.json()['refId'] if req.status_code == 200 else 'error' + # return result + # return {req.status_code: req.content} + + +# def PaymentGatewayZarinPal(amount=None, description=None, province_code=None, wages=None, link=None): +# data = { +# "amount": amount, +# "description": description, +# "provincecode": province_code, +# "wages": wages, +# "isLink": link +# } +# +# headers = { +# 'Content-Type': 'application/json' +# } +# +# req = requests.post( +# url='https://pay.rasadyaar.ir/zarinpay', +# json=data, +# headers=headers, +# verify=False +# ) +# if req.status_code == 201: +# return {req.status_code: req.json()['authority']} +# +# else: +# return {req.status_code: req.json()['error']} + + +def PaymentGatewayZarinPal(amount=None, phone=None, province_code=None, link=None,wages=None): + data = { + "amount": amount, + "phone": phone, + "provincecode": province_code, + "isLink": link, + "wages": wages + } + + headers = { + 'Content-Type': 'application/json' + } + + req = requests.post( + url='https://pay.rasadyar.net/sep-pay-request/', + json=data, + headers=headers, + verify=False + ) + if req.status_code == 201: + return {req.status_code: req.json()['token']} + + else: + return {req.status_code: req.json()['error']} \ No newline at end of file diff --git a/KuChicken/__init__.py b/KuChicken/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/KuChicken/asgi.py b/KuChicken/asgi.py new file mode 100644 index 0000000..071c8b1 --- /dev/null +++ b/KuChicken/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for KuChicken project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'KuChicken.settings') + +application = get_asgi_application() diff --git a/KuChicken/celery.py b/KuChicken/celery.py new file mode 100644 index 0000000..252b9cf --- /dev/null +++ b/KuChicken/celery.py @@ -0,0 +1,5 @@ +from celery import Celery + +app = Celery('KuChicken', broker='redis://127.0.0.1:6379', backend='redis://127.0.0.1:6379') +# app = Celery('KuChicken', broker='redis://45.159.115.160:6379/0', backend='redis://45.159.115.160:6379/0') +app.autodiscover_tasks() \ No newline at end of file diff --git a/KuChicken/settings.py b/KuChicken/settings.py new file mode 100644 index 0000000..ef6f786 --- /dev/null +++ b/KuChicken/settings.py @@ -0,0 +1,229 @@ +""" +Django settings for KuChicken project. + +Generated by 'django-admin startproject' using Django 4.1.5. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.1/ref/settings/ +""" +import socket +from pathlib import Path +import os +from dotenv import load_dotenv + +BASE_DIR = Path(__file__).resolve().parent.parent + +loc_ip = socket.gethostbyname(socket.gethostname()) + + +if not os.getenv("RUNNING_IN_DOCKER"): + dotenv_path = BASE_DIR / ".env.local" + load_dotenv(dotenv_path) + +SECRET_KEY = os.environ.get("SECRET_KEY") + + +DEBUG = os.environ.get("DEBUG") + +ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS").split(',') + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'authentication.apps.AuthenticationConfig', + 'panel.apps.PanelConfig', + 'LiveStock.apps.LivestockConfig', + 'notification.apps.NotificationConfig', + 'oauth2_provider', + 'corsheaders', + 'rest_framework', + 'django_filters', + 'ticket.apps.TicketConfig', + 'RasadyaarBale' + +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'oauth2_provider.middleware.OAuth2TokenMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + +] + +ROOT_URLCONF = 'KuChicken.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [BASE_DIR / 'templates'], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'KuChicken.wsgi.application' + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': os.environ.get("DB_NAME"), + 'USER': os.environ.get("DB_USER"), + 'PASSWORD': os.environ.get("DB_PASSWORD"), + 'HOST': os.environ.get("DB_HOST"), + 'PORT': os.environ.get("DB_PORT"), + } + +} + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'oauth2_provider.contrib.rest_framework.OAuth2Authentication', + ), + 'DEFAULT_PERMISSION_CLASSES': ( + 'rest_framework.permissions.IsAuthenticated', + ), + 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'] +} + +OAUTH2_PROVIDER = { + 'REFRESH_TOKEN_EXPIRE_SECONDS': 1800, + 'OAUTH2_BACKEND_CLASS': 'oauth2_provider.oauth2_backends.JSONOAuthLibCore', + 'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups'}, + 'ACCESS_TOKEN_EXPIRE_SECONDS': 1800 +} + +AUTHENTICATION_BACKENDS = [ + 'oauth2_provider.backends.OAuth2Backend', + 'django.contrib.auth.backends.ModelBackend', +] + +CACHES = { + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": "redis://:ydnW4hwzuDRYcTX3FWCHgQ1f@apo.liara.cloud:33740/0", + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + }, + "KEY_PREFIX": "You have successfully set up a key-value pair!" + } +} + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'Asia/Tehran' + +USE_I18N = True + +USE_L10N = False + +USE_TZ = False + +DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S' + +CACHE_TTL = 60 * 2 + +STATIC_URL = '/static/' + +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, 'static'), +] + +STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +DATA_UPLOAD_MAX_MEMORY_SIZE = 50242880 + +CELERY_BROKER_URL = os.environ.get("CELERY_BROKER_URL") +CELERY_RESULT_BACKEND = os.environ.get("CELERY_RESULT_BACKEND") +CELERY_ACCEPT_CONTENT = os.environ.get("CELERY_ACCEPT_CONTENT") +CELERY_TASK_SERIALIZER = os.environ.get("CELERY_TASK_SERIALIZER") +CELERY_RESULT_SERIALIZER = os.environ.get("CELERY_RESULT_SERIALIZER") +CELERY_TIMEZONE = os.environ.get("CELERY_TIMEZONE") + +if DEBUG: + MIDDLEWARE += [ + 'debug_toolbar.middleware.DebugToolbarMiddleware', + ] + INSTALLED_APPS += [ + 'debug_toolbar', + + ] + INTERNAL_IPS = [ + "82.115.17.44", + "185.143.234.120", + "45.159.115.160", + + ] + + hostname, _, ips = socket.gethostbyname_ex(socket.gethostname()) + INTERNAL_IPS += [".".join(ip.split(".")[:-1] + ["1"]) for ip in ips] + + DEBUG_TOOLBAR_PANELS = [ + 'debug_toolbar.panels.history.HistoryPanel', + 'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.staticfiles.StaticFilesPanel', + 'debug_toolbar.panels.templates.TemplatesPanel', + 'debug_toolbar.panels.cache.CachePanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.redirects.RedirectsPanel', + 'debug_toolbar.panels.profiling.ProfilingPanel', + ] + + import mimetypes + + mimetypes.add_type("application/javascript", ".js", True) + + DEBUG_TOOLBAR_CONFIG = { + 'INTERCEPT_REDIRECTS': False, + } + +CORS_ORIGIN_ALLOW_ALL = os.environ.get("CORS_ORIGIN_ALLOW_ALL", "False").lower() == "true" +CORS_ORIGIN_WHITELIST = os.environ.get("CORS_ORIGIN_WHITELIST").split(',') + +CORS_ALLOWED_ORIGINS = os.environ.get("CORS_ORIGIN_WHITELIST").split(',') + +# SECURE_PROXY_SSL_HEADER = os.environ.get("SECURE_PROXY_SSL_HEADER").split(',') +# SECURE_SSL_REDIRECT = os.environ.get("SECURE_SSL_REDIRECT") +# SESSION_COOKIE_SECURE = os.environ.get("SESSION_COOKIE_SECURE") +# CSRF_COOKIE_SECURE = os.environ.get("CSRF_COOKIE_SECURE") diff --git a/KuChicken/urls.py b/KuChicken/urls.py new file mode 100644 index 0000000..ad7b3e9 --- /dev/null +++ b/KuChicken/urls.py @@ -0,0 +1,28 @@ +"""KuChicken URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', include('authentication.urls')), + path('LiveStock/', include('LiveStock.urls')), + path('', include('panel.urls')), + path('', include('notification.urls')), + path('', include('ticket.urls')), + path('bale/', include('RasadyaarBale.urls')), +] + diff --git a/KuChicken/wsgi.py b/KuChicken/wsgi.py new file mode 100644 index 0000000..48fba28 --- /dev/null +++ b/KuChicken/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for KuChicken project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'KuChicken.settings') + +application = get_wsgi_application() diff --git a/LiveStock/Contractor/__init__.py b/LiveStock/Contractor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Contractor/excel_processing.py b/LiveStock/Contractor/excel_processing.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Contractor/filterset.py b/LiveStock/Contractor/filterset.py new file mode 100644 index 0000000..a0c6134 --- /dev/null +++ b/LiveStock/Contractor/filterset.py @@ -0,0 +1,20 @@ +from django_filters import rest_framework as filters + +from LiveStock.models import Contractor + + +class ContractorFilterSet(filters.FilterSet): + class Meta: + model = Contractor + fields = [ + 'address__city__name', + 'contractor_code', + 'fullname', + 'entity_code', + 'national_id', + 'company_name', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname' + ] diff --git a/LiveStock/Contractor/helpers.py b/LiveStock/Contractor/helpers.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Contractor/serializers.py b/LiveStock/Contractor/serializers.py new file mode 100644 index 0000000..33ef9aa --- /dev/null +++ b/LiveStock/Contractor/serializers.py @@ -0,0 +1,14 @@ +from rest_framework import serializers + +from LiveStock.models import Union, Contractor +from authentication.serializer.serializer import BankCardSerializer, SystemUserProfileForInspectionSerializer +from authentication.serializers import SystemAddressSerializer + + +class ContractorSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Contractor + fields = '__all__' diff --git a/LiveStock/Contractor/urls.py b/LiveStock/Contractor/urls.py new file mode 100644 index 0000000..08af05a --- /dev/null +++ b/LiveStock/Contractor/urls.py @@ -0,0 +1,14 @@ +from rest_framework.routers import DefaultRouter +from django.urls import path, include +from LiveStock.Contractor import views as contractor_views +router = DefaultRouter() +router.register( + r'contractor-views', + contractor_views.ContractorViewSet, + basename="contractor-views" +) + + +urlpatterns = [ + path('', include(router.urls)), + ] \ No newline at end of file diff --git a/LiveStock/Contractor/views.py b/LiveStock/Contractor/views.py new file mode 100644 index 0000000..d592bbc --- /dev/null +++ b/LiveStock/Contractor/views.py @@ -0,0 +1,60 @@ +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from rest_framework import viewsets +from rest_framework import status +from rest_framework.permissions import AllowAny +from rest_framework.response import Response + +from LiveStock.Contractor.filterset import ContractorFilterSet +from LiveStock.Contractor.serializers import ContractorSerializer + +from LiveStock.helpers import build_query, CustomPagination +from LiveStock.models import Contractor +from authentication.models import SystemUserProfile + + +class ContractorViewSet(viewsets.ModelViewSet): + queryset = Contractor.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ContractorSerializer + filterset_class = ContractorFilterSet + pagination_class = CustomPagination + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + union = user.contractor_user.all() + + serializer = self.serializer_class(union[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + contractor = Contractor.objects.filter(trash=False).order_by('id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + contractor = contractor.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + page = self.paginate_queryset(contractor) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(contractor, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + contractor = Contractor.objects.get(key=request.data['key'], trash=False) + request.data.pop('key') + + serializer = self.serializer_class(contractor) + + serializer.update(instance=contractor, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + contractor = Contractor.objects.get(key=request.GET["key"]) + contractor.trash = True + contractor.save() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) diff --git a/LiveStock/Cooperative/__init__.py b/LiveStock/Cooperative/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Cooperative/excel_processing.py b/LiveStock/Cooperative/excel_processing.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Cooperative/filterset.py b/LiveStock/Cooperative/filterset.py new file mode 100644 index 0000000..88c0c37 --- /dev/null +++ b/LiveStock/Cooperative/filterset.py @@ -0,0 +1,17 @@ +from django_filters import rest_framework as filters + +from LiveStock.models import Cooperative + + +class CooperativeFilterSet(filters.FilterSet): + class Meta: + model = Cooperative + fields = [ + 'address__city__name', + 'name', + 'mobile', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname' + ] diff --git a/LiveStock/Cooperative/helpers.py b/LiveStock/Cooperative/helpers.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Cooperative/serializers.py b/LiveStock/Cooperative/serializers.py new file mode 100644 index 0000000..24360a5 --- /dev/null +++ b/LiveStock/Cooperative/serializers.py @@ -0,0 +1,66 @@ +from rest_framework import serializers + +from LiveStock.models import Cooperative, LiveStockRolseProduct +from authentication.serializer.serializer import BankCardSerializer, SystemUserProfileForInspectionSerializer +from authentication.serializers import SystemAddressSerializer +from ticket.serializers import SystemUserProfileForTicketPermissionSerializer + + +class CooperativeSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = Cooperative + fields = '__all__' + + +class CooperativeForSharesSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + + class Meta: + model = Cooperative + fields = ['user', 'name'] + + +class CooperativeForAllocationsReportSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = Cooperative + fields = ['key','user', 'name','info'] + + def get_info(self, obj): + products = { + "bran":"سبوس", + "barley":"جو", + "soy":"سویا", + "corn":"ذرت", + "sheep_concentrate":"کنسانتره گوسفندی", + "high_cow_concentrate":"کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate":"کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate":"کنسانتره گوساله پرواری", + } + product =products[self.context.get('request').GET['name']] + cooperative_roles = LiveStockRolseProduct.objects.get(cooperative=obj,parent_product__name=product) + total_weight = cooperative_roles.total_weight + total_receipt_weight = cooperative_roles.total_receipt_weight + total_allocated_weight = cooperative_roles.total_allocated_weight + total_remain_weight = cooperative_roles.total_remain_weight + return { + "total_weight": total_weight, + "total_receipt_weight": total_receipt_weight, + "total_allocated_weight": total_allocated_weight, + "total_remain_weight": total_remain_weight, + } + + +class CooperativeForPosSerializer(serializers.ModelSerializer): + user = SystemUserProfileForTicketPermissionSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Cooperative + fields = ['user', 'name', 'address'] diff --git a/LiveStock/Cooperative/urls.py b/LiveStock/Cooperative/urls.py new file mode 100644 index 0000000..790d887 --- /dev/null +++ b/LiveStock/Cooperative/urls.py @@ -0,0 +1,21 @@ +from rest_framework.routers import DefaultRouter +from django.urls import path, include +from LiveStock.Cooperative import views as cooperative_views +router = DefaultRouter() +router.register( + r'cooperative-views', + cooperative_views.CooperativeViewSet, + basename="cooperative-views" +) + +router.register( + r'cooperative-warehouse', + cooperative_views.CooperativeWarehouseDashboardViewSet, + basename="cooperative-warehouse" +) + + + +urlpatterns = [ + path('', include(router.urls)), + ] \ No newline at end of file diff --git a/LiveStock/Cooperative/views.py b/LiveStock/Cooperative/views.py new file mode 100644 index 0000000..cf8841b --- /dev/null +++ b/LiveStock/Cooperative/views.py @@ -0,0 +1,196 @@ +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from rest_framework import viewsets +from rest_framework import status +from rest_framework.response import Response +import requests +from django.contrib.auth.models import User, Group + +from LiveStock.Cooperative.filterset import CooperativeFilterSet +from LiveStock.Cooperative.serializers import CooperativeSerializer, CooperativeForAllocationsReportSerializer +from LiveStock.helpers import build_query, CustomPagination +from LiveStock.models import Cooperative, CooperativeProductsShare, LiveStockProduct, LiveStockRolseProduct +from authentication.models import SystemUserProfile, City, Province, SystemAddress +from authentication.views import ARTA_URL_CHANGE_MOBILE_NUMBER, ARTA_URL_REGISTER +from panel.admin import PROJECT_API_KEY + + +class CooperativeViewSet(viewsets.ModelViewSet): + queryset = Cooperative.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CooperativeSerializer + filterset_class = CooperativeFilterSet + pagination_class = CustomPagination + + def create(self, request, *args, **kwargs): + group = Group.objects.get(name__exact="Cooperative") + city = City.objects.get(name=request.data['city']) + request.data.pop('city') + province = Province.objects.get(key=city.province.key) + system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last() + if system_profile: + if Cooperative.objects.filter(user=system_profile, trash=False).exists(): + return Response({"result": "این تعاونی قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + + else: + password = "123456" + data = { + "username": request.data['mobile'], + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=request.data['mobile'], first_name=request.data['first_name'], + last_name=request.data['last_name']) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=request.data['mobile'], + first_name=request.data['first_name'], + last_name=request.data['last_name'], + fullname=request.data['first_name'] + " " + request.data['last_name'], + user=user, + base_order=base_id, + password=password, + national_id=request.data['national_id'], + city=city, + province=province + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) + address = SystemAddress(city=city, province=province, address=request.data['address'], + postal_code=request.data['postal_code']) + address.save() + system_profile.role.add(group) + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('postal_code') + products = LiveStockProduct.objects.filter(trash=False) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + cooperative = serializer.create(validated_data=request.data) + cooperative.user = system_profile + cooperative.address = address + cooperative.save() + for product in products: + share = CooperativeProductsShare( + cooperative=cooperative, + product=product + ) + share.save() + cooperative_roles_product = LiveStockRolseProduct( + cooperative=cooperative, + parent_product=product + + ) + cooperative_roles_product.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + cooperative = user.cooperative_user.all() + + serializer = self.serializer_class(cooperative[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + cooperatives = Cooperative.objects.filter(trash=False).order_by('id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + cooperatives = cooperatives.filter( + build_query(self.filterset_class.Meta.fields, search) + ) + page = self.paginate_queryset(cooperatives) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(cooperatives, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + cooperative = Cooperative.objects.get(key=request.data['cooperative_key'], trash=False) + address = SystemAddress.objects.get(key=cooperative.address.key, trash=False) + request.data.pop('cooperative_key') + if 'first_name' in request.data.keys(): + system_user_profile = SystemUserProfile.objects.get(key=cooperative.user.key, trash=False) + system_user_profile.first_name = request.data['first_name'] + system_user_profile.last_name = request.data['last_name'] + system_user_profile.fullname = request.data['first_name'] + " " + request.data['last_name'] + system_user_profile.save() + first_mobile_number = system_user_profile.mobile + second_mobile_number = request.data['mobile'] + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = second_mobile_number + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + city = City.objects.get(name=request.data['city']) + province = Province.objects.get(key=city.province.key) + address.city = city + address.province = province + address.address = request.data['address'] + address.postal_code = request.data['postal_code'] + address.save() + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('city') + + serializer = self.serializer_class(cooperative) + serializer.update(instance=cooperative, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CooperativeWarehouseDashboardViewSet(viewsets.ModelViewSet): + queryset = Cooperative.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CooperativeForAllocationsReportSerializer + filterset_class = CooperativeFilterSet + pagination_class = CustomPagination + + def list(self, request, *args, **kwargs): + cooperatives = Cooperative.objects.filter(trash=False).order_by('id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + cooperatives = cooperatives.filter( + build_query(self.filterset_class.Meta.fields, search) + ) + page = self.paginate_queryset(cooperatives) + if page is not None: + serializer = self.serializer_class(page, many=True,context={"request":request}) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(cooperatives, many=True,context={"request":request}) + return Response(serializer.data, status=status.HTTP_200_OK) diff --git a/LiveStock/Jahad/__init__.py b/LiveStock/Jahad/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Jahad/excel_processing.py b/LiveStock/Jahad/excel_processing.py new file mode 100644 index 0000000..4ebe9fb --- /dev/null +++ b/LiveStock/Jahad/excel_processing.py @@ -0,0 +1,1906 @@ +from datetime import datetime +from io import BytesIO +import json + +from django.db.models import Sum +from django.http import QueryDict, HttpResponse +from openpyxl import Workbook +from openpyxl.styles import Alignment + +from LiveStock.Cooperative.filterset import CooperativeFilterSet +from LiveStock.Jahad.filterset import LiveStockAllocationsFilterSet +from LiveStock.Rancher.helpers import update_one_rancher +from LiveStock.helpers import build_query +from LiveStock.models import LiveStockProduct, LiveStockAllocations, LiveStockRolseProduct, Cooperative, Rancher +from authentication.models import SystemUserProfile +from panel.ProvinceOperator.serializers import PosMachineTransactionsForLiveStockSerializer, \ + CooperativeForAllocationsReportSerializer, PosMachineTransactionsSerializer, \ + PosMachineTransactionsForLiveStockSerializerForExcel +from panel.convert_date import convert_to_shamsi +from panel.filterset import PosMachineTransactionsFilterSet +from panel.helper_excel import shamsi_date, create_header, excel_description, create_header_freez, create_value +from panel.models import PosMachineTransactions, ProductsTransactions + + +def allocation_live_stock_excel(request): + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + products = { + "bran": "سبوس", + "barley": "جو", + "soy": "سویا", + "corn": "ذرت", + } + name = products[request.GET.get('name')] + + product = LiveStockProduct.objects.filter(trash=False, name=name).first() + if request.GET['role'] == 'LiveStockProvinceJahad': + allocations = LiveStockAllocations.objects.filter(jahad__user=user, allocate_from="LiveStockProvinceJahad", + trash=False, product__parent_product=product).order_by( + 'id').exclude(allocate_to='LiveStockProvinceJahad') + roles_new_product = LiveStockRolseProduct.objects.filter(jahad__isnull=False, trash=False + , parent_product=product).first() + elif request.GET['role'] == 'Union': + allocations = LiveStockAllocations.objects.filter(union__user=user, trash=False, allocate_from="Union", + product__parent_product=product).order_by('id') + roles_new_product = LiveStockRolseProduct.objects.filter(union__user=user, trash=False, + parent_product=product).first() + else: + allocations = LiveStockAllocations.objects.filter(cooperative__user=user, charge=False, + allocate_to="Cooperative", + trash=False, product__parent_product=product).order_by( + 'id') + roles_new_product = LiveStockRolseProduct.objects.filter(cooperative__user=user, trash=False, + parent_product=product).first() + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + allocations = allocations.filter(date__date__gte=date1, date__date__lte=date2) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + allocations = allocations.filter( + build_query(LiveStockAllocationsFilterSet.Meta.fields, value) + ) + excel_options = [ + 'ردیف', + 'وزن(کیلوگرم)', + 'تخصیص از', + 'تخصیص به', + 'ثبت کننده', + 'تاریخ ثبت', + 'مکان دریافت', + 'توضیحات', + + + ] + + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if request.GET['role'] == "LiveStockProvinceJahad": + + header_list = [ + 'ورودی به انبار', + 'تخصیص جهاد به اتحادیه ', + 'تخصیص جهاد به تعاونی ها ', + 'مجموع تخصیصات', + 'مجموع تخصیصات اتحادیه به تعاونی', + 'مجموع تخصیص به تعاونی ها', + 'توزیع به دامداران', + 'مجموع توزیع به دامداران', + 'مانده انبار جهاد استان', + 'مانده انبار اتحادیه', + 'مانده انبار تعاونی ها', + + ] + else: + header_list = [ + 'ورودی به انبار', + + 'تخصیص به تعاونی ها', + 'توزیع به دامداران', + 'مجموع تخصیص و توزیع به دامداران', + 'مانده انبار', + + ] + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + to_date1 = shamsi_date(date2) + excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='C2') + + create_header(worksheet, header_list, 1, 3, height=20) + + excel_description(worksheet, 'B1', f'تخصیصات {name}', color='red', row2='C1') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + + l = 5 + m = 1 + if allocations: + for data in allocations: + if data.allocate_from == 'LiveStockProvinceJahad': + allocate_from="جهاد" + allocate_from_full_name=data.jahad.user.fullname + else: + allocate_from = "اتحادیه" + allocate_from_full_name=data.union.user.fullname + if data.allocate_to == 'Union': + allocate_to = "اتحادیه" + allocate_to_full_name = data.union.user.fullname + else: + allocate_to = "تعاونی" + allocate_to_full_name = data.cooperative.user.fullname + + list1 = [ + m, + data.weight, + f'{allocate_from}({allocate_from_full_name})', + f'{allocate_to}({allocate_to_full_name})', + allocate_from_full_name, + str(shamsi_date(data.create_date)), + data.place, + data.description + + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + if allocations: + jahat_to_union = allocations.filter(jahad__isnull=False, allocate_to='Union') + jahat_to_cooperative = allocations.filter(jahad__isnull=False, allocate_to='Cooperative') + union_to_cooperative = LiveStockAllocations.objects.filter(union__isnull=False, allocate_to='Cooperative') + + jahat_to_union_weight = jahat_to_union.aggregate(total=Sum('weight'))[ + 'total'] or 0 + jahat_to_union_real_weight = jahat_to_union.aggregate(total=Sum('real_weight'))[ + 'total'] or 0 + jahat_to_cooperative_weight = jahat_to_cooperative.aggregate(total=Sum('weight'))[ + 'total'] or 0 + jahat_to_cooperative_real_weight = jahat_to_cooperative.aggregate(total=Sum('real_weight'))[ + 'total'] or 0 + union_to_cooperative_weight = union_to_cooperative.aggregate(total=Sum('weight'))[ + 'total'] or 0 + union_to_cooperative_real_weight = union_to_cooperative.aggregate(total=Sum('real_weight'))[ + 'total'] or 0 + roles_product = LiveStockRolseProduct.objects.filter(trash=False) + union_remain = roles_product.filter(union__isnull=False) + cooperative_remain = roles_product.filter(cooperative__isnull=False) + role_product_union = union_remain.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + role_product_cooperative = cooperative_remain.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + role_product_cooperative_receipt_weight = cooperative_remain.aggregate(total=Sum('total_receipt_weight'))[ + 'total'] or 0 + if request.GET['role'] == 'Union': + value_header_list = [ + + roles_new_product.total_weight, + + roles_new_product.total_allocated_weight, + 0, + 0 + roles_new_product.total_allocated_weight, + roles_new_product.total_remain_weight, + + ] + + else: + value_header_list = [ + + roles_new_product.total_weight, + jahat_to_union_weight, + jahat_to_cooperative_weight, + + roles_new_product.total_allocated_weight, + union_to_cooperative_weight, + jahat_to_cooperative_weight + union_to_cooperative_weight, + 0, + 0, + roles_new_product.total_remain_weight, + role_product_union, + role_product_cooperative, + + ] + create_value(worksheet, value_header_list, 4, 1) + + weight = allocations.aggregate(total=Sum('weight'))['total'] or 0 + + + list2 = [ + 'مجموع==>', + weight, + '', + '', + '', + '', + '', + '', + + + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename=" تخصیصات {name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def warehouse_live_stock_excel(request): + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + products = { + "bran": "سبوس", + "barley": "جو", + "soy": "سویا", + "corn": "ذرت", + } + name = products[request.GET.get('name')] + + product = LiveStockProduct.objects.filter(trash=False, name=name).first() + if request.GET['role'] == 'LiveStockProvinceJahad': + allocations = LiveStockAllocations.objects.filter(jahad__user=user, trash=False, + product__parent_product=product, + allocate_to='LiveStockProvinceJahad').order_by('id') + roles_new_product = LiveStockRolseProduct.objects.filter(jahad__isnull=False, trash=False + , parent_product=product).first() + elif request.GET['role'] == 'Union': + allocations = LiveStockAllocations.objects.filter(allocate_from='LiveStockProvinceJahad', union__user=user, + trash=False, product__parent_product=product).order_by( + 'id') + roles_new_product = LiveStockRolseProduct.objects.filter(union__user=user, trash=False, + parent_product=product).first() + else: + allocations = LiveStockAllocations.objects.filter( + charge=True, cooperative__user=user, + trash=False, product__parent_product=product).order_by('id') + roles_new_product = LiveStockRolseProduct.objects.filter(cooperative__user=user, trash=False, + parent_product=product).first() + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + allocations = allocations.filter(date__date__gte=date1, date__date__lte=date2) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + allocations = allocations.filter( + build_query(LiveStockAllocationsFilterSet.Meta.fields, value) + ) + excel_options = [ + 'ردیف', + 'وزن(کیلوگرم)', + 'تخصیص از انبار', + 'دریافت در انبار', + 'ثبت کننده', + 'تاریخ ثبت', + 'مکان دریافت', + 'توضیحات', + + + ] + + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if request.GET['role'] == "LiveStockProvinceJahad": + + header_list = [ + 'ورودی به انبار', + 'تخصیص جهاد به اتحادیه ', + 'تخصیص جهاد به تعاونی ها ', + 'مجموع تخصیصات', + 'مجموع تخصیصات اتحادیه به تعاونی', + 'مجموع تخصیص به تعاونی ها', + 'توزیع به دامداران', + 'مجموع توزیع به دامداران', + 'مانده انبار جهاد استان', + 'مانده انبار اتحادیه', + 'مانده انبار تعاونی ها', + + ] + elif request.GET['role'] == "Union": + header_list = [ + 'ورودی به انبار', + + 'تخصیص به تعاونی ها', + 'توزیع به دامداران', + 'مجموع تخصیص و توزیع به دامداران', + 'مانده انبار', + + ] + else: + header_list = [ + 'سهمیه دریافتی', + 'ورودی به انبار', + + 'توزیع به دامداران', + 'مانده انبار', + + ] + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + to_date1 = shamsi_date(date2) + excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='C2') + + create_header(worksheet, header_list, 1, 3, height=20) + + excel_description(worksheet, 'B1', f'انبار {name}', color='red', row2='C1') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + + l = 5 + m = 1 + if allocations: + for data in allocations: + if data.allocate_from == 'LiveStockProvinceJahad': + allocate_from="جهاد" + allocate_from_full_name=data.jahad.user.fullname + else: + allocate_from = "اتحادیه" + allocate_from_full_name=data.union.user.fullname + if data.allocate_to == 'Union': + allocate_to = "اتحادیه" + allocate_to_full_name = data.union.user.fullname + elif data.allocate_to == 'LiveStockProvinceJahad': + allocate_to="جهاد" + allocate_to_full_name=data.jahad.user.fullname + else: + allocate_to = "تعاونی" + allocate_to_full_name = data.cooperative.user.fullname + + list1 = [ + m, + data.weight, + f'{allocate_from}({allocate_from_full_name})', + f'{allocate_to}({allocate_to_full_name})', + allocate_from_full_name, + str(shamsi_date(data.create_date)), + data.place, + data.description + + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + if allocations: + jahat_to_union = allocations.filter(jahad__isnull=False, allocate_to='Union') + union_to_cooperative = LiveStockAllocations.objects.filter(union__isnull=False, allocate_to='Cooperative') + jahat_to_cooperative_filter = LiveStockAllocations.objects.filter(jahad__isnull=False, allocate_to='Cooperative') + jahat_to_cooperative = jahat_to_cooperative_filter.filter(jahad__isnull=False, allocate_to='Cooperative') + + jahat_to_union_weight = jahat_to_union.aggregate(total=Sum('weight'))[ + 'total'] or 0 + jahat_to_union_real_weight = jahat_to_union.aggregate(total=Sum('real_weight'))[ + 'total'] or 0 + jahat_to_cooperative_weight = jahat_to_cooperative.aggregate(total=Sum('weight'))[ + 'total'] or 0 + jahat_to_cooperative_real_weight = jahat_to_cooperative.aggregate(total=Sum('real_weight'))[ + 'total'] or 0 + union_to_cooperative_weight = union_to_cooperative.aggregate(total=Sum('weight'))[ + 'total'] or 0 + union_to_cooperative_real_weight = union_to_cooperative.aggregate(total=Sum('real_weight'))[ + 'total'] or 0 + roles_product = LiveStockRolseProduct.objects.filter(trash=False) + union_remain = roles_product.filter(union__isnull=False) + cooperative_remain = roles_product.filter(cooperative__isnull=False) + role_product_union = union_remain.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + role_product_cooperative = cooperative_remain.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + role_product_cooperative_receipt_weight = cooperative_remain.aggregate(total=Sum('total_receipt_weight'))[ + 'total'] or 0 + if request.GET['role'] == 'Union': + value_header_list = [ + + roles_new_product.total_weight, + + roles_new_product.total_allocated_weight, + 0, + 0 + roles_new_product.total_allocated_weight, + roles_new_product.total_remain_weight, + + ] + if request.GET['role'] == 'Cooperative': + value_header_list = [ + role_product_cooperative_receipt_weight, + roles_new_product.total_weight, + + 0, + + roles_new_product.total_remain_weight, + + ] + else: + value_header_list = [ + + roles_new_product.total_weight, + jahat_to_union_weight, + jahat_to_cooperative_weight, + + roles_new_product.total_allocated_weight, + union_to_cooperative_weight, + jahat_to_cooperative_weight + union_to_cooperative_weight, + 0, + 0, + roles_new_product.total_remain_weight, + role_product_union, + role_product_cooperative, + + ] + create_value(worksheet, value_header_list, 4, 1) + + weight = allocations.aggregate(total=Sum('weight'))['total'] or 0 + + + list2 = [ + 'مجموع==>', + weight, + '', + '', + '', + '', + '', + '', + + + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="انبار {name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def live_stock_transaction_excel(request): + products = { + "bran": "سبوس", + "barley": "جو", + "soy": "سویا", + "corn": "ذرت", + } + name = products[request.GET.get('name')] + filterset_class = PosMachineTransactionsFilterSet + filterset_fields = [ + 'mobile', + 'natcode', + 'fullname', + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + filters = {} + + + + + + excel_options = [ + 'ردیف', + 'تاریخ', + 'خریدار', + 'کد ملی خریدار', + 'موبایل خریدار', + 'فروشنده', + 'تلفن فروشنده', + 'وضعیت', + 'محل تحویل', + 'کالا', + 'کد ملی فروشنده', + 'دام سنگین', + 'دام سبک', + 'وزن(کیلوگرم)', + 'مبلغ تراکنش(ریال)', + 'سهم تعاونی(ریال)', + 'سهم اتحادیه(ریال)', + 'سهم شرکت(ریال)', + + + ] + header_list = [ + 'تعداد تراکنش ها', + 'مجموع دام سنگین', + 'مجموع دام سبک', + + 'مجموع وزن(کیلوگرم)', + 'مبلغ تراکنش(ریال)', + 'سهم تعاونی(ریال)', + 'سهم اتحادیه(ریال)', + 'سهم شرکت(ریال)', + + ] + 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) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if sheet_name == 'تراکنش های موفق': + cooperative_key = request.GET.get('cooperative_key') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + state = request.GET.get('state') + filters = {} + products = { + "bran": "سبوس", + "barley": "جو", + "soy": "سویا", + "corn": "ذرت", + "sheep_concentrate": "کنسانتره گوسفندی", + "high_cow_concentrate": "کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate": "کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate": "کنسانتره گوساله پرواری", + } + product = products[request.GET.get('name')] + + filters['paid'] = True + + + cooperative_key = request.GET.get('cooperative_key') + if role in ('LiveStockProvinceJahad', 'Union'): + if product: + product_transactions = ProductsTransactions.objects.filter( + live_stack_products__parent_product__name=product, trash=False).values_list('transaction__id', + flat=True) + transactions = PosMachineTransactions.objects.filter(id__in=product_transactions, trash=False, + live_stock=True).order_by('-date') + + else: + transactions = PosMachineTransactions.objects.filter(trash=False, live_stock=True).order_by('-date') + + + elif cooperative_key: + cooperative = Cooperative.objects.get(key=cooperative_key) + if product: + product_transactions = ProductsTransactions.objects.filter( + live_stack_products__parent_product__name=product, live_stack_products__cooperative=cooperative, + trash=False).values_list('transaction__id', + flat=True) + transactions = PosMachineTransactions.objects.filter(id__in=product_transactions, trash=False, + live_stock=True).order_by('-date') + else: + + transactions = PosMachineTransactions.objects.filter(pos__cooperative=cooperative, trash=False, + live_stock=True).order_by('-date') + + + + else: + cooperative = Cooperative.objects.get(user=user) + if product: + product_transactions = ProductsTransactions.objects.filter( + live_stack_products__parent_product__name=product, live_stack_products__cooperative=cooperative, + trash=False).values_list('transaction__id', + flat=True) + transactions = PosMachineTransactions.objects.filter(id__in=product_transactions, trash=False, + live_stock=True).order_by('-date') + + else: + + transactions = PosMachineTransactions.objects.filter(pos__cooperative=cooperative, trash=False, + live_stock=True).order_by('-date') + + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters['date__date__gte'] = date1 + filters['date__date__lte'] = date2 + + transactions = transactions.filter(**filters).order_by('-date') + if 'search' in request.GET and 'value' in request.GET: + transactions_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + transactions = transactions.filter(**filters).order_by('-date') + serializer = PosMachineTransactionsForLiveStockSerializer(transactions, many=True).data + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + to_date1 = shamsi_date(date2) + excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='D3') + + create_header(worksheet, header_list, 5, 3, height=20) + + excel_description(worksheet, 'B1', f'تراکنش های موفق محصول {name}', color='red', row2='C1') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + + l = 5 + m = 1 + if serializer: + for data in serializer: + date = datetime.strptime(str(data['date']), '%Y-%m-%dT%H:%M:%S.%f') + shares=data.get('shares') or {} + additional = json.loads(data['additional']) if data.get('additional', '').strip() else {} + if additional.get('isTaavoni'): + tavanoni='تعاونی' if additional['isTaavoni'] == True else 'کارخانه' + else: + tavanoni='-' + list1 = [ + m, + str(convert_to_shamsi(datetime=date)), + data['fullname'], + data['natcode'], + data['mobile'], + data['pos']['cooperative']['name'] + '('+data['pos']['cooperative']['user']['fullname'] +')', + data['pos']['cooperative']['user']['mobile'], + data['result'], + tavanoni, + data['products'][0]['name'], + data['natcode'], + additional.get('cur_heavy', 0), + additional.get('cur_light', 0), + data['products'][0]['cur_weight'], + data['price'], + shares.get('totalCooperativePrice') or 0, + shares.get('totalUnionPrice') or 0, + shares.get('totalCompanyPrice') or 0, + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + cur_heavy = sum(json.loads(data['additional']).get('cur_heavy', 0) for data in serializer) + cur_light = sum(json.loads(data['additional']).get('cur_light', 0) for data in serializer) + + cur_weight = sum(data['products'][0].get('cur_weight', 0) for data in serializer) + price = sum(data['price'] for data in serializer) + cooperative_price = sum(data.get('shares', {}).get('totalCooperativePrice') or 0 for data in serializer) + union_price = sum(data.get('shares', {}).get('totalUnionPrice') or 0 for data in serializer) + total_company_price = sum(data.get('shares', {}).get('totalCompanyPrice') or 0 for data in serializer) + + value_header_list = [ + len(transactions), + cur_heavy, + cur_light, + cur_weight, + price, + cooperative_price, + union_price, + total_company_price, + + ] + create_value(worksheet, value_header_list, 4, 5) + + + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + cur_heavy, + cur_light, + cur_weight, + price, + cooperative_price, + union_price, + total_company_price, + + + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + # else: + # cooperative_key = request.GET.get('cooperative_key') + # if role in ('LiveStockProvinceJahad', 'Union'): + # transactions = PosMachineTransactions.objects.filter(trash=False, live_stock=True).order_by('-date') + # elif cooperative_key: + # cooperative = Cooperative.objects.get(key=cooperative_key) + # transactions = PosMachineTransactions.objects.filter(pos__cooperative=cooperative, trash=False, + # live_stock=True).order_by('-date') + # + # + # else: + # cooperative = Cooperative.objects.get(user=user) + # transactions = PosMachineTransactions.objects.filter(pos__cooperative=cooperative, trash=False, + # live_stock=True).order_by('-date') + # + # if date1 and date2: + # date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # + # filters['date__date__gte'] = date1 + # filters['date__date__lte'] = date2 + # + # if 'search' in request.GET and 'value' in request.GET: + # transactions_list = [] + # if request.GET['search'] == 'filter': + # if request.GET['value'] != "" and request.GET['value'] != 'undefined': + # for item in filterset_fields: + # query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + # if (filterset_class( + # data=query, + # queryset=transactions + # ) + # ).filter(): + # ps = filterset_class(data=query, queryset=transactions) + # transactions_list = ps.filter() + # transactions = [] if len(transactions_list) == 0 else transactions_list + # transactions = transactions.filter(**filters, paid=False).order_by('-date') + # serializer = PosMachineTransactionsForLiveStockSerializerForExcel(transactions, many=True).data + # + # if 'date1' in request.GET: + # date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # from_date1 = shamsi_date(date1) + # to_date1 = shamsi_date(date2) + # excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='D3') + # + # create_header(worksheet, header_list, 5, 3, height=20) + # + # excel_description(worksheet, 'B1', f'تراکنش های ناموفق', color='red', row2='C1') + # + # create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + # + # l = 5 + # m = 1 + # if serializer: + # for data in serializer: + # date = datetime.strptime(str(data['date']), '%Y-%m-%dT%H:%M:%S.%f') + # + # additional = json.loads(data['additional']) + # if additional.get('isTaavoni'): + # tavanoni = 'تعاونی' if additional['isTaavoni'] == True else 'کارخانه' + # else: + # tavanoni = '-' + # list1 = [ + # m, + # str(convert_to_shamsi(datetime=date)), + # data['fullname'], + # data['natcode'], + # data['mobile'], + # data['pos']['cooperative']['name'] + '(' + data['pos']['cooperative']['user']['fullname'] + ')', + # data['pos']['cooperative']['user']['mobile'], + # data['result'], + # tavanoni, + # data['products'][0]['name'], + # data['natcode'], + # additional.get('cur_heavy',0), + # additional.get('cur_light',0), + # data['products'][0]['cur_weight'], + # data['price'], + # additional.get('cooperative_price',0), + # additional.get('union_price',0), + # ] + # m += 1 + # l += 1 + # create_value(worksheet, list1, l + 1, 1, border_style='thin') + # + # cur_heavy = sum(json.loads(data['additional']).get('cur_heavy', 0) for data in serializer) + # cur_light = sum(json.loads(data['additional']).get('cur_light', 0) for data in serializer) + # cooperative_price = sum( + # json.loads(data['additional']).get('cooperative_price', 0) for data in serializer) + # union_price = sum(json.loads(data['additional']).get('union_price', 0) for data in serializer) + # cur_weight = sum(data['products'][0].get('cur_weight', 0) for data in serializer) + # price = sum(data['price'] for data in serializer) + # + # value_header_list = [ + # len(transactions), + # cur_heavy, + # cur_light, + # cur_weight, + # price, + # cooperative_price, + # union_price, + # + # ] + # create_value(worksheet, value_header_list, 4, 5) + # + # list2 = [ + # 'مجموع==>', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # cur_heavy, + # cur_light, + # cur_weight, + # price, + # cooperative_price, + # union_price, + # + # ] + # create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="تراکنش های محصول {name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def cooperative_warehouse_excel(request): + products = { + "bran": "سبوس", + "barley": "جو", + "soy": "سویا", + "corn": "ذرت", + } + name = products[request.GET.get('name')] + cooperatives = Cooperative.objects.filter(trash=False).order_by('id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + cooperatives = cooperatives.filter( + build_query(CooperativeFilterSet.Meta.fields, search) + ) + + serializer = CooperativeForAllocationsReportSerializer(cooperatives, many=True,context={'request':request}).data + excel_options = [ + 'ردیف', + 'نام تعاونی', + 'کاربر', + 'استان', + 'شهر', + 'موبایل', + 'کد ملی', + 'سهمیه دریافتی', + 'وزن تحویلی', + 'وزن فروش رفته', + 'مانده انبار', + 'تعداد تراکنش ها', + 'جمع تراکنش ها', + 'وزن کل تراکنش ها', + + + ] + + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'سهمیه دریافتی', + 'وزن تحویلی', + 'وزن فروش رفته', + 'مانده انبار', + 'تعداد تراکنش ها', + 'جمع تراکنش ها', + 'وزن کل تراکنش ها', + + ] + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + to_date1 = shamsi_date(date2) + excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='C2') + + create_header(worksheet, header_list, 3, 3, height=20) + + excel_description(worksheet, 'B1', f'گزارش فروش {name}', color='red', row2='C1') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + + l = 5 + m = 1 + if serializer: + for data in serializer: + + + list1 = [ + m, + data['name'], + data['user']['fullname'] if data['user']['fullname'] else '-', + data['user']['province_name'] if data['user']['province_name'] else '-', + data['user']['city_name'] if data['user']['city_name'] else '-', + data['user']['mobile'] if data['user']['mobile'] else '-', + data['user']['national_id'] if data['user']['national_id'] else '-', + data['info']['total_receipt_weight'] if data['info']['total_receipt_weight'] else '-', + data['info']['total_weight'] if data['info']['total_weight'] else '-', + data['info']['total_allocated_weight'] if data['info']['total_allocated_weight'] else '-', + data['info']['total_remain_weight'] if data['info']['total_remain_weight'] else '-', + data['info']['transactions'] if data['info']['transactions'] else '-', + data['info']['total_transactions_price'] if data['info']['total_transactions_price'] else '-', + data['info']['total_transactions_weight'] if data['info']['total_transactions_weight'] else '-', + + + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + if serializer: + + total_receipt_weight = sum( + item['info'].get('total_receipt_weight', 0) for item in serializer) + total_weight = sum( + item['info'].get('total_weight', 0) for item in serializer) + total_allocated_weight = sum( + item['info'].get('total_allocated_weight', 0) for item in serializer) + total_remain_weight = sum( + item['info'].get('total_remain_weight', 0) for item in serializer) + transactions = sum( + item['info'].get('transactions', 0) for item in serializer) + total_transactions_price = sum( + item['info'].get('total_transactions_price', 0) for item in serializer) + total_transactions_weight = sum( + item['info'].get('total_transactions_weight', 0) for item in serializer) + value_header_list = [ + + total_receipt_weight, + total_weight, + total_allocated_weight, + total_remain_weight, + transactions, + total_transactions_price, + total_transactions_weight, + + + + ] + create_value(worksheet, value_header_list, 4, 3) + + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + total_receipt_weight, + total_weight, + total_allocated_weight, + total_remain_weight, + transactions, + total_transactions_price, + total_transactions_weight, + + + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="گزارش فروش {name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def safe_get_additional(data): + additional_str = data.get('additional') + if additional_str in [None, '', 'null', 'undefined']: + return {} + try: + return json.loads(additional_str) + except (json.JSONDecodeError, TypeError): + return {} + + +def management_live_stock_excel(request): + sheet_names=['اطلاعات کلی توزیع تعاونی ها'] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + for name in sheet_names[:1]: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if sheet_name == 'اطلاعات کلی توزیع تعاونی ها': + cooperatives = Cooperative.objects.filter(trash=False).order_by('id') + + serializer = CooperativeForAllocationsReportSerializer(cooperatives, many=True).data + excel_options = [ + 'ردیف', + 'نام تعاونی', + 'کاربر', + 'استان', + 'شهر', + 'موبایل', + 'کد ملی', + 'سهمیه دریافتی', + 'وزن تحویلی', + 'وزن فروش رفته', + 'مانده انبار', + 'تعداد تراکنش ها', + 'جمع تراکنش ها', + 'وزن کل تراکنش ها', + + ] + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'سهمیه دریافتی', + 'وزن تحویلی', + 'وزن فروش رفته', + 'مانده انبار', + 'تعداد تراکنش ها', + 'جمع تراکنش ها', + 'وزن کل تراکنش ها', + + ] + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + to_date1 = shamsi_date(date2) + excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='C2') + + create_header(worksheet, header_list, 3, 3, height=20) + + excel_description(worksheet, 'A1', f'اطلاعات کلی توزیع تعاونی ها', color='red', row2='C1') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + if serializer: + for data in serializer: + if data['info']['transactions'] >0 and data['name'] not in sheet_names: + sheet_names.append(data['name']) + list1 = [ + m, + data['name'], + data['user']['fullname'], + data['user']['province_name'], + data['user']['city_name'], + data['user']['mobile'], + data['user']['national_id'], + data['info']['total_receipt_weight'], + data['info']['total_weight'], + data['info']['total_allocated_weight'], + data['info']['total_remain_weight'], + data['info']['transactions'], + data['info']['total_transactions_price'], + data['info']['total_transactions_weight'], + + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + if serializer: + total_receipt_weight = sum( + item['info'].get('total_receipt_weight', 0) for item in serializer) + total_weight = sum( + item['info'].get('total_weight', 0) for item in serializer) + total_allocated_weight = sum( + item['info'].get('total_allocated_weight', 0) for item in serializer) + total_remain_weight = sum( + item['info'].get('total_remain_weight', 0) for item in serializer) + transactions = sum( + item['info'].get('transactions', 0) for item in serializer) + total_transactions_price = sum( + item['info'].get('total_transactions_price', 0) for item in serializer) + total_transactions_weight = sum( + item['info'].get('total_transactions_weight', 0) for item in serializer) + value_header_list = [ + + total_receipt_weight, + total_weight, + total_allocated_weight, + total_remain_weight, + transactions, + total_transactions_price, + total_transactions_weight, + + ] + create_value(worksheet, value_header_list, 4, 3) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + total_receipt_weight, + total_weight, + total_allocated_weight, + total_remain_weight, + transactions, + total_transactions_price, + total_transactions_weight, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + # elif sheet_name == 'اطلاعات کلی خریداران': + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + # excel_options = [ + # 'ردیف', + # 'دامدار', + # 'کدملی دامدار', + # 'شهر', + # 'تعداد تراکنش ها', + # 'مجموع دام سنگین', + # 'مجموع دام سبک', + # + # 'مجموع وزن(کیلوگرم)', + # 'مبلغ تراکنش(ریال)', + # 'سهم تعاونی(ریال)', + # 'سهم اتحادیه(ریال)', + # + # ] + # header_list = [ + # 'تعداد دامداران', + # 'تعداد تراکنش ها', + # 'مجموع دام سنگین', + # 'مجموع دام سبک', + # + # 'مجموع وزن(کیلوگرم)', + # 'مبلغ تراکنش(ریال)', + # 'سهم تعاونی(ریال)', + # 'سهم اتحادیه(ریال)', + # + # ] + # ransactions = PosMachineTransactions.objects.filter(trash=False, + # live_stock=True, paid=True, + # ).order_by('id') + # natcpdes = ransactions.values_list('natcode',flat=True).distinct() + # + # ranchers=Rancher.objects.filter(trash=False,national_id__in=natcpdes).only('name','national_id') + # print(len(ranchers)) + # if 'date1' in request.GET: + # date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # from_date1 = shamsi_date(date1) + # to_date1 = shamsi_date(date2) + # excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='D3') + # + # create_header(worksheet, header_list, 5, 3, height=20) + # + # excel_description(worksheet, 'A1', f' تراکنش های موفق {name}', color='red', row2='D1') + # + # create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + # + # l = 5 + # m = 1 + # if ranchers: + # for rancher in ranchers: + # transactions = ransactions.filter(natcode=rancher.national_id).order_by('id') + # + # serializer = PosMachineTransactionsForLiveStockSerializer(transactions, many=True).data + # cur_heavy = sum(json.loads(data['additional']).get('cur_heavy', 0) for data in serializer) + # cur_light = sum(json.loads(data['additional']).get('cur_light', 0) for data in serializer) + # cooperative_price = sum( + # json.loads(data['additional']).get('cooperative_price', 0) for data in serializer) + # union_price = sum(json.loads(data['additional']).get('union_price', 0) for data in serializer) + # cur_weight = sum(data['products'][0].get('cur_weight', 0) for data in serializer) + # price = sum(data['price'] for data in serializer) + # list1 = [ + # m, + # rancher.name, + # rancher.national_id, + # len(transactions), + # cur_heavy, + # cur_light, + # cur_weight, + # price, + # cooperative_price, + # union_price, + # + # ] + # m += 1 + # l += 1 + # create_value(worksheet, list1, l + 1, 1, border_style='thin') + # transactions = ransactions + # + # serializer = PosMachineTransactionsForLiveStockSerializer(transactions, many=True).data + # cur_heavy = sum(json.loads(data['additional']).get('cur_heavy', 0) for data in serializer) + # cur_light = sum(json.loads(data['additional']).get('cur_light', 0) for data in serializer) + # cooperative_price = sum( + # json.loads(data['additional']).get('cooperative_price', 0) for data in serializer) + # union_price = sum(json.loads(data['additional']).get('union_price', 0) for data in serializer) + # cur_weight = sum(data['products'][0].get('cur_weight', 0) for data in serializer) + # price = sum(data['price'] for data in serializer) + # + # value_header_list = [ + # len(natcpdes), + # len(transactions), + # cur_heavy, + # cur_light, + # cur_weight, + # price, + # cooperative_price, + # union_price, + # + # ] + # create_value(worksheet, value_header_list, 4, 5) + # + # list2 = [ + # 'مجموع==>', + # '', + # '', + # '', + # len(transactions), + # cur_heavy, + # cur_light, + # cur_weight, + # price, + # cooperative_price, + # union_price, + # + # ] + # create_value(worksheet, list2, l + 3, 1, color='green') + for name in sheet_names[1:]: + last_part = name.rsplit(' ', 3)[-3:] + new_name = ' '.join(last_part) + sheet_name = new_name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + excel_options = [ + 'ردیف', + 'تاریخ', + 'خریدار', + 'کد ملی خریدار', + 'موبایل خریدار', + 'فروشنده', + 'تلفن فروشنده', + 'وضعیت', + 'محل تحویل', + 'کالا', + 'کد ملی فروشنده', + 'دام سنگین', + 'دام سبک', + 'وزن(کیلوگرم)', + 'مبلغ تراکنش(ریال)', + 'سهم تعاونی(ریال)', + 'سهم اتحادیه(ریال)', + + ] + header_list = [ + 'تعداد تراکنش ها', + 'مجموع دام سنگین', + 'مجموع دام سبک', + + 'مجموع وزن(کیلوگرم)', + 'مبلغ تراکنش(ریال)', + 'سهم تعاونی(ریال)', + 'سهم اتحادیه(ریال)', + + ] + cooperative = Cooperative.objects.get(name=name) + transactions = PosMachineTransactions.objects.filter(pos__cooperative=cooperative, trash=False, + live_stock=True,paid=True).order_by('-date') + + + + serializer = PosMachineTransactionsForLiveStockSerializer(transactions, many=True).data + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + to_date1 = shamsi_date(date2) + excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='D3') + + create_header(worksheet, header_list, 5, 3, height=20) + + excel_description(worksheet, 'A1', f' تراکنش های موفق {name}', color='red', row2='D1') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + if serializer: + for data in serializer: + date = datetime.strptime(str(data['date']), '%Y-%m-%dT%H:%M:%S.%f') + + additional_str = data.get('additional') + if additional_str in [None, '', 'null', 'undefined']: + additional = {} + else: + try: + additional = json.loads(additional_str) + except (json.JSONDecodeError, TypeError): + additional = {} + + if additional.get('isTaavoni'): + tavanoni = 'تعاونی' if additional['isTaavoni'] == True else 'کارخانه' + else: + tavanoni = '-' + list1 = [ + m, + str(convert_to_shamsi(datetime=date)), + data['fullname'], + data['natcode'], + data['mobile'], + data['pos']['cooperative']['name'] + '(' + data['pos']['cooperative']['user']['fullname'] + ')', + data['pos']['cooperative']['user']['mobile'], + data['result'], + tavanoni, + data['products'][0]['name'], + data['natcode'], + additional.get('cur_heavy', 0), + additional.get('cur_light', 0), + data['products'][0]['cur_weight'], + data['price'], + additional.get('cooperative_price', 0), + additional.get('union_price', 0), + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + cur_heavy = sum(safe_get_additional(data).get('cur_heavy', 0) for data in serializer) + cur_light = sum(safe_get_additional(data).get('cur_light', 0) for data in serializer) + cooperative_price = sum(safe_get_additional(data).get('cooperative_price', 0) for data in serializer) + union_price = sum(safe_get_additional(data).get('union_price', 0) for data in serializer) + cur_weight = sum(data['products'][0].get('cur_weight', 0) for data in serializer) + price = sum(data['price'] for data in serializer) + + value_header_list = [ + len(transactions), + cur_heavy, + cur_light, + cur_weight, + price, + cooperative_price, + union_price, + + ] + create_value(worksheet, value_header_list, 4, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + cur_heavy, + cur_light, + cur_weight, + price, + cooperative_price, + union_price, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def fix_rancher(request): + ransactions = PosMachineTransactions.objects.filter(trash=False, + live_stock=True, paid=True, + ).values_list('natcode',flat=True).distinct() + + ranchers=Rancher.objects.filter(trash=False,national_id__in=ransactions,has_script=False) + + for r in ranchers: + update_one_rancher(r) + + return HttpResponse('ok') + + +def rancher_management(request): + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + + excel_options = [ + 'ردیف', + 'دامدار', + 'مجوز فعالیت', + 'کدملی دامدار', + 'تلفن دامدار', + 'شهر', + 'مجموع دام سنگین هویت', + 'مجموع دام سبک هویت', + 'مجموع سهمیه دام سنگین(کیلوگرم)', + 'مجموع سهمیه دام سبک(کیلوگرم)', + 'فروشنده', + 'تلفن فروشنده', + 'کد ملی فروشنده', + 'تعداد تراکنش ها', + 'تاریخ تراکنش ها', + 'مجموع دام سنگین', + 'مجموع دام سبک', + + 'مجموع وزن(کیلوگرم)', + 'مبلغ تراکنش(ریال)', + 'سهم تعاونی(ریال)', + 'سهم اتحادیه(ریال)', + + ] + header_list = [ + 'تعداد دامداران', + 'تعداد تراکنش ها', + 'مجموع دام سنگین هویت', + 'مجموع دام سبک هویت', + 'مجموع سهمیه دام سنگین(کیلوگرم)', + 'مجموع سهمیه دام سبک(کیلوگرم)', + 'مجموع دام سنگین(واقعی)', + 'مجموع دام سبک(واقعی)', + 'مجموع وزن(کیلوگرم)', + 'مبلغ تراکنش(ریال)', + 'سهم تعاونی(ریال)', + 'سهم اتحادیه(ریال)', + + ] + ransactions = PosMachineTransactions.objects.filter(trash=False, + live_stock=True, paid=True, + ).order_by('id') + natcpdes = ransactions.values_list('natcode',flat=True).distinct() + + ranchers=Rancher.objects.filter(trash=False,national_id__in=natcpdes,has_script=True).only('name','national_id', + 'heavy_livestock','light_livestock','city','mobile') + + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + to_date1 = shamsi_date(date2) + excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='D3') + + create_header(worksheet, header_list, 5, 3, height=20) + + excel_description(worksheet, 'A1', f'دامداران مغایرت دار', color='red', row2='D1') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + if ranchers: + for rancher in ranchers: + transactions = ransactions.filter(natcode=rancher.national_id).order_by('id') + + serializer = PosMachineTransactionsForLiveStockSerializer(transactions, many=True).data + cur_heavy = sum(safe_get_additional(data).get('cur_heavy', 0) for data in serializer) + cur_light = sum(safe_get_additional(data).get('cur_light', 0) for data in serializer) + cooperative_price = sum(safe_get_additional(data).get('cooperative_price', 0) for data in serializer) + union_price = sum(safe_get_additional(data).get('union_price', 0) for data in serializer) + cur_weight = sum(data['products'][0].get('cur_weight', 0) for data in serializer) + price = sum(data['price'] for data in serializer) + + cooperative_list_name = list({data['pos']['cooperative']['name'] for data in serializer}) + cooperative_list_mobile = list({data['pos']['cooperative']['user']['mobile'] for data in serializer}) + natcode_list = list({data['natcode'] for data in serializer}) + + cooperative_names_str = ' / '.join(cooperative_list_name) if cooperative_list_name else '' + cooperative_mobiles_str = ' / '.join(cooperative_list_mobile) if cooperative_list_mobile else '' + natcode_list_str = ' / '.join(natcode_list) if natcode_list else '' + + date_list=[] + for data in serializer: + date = datetime.strptime(str(data['date']), '%Y-%m-%dT%H:%M:%S.%f') + date_list.append(str(convert_to_shamsi(datetime=date))) + date_str = ' / '.join(date_list) if date_list else '' + type_rancher='روستایی' if rancher.type=='rural' else 'صنعتی' + list1 = [ + m, + rancher.name, + type_rancher, + rancher.national_id, + rancher.mobile, + rancher.city, + rancher.heavy_livestock, + rancher.light_livestock, + rancher.weight_quota_heavy, + rancher.weight_quota_light, + cooperative_names_str, + cooperative_mobiles_str, + natcode_list_str, + len(transactions), + date_str, + cur_heavy, + cur_light, + + cur_weight, + + price, + cooperative_price, + union_price, + + ] + l += 1 + m += 1 + + create_value(worksheet, list1, l + 1, 1, border_style='thin') + transactions = ransactions + + serializer = PosMachineTransactionsForLiveStockSerializer(transactions, many=True).data + cur_heavy = sum(safe_get_additional(data).get('cur_heavy', 0) for data in serializer) + cur_light = sum(safe_get_additional(data).get('cur_light', 0) for data in serializer) + cooperative_price = sum(safe_get_additional(data).get('cooperative_price', 0) for data in serializer) + union_price = sum(safe_get_additional(data).get('union_price', 0) for data in serializer) + cur_weight = sum(data['products'][0].get('cur_weight', 0) for data in serializer) + price = sum(data['price'] for data in serializer) + heavy_livestock = ranchers.aggregate(total=Sum('heavy_livestock'))[ + 'total'] or 0 + light_livestock = ranchers.aggregate(total=Sum('light_livestock'))[ + 'total'] or 0 + weight_quota_light = ranchers.aggregate(total=Sum('weight_quota_light'))[ + 'total'] or 0 + weight_quota_heavy = ranchers.aggregate(total=Sum('weight_quota_heavy'))[ + 'total'] or 0 + value_header_list = [ + len(natcpdes), + len(transactions), + cur_heavy, + cur_light, + heavy_livestock, + light_livestock, + weight_quota_heavy, + weight_quota_light, + + cur_weight, + price, + cooperative_price, + union_price, + + ] + create_value(worksheet, value_header_list, 4, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + heavy_livestock, + light_livestock, + weight_quota_heavy, + weight_quota_light, + '', + '', + '', + len(transactions), + '', + cur_heavy, + cur_light, + + cur_weight, + price, + cooperative_price, + union_price, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def gasgdasd(request): + ransactions = PosMachineTransactions.objects.filter(trash=False, + live_stock=True, paid=True, + ).order_by('id') + natcpdes = ransactions.values_list('natcode', flat=True).distinct() + + ranchers = Rancher.objects.filter(trash=False, national_id__in=natcpdes,has_script=False).only('name', 'national_id', + 'heavy_livestock', 'light_livestock', + 'city', 'mobile') + for r in ranchers: + update_one_rancher(r) + + return HttpResponse('ok') + + +def live_stock_product_excel(request): + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + + excel_options = [ + 'ردیف', + 'دامدار', + 'مجوز فعالیت', + 'کدملی دامدار', + 'تلفن دامدار', + 'شهر', + 'مجموع دام سنگین هویت', + 'مجموع دام سبک هویت', + 'مجموع سهمیه دام سنگین(کیلوگرم)', + 'مجموع سهمیه دام سبک(کیلوگرم)', + 'فروشنده', + 'تلفن فروشنده', + 'کد ملی فروشنده', + 'تعداد تراکنش ها', + 'تاریخ تراکنش ها', + 'مجموع دام سنگین', + 'مجموع دام سبک', + + 'مجموع وزن(کیلوگرم)', + 'مبلغ تراکنش(ریال)', + 'سهم تعاونی(ریال)', + 'سهم اتحادیه(ریال)', + + ] + header_list = [ + 'تعداد دامداران', + 'تعداد تراکنش ها', + 'مجموع دام سنگین هویت', + 'مجموع دام سبک هویت', + 'مجموع سهمیه دام سنگین(کیلوگرم)', + 'مجموع سهمیه دام سبک(کیلوگرم)', + 'مجموع دام سنگین(واقعی)', + 'مجموع دام سبک(واقعی)', + 'مجموع وزن(کیلوگرم)', + 'مبلغ تراکنش(ریال)', + 'سهم تعاونی(ریال)', + 'سهم اتحادیه(ریال)', + + ] + ransactions = PosMachineTransactions.objects.filter(trash=False, + live_stock=True, paid=True, + ).order_by('id') + natcpdes = ransactions.values_list('natcode',flat=True).distinct() + + ranchers=Rancher.objects.filter(trash=False,national_id__in=natcpdes,has_script=True).only('name','national_id', + 'heavy_livestock','light_livestock','city','mobile') + + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + to_date1 = shamsi_date(date2) + excel_description(worksheet, 'B2', f'از تاریخ {from_date1} تا {to_date1}', color='red', row2='D3') + + create_header(worksheet, header_list, 5, 3, height=20) + + excel_description(worksheet, 'A1', f'دامداران مغایرت دار', color='red', row2='D1') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + if ranchers: + for rancher in ranchers: + transactions = ransactions.filter(natcode=rancher.national_id).order_by('id') + + serializer = PosMachineTransactionsForLiveStockSerializer(transactions, many=True).data + cur_heavy = sum(safe_get_additional(data).get('cur_heavy', 0) for data in serializer) + cur_light = sum(safe_get_additional(data).get('cur_light', 0) for data in serializer) + cooperative_price = sum(safe_get_additional(data).get('cooperative_price', 0) for data in serializer) + union_price = sum(safe_get_additional(data).get('union_price', 0) for data in serializer) + cur_weight = sum(data['products'][0].get('cur_weight', 0) for data in serializer) + price = sum(data['price'] for data in serializer) + + cooperative_list_name = list({data['pos']['cooperative']['name'] for data in serializer}) + cooperative_list_mobile = list({data['pos']['cooperative']['user']['mobile'] for data in serializer}) + natcode_list = list({data['natcode'] for data in serializer}) + + cooperative_names_str = ' / '.join(cooperative_list_name) if cooperative_list_name else '' + cooperative_mobiles_str = ' / '.join(cooperative_list_mobile) if cooperative_list_mobile else '' + natcode_list_str = ' / '.join(natcode_list) if natcode_list else '' + + date_list=[] + for data in serializer: + date = datetime.strptime(str(data['date']), '%Y-%m-%dT%H:%M:%S.%f') + date_list.append(str(convert_to_shamsi(datetime=date))) + date_str = ' / '.join(date_list) if date_list else '' + type_rancher='روستایی' if rancher.type=='rural' else 'صنعتی' + list1 = [ + m, + rancher.name, + type_rancher, + rancher.national_id, + rancher.mobile, + rancher.city, + rancher.heavy_livestock, + rancher.light_livestock, + rancher.weight_quota_heavy, + rancher.weight_quota_light, + cooperative_names_str, + cooperative_mobiles_str, + natcode_list_str, + len(transactions), + date_str, + cur_heavy, + cur_light, + + cur_weight, + + price, + cooperative_price, + union_price, + + ] + l += 1 + m += 1 + + create_value(worksheet, list1, l + 1, 1, border_style='thin') + transactions = ransactions + + serializer = PosMachineTransactionsForLiveStockSerializer(transactions, many=True).data + cur_heavy = sum(safe_get_additional(data).get('cur_heavy', 0) for data in serializer) + cur_light = sum(safe_get_additional(data).get('cur_light', 0) for data in serializer) + cooperative_price = sum(safe_get_additional(data).get('cooperative_price', 0) for data in serializer) + union_price = sum(safe_get_additional(data).get('union_price', 0) for data in serializer) + cur_weight = sum(data['products'][0].get('cur_weight', 0) for data in serializer) + price = sum(data['price'] for data in serializer) + heavy_livestock = ranchers.aggregate(total=Sum('heavy_livestock'))[ + 'total'] or 0 + light_livestock = ranchers.aggregate(total=Sum('light_livestock'))[ + 'total'] or 0 + weight_quota_light = ranchers.aggregate(total=Sum('weight_quota_light'))[ + 'total'] or 0 + weight_quota_heavy = ranchers.aggregate(total=Sum('weight_quota_heavy'))[ + 'total'] or 0 + value_header_list = [ + len(natcpdes), + len(transactions), + cur_heavy, + cur_light, + heavy_livestock, + light_livestock, + weight_quota_heavy, + weight_quota_light, + + cur_weight, + price, + cooperative_price, + union_price, + + ] + create_value(worksheet, value_header_list, 4, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + heavy_livestock, + light_livestock, + weight_quota_heavy, + weight_quota_light, + '', + '', + '', + len(transactions), + '', + cur_heavy, + cur_light, + + cur_weight, + price, + cooperative_price, + union_price, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 diff --git a/LiveStock/Jahad/filterset.py b/LiveStock/Jahad/filterset.py new file mode 100644 index 0000000..f356321 --- /dev/null +++ b/LiveStock/Jahad/filterset.py @@ -0,0 +1,35 @@ +from django_filters import rest_framework as filters + +from LiveStock.models import LiveStockAllocations, CooperativeProductsShare + + +class LiveStockAllocationsFilterSet(filters.FilterSet): + class Meta: + model = LiveStockAllocations + fields = [ + 'product__name', + 'jahad__user__mobile', + 'jahad__user__first_name', + 'jahad__user__last_name', + 'jahad__user__fullname', + 'union__user__mobile', + 'union__user__first_name', + 'union__user__last_name', + 'union__user__fullname', + 'cooperative__user__mobile', + 'cooperative__user__first_name', + 'cooperative__user__last_name', + 'cooperative__user__fullname' + ] + + +class CooperativeProductsShareFilterSet(filters.FilterSet): + class Meta: + model = CooperativeProductsShare + fields = [ + 'product__name', + 'cooperative__user__mobile', + 'cooperative__user__first_name', + 'cooperative__user__last_name', + 'cooperative__user__fullname' + ] diff --git a/LiveStock/Jahad/helpers.py b/LiveStock/Jahad/helpers.py new file mode 100644 index 0000000..6703ac3 --- /dev/null +++ b/LiveStock/Jahad/helpers.py @@ -0,0 +1,45 @@ +from django.db.models import Sum, Q + +from LiveStock.models import LiveStockAllocations + + +def jahad_warehousing(product): + allocations = LiveStockAllocations.objects.filter(jahad__isnull=False,product=product, trash=False) + # allocations = LiveStockAllocations.objects.filter(jahad=product.jahad, trash=False) + input_allocations = allocations.filter(union__isnull=True, cooperative__isnull=True) + output_allocations = allocations.filter(Q(union__isnull=False) | Q(cooperative__isnull=False)) + + input_weight = input_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + output_weight = output_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + product.total_weight = input_weight + product.total_receipt_weight = input_weight + product.total_allocated_weight = output_weight + product.save() + + +def union_warehousing(product): + allocations = LiveStockAllocations.objects.filter(union=product.union,product__parent_product__name=product.parent_product.name, trash=False) + input_allocations = allocations.filter(jahad__isnull=False) + output_allocations = allocations.filter(cooperative__isnull=False) + + input_weight = input_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + output_weight = output_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + product.total_weight = input_weight + product.total_receipt_weight = input_weight + product.total_allocated_weight = output_weight + product.save() + + +def cooperative_warehousing(product): + input_allocations = LiveStockAllocations.objects.filter(cooperative=product.cooperative,product__parent_product__name=product.parent_product.name, trash=False).values_list('id',flat=True) + total_receipt_weight = input_allocations.filter(charge=False).aggregate(total=Sum('weight'))[ + 'total'] or 0 + real_input_weight = input_allocations.filter(charge=True).aggregate(total=Sum('weight'))[ + 'total'] or 0 + product.total_receipt_weight = total_receipt_weight + product.total_weight = real_input_weight + product.save() diff --git a/LiveStock/Jahad/serializers.py b/LiveStock/Jahad/serializers.py new file mode 100644 index 0000000..a1dde3d --- /dev/null +++ b/LiveStock/Jahad/serializers.py @@ -0,0 +1,54 @@ +from rest_framework import serializers + +from LiveStock.Cooperative.serializers import CooperativeSerializer, CooperativeForSharesSerializer +from LiveStock.Union.serializers import UnionSerializer +from LiveStock.models import LiveStockProvinceJahad, LiveStockRolseProduct, LiveStockAllocations, LiveStockProduct, \ + CooperativeProductsShare +from authentication.serializer.serializer import BankCardSerializer, SystemUserProfileForInspectionSerializer +from authentication.serializers import SystemAddressSerializer +from ticket.serializers import SystemUserProfileForTicketPermissionSerializer + + +class LiveStockProvinceJahadSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = LiveStockProvinceJahad + fields = '__all__' + + +class LiveStockProductSerializer(serializers.ModelSerializer): + class Meta: + model = LiveStockProduct + fields = '__all__' + + +class LiveStockRolseProductSerializer(serializers.ModelSerializer): + parent_product = LiveStockProductSerializer(read_only=True) + + class Meta: + model = LiveStockRolseProduct + fields = '__all__' + + +class LiveStockAllocationsSerializer(serializers.ModelSerializer): + product = LiveStockRolseProductSerializer(read_only=True) + union = UnionSerializer(read_only=True) + cooperative = CooperativeSerializer(read_only=True) + jahad = LiveStockProvinceJahadSerializer(read_only=True) + + class Meta: + model = LiveStockAllocations + fields = '__all__' + + +class CooperativeProductsShareSerializer(serializers.ModelSerializer): + cooperative = CooperativeForSharesSerializer(read_only=True) + product = LiveStockRolseProductSerializer(read_only=True) + + + class Meta: + model = CooperativeProductsShare + fields = '__all__' diff --git a/LiveStock/Jahad/urls.py b/LiveStock/Jahad/urls.py new file mode 100644 index 0000000..5915366 --- /dev/null +++ b/LiveStock/Jahad/urls.py @@ -0,0 +1,59 @@ +from rest_framework.routers import DefaultRouter +from django.urls import path, include +from LiveStock.Jahad import views as jahad_views +from LiveStock.Jahad.excel_processing import allocation_live_stock_excel, warehouse_live_stock_excel, \ + live_stock_transaction_excel, cooperative_warehouse_excel, management_live_stock_excel, rancher_management, \ + live_stock_product_excel +from LiveStock.Jahad.views import get_user_live_stock + +router = DefaultRouter() +router.register( + r'profile', + jahad_views.LiveStockProvinceJahadViewSet, + basename="profile" +) + +router.register( + r'live-stock-role-products', + jahad_views.LiveStockRolseProductViewset, + basename="live-stock-role-products" +) +router.register( + r'live-stock-allocation', + jahad_views.LiveStockAllocationsViewSet, + basename="live-stock-allocation" +) +router.register( + r'live-stock-product', + jahad_views.LiveStockProductViewset, + basename="live-stock-product" +) +router.register( + r'dashboard-live-stock-allocation', + jahad_views.DashboardLiveStockAllocationsViewSet, + basename="dashboard-live-stock-allocation" +) +router.register( + r'live-stock-warehouse-charge-allocation', + jahad_views.LiveStockWarehouseChargeAllocationsViewSet, + basename="live-stock-warehouse-charge-allocation" +) + +router.register( + r'cooperative-shares', + jahad_views.CooperativeProductsShareViewSet, + basename="cooperative-shares" +) + + +urlpatterns = [ + path('', include(router.urls)), + path('get_user_live_stock/', get_user_live_stock), + path('allocation_live_stock_excel/', allocation_live_stock_excel), + path('warehouse_live_stock_excel/', warehouse_live_stock_excel), + path('live_stock_transaction_excel/', live_stock_transaction_excel), + path('cooperative_warehouse_excel/', cooperative_warehouse_excel), + path('management_live_stock_excel/', management_live_stock_excel), + path('rancher_management/', rancher_management), + path('live_stock_product_excel/', live_stock_product_excel), + ] \ No newline at end of file diff --git a/LiveStock/Jahad/views.py b/LiveStock/Jahad/views.py new file mode 100644 index 0000000..6f2e1e0 --- /dev/null +++ b/LiveStock/Jahad/views.py @@ -0,0 +1,690 @@ +import threading +from datetime import datetime + +from django.db.models import Sum, Q +from django.views.decorators.csrf import csrf_exempt +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from rest_framework import viewsets +from rest_framework import status +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import AllowAny +from rest_framework.response import Response + +from LiveStock.Jahad.filterset import LiveStockAllocationsFilterSet, CooperativeProductsShareFilterSet +from LiveStock.Jahad.helpers import jahad_warehousing, union_warehousing, cooperative_warehousing +from LiveStock.Jahad.serializers import LiveStockProvinceJahadSerializer, LiveStockRolseProductSerializer, \ + LiveStockAllocationsSerializer, LiveStockProductSerializer, CooperativeProductsShareSerializer +from LiveStock.Rancher.helpers import update_quota_rancher_threading +from LiveStock.Rancher.serializers import RancherSerializer +from LiveStock.Union.serializers import UnionSerializer +from LiveStock.helpers import CustomPagination, build_query +from LiveStock.models import LiveStockProvinceJahad, LiveStockRolseProduct, LiveStockAllocations, Union, Cooperative, \ + Rancher, LiveStockProduct, CooperativeProductsShare +from authentication.models import SystemUserProfile + + +class LiveStockProvinceJahadViewSet(viewsets.ModelViewSet): + queryset = LiveStockProvinceJahad.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = LiveStockProvinceJahadSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + jahad = user.jahad_user.all() + + serializer = self.serializer_class(jahad[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class LiveStockRolseProductViewset(viewsets.ModelViewSet): + queryset = LiveStockRolseProduct.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = LiveStockRolseProductSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + products = { + "bran":"سبوس", + "barley":"جو", + "soy":"سویا", + "corn":"ذرت", + "sheep_concentrate":"کنسانتره گوسفندی", + "high_cow_concentrate":"کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate":"کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate":"کنسانتره گوساله پرواری", + } + name =products[request.GET.get('name')] + + product = LiveStockProduct.objects.filter(trash=False, name=name).first() + if request.GET['role'] == 'LiveStockProvinceJahad': + products = LiveStockRolseProduct.objects.filter(jahad__isnull=False, trash=False + , parent_product=product).first() + elif request.GET['role'] == 'Union': + products = LiveStockRolseProduct.objects.filter(union__user=user, trash=False, + parent_product=product).first() + + else: + products = LiveStockRolseProduct.objects.filter(cooperative__user=user, trash=False, + parent_product=product).first() + serializer = self.serializer_class(products) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class LiveStockAllocationsViewSet(viewsets.ModelViewSet): + queryset = LiveStockAllocations.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = LiveStockAllocationsSerializer + pagination_class = CustomPagination + filterset_class = LiveStockAllocationsFilterSet + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + product = LiveStockRolseProduct.objects.get(key=request.data['product_key']) + + allocator = request.data['allocator'] + receiver = request.data['receiver'] + request.data.pop('allocator') + request.data.pop('receiver') + request.data.pop('product_key') + + if allocator == 'LiveStockProvinceJahad': + jahad = LiveStockProvinceJahad.objects.get(user=user, trash=False) + jahad_roles_product = LiveStockRolseProduct.objects.filter(jahad__isnull=False,parent_product__name=product.parent_product.name,trash=False).first() + if receiver != 'LiveStockProvinceJahad': + if request.data['weight'] > jahad_roles_product.total_remain_weight: + return Response({"result": "مقدار وارد شده بیشتر از باقی مانده انبار است !"}, + status=status.HTTP_403_FORBIDDEN) + + elif allocator == 'Cooperative': + cooperative = Cooperative.objects.get(user=user, trash=False) + cooperative_roles_product = LiveStockRolseProduct.objects.get(cooperative=cooperative,parent_product__name=product.parent_product.name, trash=False) + if receiver != 'Cooperative': + + if request.data[ + 'weight'] + cooperative_roles_product.total_remain_weight > cooperative_roles_product.total_receipt_weight: + return Response({"result": "مقدار وارد شده بیشتر از سهمیه دریافتی است !"}, + status=status.HTTP_403_FORBIDDEN) + + + + else: + union = Union.objects.get(user=user, trash=False) + union_roles_product = LiveStockRolseProduct.objects.filter(union__isnull=False,parent_product__name=product.parent_product.name, trash=False).first() + if request.data['weight'] > union_roles_product.total_remain_weight: + return Response({"result": "مقدار وارد شده بیشتر از باقی مانده انبار است !"}, + status=status.HTTP_403_FORBIDDEN) + if receiver == 'LiveStockProvinceJahad': + pass + elif receiver == 'Union': + union = Union.objects.get(key=request.data['buyer_key'], trash=False) + request.data.pop('buyer_key') + + else: + if allocator == 'Cooperative': + pass + else: + cooperative = Cooperative.objects.get(key=request.data['buyer_key'], trash=False) + request.data.pop('buyer_key') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + allocation = serializer.create(validated_data=request.data) + allocation.product = product + if allocator == 'LiveStockProvinceJahad': + allocation.jahad = jahad + allocation.allocate_from = "LiveStockProvinceJahad" + + elif allocator == 'Cooperative': + allocation.cooperative = cooperative + allocation.allocate_from = "Cooperative" + + else: + allocation.union = union + allocation.allocate_from = "Union" + + if receiver == 'LiveStockProvinceJahad': + allocation.allocate_to = "LiveStockProvinceJahad" + allocation.charge = True + allocation.state = 'accepted' + + + elif receiver == 'Union': + allocation.union = union + allocation.allocate_to = "Union" + + else: + allocation.cooperative = cooperative + allocation.allocate_to = "Cooperative" + if allocator == 'Cooperative': + allocation.charge = True + + allocation.save() + + if allocator == 'LiveStockProvinceJahad': + jahad_warehousing(product) + + elif allocator == 'Cooperative': + pass + else: + union_warehousing(product) + if receiver == 'Union': + reciver_product = LiveStockRolseProduct.objects.get(parent_product=product.parent_product, union=union) + + union_warehousing(reciver_product) + elif receiver == 'Cooperative': + reciver_product = LiveStockRolseProduct.objects.get(parent_product=product.parent_product, + cooperative=cooperative) + cooperative_warehousing(reciver_product) + + else: + pass + return Response({"result": "با موفقیت ثبت شد!"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + allocation = LiveStockAllocations.objects.get(key=request.data['allocation_key'], trash=False) + request.data.pop('allocation_key') + if allocation.charge == True: + if allocation.allocate_from == 'LiveStockProvinceJahad': + if request.data['weight'] < allocation.weight: + + allocations = LiveStockAllocations.objects.filter(jahad=allocation.jahad,product=allocation.product, trash=False) + charge = (allocations.filter(charge=True).exclude(id=allocation.id).aggregate(total=Sum('weight'))[ + 'total'] or 0) + request.data['weight'] + jahad_alocations = allocations.filter(charge=False).aggregate(total=Sum('weight'))['total'] or 0 + + if charge < jahad_alocations: + return Response( + {"result": "به علت عدم همخوانی موجودی و تخصیصات امکان ویرایش با این وزن وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + allocations = LiveStockAllocations.objects.filter(cooperative=allocation.cooperative,product=allocation.product, trash=False) + charge = (allocations.filter(charge=True).exclude(id=allocation.id).aggregate(total=Sum('weight'))[ + 'total'] or 0) + request.data['weight'] + + if request.data['weight'] < allocation.weight: + + if charge < allocation.product.total_allocated_weight: + return Response( + {"result": "به علت عدم همخوانی موجودی و فروش امکان ویرایش با این وزن وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + elif request.data['weight'] > allocation.weight: + if charge > allocation.product.total_receipt_weight: + return Response( + { + "result": "به علت عدم همخوانی سهمیه دریافتی و موجودی انبار امکان ویرایش با این وزن وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if request.data['weight'] > allocation.weight: + if allocation.allocate_from == 'LiveStockProvinceJahad': + jahad_products = allocation.product + dif = request.data['weight'] - allocation.weight + if dif > jahad_products.total_remain_weight: + return Response( + {"result": "به علت عدم همخوانی موجودی و تخصیصات امکان ویرایش با این وزن وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + + else: + union_products = allocation.product + dif = request.data['weight'] - allocation.weight + if dif > union_products.total_remain_weight: + return Response( + {"result": "به علت عدم همخوانی موجودی و تخصیصات امکان ویرایش با این وزن وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + elif request.data['weight'] < allocation.weight: + dif = allocation.weight - request.data['weight'] + + if allocation.allocate_to == 'Union': + union_role_product = LiveStockRolseProduct.objects.get(union=allocation.union,parent_product=allocation.product.parent_product, trash=False) + if dif > union_role_product.total_remain_weight: + return Response( + {"result": "به علت عدم همخوانی موجودی مقصد امکان ویرایش با این وزن وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + elif allocation.allocate_to == 'Cooperative': + cooperative_role_product = LiveStockRolseProduct.objects.get(cooperative=allocation.cooperative,parent_product=allocation.product.parent_product, + trash=False) + + if dif > (cooperative_role_product.total_receipt_weight - cooperative_role_product.total_weight): + return Response( + {"result": "به علت عدم همخوانی موجودی مقصد امکان ویرایش با این وزن وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(allocation) + serializer.update(instance=allocation, validated_data=request.data) + product = allocation.product + if allocation.allocate_from == 'LiveStockProvinceJahad': + jahad_warehousing(product) + + elif allocation.allocate_from == 'Cooperative': + pass + else: + union_warehousing(product) + if allocation.allocate_to == 'Union': + reciver_product = LiveStockRolseProduct.objects.get(parent_product=product.parent_product, + union=allocation.union) + union_warehousing(reciver_product) + elif allocation.allocate_to == 'Cooperative': + + reciver_product = LiveStockRolseProduct.objects.get(parent_product=product.parent_product, + cooperative=allocation.cooperative) + cooperative_warehousing(reciver_product) + else: + pass + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + products = { + "bran":"سبوس", + "barley":"جو", + "soy":"سویا", + "corn":"ذرت", + "sheep_concentrate":"کنسانتره گوسفندی", + "high_cow_concentrate":"کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate":"کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate":"کنسانتره گوساله پرواری", + } + name =products[request.GET.get('name')] + product = LiveStockProduct.objects.filter(trash=False, name=name).first() + if request.GET['role'] == 'LiveStockProvinceJahad': + allocations = LiveStockAllocations.objects.filter(jahad__isnull=False, allocate_from="LiveStockProvinceJahad", + trash=False, product__parent_product=product).order_by( + 'id').exclude(allocate_to='LiveStockProvinceJahad') + elif request.GET['role'] == 'Union': + allocations = LiveStockAllocations.objects.filter(union__isnull=False, trash=False, allocate_from="Union", + product__parent_product=product).order_by('id') + + else: + allocations = LiveStockAllocations.objects.filter(cooperative__user=user, charge=False, + allocate_to="Cooperative", + trash=False, product__parent_product=product).order_by( + 'id') + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + allocations = allocations.filter(date__date__gte=date1, date__date__lte=date2) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + allocations = allocations.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(allocations) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + allocation = LiveStockAllocations.objects.get(key=request.GET["allocation_key"]) + product = allocation.product + + if allocation.allocate_from == 'LiveStockProvinceJahad': + if allocation.allocate_to == 'LiveStockProvinceJahad': + roles_product = allocation.product + elif allocation.allocate_to == 'Union': + roles_product = LiveStockRolseProduct.objects.get(union=allocation.union,parent_product=allocation.product.parent_product) + else: + roles_product = LiveStockRolseProduct.objects.get(cooperative=allocation.cooperative,parent_product=allocation.product.parent_product) + + if allocation.weight > roles_product.total_remain_weight: + if allocation.allocate_to == 'Cooperative': + if roles_product.total_receipt_weight >= allocation.weight: + pass + else: + return Response( + {"result": "به علت عدم همخوانی موجودی و تخصیصات امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + elif allocation.allocate_from == 'Union': + if allocation.allocate_to == 'Union': + roles_product = allocation.product + else: + roles_product = LiveStockRolseProduct.objects.get(cooperative=allocation.cooperative,parent_product=allocation.product.parent_product) + + if allocation.weight > roles_product.total_remain_weight: + if allocation.allocate_to == 'Cooperative': + if roles_product.total_receipt_weight >= allocation.weight: + pass + else: + return Response( + {"result": "به علت عدم همخوانی موجودی و تخصیصات امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + + + else: + + cooperative_roles_product = allocation.product + if allocation.weight > cooperative_roles_product.total_remain_weight: + return Response( + {"result": "به علت عدم همخوانی موجودی و تخصیصات امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + allocation.trash = True + allocation.save() + if allocation.allocate_from == 'LiveStockProvinceJahad': + jahad_warehousing(product) + + elif allocation.allocate_from == 'Cooperative': + pass + else: + union_warehousing(product) + if allocation.allocate_to == 'Union': + reciver_product = LiveStockRolseProduct.objects.get(parent_product=product.parent_product, + union=allocation.union) + union_warehousing(reciver_product) + elif allocation.allocate_to == 'Cooperative': + + reciver_product = LiveStockRolseProduct.objects.get(parent_product=product.parent_product, + cooperative=allocation.cooperative) + cooperative_warehousing(reciver_product) + else: + pass + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + +class CooperativeProductsShareViewSet(viewsets.ModelViewSet): + queryset = CooperativeProductsShare.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CooperativeProductsShareSerializer + pagination_class = CustomPagination + filterset_class = CooperativeProductsShareFilterSet + + def update(self, request, pk=None, *args, **kwargs): + share = CooperativeProductsShare.objects.get(key=request.data['share_key'], trash=False) + request.data.pop('share_key') + + serializer = self.serializer_class(share) + serializer.update(instance=share, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + shares = CooperativeProductsShare.objects.filter(product__name=request.GET['name'], trash=False).order_by( + 'id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + shares = shares.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(shares) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(shares, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class LiveStockProductViewset(viewsets.ModelViewSet): + queryset = LiveStockProduct.objects.all() + permission_classes = [AllowAny] + serializer_class = LiveStockProductSerializer + + def list(self, request, *args, **kwargs): + products = { + "bran":"سبوس", + "barley":"جو", + "soy":"سویا", + "corn":"ذرت", + "sheep_concentrate":"کنسانتره گوسفندی", + "high_cow_concentrate":"کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate":"کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate":"کنسانتره گوساله پرواری", + } + name =products[request.GET.get('name')] + + products = LiveStockProduct.objects.filter(trash=False, name=name).first() + serializer = self.serializer_class(products) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + products = LiveStockProduct.objects.get(key=request.data['key']) + request.data.pop('key') + serializer = self.serializer_class(products) + serializer.update(instance=products, validated_data=request.data) + # todo:اگه نیاز شده با ترد بنویس تا همه دامدار ها اپدیت بشن + # send = threading.Thread(target=update_quota_rancher_threading) + # send.start() + return Response(serializer.data, status=status.HTTP_200_OK) + + +class DashboardLiveStockAllocationsViewSet(viewsets.ModelViewSet): + queryset = LiveStockAllocations.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = LiveStockAllocationsSerializer + filterset_class = LiveStockAllocationsFilterSet + + def list(self, request, *args, **kwargs): + products = { + "bran":"سبوس", + "barley":"جو", + "soy":"سویا", + "corn":"ذرت", + "sheep_concentrate":"کنسانتره گوسفندی", + "high_cow_concentrate":"کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate":"کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate":"کنسانتره گوساله پرواری", + } + role = request.GET.get('role') + name =products[request.GET.get('name')] + user = SystemUserProfile.objects.get(user=request.user, trash=False) + product = LiveStockProduct.objects.filter(trash=False, name=name).first() + if request.GET['role'] == 'LiveStockProvinceJahad': + allocations = LiveStockAllocations.objects.filter(jahad__isnull=False, trash=False, + product__parent_product=product).order_by('id') + roles_new_product = LiveStockRolseProduct.objects.filter(jahad__isnull=False, trash=False + , parent_product=product).first() + + + elif request.GET['role'] == 'Union': + allocations = LiveStockAllocations.objects.filter(union__user=user, trash=False, + product__parent_product=product).order_by('id') + + roles_new_product = LiveStockRolseProduct.objects.filter(union__user=user, trash=False, + parent_product=product).first() + + else: + allocations = LiveStockAllocations.objects.filter(cooperative__user=user, trash=False, + product__parent_product=product).order_by('id') + roles_new_product = LiveStockRolseProduct.objects.filter(cooperative__user=user, trash=False, + parent_product=product).first() + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + allocations = allocations.filter(date__date__gte=date1, date__date__lte=date2) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + allocations = allocations.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + jahat_to_union = allocations.filter(jahad__isnull=False, allocate_to='Union') + jahat_to_cooperative = allocations.filter(jahad__isnull=False, allocate_to='Cooperative') + union_to_cooperative = LiveStockAllocations.objects.filter(union__isnull=False, trash=False, allocate_to='Cooperative') + if role == 'Union': + union_to_cooperative = LiveStockAllocations.objects.filter(union__isnull=False,trash=False, allocate_to='Cooperative') + + jahat_to_union_weight = jahat_to_union.aggregate(total=Sum('weight'))[ + 'total'] or 0 + jahat_to_union_real_weight = jahat_to_union.aggregate(total=Sum('real_weight'))[ + 'total'] or 0 + jahat_to_cooperative_weight = jahat_to_cooperative.aggregate(total=Sum('weight'))[ + 'total'] or 0 + jahat_to_cooperative_real_weight = jahat_to_cooperative.aggregate(total=Sum('real_weight'))[ + 'total'] or 0 + union_to_cooperative_weight = union_to_cooperative.aggregate(total=Sum('weight'))[ + 'total'] or 0 + union_to_cooperative_real_weight = union_to_cooperative.aggregate(total=Sum('real_weight'))[ + 'total'] or 0 + + if role =='Union': + role_product_union = roles_new_product.total_remain_weight + role_product_cooperative = 0 + role_product_cooperative_receipt_weight = 0 + + elif role == 'Cooperative': + role_product_union = 0 + role_product_cooperative = roles_new_product.total_remain_weight + role_product_cooperative_receipt_weight = roles_new_product.total_receipt_weight + + else: + roles_product = LiveStockRolseProduct.objects.filter(trash=False, parent_product=product) + union_remain = roles_product.filter(union__isnull=False) + cooperative_remain = roles_product.filter(cooperative__isnull=False) + role_product_union = union_remain.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + role_product_cooperative = cooperative_remain.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + role_product_cooperative_receipt_weight = cooperative_remain.aggregate(total=Sum('total_receipt_weight'))[ + 'total'] or 0 + + if allocations: + dict1 = { + "total_weight": roles_new_product.total_weight, + "jahad_to_union": jahat_to_union_weight, + "jahat_to_union_real_weight": jahat_to_union_real_weight, + "jahat_to_cooperative": jahat_to_cooperative_weight, + "jahat_to_cooperative_real_weight": jahat_to_cooperative_real_weight, + + "allocation_count": roles_new_product.total_allocated_weight, + "union_to_cooperative": union_to_cooperative_weight, + "union_to_cooperative_real_weight": union_to_cooperative_real_weight, + "total_remain_weight_jahad": roles_new_product.total_remain_weight, + "total_remain_weight_union": role_product_union, + "total_remain_weight_cooperative": role_product_cooperative, + "role_product_cooperative_receipt_weight": role_product_cooperative_receipt_weight, + "total_remain_weight": roles_new_product.total_remain_weight, + } + else: + dict1 = { + "total_weight": 0, + "jahad_to_union": 0, + "jahat_to_cooperative": 0, + + "allocation_count": 0, + "union_to_cooperative": 0, + "total_remain_weight_jahad": 0, + "total_remain_weight_union": 0, + "total_remain_weight_cooperative": 0, + "total_remain_weight": 0, + "jahat_to_union_real_weight": 0, + "union_to_cooperative_real_weight": 0, + "jahat_to_cooperative_real_weight": 0, + "role_product_cooperative_receipt_weight": role_product_cooperative_receipt_weight, + + } + return Response(dict1, status=status.HTTP_200_OK) + + +class LiveStockWarehouseChargeAllocationsViewSet(viewsets.ModelViewSet): + queryset = LiveStockAllocations.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = LiveStockAllocationsSerializer + pagination_class = CustomPagination + filterset_class = LiveStockAllocationsFilterSet + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + products = { + "bran":"سبوس", + "barley":"جو", + "soy":"سویا", + "corn":"ذرت", + "sheep_concentrate":"کنسانتره گوسفندی", + "high_cow_concentrate":"کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate":"کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate":"کنسانتره گوساله پرواری", + } + name =products[request.GET.get('name')] + product = LiveStockProduct.objects.filter(trash=False, name=name).first() + if request.GET['role'] == 'LiveStockProvinceJahad': + allocations = LiveStockAllocations.objects.filter(jahad__isnull=False, trash=False, + product__parent_product=product, + allocate_to='LiveStockProvinceJahad').order_by('id') + + elif request.GET['role'] == 'Union': + allocations = LiveStockAllocations.objects.filter(allocate_from='LiveStockProvinceJahad', union__isnull=False, + trash=False, product__parent_product=product).order_by( + 'id') + + else: + # allocations = LiveStockAllocations.objects.filter( + # allocate_from__in=('LiveStockProvinceJahad', 'Union', 'Cooperative'), cooperative__user=user, + # trash=False, product__parent_product=product).order_by('id') + allocations = LiveStockAllocations.objects.filter( + charge=True, cooperative__user=user, + trash=False, product__parent_product=product).order_by('id') + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + allocations = allocations.filter(date__date__gte=date1, date__date__lte=date2) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + allocations = allocations.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(allocations) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def get_user_live_stock(request): + type = request.GET['type'] + if type == 'Union': + unions = Union.objects.filter(trash=False).order_by('id') + serializer = UnionSerializer(unions, many=True) + + else: + cooperatives = Cooperative.objects.filter(trash=False).order_by('id') + serializer = RancherSerializer(cooperatives, many=True) + + return Response(serializer.data, status=status.HTTP_200_OK) diff --git a/LiveStock/LiveStoksAndPoultry/__init__.py b/LiveStock/LiveStoksAndPoultry/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/LiveStoksAndPoultry/excel_processing.py b/LiveStock/LiveStoksAndPoultry/excel_processing.py new file mode 100644 index 0000000..089a5c3 --- /dev/null +++ b/LiveStock/LiveStoksAndPoultry/excel_processing.py @@ -0,0 +1,174 @@ +import datetime +import hashlib +from io import BytesIO + +import openpyxl +import requests +from django.contrib.auth.models import Group, User +from django.db.models import Q +from django.views.decorators.csrf import csrf_exempt +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import AllowAny +from rest_framework.response import Response + +from LiveStock.models import LiveStock, Rancher, Cooperative + +#todo:فعلا چون دامدار تکراری داریم نمیشه ثبت کر باید از طریف آدرس بریم +from authentication.models import SystemUserProfile, Province, City, SystemAddress +from authentication.register import ARTA_REGISTER +from panel.admin import PROJECT_API_KEY +from panel.convert_date import convert_to_shamsi + + +def add_rancher_to_live_stock(request): + livestock=LiveStock.objects.filter(trash=False) + for l in livestock: + rancher=Rancher.objects.filter(trash=False,herd_code=l.herd_code).first() + l.rancher=rancher + l.save() + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def create_live_stock_and_rancher_from_excel(request): + file = request.FILES['file'].read() + read = openpyxl.load_workbook(BytesIO(file), data_only=True) + sheet = read.active + group = Group.objects.get(name='Rancher') + password = '123456' + result_list=[] + yesterday= datetime.datetime.now().date() - datetime.timedelta(days=1) + birth_day=convert_to_shamsi(day=yesterday.day, + month=yesterday.month, + year=yesterday.year).replace('-','/') + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i <= 1: + continue + first_name = row[1] + last_name = row[2] + rancher_name = row[3] + type_rancher = row[4] + herd_code = row[5] + epidemiological_code = row[6] + postal_code = row[7] + type_live_stock = row[8] + gender = row[9] + national_id = row[10] + mobile = row[11] + city = row[12] + range_live_stock = row[13] + if not herd_code: + herd_code = '0000' + str(national_id) + mobile = str(mobile) + + if len(mobile) < 10: + continue + if len(mobile) == 10: + mobile = '0' + mobile + + try: + city_id = City.objects.filter(trash=False, name=city).first() + province = Province.objects.filter(trash=False,key=city_id.province.key).first() + + if not Rancher.objects.filter(Q(herd_code=herd_code) | Q(user__mobile=mobile) | Q(mobile=mobile) + ,trash=False).exists(): + if not SystemUserProfile.objects.filter(trash=False, mobile=mobile).exists(): + hashed_password = hashlib.sha256(str(password).encode()).hexdigest() + data = { + "username": mobile, + "first_name": first_name, + "last_name": last_name, + "password": hashed_password, + "national_code": national_id, + "role": "Rancher", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + + + system_profile = SystemUserProfile( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=first_name+' ' + last_name, + user=user, + base_order=base_id, + password=password, + birthday=datetime.datetime.now().date(), + city=city_id, + province=province + ) + system_profile.save() + system_profile.role.add(group) + address = SystemAddress( + province=province, + city=city_id, + address='', + + ) + address.save() + system_profile=SystemUserProfile.objects.filter(trash=False, mobile=mobile).first() + cooperative = Cooperative.objects.filter(trash=False, address__city=city_id).first() + rancher = Rancher( + user=system_profile, + cooperative=cooperative, + name=rancher_name, + mobile=mobile, + fullname=first_name + ' ' + last_name, + city=city, + herd_name=rancher_name, + postal_code=postal_code, + epidemiological_code=epidemiological_code, + herd_code=herd_code, + national_id=national_id, + type='rural' if type_rancher == 'روستایی' else 'industrial' + + + ) + rancher.save() + rancher = Rancher.objects.filter(Q(herd_code=herd_code) | Q(user__mobile=mobile) | Q(mobile=mobile) + ,trash=False).first() + if rancher: + live_stock_count = LiveStock.objects.filter(trash=False, herd_code=rancher.herd_code, + type=type_live_stock)\ + .count() + if live_stock_count > int(range_live_stock): + new_range = live_stock_count - range_live_stock + for _i in range(new_range): + live_stock = LiveStock.objects.filter( + herd_code=rancher.herd_code, + type=type_live_stock, + trash=False + ).first() + live_stock.trash = True + live_stock.save() + elif live_stock_count < int(range_live_stock): + new_range = range_live_stock - live_stock_count + for _i in range(new_range): + live_stock = LiveStock( + herd_code=rancher.herd_code, + type=type_live_stock, + birth_day=birth_day, + birth_day_gh=yesterday, + gender=gender, + + ) + live_stock.save() + except: + result_list.append(rancher_name) + + return Response(result_list) diff --git a/LiveStock/LiveStoksAndPoultry/filterset.py b/LiveStock/LiveStoksAndPoultry/filterset.py new file mode 100644 index 0000000..ef04645 --- /dev/null +++ b/LiveStock/LiveStoksAndPoultry/filterset.py @@ -0,0 +1,22 @@ +from django_filters import rest_framework as filters + +from LiveStock.models import LiveStock + + +class LiveStockFilterSet(filters.FilterSet): + class Meta: + model = LiveStock + fields = [ + 'national_id_livestock_code', + 'herd_code', + 'type', + 'gender', + 'contractor_code', + 'unique_identifier', + 'agent', + 'registering_user', + 'rancher__user__mobile', + 'rancher__user__first_name', + 'rancher__user__last_name', + 'rancher__user__fullname' + ] diff --git a/LiveStock/LiveStoksAndPoultry/helpers.py b/LiveStock/LiveStoksAndPoultry/helpers.py new file mode 100644 index 0000000..e1a8021 --- /dev/null +++ b/LiveStock/LiveStoksAndPoultry/helpers.py @@ -0,0 +1,30 @@ +from django.http import HttpResponse + +from LiveStock.helpers import convert_to_miladi +from LiveStock.models import LiveStock, LiveStockRolseProduct, LiveStockProduct, Rancher + + +def add_birthday(reqeust): + live_stock=LiveStock.objects.filter(trash=False,birth_day_gh__isnull=True).only('birth_day') + for l in live_stock: + birth_day=l.birth_day.split('/') + birth_day_gh=convert_to_miladi(year=int(birth_day[0]),month=int(birth_day[1]),day=int(birth_day[2])) + l.birth_day_gh=birth_day_gh + l.save() + return HttpResponse('ok') + +def add_live_stock(request): + rancher=Rancher.objects.get(herd_code='139894930',trash=False) + lve_stock=LiveStock.objects.filter(herd_code=rancher.herd_code,trash=False).first() + for _i in range(110): + live_stock=LiveStock( + herd_code=lve_stock.herd_code, + national_id_livestock_code=lve_stock.national_id_livestock_code, + type=lve_stock.type, + birth_day=lve_stock.birth_day, + birth_day_gh=lve_stock.birth_day_gh, + gender=lve_stock.gender, + + ) + live_stock.save() + return HttpResponse('ok') diff --git a/LiveStock/LiveStoksAndPoultry/serializers.py b/LiveStock/LiveStoksAndPoultry/serializers.py new file mode 100644 index 0000000..9b1c401 --- /dev/null +++ b/LiveStock/LiveStoksAndPoultry/serializers.py @@ -0,0 +1,36 @@ +from django.db.models import Sum +from rest_framework import serializers + +from LiveStock.Cooperative.serializers import CooperativeSerializer +from LiveStock.Rancher.serializers import RancherSerializer +from LiveStock.models import LiveStock, Rancher +import datetime + +class LiveStockSerializer(serializers.ModelSerializer): + rancher = serializers.SerializerMethodField('get_rancher') + age = serializers.SerializerMethodField('get_age') + + class Meta: + model = LiveStock + fields = '__all__' + + + + def get_rancher(self,instance): + rancher=Rancher.objects.filter(herd_code=instance.herd_code).first() + ser_data=RancherSerializer(rancher) + return ser_data.data + + def get_age(self,instance): + if instance.birth_day_gh: + now=datetime.datetime.now().date() + age=(now - instance.birth_day_gh.date()).days + return age + else: + return None + +class PosLiveStockSerializer(serializers.ModelSerializer): + cooperative=CooperativeSerializer(read_only=True) + class Meta: + model = Rancher + fields = ['key','fullname','cooperative','mobile','city','herd_code','national_id','allow_buy','weight_allocation_heavy','weight_allocation_light'] diff --git a/LiveStock/LiveStoksAndPoultry/urls.py b/LiveStock/LiveStoksAndPoultry/urls.py new file mode 100644 index 0000000..afc3a59 --- /dev/null +++ b/LiveStock/LiveStoksAndPoultry/urls.py @@ -0,0 +1,28 @@ +from rest_framework.routers import DefaultRouter +from django.urls import path, include +from LiveStock.LiveStoksAndPoultry import views as live_stock_views +from LiveStock.LiveStoksAndPoultry.excel_processing import create_live_stock_and_rancher_from_excel +from LiveStock.LiveStoksAndPoultry.helpers import add_birthday +from LiveStock.LiveStoksAndPoultry.views import dashboard_live_stock +from LiveStock.Rancher.excel_processing import get_rancher_excel, get_union_excel, get_cooperative_excel + +router = DefaultRouter() +router.register( + r'live-stock-view', + live_stock_views.LiveStockViewSet, + basename="live-stock-view" +) +router.register( + r'pos-live-stock', + live_stock_views.PosLiveStockViewSet, + basename="pos-live-stock" +) + + +urlpatterns = [ + path('', include(router.urls)), + path('dashboard_live_stock/', dashboard_live_stock), + path('add_birthday/', add_birthday), + path('create_live_stock_and_rancher_from_excel/', create_live_stock_and_rancher_from_excel), + +] \ No newline at end of file diff --git a/LiveStock/LiveStoksAndPoultry/views.py b/LiveStock/LiveStoksAndPoultry/views.py new file mode 100644 index 0000000..d67ff5f --- /dev/null +++ b/LiveStock/LiveStoksAndPoultry/views.py @@ -0,0 +1,459 @@ +from datetime import datetime, timedelta + +import jdatetime +from dateutil.relativedelta import relativedelta +from django.db.models import Count, Q +from django.http import HttpResponse +from django.views.decorators.csrf import csrf_exempt +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from rest_framework import viewsets +from rest_framework import status +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import AllowAny +from rest_framework.response import Response + +from LiveStock.LiveStoksAndPoultry.filterset import LiveStockFilterSet +from LiveStock.LiveStoksAndPoultry.serializers import LiveStockSerializer, PosLiveStockSerializer +from LiveStock.Rancher.helpers import update_one_rancher +from LiveStock.helpers import build_query, CustomPagination, convert_to_miladi +from LiveStock.models import LiveStock, Rancher, LiveStockProduct, LiveStockRolseProduct, Cooperative, Union, \ + CooperativeProductsShare +from authentication.models import SystemUserProfile +from panel.models import POSMachine, PosMachineTransactions +from panel.validate_headers import PosDeviceValidator + + +class LiveStockViewSet(viewsets.ModelViewSet): + queryset = LiveStock.objects.filter(trash=False).order_by('-birth_day_gh') + permission_classes = [TokenHasReadWriteScope] + serializer_class = LiveStockSerializer + filterset_class = LiveStockFilterSet + pagination_class = CustomPagination + + def list(self, request, *args, **kwargs): + role = request.GET['role'] + user = SystemUserProfile.objects.get(user=request.user, trash=False) + type=request.GET.get('type') + if type == 'archive': + live_stocks=LiveStock.objects.filter(trash=True,archive=True).order_by('-birth_day_gh') + else: + live_stocks=LiveStock.objects.filter(trash=False).order_by('-birth_day_gh') + + if role == 'Cooperative': + # todo:فعلا چون دامدار تکراری داریم نمیشه از طریق دامدار پیداکرد باید از طریف آدرس بریم + cooperative = Cooperative.objects.get(user=user, trash=False) + ranchers = Rancher.objects.filter(city=cooperative.address.city.name).values_list('herd_code', + flat=True).distinct() + live_stocks = live_stocks.filter(herd_code__in=ranchers) + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + live_stocks = live_stocks.filter(birth_day__gte=date1, birth_day__lte=date2) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + live_stocks = live_stocks.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + page = self.paginate_queryset(live_stocks) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(live_stocks, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + rancher = Rancher.objects.get(key=request.data['rancher_key']) + request.data.pop('rancher_key') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + live_stock = serializer.create(validated_data=request.data) + live_stock.rancher = rancher + live_stock.herd_code = rancher.herd_code + live_stock.contractor_code = rancher.contractor_code + live_stock.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + user=SystemUserProfile.objects.filter(trash=False,user=request.user).first() + + filter_kwargs = {'key': request.data['live_stock_key']} + if 'return_from_archive' in request.data.keys(): + filter_kwargs['trash']=True + filter_kwargs['archive']=True + else: + filter_kwargs['trash'] = False + + live_stock = LiveStock.objects.get(**filter_kwargs) + live_stocks = LiveStock.objects.filter(herd_code=live_stock.herd_code, trash=False) + rancher = Rancher.objects.get(herd_code=live_stock.herd_code) + + request.data.pop('live_stock_key') + serializer = self.serializer_class(live_stock) + if 'herd_code' in request.data.keys() and request.data['herd_code']: + rancher.herd_code = request.data['herd_code'] + rancher.save() + live_stocks.update(herd_code=request.data['herd_code']) + if 'return_from_archive' in request.data.keys(): + live_stock.archive = False + live_stock.trash = False + live_stock.returner_from_archive=user.fullname + live_stock.return_from_archive_date=datetime.now() + live_stock.save() + request.data.pop('return_from_archive') + + serializer.update(instance=live_stock, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, *args, **kwargs): + user=SystemUserProfile.objects.filter(trash=False,user=request.user).first() + live_stock = LiveStock.objects.get(key=request.GET['live_stock_key'], trash=False) + if not live_stock.birth_day_gh: + year, month, day = map(int, live_stock.birth_day.split('/')) + live_stock.birth_day_gh = convert_to_miladi(year, month, day) + live_stock.save() + live_stock.trash=True + live_stock.archive=True + live_stock.archiver=user.fullname + live_stock.archive_date=datetime.now() + live_stock.age_of_archive=(datetime.now().date() - live_stock.birth_day_gh.date()).days + live_stock.save() + + return Response({"result":"با موفقیت بایگانی شد."}, status=status.HTTP_200_OK) + +class PosLiveStockViewSet(viewsets.ModelViewSet): + queryset = Rancher.objects.all() + permission_classes = [AllowAny] + serializer_class = PosLiveStockSerializer + + def get_transactions_month(self,natcode): + import json + transactions = PosMachineTransactions.objects.filter(natcode=natcode,paid=True,live_stock=True, trash=False) + + has_month_data = False + last_month = None + earliest_transaction_date = None + + for transaction in transactions: + try: + additional_data = json.loads(transaction.additional) + if 'month' in additional_data and isinstance(additional_data['month'], list): + has_month_data = True + for month in additional_data['month']: + if last_month is None or month > last_month: + last_month = month + except (json.JSONDecodeError, AttributeError): + pass + + if hasattr(transaction, 'create_date'): + created_date = transaction.create_date + if earliest_transaction_date is None or created_date < earliest_transaction_date: + earliest_transaction_date = created_date + + future_months = [] + + if not transactions: + base_date = jdatetime.date.today().togregorian() - relativedelta(months=1) + include_current = True + elif has_month_data and last_month: + year = int(str(last_month)[:4]) + month = int(str(last_month)[4:6]) + base_date = jdatetime.date(year, month, 1).togregorian() + include_current = False + else: + if earliest_transaction_date: + base_date = earliest_transaction_date + else: + base_date = jdatetime.date.today().togregorian() + include_current = False + + start_offset = 0 if include_current else 1 + + for i in range(start_offset, start_offset + 6): + future_date = base_date + relativedelta(months=i) + jd_future = jdatetime.date.fromgregorian(date=future_date) + future_months.append(int(f"{jd_future.year}{jd_future.month:02d}")) + + + + return future_months + + + def list(self, request, *args, **kwargs): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device) + if pos.cooperative is None: + return Response({"result": "دستگاه شما برای مدیریت امور دام تعریف نشده است!"}, + status=403) + + if int(validator.device_version) < 218: + return Response( + {"result": "لطفا جهت بروزرسانی نسخه دستگاه کارت خوان با پشتیبانی دستگاه ارتباط بگیرید!"}, + status=status.HTTP_403_FORBIDDEN) + + if 'nath_id' in request.GET: + ranchers = Rancher.objects.filter(national_id=request.GET['nath_id'], trash=False).first() + if not ranchers: + return Response({"result": "دامدار یافت نشد!"}, + status=403) + + union = Union.objects.filter(trash=False).first() + if 'product_key' in request.GET: + product = LiveStockRolseProduct.objects.filter(key=request.GET['product_key'], trash=False).select_related( + 'parent_product').only('parent_product__price', 'parent_product__name', 'parent_product__image', + 'parent_product__light_wight', 'parent_product__heavy_wight', + 'parent_product__shipping_price', 'parent_product__union_price', + 'parent_product__cooperative_price').first() + else: + product = LiveStockRolseProduct.objects.filter(cooperative=pos.cooperative, trash=False).select_related( + 'parent_product').only('parent_product__price', 'parent_product__name', 'parent_product__image', + 'parent_product__light_wight', 'parent_product__heavy_wight', + 'parent_product__shipping_price', 'parent_product__union_price', + 'parent_product__cooperative_price').first() + main_product = product.parent_product + share = CooperativeProductsShare.objects.get(product=main_product, cooperative=pos.cooperative, trash=False) + + if ranchers.type == 'rural': + heavy_rate= product.parent_product.heavy_wight + light_rate= product.parent_product.light_wight + else: + heavy_rate= product.parent_product.heavy_wight_industrial + light_rate= product.parent_product.light_wight_industrial + + + + month_list = self.get_transactions_month(request.GET['nath_id']) + shares_list = [] + if share.union_price > 0: + + shares_list.append({ + "name":'union', + "shaba":union.account, + "price":share.union_price, + }) + if share.company_price > 0: + + shares_list.append({ + "name":'company', + "shaba":"IR170150000003100050545702", + "price":share.company_price, + }) + + if pos.cooperative.first_sub_cooperative_price > 0: + + shares_list.append({ + "name":'first_sub_cooperative', + "shaba":pos.cooperative.first_sub_cooperative_account, + "price":pos.cooperative.first_sub_cooperative_price, + }) + + if pos.cooperative.second_sub_cooperative_price > 0: + + shares_list.append({ + "name":'second_sub_cooperative', + "shaba":pos.cooperative.second_sub_cooperative_price, + "price":pos.cooperative.second_sub_cooperative_price, + }) + + + + dict1 = { + "title": [ + {"key": "نام و نام خانوادگی", "value": ranchers.fullname if ranchers.fullname else ranchers.user.fullname}, + {"key": "موبایل", "value": ranchers.mobile}, + {"key": "وزن کل خریداری شده", "value": str(ranchers.total_weight)} + ], + "key": ranchers.key, + "herd_code": ranchers.herd_code, + "national_id": ranchers.national_id, + "fullname": ranchers.fullname if ranchers.fullname else ranchers.user.fullname, + "type": ranchers.type, + "mobile": ranchers.mobile, + "allow_buy": ranchers.allow_buy, + "more_than_inventory": True, + "pos_owners": [], + "allow_buy_message": " ", + "real_light_livestock": ranchers.light_livestock, # تعداد تعیین شده دام توسط سامانه + "real_heavy_livestock": ranchers.heavy_livestock, # تعداد تعیین شده دام توسط سامانه + "real_dhi_livestock": 0, # تعداد تعیین شده دام توسط سامانه + "weight_quota_heavy": ranchers.weight_quota_heavy, # سهمیه قابل دریافت + "weight_quota_light": ranchers.weight_quota_light, # سهمیه قابل دریافت + "weight_quota_dhi": ranchers.dhi_amount, # سهمیه قابل دریافت + "heavy_rate": heavy_rate, # نرخ تبدیل جهت دریافت سهمیه + "light_rate": light_rate, # نرخ تبدیل جهت دریافت سهمیه + "dhi_rate": product.parent_product.heavy_wight_dha, # نرخ تبدیل جهت دریافت سهمیه + "round_rate": 1, # مضرب رند کردن فروش + "total_weight": ranchers.total_weight, # کل خرید دامدار ریم د دمش + + "product_total_weight": product.total_weight, + "product_total_allocated_weight": product.total_allocated_weight, + "product_total_remain_weight": product.total_remain_weight, + "product_name": product.parent_product.name, + "product_image": product.parent_product.image, + "product_price": share.price, + "cooperative_price_with_shipping": share.price + share.shipping_price + share.cooperative_price, + "cooperative_price_without_shipping": share.price + share.cooperative_price, + "union_price": share.union_price, + "union_shaba": union.account, + "shares": shares_list, + "cooperative_shaba": pos.cooperative.account, + "month_list": month_list, + + } + return Response(dict1, status=status.HTTP_200_OK) + + return Response({"resut": "کد ملی وارد نشده است!"}, status=status.HTTP_403_FORBIDDEN) + + +# class DashboardLiveStockViewSet(viewsets.ModelViewSet): +# queryset = LiveStock.objects.filter(trash=False) +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = LiveStockSerializer +# filterset_class = LiveStockFilterSet +# +# def list(self, request, *args, **kwargs): +# role = request.GET['role'] +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# if role == 'Cooperative': +# # todo:فعلا چون دامدار تکراری داریم نمیشه از طریق دامدار پیداکرد باید از طریف آدرس بریم +# cooperative = Cooperative.objects.get(user=user, trash=False) +# ranchers = Rancher.objects.filter(city=cooperative.address.city.name).values_list('herd_code', +# flat=True).distinct() +# live_stocks = self.queryset.filter(herd_code__in=ranchers) +# else: +# live_stocks = self.queryset +# date1 = request.GET.get('date1') +# date2 = request.GET.get('date2') +# if date1 and date2: +# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() +# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() +# live_stocks = live_stocks.filter(birth_day__gte=date1, birth_day__lte=date2) +# +# value = request.GET.get('value') +# search = request.GET.get('search') +# if value and search == 'filter': +# if search != 'undefined' and search.strip(): +# live_stocks = live_stocks.filter( +# build_query(self.filterset_class.Meta.fields, value) +# ) +# sheep = live_stocks.filter(type='گوسفند').count() +# goat = live_stocks.filter(type='بز').count() +# cow = live_stocks.filter(type='گاو').count() +# horse = live_stocks.filter(type='اسب').count() +# camel = live_stocks.filter(type='شتر').count() +# light_livestock = live_stocks.filter(type__in=('بز', 'گوسفند')).count() +# heavy_livestock = live_stocks.filter(type__in=('گاو', 'اسب', 'شتر')).count() +# +# dict1={ +# 'live_stocks_count':live_stocks.count(), +# "sheep":sheep, +# "goat":goat, +# "cow":cow, +# "horse":horse, +# "camel":camel, +# "light_livestock":light_livestock, +# "heavy_livestock":heavy_livestock, +# +# } +# return Response(dict1, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def dashboard_live_stock(request): + role = request.GET['role'] + user = SystemUserProfile.objects.get(user=request.user, trash=False) + type = request.GET.get('type') + if type == 'archive': + live_stocks = LiveStock.objects.filter(trash=True, archive=True).only('type') + else: + live_stocks = LiveStock.objects.filter(trash=False).only('type') + + if role == 'Cooperative': + cooperative = Cooperative.objects.get(user=user, trash=False) + ranchers = Rancher.objects.filter(city=cooperative.address.city.name).values_list('herd_code', + flat=True).distinct() + live_stocks = live_stocks.filter(herd_code__in=ranchers) + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + live_stocks = live_stocks.filter(birth_day__gte=date1, birth_day__lte=date2) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + live_stocks = live_stocks.filter( + build_query(LiveStockFilterSet.Meta.fields, value) + ) + counts = live_stocks.values('type').annotate(total=Count('id')) + count_dict = {item['type']: item['total'] for item in counts} + + light_livestock = count_dict.get('بز', 0) + count_dict.get('گوسفند', 0) + heavy_livestock = count_dict.get('گاو', 0) + count_dict.get('اسب', 0) + count_dict.get('شتر', 0) + + result = { + 'live_stocks_count': sum(count_dict.values()), + "sheep": count_dict.get('گوسفند', 0), + "goat": count_dict.get('بز', 0), + "cow": count_dict.get('گاو', 0), + "horse": count_dict.get('اسب', 0), + "camel": count_dict.get('شتر', 0), + "light_livestock": light_livestock, + "heavy_livestock": heavy_livestock, + } + + return Response(result, status=status.HTTP_200_OK) + +from datetime import date, timedelta + +def archive_live_stock(request): + today = date.today() + archive_msg = 'بایگانی خودکار به علت سن بالا' + + stocks_to_convert = LiveStock.objects.filter(trash=False, birth_day_gh__isnull=True) + for stock in stocks_to_convert: + try: + year, month, day = map(int, stock.birth_day.split('/')) + stock.birth_day_gh = convert_to_miladi(year, month, day) + stock.save() + except: + continue + + archive_conditions = Q( + Q(type__in=['بز', 'گوسفند'], gender='نر') & Q(birth_day_gh__lte=today - timedelta(days=425)) | + Q(type__in=['بز', 'گوسفند'], gender='ماده') & Q(birth_day_gh__lte=today - timedelta(days=1825)) | + Q(type='گاو') & Q(birth_day_gh__lte=today - timedelta(days=3285)) | + Q(type='اسب') & Q(birth_day_gh__lte=today - timedelta(days=4380)) + ) + + archived_count = LiveStock.objects.filter( + trash=False, + birth_day_gh__isnull=False + ).filter(archive_conditions).update( + trash=True, + archive=True, + archiver=archive_msg + ) + + + + return HttpResponse('ok') \ No newline at end of file diff --git a/LiveStock/Rancher/__init__.py b/LiveStock/Rancher/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Rancher/excel_processing.py b/LiveStock/Rancher/excel_processing.py new file mode 100644 index 0000000..68b682a --- /dev/null +++ b/LiveStock/Rancher/excel_processing.py @@ -0,0 +1,592 @@ +import datetime +import hashlib + +import requests +from django.contrib.auth.models import User, Group +from django.db.models import Count +from django.http import HttpResponse +from django.views.decorators.csrf import csrf_exempt +from openpyxl import Workbook +from openpyxl.styles import Alignment +from rest_framework import status +import openpyxl +from io import BytesIO +from rest_framework.response import Response +from rest_framework.decorators import permission_classes, api_view +from rest_framework.permissions import AllowAny + +from LiveStock.Rancher.helpers import update_one_rancher +from LiveStock.helpers import convert_to_miladi +from LiveStock.models import Rancher, Cooperative, Union, Contractor, LiveStockRolseProduct, LiveStockProvinceJahad, \ + LiveStock +from authentication.models import SystemUserProfile, Province, SystemAddress, City +from authentication.register import ARTA_REGISTER +from panel.admin import PROJECT_API_KEY +from panel.helper_excel import create_header, excel_description, create_header_freez, create_value + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_rancher_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + group = Group.objects.get(name__exact="Rancher") + system_user = SystemUserProfile.objects.filter(trash=False) + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i < 1: + continue + herd_code = row[0] + epidemiological_code = row[1] + postal_code = row[2] + unit_id = row[3] + herd_name = row[4] + national_id = row[5] + name = row[6] + mobile = row[7] + city = row[9] + lng = row[10] + lot = row[11] + registering_user = row[12] + mobile = str(mobile) + + if len(mobile) < 10: + continue + if len(mobile) == 10: + mobile = '0' + mobile + + full_name = name.split(':') + if not system_user.filter(mobile=mobile).exists(): + if not User.objects.filter(username=mobile).exists(): + hashed_password = hashlib.sha256(str('1404').encode()).hexdigest() + data = { + "username": mobile, + "first_name": full_name[0], + "last_name": full_name[1], + "password": hashed_password, + "national_code": national_id, + "role": "Rancher", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + province = Province.objects.filter(trash=False).first() + user = User(username=mobile, first_name=full_name[0], last_name=full_name[1], + password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + city_id = City.objects.filter(trash=False, id=city).first() + + system_profile = SystemUserProfile( + mobile=mobile, + first_name=full_name[0], + last_name=full_name[1], + fullname=name, + user=user, + base_order=base_id, + password='1404', + birthday=datetime.datetime.now().date(), + city=city_id, + province=province + ) + system_profile.save() + system_profile.role.add(group) + address = SystemAddress( + province=province, + city=city_id, + address=city, + postal_code=postal_code + + ) + address.save() + cooperative = Cooperative.objects.filter(trash=False, address__city=city_id).first() + if not Rancher.objects.filter(trash=False, herd_code=herd_code).exists(): + rancher = Rancher( + user=system_profile, + address=address, + cooperative=cooperative, + name=name, + registering_user=registering_user, + lng=lng, + lot=lot, + mobile=mobile, + fullname=name, + city=city, + herd_name=herd_name, + unit_id=unit_id, + postal_code=postal_code, + epidemiological_code=epidemiological_code, + herd_code=herd_code, + national_id=national_id, + + ) + rancher.save() + + return Response({"result": "ok"}, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_union_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + group = Group.objects.get(name__exact="Union") + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i < 3: + continue + type = row[4] + address = row[5] + + name = row[2] + mobile = row[6] + + mobile = str(mobile) + + if len(mobile) < 10: + continue + if len(mobile) == 10: + mobile = '0' + mobile + print(mobile) + full_name = name.split(' ') + if not SystemUserProfile.objects.filter(trash=False, mobile=mobile).exists(): + hashed_password = hashlib.sha256(str('1404').encode()).hexdigest() + data = { + "username": mobile, + "first_name": full_name[0], + "last_name": full_name[1], + "password": hashed_password, + "national_code": '0', + "role": "Union", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + province = Province.objects.filter(trash=False).first() + user = User(username=mobile, first_name=full_name[0], last_name=full_name[1], password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + city_id = City.objects.filter(trash=False, name='همدان').first() + + system_profile = SystemUserProfile( + mobile=mobile, + first_name=full_name[0], + last_name=full_name[1], + fullname=name, + user=user, + base_order=base_id, + password='1404', + birthday=datetime.datetime.now().date(), + city=city_id, + province=province + ) + system_profile.save() + system_profile.role.add(group) + address = SystemAddress( + province=province, + city=city_id, + address=address, + + ) + address.save() + if not Union.objects.filter(trash=False, user__mobile=mobile).exists(): + union = Union( + user=system_profile, + address=address, + name=name, + mobile=mobile, + type=type, + + ) + union.save() + # role_product=LiveStockRolseProduct(union=union) + # role_product.save() + + return Response({"result": "ok"}, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_cooperative_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + group = Group.objects.get(name__exact="Cooperative") + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i < 3: + continue + city = row[3] + address = row[5] + + name = row[4] + mobile = row[6] + national_id = row[7] + + mobile = str(mobile) + + if len(mobile) < 10: + continue + if len(mobile) == 10: + mobile = '0' + mobile + print(mobile) + full_name = name.split(' ') + if not SystemUserProfile.objects.filter(trash=False, mobile=mobile).exists(): + hashed_password = hashlib.sha256(str('1404').encode()).hexdigest() + data = { + "username": mobile, + "first_name": full_name[0], + "last_name": full_name[1], + "password": hashed_password, + "national_code": national_id, + "role": "Cooperative", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + province = Province.objects.filter(trash=False).first() + user = User(username=mobile, first_name=full_name[0], last_name=full_name[1:], password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + city_id = City.objects.filter(trash=False, name__contains=city).first() + + system_profile = SystemUserProfile( + mobile=mobile, + first_name=full_name[0], + last_name=full_name[1], + fullname=name, + user=user, + base_order=base_id, + password='1404', + birthday=datetime.datetime.now().date(), + city=city_id, + province=province + ) + system_profile.save() + system_profile.role.add(group) + address = SystemAddress( + province=province, + city=city_id, + address=address, + + ) + address.save() + if not Cooperative.objects.filter(trash=False, user__mobile=mobile).exists(): + cooperative = Cooperative( + user=system_profile, + address=address, + name=name, + mobile=mobile, + national_id=national_id, + + ) + cooperative.save() + # role_product=LiveStockRolseProduct(union=union) + # role_product.save() + + return Response({"result": "ok"}, status=status.HTTP_200_OK) + + +def hgsahgsad(request): + rancher = Cooperative.objects.all().order_by('id') + for r in rancher: + m=LiveStockRolseProduct( + cooperative=r + ) + m.save() + return HttpResponse('ok') + + +import random + + +def generate_random_phone_number(): + prefix = "0908" + used_numbers = set() + + while True: + suffix = ''.join([str(random.randint(0, 9)) for _ in range(7)]) + full_number = prefix + suffix + + if not SystemUserProfile.objects.filter(mobile=full_number): + used_numbers.add(full_number) + return full_number + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_contractor_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + group = Group.objects.get(name__exact="Cooperative") + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i < 1: + continue + contractor_code = row[0] + first_name = row[1] + last_name = row[2] + full_name=first_name+ ' ' + last_name + entity_code=row[3] + city=row[4] + national_id=row[5] + postal_code=row[7] + company_name=row[8] + + mobile = str(generate_random_phone_number()) + + + if not SystemUserProfile.objects.filter(trash=False, mobile=mobile).exists(): + hashed_password = hashlib.sha256(str('1404').encode()).hexdigest() + data = { + "username": mobile, + "first_name": first_name, + "last_name": last_name, + "password": hashed_password, + "national_code": national_id, + "role": "Contractor", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + province = Province.objects.filter(trash=False).first() + user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + city_id = City.objects.filter(trash=False, id=city).first() + + system_profile = SystemUserProfile( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=full_name, + user=user, + base_order=base_id, + password='1404', + birthday=datetime.datetime.now().date(), + city=city_id, + province=province + ) + system_profile.save() + system_profile.role.add(group) + address = SystemAddress( + province=province, + city=city_id, + postal_code=postal_code, + + ) + address.save() + if not Contractor.objects.filter(trash=False, user__mobile=mobile).exists(): + contractor = Contractor( + user=system_profile, + address=address, + contractor_code=contractor_code, + fullname=full_name, + entity_code=entity_code, + national_id=national_id, + company_name=company_name + + ) + contractor.save() + # role_product=LiveStockRolseProduct(union=union) + # role_product.save() + + return Response({"result": "ok"}, status=status.HTTP_200_OK) + + +def kjdfjsd(request): + live=LiveStock.objects.filter(birth_day_gh__isnull=True).count() + return HttpResponse(live) + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_live_stock_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + + existing_codes = set(LiveStock.objects.filter(trash=False).values_list('national_id_livestock_code', flat=True)) + + live_stocks_to_create = [] + l = 0 + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i < 1: + continue + + national_id_livestock_code = row[0] + if national_id_livestock_code not in existing_codes: + birth_day = row[3].split('/') + birth_day_ghamari = convert_to_miladi( + year=int(birth_day[0]), + month=int(birth_day[1]), + day=int(birth_day[2]) + ) + + live_stock = LiveStock( + national_id_livestock_code=row[0], + herd_code=row[1], + type=row[2], + birth_day=row[3], + birth_day_gh=birth_day_ghamari, + gender=row[4], + contractor_code=row[5], + unique_identifier=row[6], + agent=row[7], + registering_user=row[8], + registering_date=row[9], + ) + live_stocks_to_create.append(live_stock) + l += 1 + + LiveStock.objects.bulk_create(live_stocks_to_create) + + return Response({"result": l}, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_cooepritive_or_rural_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + rancher=Rancher.objects.filter(trash=False).only('national_id','type') + l=0 + for i, row in enumerate(sheet.iter_rows(values_only=True)): + national_id= row[0] + + new_rancher=rancher.filter(national_id=national_id) + if new_rancher: + if len(new_rancher) >1: + for r in new_rancher: + r.type='industrial' + r.save() + else: + n=new_rancher.first() + n.type = 'industrial' + n.save() + l+=1 + + return Response({"result": l}, status=status.HTTP_200_OK) + + +def rancher_repetitive_excel(request): + + + duplicates = Rancher.objects.filter(trash=False).values('national_id').annotate( + count=Count('national_id') + ).filter(count__gt=1) + # حالا رکوردهایی که national_id تکراری دارند را استخراج می‌کنیم + duplicate_records = Rancher.objects.filter( + national_id__in=[item['national_id'] for item in duplicates], + trash=False + ) + + + + + excel_options = [ + 'ردیف', + 'نام دامدار', + 'شماره ملی', + 'کد گله', + 'تعداد دام سبک', + 'تعداد دام سنگین', + + + ] + + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + + + excel_description(worksheet, 'B1', f'انبار', color='red', row2='C1') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + + l = 5 + m = 1 + if duplicate_records: + for data in duplicate_records: + + while True: + update_ranchers = update_one_rancher(data) + if update_ranchers: + break + list1 = [ + m, + data.fullname, + data.national_id, + data.herd_code, + data.light_livestock, + data.heavy_livestock, + + + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + + 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 \ No newline at end of file diff --git a/LiveStock/Rancher/filterset.py b/LiveStock/Rancher/filterset.py new file mode 100644 index 0000000..33e4cae --- /dev/null +++ b/LiveStock/Rancher/filterset.py @@ -0,0 +1,25 @@ +from django_filters import rest_framework as filters + +from LiveStock.models import Rancher + + +class RancherFilterSet(filters.FilterSet): + class Meta: + model = Rancher + fields = [ + 'fullname', + 'herd_code', + 'mobile', + 'city', + 'national_id', + 'herd_code', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'registering_user', + 'unit_id', + 'epidemiological_code', + 'postal_code', + + ] diff --git a/LiveStock/Rancher/helpers.py b/LiveStock/Rancher/helpers.py new file mode 100644 index 0000000..8b800bc --- /dev/null +++ b/LiveStock/Rancher/helpers.py @@ -0,0 +1,111 @@ +from django.http import HttpResponse +from django.db.models import Count, Q + +from LiveStock.models import Rancher, LiveStock, LiveStockProduct + + + +def update_quota_rancher_threading(): + rancher=Rancher.objects.filter(trash=False).only('trash').order_by('id') + for rancher in rancher: + rancher.save() + + +def get_live_stock_info(request): + rancher=Rancher.objects.filter(trash=False,has_script=False).only('cow','sheep','goat','horse','camel','light_livestock','heavy_livestock','has_script' + ) + rachers=rancher.values_list('herd_code',flat=True).distinct() + live_stocks = LiveStock.objects.filter(trash=False,herd_code__in=rachers ).only('type') + for r in rancher: + live_stock=live_stocks.filter(herd_code=r.herd_code).only('type') + if live_stock: + sheep=live_stock.filter(type='گوسفند').count() + goat=live_stock.filter(type='بز').count() + cow=live_stock.filter(type='گاو').count() + horse=live_stock.filter(type='اسب').count() + camel=live_stock.filter(type='شتر').count() + light_livestock = live_stock.filter(type__in=('بز', 'گوسفند')).count() + heavy_livestock = live_stock.filter(type__in=('گاو','اسب','شتر')).count() + product = LiveStockProduct.objects.filter(trash=False, name='سبوس').first() + + r.sheep=sheep + r.horse=horse + r.camel=camel + r.light_livestock=light_livestock + r.heavy_livestock=heavy_livestock + r.goat=goat + r.cow=cow + r.has_script=True + r.weight_quota_heavy = product.heavy_wight * heavy_livestock + r.weight_quota_light = product.light_wight * light_livestock + r.save() + + return HttpResponse('ok') + + +def update_rancher(rancherss): + for ranchers in rancherss: + live_stocks = LiveStock.objects.filter(trash=False, herd_code=ranchers.herd_code).only('type') + + sheep = live_stocks.filter(type='گوسفند').count() + goat = live_stocks.filter(type='بز').count() + cow = live_stocks.filter(type='گاو').count() + horse = live_stocks.filter(type='اسب').count() + camel = live_stocks.filter(type='شتر').count() + light_livestock = live_stocks.filter(type__in=('بز', 'گوسفند')).count() + heavy_livestock = live_stocks.filter(type__in=('گاو', 'اسب', 'شتر')).count() + product = LiveStockProduct.objects.filter(name='سبوس', trash=False).first() + + ranchers.sheep = sheep + ranchers.horse = horse + ranchers.camel = camel + ranchers.light_livestock = light_livestock + ranchers.heavy_livestock = heavy_livestock + ranchers.goat = goat + ranchers.cow = cow + ranchers.weight_quota_heavy = product.heavy_wight * heavy_livestock + ranchers.weight_quota_light = product.light_wight * light_livestock + ranchers.save() + return True + + +def al_get_live_stock_info(request): + rancher = Rancher.objects.filter(trash=False, has_script=False).only('cow', 'sheep', 'goat', 'horse', 'camel', + 'light_livestock', 'heavy_livestock', + 'has_script' + ).count() + return HttpResponse(rancher) + + +def update_one_rancher(ranchers): + if not ranchers.has_script: + counts = LiveStock.objects.filter( + trash=False, + herd_code=ranchers.herd_code + ).aggregate( + sheep_count=Count('id', filter=Q(type='گوسفند')), + goat_count=Count('id', filter=Q(type='بز')), + cow_count=Count('id', filter=Q(type='گاو')), + horse_count=Count('id', filter=Q(type='اسب')), + camel_count=Count('id', filter=Q(type='شتر')), + light_count=Count('id', filter=Q(type__in=('بز', 'گوسفند'))), + heavy_count=Count('id', filter=Q(type__in=('گاو', 'اسب', 'شتر'))) + ) + + product = LiveStockProduct.objects.filter(name='سبوس', trash=False).first() + + ranchers.sheep = counts['sheep_count'] + ranchers.goat = counts['goat_count'] + ranchers.cow = counts['cow_count'] + ranchers.horse = counts['horse_count'] + ranchers.camel = counts['camel_count'] + ranchers.light_livestock = counts['light_count'] + ranchers.heavy_livestock = counts['heavy_count'] + + ranchers.weight_quota_heavy = product.heavy_wight * counts['heavy_count'] + ranchers.weight_quota_light = product.light_wight * counts['light_count'] + + ranchers.has_script = True + ranchers.save() + + return True diff --git a/LiveStock/Rancher/serializers.py b/LiveStock/Rancher/serializers.py new file mode 100644 index 0000000..085deba --- /dev/null +++ b/LiveStock/Rancher/serializers.py @@ -0,0 +1,40 @@ +from rest_framework import serializers +from LiveStock.models import Rancher, LiveStock, LiveStockProduct +from authentication.serializer.serializer import BankCardSerializer, SystemUserProfileForInspectionSerializer +from authentication.serializers import SystemAddressSerializer + + +class RancherSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + # address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Rancher + fields = '__all__' + + +class RancherForBazrasiSerializer(serializers.ModelSerializer): + heavy_livestock = serializers.SerializerMethodField() + light_livestock = serializers.SerializerMethodField() + + class Meta: + model = Rancher + fields = [ + 'herd_code', + 'fullname', + 'mobile', + 'lot', + 'lng', + 'heavy_livestock', + 'light_livestock', + 'type' + + ] + + def get_heavy_livestock(self, obj): + heavy_counts = self.context.get('heavy_counts') or {} + return heavy_counts.get(obj.herd_code, 0) + + def get_light_livestock(self, obj): + light_counts = self.context.get('light_counts') or {} + return light_counts.get(obj.herd_code, 0) diff --git a/LiveStock/Rancher/urls.py b/LiveStock/Rancher/urls.py new file mode 100644 index 0000000..95c8485 --- /dev/null +++ b/LiveStock/Rancher/urls.py @@ -0,0 +1,38 @@ +from rest_framework.routers import DefaultRouter +from django.urls import path, include +from LiveStock.Rancher import views as rancher_views +from LiveStock.Rancher.excel_processing import get_rancher_excel, get_union_excel, get_cooperative_excel, hgsahgsad, \ + get_contractor_excel, kjdfjsd, get_live_stock_excel, get_cooepritive_or_rural_excel, rancher_repetitive_excel +from LiveStock.Rancher.helpers import get_live_stock_info +from LiveStock.Rancher.views import get_detail_rancher, dashboard_rancher + +router = DefaultRouter() +router.register( + r'rancher-view', + rancher_views.RancherViewSet, + basename="rancher-view" +) + +router.register( + r'bazrasi-rancher-view', + rancher_views.RancherForBazrasiViewSet, + basename="bazrasi-rancher-view" +) + + +urlpatterns = [ + path('', include(router.urls)), + path('get_rancher_excel/', get_rancher_excel), + path('get_union_excel/', get_union_excel), + path('get_cooperative_excel/', get_cooperative_excel), + path('hgsahgsad/', hgsahgsad), + path('get_contractor_excel/', get_contractor_excel), + path('get_live_stock_info/', get_live_stock_info), + path('get_detail_rancher/', get_detail_rancher), + path('dashboard_rancher/', dashboard_rancher), + path('kjdfjsd/', kjdfjsd), + path('get_live_stock_excel/', get_live_stock_excel), + path('get_cooepritive_or_rural_excel/', get_cooepritive_or_rural_excel), + path('rancher_repetitive_excel/', rancher_repetitive_excel), + +] \ No newline at end of file diff --git a/LiveStock/Rancher/views.py b/LiveStock/Rancher/views.py new file mode 100644 index 0000000..091c75d --- /dev/null +++ b/LiveStock/Rancher/views.py @@ -0,0 +1,352 @@ +from django.db.models import Sum, Count, Q +from django.views.decorators.csrf import csrf_exempt +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from rest_framework import viewsets +from rest_framework import status +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import AllowAny +from rest_framework.response import Response + +from LiveStock.Rancher.filterset import RancherFilterSet +from LiveStock.Rancher.serializers import RancherSerializer, RancherForBazrasiSerializer +from LiveStock.helpers import CustomPagination, build_query +from LiveStock.models import Rancher, Cooperative, LiveStock +from authentication.models import SystemUserProfile, City, Province +from LiveStock.Rancher.helpers import update_rancher, update_one_rancher +from django.contrib.auth.models import User, Group + +from authentication.views import ARTA_URL_REGISTER, ARTA_URL_CHANGE_MOBILE_NUMBER +from panel.admin import PROJECT_API_KEY +import requests + + +class RancherViewSet(viewsets.ModelViewSet): + queryset = Rancher.objects.filter(trash=False).only('herd_code', 'epidemiological_code', 'postal_code', 'unit_id', + 'herd_name', 'national_id', + 'fullname', 'mobile', 'contractor_code', 'city', + 'registering_user', 'light_livestock', 'heavy_livestock', 'cow', + 'goat', 'sheep', 'horse', 'camel', 'lot', 'lng', + 'allow_buy').order_by('id') + permission_classes = [TokenHasReadWriteScope] + serializer_class = RancherSerializer + pagination_class = CustomPagination + filterset_class = RancherFilterSet + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + rancher = user.rancher_user.all() + + serializer = self.serializer_class(rancher[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if request.GET['role'] == 'Cooperative': + cooperative = Cooperative.objects.get(user=user, trash=False) + ranchers = Rancher.objects.filter(trash=False, city=cooperative.address.city.name).only('herd_code', + 'epidemiological_code', + 'postal_code', + 'unit_id', + 'herd_name', + 'national_id', + 'fullname', + 'mobile', + 'contractor_code', + 'city', + 'registering_user', + 'light_livestock', + 'heavy_livestock', + 'cow', + 'goat', 'sheep', + 'horse', 'camel', + 'lot', 'lng', + 'allow_buy').order_by( + 'id') + + else: + ranchers = Rancher.objects.filter(trash=False).only('herd_code', 'epidemiological_code', 'postal_code', + 'unit_id', 'herd_name', 'national_id', + 'fullname', 'mobile', 'contractor_code', 'city', + 'registering_user', 'light_livestock', + 'heavy_livestock', 'cow', + 'goat', 'sheep', 'horse', 'camel', 'lot', 'lng', + 'allow_buy').order_by('id') + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + ranchers = ranchers.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(ranchers) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(ranchers.first()) + # serializer = self.serializer_class(ranchers, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + group = Group.objects.get(name__exact="Rancher") + city = City.objects.get(name=request.data['city']) + request.data.pop('city') + province = Province.objects.get(key=city.province.key) + system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last() + if system_profile: + if Rancher.objects.filter(user=system_profile, trash=False).exists(): + return Response({"result": "این اتحادیه قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + + else: + password = "123456" + data = { + "username": request.data['mobile'], + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=request.data['mobile'], first_name=request.data['first_name'], + last_name=request.data['last_name']) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=request.data['mobile'], + first_name=request.data['first_name'], + last_name=request.data['last_name'], + fullname=request.data['first_name'] + " " + request.data['last_name'], + user=user, + base_order=base_id, + password=password, + national_id=request.data['national_id'], + city=city, + province=province + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) + system_profile.role.add(group) + request.data.pop('first_name') + request.data.pop('last_name') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + rancher = serializer.create(validated_data=request.data) + rancher.user = system_profile + rancher.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + rancher = Rancher.objects.get(key=request.data['key'], trash=False) + if 'first_name' in request.data.keys(): + # system_user_profile = SystemUserProfile.objects.get(key=rancher.user.key, trash=False) + # system_user_profile.first_name = request.data['first_name'] + # system_user_profile.last_name = request.data['last_name'] + # system_user_profile.fullname = request.data['first_name'] + " " + request.data['last_name'] + # system_user_profile.save() + # first_mobile_number = system_user_profile.mobile + # second_mobile_number = request.data['mobile'] + # if first_mobile_number != second_mobile_number: + # if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + # return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + # status=status.HTTP_403_FORBIDDEN) + # data = { + # "first_mobile_number": first_mobile_number, + # "second_mobile_number": second_mobile_number, + # } + # req = requests.post( + # url=ARTA_URL_CHANGE_MOBILE_NUMBER, + # data=data, + # verify=False + # ) + # if req.status_code == 200: + # second_mobile_number = second_mobile_number + # user = User.objects.get(id=system_user_profile.user.id) + # user.username = second_mobile_number + # user.save() + # system_user_profile.mobile = second_mobile_number + # system_user_profile.save() + request.data.pop('first_name') + request.data.pop('last_name') + + serializer = self.serializer_class(rancher) + serializer.update(instance=rancher, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + + def destroy(self, request, pk=None, *args, **kwargs): + rancher = Rancher.objects.get(key=request.GET["rancher_key"]) + rancher.trash = True + rancher.save() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + + # def update(self, request, *args, **kwargs): + # rancher = self.queryset.get(key=request.data['key'], trash=False) + # request.data.pop('key') + # + # serializer = self.serializer_class(rancher) + # serializer.update(instance=rancher, validated_data=request.data) + # return Response(serializer.data, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def get_detail_rancher(request): + ranchers = Rancher.objects.filter(herd_code=request.GET['herd_code']).first() + while True: + update_ranchers = update_one_rancher(ranchers) + if update_ranchers: + break + dict1 = { + "light_livestock": ranchers.light_livestock, + "heavy_livestock": ranchers.heavy_livestock, + "sheep": ranchers.sheep, + "goat": ranchers.goat, + "cow": ranchers.cow, + "camel": ranchers.camel, + "horse": ranchers.horse + } + return Response(dict1, status=status.HTTP_200_OK) + + +class RancherForBazrasiViewSet(viewsets.ModelViewSet): + queryset = Rancher.objects.filter(trash=False, type='industrial').only( + 'herd_code', + 'fullname', + 'mobile', + 'lot', + 'lng', + 'industrial', + 'heavy_livestock', + 'light_livestock' + ).order_by('-industrial', 'id') + permission_classes = [AllowAny] + serializer_class = RancherForBazrasiSerializer + + def list(self, request, *args, **kwargs): + type_filter = request.GET.get('type') + queryset = Rancher.objects.filter(trash=False).only( + 'herd_code', + 'fullname', + 'mobile', + 'lot', + 'lng', + 'industrial', + 'heavy_livestock', + 'light_livestock', + 'type' + ).order_by('-industrial', 'id') + + if type_filter in ('industrial', 'rural'): + queryset = queryset.filter(type=type_filter) + + herd_codes = list(queryset.values_list('herd_code', flat=True)) + + heavy_counts = {} + light_counts = {} + valid_herd_codes = set() + if herd_codes: + heavy_types = ('گاو', 'اسب', 'شتر') + light_types = ('بز', 'گوسفند') + livestock_counts = ( + LiveStock.objects.filter( + trash=False, + herd_code__in=herd_codes, + type__in=heavy_types + light_types + ) + .values('herd_code', 'type') + .annotate(total=Count('id')) + ) + for item in livestock_counts: + herd_code = item['herd_code'] + livestock_type = item['type'] + total = item['total'] + if livestock_type in heavy_types: + heavy_counts[herd_code] = heavy_counts.get(herd_code, 0) + total + elif livestock_type in light_types: + light_counts[herd_code] = light_counts.get(herd_code, 0) + total + + valid_herd_codes = set(heavy_counts.keys()) | set(light_counts.keys()) + + if valid_herd_codes: + queryset = queryset.filter(herd_code__in=valid_herd_codes) + else: + queryset = queryset.none() + + serializer = self.get_serializer( + queryset, + many=True, + context={ + 'heavy_counts': heavy_counts, + 'light_counts': light_counts + } + ) + + return Response(serializer.data, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def dashboard_rancher(request): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET.get('role') + + ranchers = Rancher.objects.filter(trash=False).values_list('herd_code', flat=True).distinct() + + live_stocks = LiveStock.objects.filter(trash=False, herd_code__in=ranchers).only('type') + + if role == 'Cooperative': + cooperative = Cooperative.objects.get(user=user, trash=False) + ranchers = Rancher.objects.filter(trash=False, city=cooperative.address.city.name).values_list('herd_code', + flat=True).distinct() + live_stocks = live_stocks.filter(herd_code__in=ranchers) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + ranchers = ranchers.filter(build_query(RancherFilterSet.Meta.fields, value)) + + counts = live_stocks.values('type').annotate(total=Count('id')) + count_dict = {item['type']: item['total'] for item in counts} + + light_livestock = count_dict.get('بز', 0) + count_dict.get('گوسفند', 0) + heavy_livestock = count_dict.get('گاو', 0) + count_dict.get('اسب', 0) + count_dict.get('شتر', 0) + total_ranchers = len(ranchers) + dhi_amount = ranchers.filter(dhi_amount__gt=1,trash=False).aggregate(total=Sum('dhi_amount'))['total'] or 0 + + result = { + 'rancher_count': total_ranchers, + 'live_stocks_count': sum(count_dict.values()), + "sheep": count_dict.get('گوسفند', 0), + "goat": count_dict.get('بز', 0), + "cow": count_dict.get('گاو', 0), + "horse": count_dict.get('اسب', 0), + "camel": count_dict.get('شتر', 0), + "light_livestock": light_livestock, + "heavy_livestock": heavy_livestock, + "dhi_amount": dhi_amount, + + } + + return Response(result, status=status.HTTP_200_OK) diff --git a/LiveStock/Union/__init__.py b/LiveStock/Union/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Union/excel_processing.py b/LiveStock/Union/excel_processing.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Union/filterset.py b/LiveStock/Union/filterset.py new file mode 100644 index 0000000..0b6bee6 --- /dev/null +++ b/LiveStock/Union/filterset.py @@ -0,0 +1,17 @@ +from django_filters import rest_framework as filters + +from LiveStock.models import Union + + +class UnionFilterSet(filters.FilterSet): + class Meta: + model = Union + fields = [ + 'address__city__name', + 'name', + 'mobile', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname' + ] diff --git a/LiveStock/Union/helpers.py b/LiveStock/Union/helpers.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/Union/serializers.py b/LiveStock/Union/serializers.py new file mode 100644 index 0000000..30f3dd2 --- /dev/null +++ b/LiveStock/Union/serializers.py @@ -0,0 +1,15 @@ +from rest_framework import serializers + +from LiveStock.models import Union +from authentication.serializer.serializer import BankCardSerializer, SystemUserProfileForInspectionSerializer +from authentication.serializers import SystemAddressSerializer + + +class UnionSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = Union + fields = '__all__' diff --git a/LiveStock/Union/urls.py b/LiveStock/Union/urls.py new file mode 100644 index 0000000..af4dc07 --- /dev/null +++ b/LiveStock/Union/urls.py @@ -0,0 +1,14 @@ +from rest_framework.routers import DefaultRouter +from django.urls import path, include +from LiveStock.Union import views as union_views +router = DefaultRouter() +router.register( + r'union-view', + union_views.UnionViewSet, + basename="union" +) + + +urlpatterns = [ + path('', include(router.urls)), + ] \ No newline at end of file diff --git a/LiveStock/Union/views.py b/LiveStock/Union/views.py new file mode 100644 index 0000000..c2bc706 --- /dev/null +++ b/LiveStock/Union/views.py @@ -0,0 +1,181 @@ +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from rest_framework import viewsets +from rest_framework import status +from rest_framework.permissions import AllowAny +from rest_framework.response import Response + +from LiveStock.Union.filterset import UnionFilterSet +from LiveStock.Union.serializers import UnionSerializer +from LiveStock.helpers import build_query, CustomPagination +from LiveStock.models import Union +from authentication.models import SystemUserProfile, City, Province, SystemAddress +from django.contrib.auth.models import User, Group + +from authentication.views import ARTA_URL_REGISTER, ARTA_URL_CHANGE_MOBILE_NUMBER +from panel.admin import PROJECT_API_KEY +import requests + + +class UnionViewSet(viewsets.ModelViewSet): + queryset = Union.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = UnionSerializer + filterset_class = UnionFilterSet + pagination_class = CustomPagination + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + union = user.union_user.all() + + serializer = self.serializer_class(union[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + unions = Union.objects.filter(trash=False).order_by('id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + unions = unions.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + page = self.paginate_queryset(unions) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(unions, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + group = Group.objects.get(name__exact="Union") + city = City.objects.get(name=request.data['city']) + request.data.pop('city') + province = Province.objects.get(key=city.province.key) + system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last() + if system_profile: + if Union.objects.filter(user=system_profile, trash=False).exists(): + return Response({"result": "این اتحادیه قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + + else: + password = "123456" + data = { + "username": request.data['mobile'], + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=request.data['mobile'], first_name=request.data['first_name'], + last_name=request.data['last_name']) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=request.data['mobile'], + first_name=request.data['first_name'], + last_name=request.data['last_name'], + fullname=request.data['first_name'] + " " + request.data['last_name'], + user=user, + base_order=base_id, + password=password, + national_id=request.data['national_id'], + city=city, + province=province + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) + address = SystemAddress(city=city, province=province, address=request.data['address'], + postal_code=request.data['postal_code']) + address.save() + system_profile.role.add(group) + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('postal_code') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + union = serializer.create(validated_data=request.data) + union.user = system_profile + union.address = address + union.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + union = Union.objects.get(key=request.data['union_key'], trash=False) + address = SystemAddress.objects.get(key=union.address.key, trash=False) + request.data.pop('union_key') + if 'first_name' in request.data.keys(): + system_user_profile = SystemUserProfile.objects.get(key=union.user.key, trash=False) + system_user_profile.first_name = request.data['first_name'] + system_user_profile.last_name = request.data['last_name'] + system_user_profile.fullname = request.data['first_name'] + " " + request.data['last_name'] + system_user_profile.save() + first_mobile_number = system_user_profile.mobile + second_mobile_number = request.data['mobile'] + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = second_mobile_number + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + city = City.objects.get(name=request.data['city']) + province = Province.objects.get(key=city.province.key) + address.city = city + address.province = province + address.address = request.data['address'] + address.postal_code = request.data['postal_code'] + address.save() + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('city') + + serializer = self.serializer_class(union) + serializer.update(instance=union, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + # def update(self, request, *args, **kwargs): + # union = Union.objects.get(key=request.data['key'], trash=False) + # request.data.pop('key') + # if 'city' in request.data: + # city_key=request.data['city'] + # request.data.pop('city') + # city=City.objects.filter(key=city_key,trash=False).first() + # union.address.city=city + # union.address.save() + # serializer = self.serializer_class(union) + # + # serializer.update(instance=union, validated_data=request.data) + # return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + union = Union.objects.get(key=request.GET["key"]) + union.trash = True + union.save() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) diff --git a/LiveStock/__init__.py b/LiveStock/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/admin.py b/LiveStock/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/LiveStock/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/LiveStock/apps.py b/LiveStock/apps.py new file mode 100644 index 0000000..2494717 --- /dev/null +++ b/LiveStock/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class LivestockConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'LiveStock' diff --git a/LiveStock/helpers.py b/LiveStock/helpers.py new file mode 100644 index 0000000..e76a4f8 --- /dev/null +++ b/LiveStock/helpers.py @@ -0,0 +1,21 @@ +import jdatetime +from rest_framework.pagination import PageNumberPagination + + +class CustomPagination(PageNumberPagination): + page_size = 10 + page_size_query_param = 'page_size' + max_page_size = 100 + + +def convert_to_miladi(year=None, month=None, day=None): + date = jdatetime.datetime(year, month, day).togregorian() + return date + + +def build_query(fields, value): + from django.db.models import Q + query = Q() + for field in fields: + query |= Q(**{f"{field}__icontains": value}) + return query diff --git a/LiveStock/migrations/0001_initial.py b/LiveStock/migrations/0001_initial.py new file mode 100644 index 0000000..1805112 --- /dev/null +++ b/LiveStock/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-03-02 12:03 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('authentication', '0060_auto_20250302_1203'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0461_auto_20250302_1203'), + ] + + operations = [ + migrations.CreateModel( + name='LiveStockProvinceJahad', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='live_stock_jahad_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestockprovincejahad_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestockprovincejahad_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='live_stock_jahad_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='live_stock_jahad_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='live_stock_jahad_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/LiveStock/migrations/0002_livestockprovincejahad_name.py b/LiveStock/migrations/0002_livestockprovincejahad_name.py new file mode 100644 index 0000000..625b1ad --- /dev/null +++ b/LiveStock/migrations/0002_livestockprovincejahad_name.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-03-02 12:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='livestockprovincejahad', + name='name', + field=models.CharField(max_length=200, null=True), + ), + ] diff --git a/LiveStock/migrations/0003_auto_20250302_1254.py b/LiveStock/migrations/0003_auto_20250302_1254.py new file mode 100644 index 0000000..272d2ef --- /dev/null +++ b/LiveStock/migrations/0003_auto_20250302_1254.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.13 on 2025-03-02 12:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0002_livestockprovincejahad_name'), + ] + + operations = [ + migrations.AddField( + model_name='livestockprovincejahad', + name='account', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='livestockprovincejahad', + name='mobile', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='livestockprovincejahad', + name='national_id', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='livestockprovincejahad', + name='type', + field=models.CharField(max_length=200, null=True), + ), + ] diff --git a/LiveStock/migrations/0004_cooperative_union.py b/LiveStock/migrations/0004_cooperative_union.py new file mode 100644 index 0000000..53fb988 --- /dev/null +++ b/LiveStock/migrations/0004_cooperative_union.py @@ -0,0 +1,67 @@ +# Generated by Django 3.2.13 on 2025-03-02 13:51 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0462_auto_20250302_1351'), + ('authentication', '0061_auto_20250302_1351'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('LiveStock', '0003_auto_20250302_1254'), + ] + + operations = [ + migrations.CreateModel( + name='Union', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('mobile', models.CharField(max_length=200, null=True)), + ('type', models.CharField(max_length=200, null=True)), + ('account', models.CharField(max_length=200, null=True)), + ('national_id', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='union_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='union_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='union_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='union_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='union_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='union_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Cooperative', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('mobile', models.CharField(max_length=200, null=True)), + ('type', models.CharField(max_length=200, null=True)), + ('account', models.CharField(max_length=200, null=True)), + ('national_id', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/LiveStock/migrations/0005_livestockallocations_livestockproduct_livestockrolseproduct_rancher.py b/LiveStock/migrations/0005_livestockallocations_livestockproduct_livestockrolseproduct_rancher.py new file mode 100644 index 0000000..34a0795 --- /dev/null +++ b/LiveStock/migrations/0005_livestockallocations_livestockproduct_livestockrolseproduct_rancher.py @@ -0,0 +1,109 @@ +# Generated by Django 3.2.13 on 2025-03-02 14:58 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0062_auto_20250302_1458'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0463_auto_20250302_1458'), + ('LiveStock', '0004_cooperative_union'), + ] + + operations = [ + migrations.CreateModel( + name='LiveStockProduct', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('image', models.CharField(max_length=500, null=True)), + ('unit', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestockproduct_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestockproduct_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Rancher', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('mobile', models.CharField(max_length=200, null=True)), + ('type', models.CharField(max_length=200, null=True)), + ('account', models.CharField(max_length=200, null=True)), + ('national_id', models.CharField(max_length=100, null=True)), + ('unit_id', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='LiveStockRolseProduct', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('total_weight', models.BigIntegerField(default=0)), + ('total_allocated_weight', models.BigIntegerField(default=0)), + ('total_remain_weight', models.CharField(max_length=500, null=True)), + ('cooperative', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_product', to='LiveStock.cooperative')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestockrolseproduct_createdby', to=settings.AUTH_USER_MODEL)), + ('jahad', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_product', to='LiveStock.livestockproduct')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestockrolseproduct_modifiedby', to=settings.AUTH_USER_MODEL)), + ('parent_product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parents_product', to='LiveStock.livestockproduct')), + ('rancher', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_product', to='LiveStock.rancher')), + ('union', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='union_product', to='LiveStock.union')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='LiveStockAllocations', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.CharField(default='pending', max_length=200)), + ('weight', models.BigIntegerField(default=0)), + ('real_weight', models.BigIntegerField(default=0)), + ('cooperative', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_allocation', to='LiveStock.cooperative')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestockallocations_createdby', to=settings.AUTH_USER_MODEL)), + ('jahad', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_allocation', to='LiveStock.livestockproduct')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestockallocations_modifiedby', to=settings.AUTH_USER_MODEL)), + ('product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product_allocation', to='LiveStock.livestockrolseproduct')), + ('rancher', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_allocation', to='LiveStock.cooperative')), + ('union', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='union_allocation', to='LiveStock.union')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/LiveStock/migrations/0006_auto_20250302_1627.py b/LiveStock/migrations/0006_auto_20250302_1627.py new file mode 100644 index 0000000..a7d167b --- /dev/null +++ b/LiveStock/migrations/0006_auto_20250302_1627.py @@ -0,0 +1,35 @@ +# Generated by Django 3.2.13 on 2025-03-02 16:27 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0005_livestockallocations_livestockproduct_livestockrolseproduct_rancher'), + ] + + operations = [ + migrations.RemoveField( + model_name='cooperative', + name='wallet', + ), + migrations.RemoveField( + model_name='livestockprovincejahad', + name='wallet', + ), + migrations.RemoveField( + model_name='rancher', + name='wallet', + ), + migrations.RemoveField( + model_name='union', + name='wallet', + ), + migrations.AddField( + model_name='rancher', + name='cooperative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_cooperative', to='LiveStock.cooperative'), + ), + ] diff --git a/LiveStock/migrations/0007_auto_20250303_0931.py b/LiveStock/migrations/0007_auto_20250303_0931.py new file mode 100644 index 0000000..2ae0952 --- /dev/null +++ b/LiveStock/migrations/0007_auto_20250303_0931.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.13 on 2025-03-03 09:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0006_auto_20250302_1627'), + ] + + operations = [ + migrations.RemoveField( + model_name='livestockallocations', + name='jahad', + ), + migrations.RemoveField( + model_name='livestockrolseproduct', + name='jahad', + ), + migrations.AddField( + model_name='livestockallocations', + name='allocate_from', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='livestockallocations', + name='allocate_to', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='livestockallocations', + name='date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + ] diff --git a/LiveStock/migrations/0008_auto_20250303_0933.py b/LiveStock/migrations/0008_auto_20250303_0933.py new file mode 100644 index 0000000..bb7f52d --- /dev/null +++ b/LiveStock/migrations/0008_auto_20250303_0933.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.13 on 2025-03-03 09:33 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0007_auto_20250303_0931'), + ] + + operations = [ + migrations.AddField( + model_name='livestockallocations', + name='jahad', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_allocation', to='LiveStock.livestockprovincejahad'), + ), + migrations.AddField( + model_name='livestockrolseproduct', + name='jahad', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_product', to='LiveStock.livestockprovincejahad'), + ), + ] diff --git a/LiveStock/migrations/0009_auto_20250303_1021.py b/LiveStock/migrations/0009_auto_20250303_1021.py new file mode 100644 index 0000000..ac25922 --- /dev/null +++ b/LiveStock/migrations/0009_auto_20250303_1021.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2025-03-03 10:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0008_auto_20250303_0933'), + ] + + operations = [ + migrations.RemoveField( + model_name='livestockallocations', + name='rancher', + ), + migrations.RemoveField( + model_name='rancher', + name='account', + ), + migrations.RemoveField( + model_name='rancher', + name='type', + ), + migrations.AddField( + model_name='rancher', + name='city', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='rancher', + name='epidemiological_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='rancher', + name='fullname', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='rancher', + name='herd_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='rancher', + name='herd_name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='rancher', + name='lng', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='lot', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='postal_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='rancher', + name='registering_user', + field=models.CharField(max_length=200, null=True), + ), + ] diff --git a/LiveStock/migrations/0010_livestockallocations_rancher.py b/LiveStock/migrations/0010_livestockallocations_rancher.py new file mode 100644 index 0000000..741a6a0 --- /dev/null +++ b/LiveStock/migrations/0010_livestockallocations_rancher.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2025-03-03 10:23 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0009_auto_20250303_1021'), + ] + + operations = [ + migrations.AddField( + model_name='livestockallocations', + name='rancher', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_allocation', to='LiveStock.rancher'), + ), + ] diff --git a/LiveStock/migrations/0011_remove_livestockallocations_rancher.py b/LiveStock/migrations/0011_remove_livestockallocations_rancher.py new file mode 100644 index 0000000..7a83f4a --- /dev/null +++ b/LiveStock/migrations/0011_remove_livestockallocations_rancher.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2025-03-03 12:05 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0010_livestockallocations_rancher'), + ] + + operations = [ + migrations.RemoveField( + model_name='livestockallocations', + name='rancher', + ), + ] diff --git a/LiveStock/migrations/0012_remove_livestockrolseproduct_rancher.py b/LiveStock/migrations/0012_remove_livestockrolseproduct_rancher.py new file mode 100644 index 0000000..cb8c9a2 --- /dev/null +++ b/LiveStock/migrations/0012_remove_livestockrolseproduct_rancher.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2025-03-03 15:00 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0011_remove_livestockallocations_rancher'), + ] + + operations = [ + migrations.RemoveField( + model_name='livestockrolseproduct', + name='rancher', + ), + ] diff --git a/LiveStock/migrations/0013_livestock.py b/LiveStock/migrations/0013_livestock.py new file mode 100644 index 0000000..b966bb2 --- /dev/null +++ b/LiveStock/migrations/0013_livestock.py @@ -0,0 +1,43 @@ +# Generated by Django 3.2.13 on 2025-03-04 13:43 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('LiveStock', '0012_remove_livestockrolseproduct_rancher'), + ] + + operations = [ + migrations.CreateModel( + name='LiveStock', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('national_id_livestock_code', models.CharField(max_length=200, null=True)), + ('herd_code', models.CharField(max_length=100, null=True)), + ('type', models.CharField(max_length=200, null=True)), + ('birth_day', models.DateField(null=True)), + ('gender', models.CharField(max_length=100, null=True)), + ('contractor_code', models.CharField(max_length=100, null=True)), + ('unique_identifier', models.CharField(max_length=100, null=True)), + ('agent', models.CharField(max_length=100, null=True)), + ('registering_user', models.CharField(max_length=200, null=True)), + ('registering_date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestock_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestock_modifiedby', to=settings.AUTH_USER_MODEL)), + ('rancher', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='LiveStock.rancher')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/LiveStock/migrations/0014_auto_20250305_1331.py b/LiveStock/migrations/0014_auto_20250305_1331.py new file mode 100644 index 0000000..ac05bc0 --- /dev/null +++ b/LiveStock/migrations/0014_auto_20250305_1331.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-03-05 13:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0013_livestock'), + ] + + operations = [ + migrations.AlterField( + model_name='livestock', + name='birth_day', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='livestock', + name='registering_date', + field=models.CharField(max_length=200, null=True), + ), + ] diff --git a/LiveStock/migrations/0015_rancher_allow_buy.py b/LiveStock/migrations/0015_rancher_allow_buy.py new file mode 100644 index 0000000..96cbe6d --- /dev/null +++ b/LiveStock/migrations/0015_rancher_allow_buy.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-03-05 16:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0014_auto_20250305_1331'), + ] + + operations = [ + migrations.AddField( + model_name='rancher', + name='allow_buy', + field=models.BooleanField(default=True), + ), + ] diff --git a/LiveStock/migrations/0016_auto_20250305_1701.py b/LiveStock/migrations/0016_auto_20250305_1701.py new file mode 100644 index 0000000..bd94cda --- /dev/null +++ b/LiveStock/migrations/0016_auto_20250305_1701.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-03-05 17:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0015_rancher_allow_buy'), + ] + + operations = [ + migrations.AddField( + model_name='rancher', + name='weight_allocation_heavy', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='weight_allocation_light', + field=models.IntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0017_auto_20250306_0033.py b/LiveStock/migrations/0017_auto_20250306_0033.py new file mode 100644 index 0000000..2c5a9cd --- /dev/null +++ b/LiveStock/migrations/0017_auto_20250306_0033.py @@ -0,0 +1,48 @@ +# Generated by Django 3.2.13 on 2025-03-06 00:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0016_auto_20250305_1701'), + ] + + operations = [ + migrations.AddField( + model_name='livestockproduct', + name='cooperative_percent', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='livestockproduct', + name='price', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='livestockproduct', + name='union_percent', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='rancher', + name='total_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='weight_quota_heavy', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='weight_quota_light', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='livestockrolseproduct', + name='total_remain_weight', + field=models.BigIntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0018_auto_20250306_1106.py b/LiveStock/migrations/0018_auto_20250306_1106.py new file mode 100644 index 0000000..7d808b5 --- /dev/null +++ b/LiveStock/migrations/0018_auto_20250306_1106.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.13 on 2025-03-06 11:06 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0066_auto_20250306_1106'), + ('LiveStock', '0017_auto_20250306_0033'), + ] + + operations = [ + migrations.AddField( + model_name='rancher', + name='contractor_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.CreateModel( + name='Contractor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('contractor_code', models.CharField(max_length=100, null=True)), + ('fullname', models.CharField(max_length=200, null=True)), + ('entity_code', models.CharField(max_length=200, null=True)), + ('national_id', models.CharField(max_length=100, null=True)), + ('company_name', models.CharField(max_length=200, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor_user', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor_user', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/LiveStock/migrations/0019_auto_20250306_1921.py b/LiveStock/migrations/0019_auto_20250306_1921.py new file mode 100644 index 0000000..343aa93 --- /dev/null +++ b/LiveStock/migrations/0019_auto_20250306_1921.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-03-06 19:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0018_auto_20250306_1106'), + ] + + operations = [ + migrations.AddField( + model_name='livestockproduct', + name='heavy_wight', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='livestockproduct', + name='light_wight', + field=models.IntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0020_auto_20250307_1118.py b/LiveStock/migrations/0020_auto_20250307_1118.py new file mode 100644 index 0000000..6e31b98 --- /dev/null +++ b/LiveStock/migrations/0020_auto_20250307_1118.py @@ -0,0 +1,60 @@ +# Generated by Django 3.2.13 on 2025-03-07 11:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0019_auto_20250306_1921'), + ] + + operations = [ + migrations.RemoveField( + model_name='rancher', + name='address', + ), + migrations.RemoveField( + model_name='rancher', + name='cooperative', + ), + migrations.RemoveField( + model_name='rancher', + name='user_bank_info', + ), + migrations.AddField( + model_name='rancher', + name='camel', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='cow', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='goat', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='heavy_livestock', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='horse', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='light_livestock', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rancher', + name='sheep', + field=models.IntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0021_auto_20250307_1312.py b/LiveStock/migrations/0021_auto_20250307_1312.py new file mode 100644 index 0000000..688b347 --- /dev/null +++ b/LiveStock/migrations/0021_auto_20250307_1312.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.13 on 2025-03-07 13:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0020_auto_20250307_1118'), + ] + + operations = [ + migrations.AddField( + model_name='contractor', + name='cooperative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor_cooperative', to='LiveStock.cooperative'), + ), + migrations.AddField( + model_name='contractor', + name='heavy_livestock', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='contractor', + name='light_livestock', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='contractor', + name='number_of_rancher', + field=models.IntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0022_rancher_has_script.py b/LiveStock/migrations/0022_rancher_has_script.py new file mode 100644 index 0000000..1f223ca --- /dev/null +++ b/LiveStock/migrations/0022_rancher_has_script.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-03-07 13:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0021_auto_20250307_1312'), + ] + + operations = [ + migrations.AddField( + model_name='rancher', + name='has_script', + field=models.BooleanField(default=False), + ), + ] diff --git a/LiveStock/migrations/0023_rancher_cooperative.py b/LiveStock/migrations/0023_rancher_cooperative.py new file mode 100644 index 0000000..93961ee --- /dev/null +++ b/LiveStock/migrations/0023_rancher_cooperative.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2025-03-07 15:25 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0022_rancher_has_script'), + ] + + operations = [ + migrations.AddField( + model_name='rancher', + name='cooperative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rancher_cooperative', to='LiveStock.cooperative'), + ), + ] diff --git a/LiveStock/migrations/0024_auto_20250307_2117.py b/LiveStock/migrations/0024_auto_20250307_2117.py new file mode 100644 index 0000000..5012292 --- /dev/null +++ b/LiveStock/migrations/0024_auto_20250307_2117.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.13 on 2025-03-07 21:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0023_rancher_cooperative'), + ] + + operations = [ + migrations.AddField( + model_name='livestockproduct', + name='company_price', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='livestockproduct', + name='cooperative_price', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='livestockproduct', + name='shipping_price', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='livestockproduct', + name='union_price', + field=models.IntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0025_auto_20250307_2128.py b/LiveStock/migrations/0025_auto_20250307_2128.py new file mode 100644 index 0000000..122fc22 --- /dev/null +++ b/LiveStock/migrations/0025_auto_20250307_2128.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.13 on 2025-03-07 21:28 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0024_auto_20250307_2117'), + ] + + operations = [ + migrations.RemoveField( + model_name='livestockproduct', + name='cooperative_percent', + ), + migrations.RemoveField( + model_name='livestockproduct', + name='union_percent', + ), + ] diff --git a/LiveStock/migrations/0026_auto_20250308_1507.py b/LiveStock/migrations/0026_auto_20250308_1507.py new file mode 100644 index 0000000..cd82b7a --- /dev/null +++ b/LiveStock/migrations/0026_auto_20250308_1507.py @@ -0,0 +1,28 @@ +# Generated by Django 3.2.13 on 2025-03-08 15:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0025_auto_20250307_2128'), + ] + + operations = [ + migrations.AddField( + model_name='cooperative', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='livestockallocations', + name='description', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='livestockallocations', + name='place', + field=models.TextField(null=True), + ), + ] diff --git a/LiveStock/migrations/0027_livestockrolseproduct_total_receipt_weight.py b/LiveStock/migrations/0027_livestockrolseproduct_total_receipt_weight.py new file mode 100644 index 0000000..8178423 --- /dev/null +++ b/LiveStock/migrations/0027_livestockrolseproduct_total_receipt_weight.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-03-09 09:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0026_auto_20250308_1507'), + ] + + operations = [ + migrations.AddField( + model_name='livestockrolseproduct', + name='total_receipt_weight', + field=models.BigIntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0028_auto_20250309_1036.py b/LiveStock/migrations/0028_auto_20250309_1036.py new file mode 100644 index 0000000..31be0f7 --- /dev/null +++ b/LiveStock/migrations/0028_auto_20250309_1036.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-03-09 10:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0027_livestockrolseproduct_total_receipt_weight'), + ] + + operations = [ + migrations.AddField( + model_name='livestockallocations', + name='charge', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='livestockallocations', + name='code', + field=models.CharField(max_length=200, null=True), + ), + ] diff --git a/LiveStock/migrations/0029_livestockrolseproduct_total_allocated.py b/LiveStock/migrations/0029_livestockrolseproduct_total_allocated.py new file mode 100644 index 0000000..c5e50b1 --- /dev/null +++ b/LiveStock/migrations/0029_livestockrolseproduct_total_allocated.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-03-09 14:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0028_auto_20250309_1036'), + ] + + operations = [ + migrations.AddField( + model_name='livestockrolseproduct', + name='total_allocated', + field=models.BigIntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0030_remove_livestockrolseproduct_total_allocated.py b/LiveStock/migrations/0030_remove_livestockrolseproduct_total_allocated.py new file mode 100644 index 0000000..b2d39b1 --- /dev/null +++ b/LiveStock/migrations/0030_remove_livestockrolseproduct_total_allocated.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2025-03-09 14:23 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0029_livestockrolseproduct_total_allocated'), + ] + + operations = [ + migrations.RemoveField( + model_name='livestockrolseproduct', + name='total_allocated', + ), + ] diff --git a/LiveStock/migrations/0031_cooperativeproductsshare.py b/LiveStock/migrations/0031_cooperativeproductsshare.py new file mode 100644 index 0000000..973a2d5 --- /dev/null +++ b/LiveStock/migrations/0031_cooperativeproductsshare.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.13 on 2025-03-10 10:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('LiveStock', '0030_remove_livestockrolseproduct_total_allocated'), + ] + + operations = [ + migrations.CreateModel( + name='CooperativeProductsShare', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('price', models.IntegerField(default=0)), + ('shipping_price', models.IntegerField(default=0)), + ('union_price', models.IntegerField(default=0)), + ('cooperative_price', models.IntegerField(default=0)), + ('cooperative', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_share_product', to='LiveStock.cooperative')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperativeproductsshare_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperativeproductsshare_modifiedby', to=settings.AUTH_USER_MODEL)), + ('product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_share_product', to='LiveStock.livestockproduct')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/LiveStock/migrations/0032_auto_20250310_1639.py b/LiveStock/migrations/0032_auto_20250310_1639.py new file mode 100644 index 0000000..52bf468 --- /dev/null +++ b/LiveStock/migrations/0032_auto_20250310_1639.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-03-10 16:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0031_cooperativeproductsshare'), + ] + + operations = [ + migrations.AddField( + model_name='union', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='livestockallocations', + name='description', + field=models.TextField(blank=True, null=True), + ), + ] diff --git a/LiveStock/migrations/0033_auto_20250310_1747.py b/LiveStock/migrations/0033_auto_20250310_1747.py new file mode 100644 index 0000000..5945905 --- /dev/null +++ b/LiveStock/migrations/0033_auto_20250310_1747.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-03-10 17:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0032_auto_20250310_1639'), + ] + + operations = [ + migrations.AddField( + model_name='livestock', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='rancher', + name='active', + field=models.BooleanField(default=True), + ), + ] diff --git a/LiveStock/migrations/0034_auto_20250311_1002.py b/LiveStock/migrations/0034_auto_20250311_1002.py new file mode 100644 index 0000000..07923cd --- /dev/null +++ b/LiveStock/migrations/0034_auto_20250311_1002.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-03-11 10:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0033_auto_20250310_1747'), + ] + + operations = [ + migrations.AddField( + model_name='livestock', + name='birth_day_gh', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='livestock', + name='registering_date_gh', + field=models.DateTimeField(null=True), + ), + ] diff --git a/LiveStock/migrations/0035_posseller.py b/LiveStock/migrations/0035_posseller.py new file mode 100644 index 0000000..9c6ef80 --- /dev/null +++ b/LiveStock/migrations/0035_posseller.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.13 on 2025-03-11 13:30 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('LiveStock', '0034_auto_20250311_1002'), + ] + + operations = [ + migrations.CreateModel( + name='PosSeller', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('full_name', models.CharField(max_length=200, null=True)), + ('mobile', models.CharField(max_length=50, null=True)), + ('national_id', models.CharField(max_length=50, null=True)), + ('city', models.CharField(max_length=100, null=True)), + ('cooperative', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='seller_pos_cooperative', to='LiveStock.cooperative')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posseller_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posseller_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/LiveStock/migrations/0036_rancher_type.py b/LiveStock/migrations/0036_rancher_type.py new file mode 100644 index 0000000..010c971 --- /dev/null +++ b/LiveStock/migrations/0036_rancher_type.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-03-12 11:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0035_posseller'), + ] + + operations = [ + migrations.AddField( + model_name='rancher', + name='type', + field=models.CharField(default='rural', max_length=200), + ), + ] diff --git a/LiveStock/migrations/0037_auto_20250312_1146.py b/LiveStock/migrations/0037_auto_20250312_1146.py new file mode 100644 index 0000000..185d04b --- /dev/null +++ b/LiveStock/migrations/0037_auto_20250312_1146.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.13 on 2025-03-12 11:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0036_rancher_type'), + ] + + operations = [ + migrations.AddField( + model_name='livestockproduct', + name='heavy_wight_dha', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='livestockproduct', + name='heavy_wight_industrial', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='livestockproduct', + name='light_wight_dha', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='livestockproduct', + name='light_wight_industrial', + field=models.IntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0038_auto_20250312_1422.py b/LiveStock/migrations/0038_auto_20250312_1422.py new file mode 100644 index 0000000..67a3666 --- /dev/null +++ b/LiveStock/migrations/0038_auto_20250312_1422.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-03-12 14:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0037_auto_20250312_1146'), + ] + + operations = [ + migrations.AddField( + model_name='rancher', + name='dhi_amount', + field=models.IntegerField(default=1), + ), + migrations.AddField( + model_name='rancher', + name='industrial', + field=models.BooleanField(default=False), + ), + ] diff --git a/LiveStock/migrations/0039_alter_rancher_dhi_amount.py b/LiveStock/migrations/0039_alter_rancher_dhi_amount.py new file mode 100644 index 0000000..05eef66 --- /dev/null +++ b/LiveStock/migrations/0039_alter_rancher_dhi_amount.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-03-12 14:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0038_auto_20250312_1422'), + ] + + operations = [ + migrations.AlterField( + model_name='rancher', + name='dhi_amount', + field=models.IntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0040_auto_20250409_1829.py b/LiveStock/migrations/0040_auto_20250409_1829.py new file mode 100644 index 0000000..657fe94 --- /dev/null +++ b/LiveStock/migrations/0040_auto_20250409_1829.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-04-09 18:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0039_alter_rancher_dhi_amount'), + ] + + operations = [ + migrations.AddField( + model_name='livestock', + name='archive', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='livestock', + name='archiver', + field=models.CharField(max_length=250, null=True), + ), + ] diff --git a/LiveStock/migrations/0041_livestock_archive_date.py b/LiveStock/migrations/0041_livestock_archive_date.py new file mode 100644 index 0000000..3f34be2 --- /dev/null +++ b/LiveStock/migrations/0041_livestock_archive_date.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-04-12 16:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0040_auto_20250409_1829'), + ] + + operations = [ + migrations.AddField( + model_name='livestock', + name='archive_date', + field=models.DateTimeField(null=True), + ), + ] diff --git a/LiveStock/migrations/0042_auto_20250414_1544.py b/LiveStock/migrations/0042_auto_20250414_1544.py new file mode 100644 index 0000000..47248dd --- /dev/null +++ b/LiveStock/migrations/0042_auto_20250414_1544.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2025-04-14 15:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0041_livestock_archive_date'), + ] + + operations = [ + migrations.AddField( + model_name='livestock', + name='return_from_archive_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='livestock', + name='returner_from_archive', + field=models.CharField(max_length=250, null=True), + ), + ] diff --git a/LiveStock/migrations/0043_livestock_age_of_archive.py b/LiveStock/migrations/0043_livestock_age_of_archive.py new file mode 100644 index 0000000..c024edc --- /dev/null +++ b/LiveStock/migrations/0043_livestock_age_of_archive.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-04-14 15:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0042_auto_20250414_1544'), + ] + + operations = [ + migrations.AddField( + model_name='livestock', + name='age_of_archive', + field=models.IntegerField(default=1), + ), + ] diff --git a/LiveStock/migrations/0044_cooperativeproductsshare_company_price.py b/LiveStock/migrations/0044_cooperativeproductsshare_company_price.py new file mode 100644 index 0000000..d3dfe20 --- /dev/null +++ b/LiveStock/migrations/0044_cooperativeproductsshare_company_price.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-05-27 12:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0043_livestock_age_of_archive'), + ] + + operations = [ + migrations.AddField( + model_name='cooperativeproductsshare', + name='company_price', + field=models.IntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/0045_auto_20250810_1102.py b/LiveStock/migrations/0045_auto_20250810_1102.py new file mode 100644 index 0000000..90fe16c --- /dev/null +++ b/LiveStock/migrations/0045_auto_20250810_1102.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.13 on 2025-08-10 11:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0044_cooperativeproductsshare_company_price'), + ] + + operations = [ + migrations.AddField( + model_name='cooperative', + name='first_sub_cooperative_account', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='cooperative', + name='first_sub_cooperative_price', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='cooperative', + name='second_sub_cooperative_account', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='cooperative', + name='second_sub_cooperative_price', + field=models.IntegerField(default=0), + ), + ] diff --git a/LiveStock/migrations/__init__.py b/LiveStock/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/LiveStock/models.py b/LiveStock/models.py new file mode 100644 index 0000000..ee55f85 --- /dev/null +++ b/LiveStock/models.py @@ -0,0 +1,372 @@ +import datetime + +from authentication.models import BaseModel, SystemUserProfile, SystemAddress, BankCard +from django.db import models + + +class LiveStockProvinceJahad(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="live_stock_jahad_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="live_stock_jahad_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="live_stock_jahad_bank_info", + null=True + ) + name = models.CharField(max_length=200, null=True) + mobile = models.CharField(max_length=200, null=True) + type = models.CharField(max_length=200, null=True) + account = models.CharField(max_length=200, null=True) + national_id = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(LiveStockProvinceJahad, self).save(*args, **kwargs) + + +class Union(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="union_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="union_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="union_bank_info", + null=True + ) + + name = models.CharField(max_length=200, null=True) + mobile = models.CharField(max_length=200, null=True) + type = models.CharField(max_length=200, null=True) + account = models.CharField(max_length=200, null=True) + national_id = models.CharField(max_length=100, null=True) + active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(Union, self).save(*args, **kwargs) + + +class Cooperative(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="cooperative_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="cooperative_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="cooperative_bank_info", + null=True + ) + name = models.CharField(max_length=200, null=True) + mobile = models.CharField(max_length=200, null=True) + type = models.CharField(max_length=200, null=True) + account = models.CharField(max_length=200, null=True) + national_id = models.CharField(max_length=100, null=True) + active = models.BooleanField(default=True) + first_sub_cooperative_price = models.IntegerField(default=0) + first_sub_cooperative_account = models.CharField(max_length=200, null=True) + second_sub_cooperative_price = models.IntegerField(default=0) + second_sub_cooperative_account = models.CharField(max_length=200, null=True) + + def save(self, *args, **kwargs): + super(Cooperative, self).save(*args, **kwargs) + + +class Rancher(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="rancher_user", + null=True + ) + # address = models.ForeignKey( + # SystemAddress, + # on_delete=models.CASCADE, + # related_name="rancher_address", + # null=True + # ) + # user_bank_info = models.ForeignKey( + # BankCard, + # on_delete=models.CASCADE, + # related_name="rancher_bank_info", + # null=True + # ) + # contractor = models.ForeignKey( + # Contractor, + # on_delete=models.CASCADE, + # related_name="rancher_contractor", + # null=True + # ) + cooperative = models.ForeignKey( + Cooperative, + on_delete=models.CASCADE, + related_name="rancher_cooperative", + null=True + ) + name = models.CharField(max_length=200, null=True) + registering_user = models.CharField(max_length=200, null=True) + lng = models.FloatField(default=0) + lot = models.FloatField(default=0) + mobile = models.CharField(max_length=200, null=True) + fullname = models.CharField(max_length=200, null=True) + city = models.CharField(max_length=200, null=True) + herd_name = models.CharField(max_length=200, null=True) + unit_id = models.CharField(max_length=100, null=True) + postal_code = models.CharField(max_length=100, null=True) + epidemiological_code = models.CharField(max_length=100, null=True) + herd_code = models.CharField(max_length=100, null=True) + national_id = models.CharField(max_length=100, null=True) + allow_buy = models.BooleanField(default=True) + weight_allocation_light = models.IntegerField(default=0) + weight_allocation_heavy = models.IntegerField(default=0) + weight_quota_heavy = models.IntegerField(default=0) + weight_quota_light = models.IntegerField(default=0) + total_weight = models.BigIntegerField(default=0) + contractor_code = models.CharField(max_length=100, null=True) + sheep = models.IntegerField(default=0) + goat = models.IntegerField(default=0) + cow = models.IntegerField(default=0) + horse = models.IntegerField(default=0) + camel = models.IntegerField(default=0) + light_livestock = models.IntegerField(default=0) + heavy_livestock = models.IntegerField(default=0) + has_script = models.BooleanField(default=False) + active = models.BooleanField(default=True) + type = models.CharField(max_length=200, default='rural') + industrial = models.BooleanField(default=False) + dhi_amount = models.IntegerField(default=0) + + + def save(self, *args, **kwargs): + # live_stocks = LiveStock.objects.filter(trash=False, herd_code=self.herd_code).only('type') + # light_livestock = live_stocks.filter(type__in=('بز', 'گوسفند')).count() + # heavy_livestock = live_stocks.filter(type__in=('گاو', 'اسب', 'شتر')).count() + # product = LiveStockProduct.objects.filter(trash=False, name='سبوس').first() + # self.weight_quota_heavy=product.heavy_wight * heavy_livestock + # self.weight_quota_light=product.light_wight * light_livestock + super(Rancher, self).save(*args, **kwargs) + + +class LiveStock(BaseModel): + rancher = models.ForeignKey(Rancher, on_delete=models.CASCADE, null=True) + national_id_livestock_code = models.CharField(max_length=200, null=True) + herd_code = models.CharField(max_length=100, null=True) + type = models.CharField(max_length=200, null=True) + birth_day = models.CharField(max_length=200, null=True) + gender = models.CharField(max_length=100, null=True) + contractor_code = models.CharField(max_length=100, null=True) + unique_identifier = models.CharField(max_length=100, null=True) + agent = models.CharField(max_length=100, null=True) + registering_user = models.CharField(max_length=200, null=True) + registering_date = models.CharField(max_length=200, null=True) + active = models.BooleanField(default=True) + birth_day_gh = models.DateTimeField(null=True) + registering_date_gh = models.DateTimeField(null=True) + archive=models.BooleanField(default=False) + age_of_archive=models.IntegerField(default=1) + archiver=models.CharField(max_length=250,null=True) + archive_date=models.DateTimeField(null=True) + returner_from_archive=models.CharField(max_length=250,null=True) + return_from_archive_date=models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + super(LiveStock, self).save(*args, **kwargs) + + +class LiveStockProduct(BaseModel): + name = models.CharField(max_length=200, null=True) + image = models.CharField(max_length=500, null=True) + unit = models.CharField(max_length=200, null=True) + price = models.IntegerField(default=0) + light_wight = models.IntegerField(default=0) + heavy_wight = models.IntegerField(default=0) + company_price = models.IntegerField(default=0) + shipping_price = models.IntegerField(default=0) + union_price = models.IntegerField(default=0) + cooperative_price = models.IntegerField(default=0) + light_wight_industrial = models.IntegerField(default=0) + heavy_wight_industrial = models.IntegerField(default=0) + light_wight_dha = models.IntegerField(default=0) + heavy_wight_dha = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(LiveStockProduct, self).save(*args, **kwargs) + + +class CooperativeProductsShare(BaseModel): + cooperative = models.ForeignKey( + Cooperative, + on_delete=models.CASCADE, + related_name="cooperative_share_product", + null=True + ) + product = models.ForeignKey( + LiveStockProduct, + on_delete=models.CASCADE, + related_name="cooperative_share_product", + null=True + ) + price = models.IntegerField(default=0) + shipping_price = models.IntegerField(default=0) + union_price = models.IntegerField(default=0) + cooperative_price = models.IntegerField(default=0) + company_price = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(CooperativeProductsShare, self).save(*args, **kwargs) + + +class LiveStockRolseProduct(BaseModel): + parent_product = models.ForeignKey( + LiveStockProduct, + on_delete=models.CASCADE, + related_name="parents_product", + null=True + ) + jahad = models.ForeignKey( + LiveStockProvinceJahad, + on_delete=models.CASCADE, + related_name="jahad_product", + null=True + ) + union = models.ForeignKey( + Union, + on_delete=models.CASCADE, + related_name="union_product", + null=True + ) + cooperative = models.ForeignKey( + Cooperative, + on_delete=models.CASCADE, + related_name="cooperative_product", + null=True + ) + # rancher = models.ForeignKey( + # Rancher, + # on_delete=models.CASCADE, + # related_name="rancher_product", + # null=True + # ) + name = models.CharField(max_length=200, null=True) + total_weight = models.BigIntegerField(default=0) + total_receipt_weight = models.BigIntegerField(default=0) + total_allocated_weight = models.BigIntegerField(default=0) + total_remain_weight = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + self.total_remain_weight = self.total_weight - self.total_allocated_weight + super(LiveStockRolseProduct, self).save(*args, **kwargs) + + +class LiveStockAllocations(BaseModel): + product = models.ForeignKey( + LiveStockRolseProduct, + on_delete=models.CASCADE, + related_name="product_allocation", + null=True + ) + jahad = models.ForeignKey( + LiveStockProvinceJahad, + on_delete=models.CASCADE, + related_name="jahad_allocation", + null=True + ) + union = models.ForeignKey( + Union, + on_delete=models.CASCADE, + related_name="union_allocation", + null=True + ) + cooperative = models.ForeignKey( + Cooperative, + on_delete=models.CASCADE, + related_name="cooperative_allocation", + null=True + ) + state = models.CharField(max_length=200, default='pending') + weight = models.BigIntegerField(default=0) + real_weight = models.BigIntegerField(default=0) + date = models.DateTimeField(default=datetime.datetime.now) + allocate_from = models.CharField(max_length=200, null=True) + allocate_to = models.CharField(max_length=200, null=True) + place = models.TextField(null=True) + charge = models.BooleanField(default=False) + code = models.CharField(max_length=200, null=True) + description = models.TextField(null=True, blank=True) + + def save(self, *args, **kwargs): + super(LiveStockAllocations, self).save(*args, **kwargs) + + +class Contractor(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="contractor_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="contractor_user", + null=True + ) + cooperative = models.ForeignKey( + Cooperative, + on_delete=models.CASCADE, + related_name="contractor_cooperative", + null=True + ) + contractor_code = models.CharField(max_length=100, null=True) + fullname = models.CharField(max_length=200, null=True) + entity_code = models.CharField(max_length=200, null=True) + national_id = models.CharField(max_length=100, null=True) + company_name = models.CharField(max_length=200, null=True) + number_of_rancher = models.IntegerField(default=0) + heavy_livestock = models.IntegerField(default=0) + light_livestock = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(Contractor, self).save(*args, **kwargs) + + +class PosSeller(BaseModel): + cooperative = models.ForeignKey( + Cooperative, + on_delete=models.CASCADE, + related_name="seller_pos_cooperative", + null=True + ) + full_name=models.CharField(max_length=200,null=True) + mobile=models.CharField(max_length=50,null=True) + national_id=models.CharField(max_length=50,null=True) + city=models.CharField(max_length=100,null=True) + + def save(self, *args, **kwargs): + super(PosSeller, self).save(*args, **kwargs) \ No newline at end of file diff --git a/LiveStock/sms_management.py b/LiveStock/sms_management.py new file mode 100644 index 0000000..d011b65 --- /dev/null +++ b/LiveStock/sms_management.py @@ -0,0 +1,29 @@ +import requests + +from LiveStock.models import Cooperative +from authentication.sahandsms.sms import USERNAME_SMS, PASSWORD_SMS, USERNAME_SMS_FINANCIAL, PASSWORD_SMS_FINANCIAL +from panel.helper import check_mobile_number + + +def send_sms_for_cooperative(request): + cooperative=Cooperative.objects.filter(trash=False) + for c in cooperative: + mobile=c.user.mobile + password=c.user.password + message = 'کاربر گرامی' \ + f'\n' \ + f'اطلاعات کاربری شما در سامانه به شرح زیر میباشد:' \ + f'\n' \ + f'\n' \ + f'نام کاربری: {mobile}' \ + f'\n' \ + f'رمز عبور: {password}' \ + f'\n' \ + f'(سامانه رصدیار)' \ + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + diff --git a/LiveStock/tests.py b/LiveStock/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/LiveStock/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/LiveStock/urls.py b/LiveStock/urls.py new file mode 100644 index 0000000..8fe1824 --- /dev/null +++ b/LiveStock/urls.py @@ -0,0 +1,10 @@ +from django.urls import path, include + +urlpatterns = [ + path('jahad/', include('LiveStock.Jahad.urls')), + path('union/', include('LiveStock.Union.urls')), + path('cooperative/', include('LiveStock.Cooperative.urls')), + path('rancher/', include('LiveStock.Rancher.urls')), + path('live-stock/', include('LiveStock.LiveStoksAndPoultry.urls')), + path('contractor/', include('LiveStock.Contractor.urls')), +] diff --git a/LiveStock/views.py b/LiveStock/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/LiveStock/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/README.md b/README.md new file mode 100644 index 0000000..13093a6 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# KuChicken +repositori backend for KuChicken diff --git a/RasadyaarBale/__init__.py b/RasadyaarBale/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/RasadyaarBale/admin.py b/RasadyaarBale/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/RasadyaarBale/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/RasadyaarBale/apps.py b/RasadyaarBale/apps.py new file mode 100644 index 0000000..bc83851 --- /dev/null +++ b/RasadyaarBale/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class RasadyaarbaleConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'RasadyaarBale' diff --git a/RasadyaarBale/helper.py b/RasadyaarBale/helper.py new file mode 100644 index 0000000..731807e --- /dev/null +++ b/RasadyaarBale/helper.py @@ -0,0 +1 @@ +Token="1799324940:4dUGkugC2MtQEddIoZRALD68tzdwAXzOci9lRkE3" diff --git a/RasadyaarBale/migrations/0001_initial.py b/RasadyaarBale/migrations/0001_initial.py new file mode 100644 index 0000000..3b3b273 --- /dev/null +++ b/RasadyaarBale/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.13 on 2025-05-25 15:05 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='User_Bale', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('chat_id', models.BigIntegerField(unique=True)), + ('first_name', models.CharField(blank=True, max_length=100, null=True)), + ('last_name', models.CharField(blank=True, max_length=100, null=True)), + ('phone_number', models.CharField(blank=True, max_length=20, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_bale_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_bale_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/RasadyaarBale/migrations/0002_user_bale_super_admin.py b/RasadyaarBale/migrations/0002_user_bale_super_admin.py new file mode 100644 index 0000000..d48eded --- /dev/null +++ b/RasadyaarBale/migrations/0002_user_bale_super_admin.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-05-26 15:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('RasadyaarBale', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='user_bale', + name='super_admin', + field=models.BooleanField(default=False), + ), + ] diff --git a/RasadyaarBale/migrations/0003_user_bale_rasadyar_user.py b/RasadyaarBale/migrations/0003_user_bale_rasadyar_user.py new file mode 100644 index 0000000..c4a9062 --- /dev/null +++ b/RasadyaarBale/migrations/0003_user_bale_rasadyar_user.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.13 on 2025-05-27 11:54 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0070_auto_20250527_1154'), + ('RasadyaarBale', '0002_user_bale_super_admin'), + ] + + operations = [ + migrations.AddField( + model_name='user_bale', + name='rasadyar_user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rasadyar_user', to='authentication.systemuserprofile'), + ), + ] diff --git a/RasadyaarBale/migrations/__init__.py b/RasadyaarBale/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/RasadyaarBale/models.py b/RasadyaarBale/models.py new file mode 100644 index 0000000..9137fcb --- /dev/null +++ b/RasadyaarBale/models.py @@ -0,0 +1,19 @@ +from django.db import models + +# Create your models here. +from authentication.models import BaseModel, SystemUserProfile + + +class User_Bale(BaseModel): + rasadyar_user = models.ForeignKey(SystemUserProfile, on_delete=models.CASCADE, + related_name="rasadyar_user", + null=True) + chat_id = models.BigIntegerField(unique=True) + first_name = models.CharField(max_length=100, null=True, blank=True) + last_name = models.CharField(max_length=100, null=True, blank=True) + phone_number = models.CharField(max_length=20, null=True, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + super_admin = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(User_Bale, self).save(*args, **kwargs) diff --git a/RasadyaarBale/tests.py b/RasadyaarBale/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/RasadyaarBale/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/RasadyaarBale/urls.py b/RasadyaarBale/urls.py new file mode 100644 index 0000000..b6ec301 --- /dev/null +++ b/RasadyaarBale/urls.py @@ -0,0 +1,15 @@ +from django.urls import include, path +from rest_framework.routers import DefaultRouter + +from RasadyaarBale.views import bale_set_webhook, BaleWebhookView + +router = DefaultRouter() + + + +urlpatterns = [ + path('', include(router.urls)), + path('set_webhook/', bale_set_webhook), + path('webhook/', BaleWebhookView.as_view()), + +] \ No newline at end of file diff --git a/RasadyaarBale/views.py b/RasadyaarBale/views.py new file mode 100644 index 0000000..ecb8681 --- /dev/null +++ b/RasadyaarBale/views.py @@ -0,0 +1,230 @@ +import json + +import requests +from django.http import HttpResponse +from rest_framework import status +from rest_framework.permissions import AllowAny +from rest_framework.response import Response +from rest_framework.views import APIView + +from authentication.models import SystemUserProfile +from general_urls import base_url_for_sms_report +from panel.convert_date import convert_to_shamsi +from panel.models import PosCompany, ProductsTransactions +from .helper import Token +from .models import User_Bale + + +class BaleWebhookView(APIView): + permission_classes = [AllowAny] + + def post(self, request): + try: + data = request.data + + if 'message' in data: + message = data['message'] + chat_id = message['chat']['id'] + user_info = message.get('from', {}) + + user, created = User_Bale.objects.update_or_create( + chat_id=chat_id, + defaults={ + 'first_name': user_info.get('first_name'), + 'last_name': user_info.get('last_name'), + } + ) + + text = message.get('text', '') + contact = message.get('contact', '') + + if text == '/start': + welcome_message = "سلام! به ربات هوشمند سامانه رصدیار خوش آمدید. لطفاً برای ادامه شماره تلفن خود را ثبت کنید." + + keyboard = { + "keyboard": [[{ + "text": "📱 ارسال شماره تلفن", + "request_contact": True + }]], + "resize_keyboard": True, + "one_time_keyboard": True + } + + self.send_message( + chat_id, + welcome_message, + reply_markup=keyboard + ) + elif contact: + phone = contact['phone_number'] + if phone.startswith('98'): + phone = '0' + phone[2:] + system_user=SystemUserProfile.objects.filter(trash=False,mobile=phone).first() + if system_user: + user.rasadyar_user=system_user + user.phone_number = phone + user.save() + + keyboard = { + "keyboard": [ + [{"text": "ℹ️ درباره ما"}, + {"text": "📬 تماس با ما"} + ] + ], + "resize_keyboard": True, + "one_time_keyboard": False + } + + self.send_message( + chat_id, + f"شماره شما ثبت شد: {phone}", + reply_markup=keyboard + ) + elif text == "ℹ️ درباره ما": + self.send_message( + chat_id, + "ربات هوشمند ساخته شده با پایتون \n\n" + "توسعه دهنده: شرکت هوشمندسازان فرآیند های نوین ماداکتو" + ) + elif text == "📬 تماس با ما": + self.send_message( + chat_id, + "برای ارتباط با ما:\n\n" + "📧 ایمیل: info@mnpc.ir\n" + "☎️ تلفن: 28421237-021\n" + "🌐 وبسایت: https://mnpc.ir/ \n" + ) + + else: + self.send_message(chat_id, f"لطفا از دکمه های راهنما استفاده کنید.") + + return Response({'status': 'ok'}, status=status.HTTP_200_OK) + + except Exception as e: + print("خطا:", e) + return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST) + + def send_message(self, chat_id, text, reply_markup=None): + url = f"https://tapi.bale.ai/bot{Token}/sendMessage" + payload = { + "chat_id": chat_id, + "text": text + } + + if reply_markup: + payload["reply_markup"] = reply_markup + + headers = {'Content-Type': 'application/json'} + + try: + response = requests.post(url, data=json.dumps(payload), headers=headers) + response.raise_for_status() + return response.json() + except requests.exceptions.RequestException as e: + print("خطا در ارسال پیام:", e) + return None + + +def bale_set_webhook(request): + response = requests.post( + f"https://tapi.bale.ai/bot{Token}/setWebhook", + json={"url": f"https://{base_url_for_sms_report}backend.rasadyaar.ir/bale/webhook/"} + ) + + return HttpResponse(response.json()) + + +def send_message_for_bale(chat_id, text, reply_markup=None): + url = f"https://tapi.bale.ai/bot{Token}/sendMessage" + payload = { + "chat_id": chat_id, + "text": text + } + + if reply_markup: + payload["reply_markup"] = reply_markup + + headers = {'Content-Type': 'application/json'} + + try: + response = requests.post(url, data=json.dumps(payload), headers=headers) + response.raise_for_status() + return response.json() + except requests.exceptions.RequestException as e: + print("خطا در ارسال پیام:", e) + return None + + +def send_transaction(transaction, chat_ids): + try: + if transaction.paid or transaction.status in (0, 1): + pos_company = PosCompany.objects.filter(trash=False, en_name__exact=transaction.posProvider).first() + if pos_company: + pos_company_name = pos_company.name + else: + pos_company_name = 'ناشناس' + if transaction.pos.kill_house: + dict_info = { + 'name': transaction.pos.kill_house.name, + 'mobile': transaction.pos.kill_house.kill_house_operator.user.mobile, + 'fullname': transaction.pos.kill_house.kill_house_operator.user.fullname, + 'city': transaction.pos.kill_house.kill_house_operator.user.city.name, + 'province': transaction.pos.kill_house.kill_house_operator.user.province.name, + 'national_code': transaction.pos.kill_house.kill_house_operator.user.national_code, + 'type': 'کشتارگاه', + } + elif transaction.pos.guild: + dict_info = { + 'name': transaction.pos.guild.guilds_name, + 'mobile': transaction.pos.guild.user.mobile, + 'fullname': transaction.pos.guild.user.fullname, + 'city': transaction.pos.guild.user.city.name, + 'province': transaction.pos.guild.user.province.name, + 'national_code': transaction.pos.guild.user.national_code, + 'type': 'صنف', + } + else: + dict_info = { + 'name': transaction.pos.cooperative.name, + 'mobile': transaction.pos.cooperative.user.mobile, + 'fullname': transaction.pos.cooperative.user.fullname, + 'city': transaction.pos.cooperative.user.city.name, + 'province': transaction.pos.cooperative.user.province.name, + 'national_code': transaction.pos.cooperative.user.national_code, + 'type': 'سامانه دام', + } + + price = "{:,}".format(int(transaction.price)) + + alert_message = ( + f"*---* {transaction.result} *---*\n" + f"{dict_info['type']} : *{dict_info['name']}*\n" + f"آدرس : *{dict_info['province']}* - *{dict_info['city']}*\n" + f"درگاه : *{pos_company_name}*\n" + f"زمان : *{convert_to_shamsi(datetime=transaction.date, in_value=True)}*\n" + f"مبلغ کل : *{price}* ریال\n\n" + ) + products = ProductsTransactions.objects.filter(trash=False, transaction=transaction) + for prd in products: + if prd.live_stack_products: + fi_prd_price = "{:,}".format(int(int(prd.cur_price) / int(prd.cur_weight)) if prd.cur_weight > 0 else 0) + else: + fi_prd_price = "{:,}".format(int(prd.price)) + cur_weight = "{:,}".format(int(prd.cur_weight)) + cur_price = "{:,}".format(int(prd.cur_price)) + if prd.cur_weight != 1: + alert_message += ( + f"*{prd.name}* (فی {fi_prd_price} ریال)\n" + f"وزن خریداری شده:({cur_weight}{prd.targetunit}) \n" + f"مبلغ: *{cur_price}* ریال\n\n" + ) + else: + alert_message += ( + f"*{prd.name}* \n" + f"خریداری شده : *{cur_price}* ریال\n\n" + ) + + for i in chat_ids: + send_message_for_bale(chat_id=i, text=alert_message) + except: + pass diff --git a/assets/img/img-min.png b/assets/img/img-min.png new file mode 100644 index 0000000..b2cae35 Binary files /dev/null and b/assets/img/img-min.png differ diff --git a/authentication/__init__.py b/authentication/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/authentication/admin.py b/authentication/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/authentication/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/authentication/apps.py b/authentication/apps.py new file mode 100644 index 0000000..8bab8df --- /dev/null +++ b/authentication/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AuthenticationConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'authentication' diff --git a/authentication/arvan_image/arvan_storage.py b/authentication/arvan_image/arvan_storage.py new file mode 100644 index 0000000..6b2f9da --- /dev/null +++ b/authentication/arvan_image/arvan_storage.py @@ -0,0 +1,169 @@ +# توابع مورد نیاز برای اتصال به ای پی آی استوریج آروان +# test +import boto3 +import logging +from botocore.exceptions import ClientError +from django.http import HttpResponse +from PIL import Image +import io +import base64 + +ARVAN_STORAGE_URL = "https://dmstore.s3.ir-thr-at1.arvanstorage.ir/36bba98f-a813-4667-bd60-33aef708bcba.jpg?AWSAccessKeyId=d5739a44-e663-4f43-99f3-13121a62a9e6&Signature=KpBpHBtAS77Y3hHx53g6bmjlGpc%3D&Expires=1651552380" + + +def connect(): + logging.basicConfig(level=logging.INFO) + + try: + s3_resource = boto3.resource( + 's3', + endpoint_url='https://s3.ir-thr-at1.arvanstorage.ir', + aws_access_key_id='b0b563b2-bb60-4faf-b09a-660982e70b00', + aws_secret_access_key='abdcccaadbd3d897b5432f72bc91048940e012ffa4f308ba0fe16f28e3c80e57' + ) + except Exception as exc: + logging.info(exc) + return s3_resource + + +def get_bucket_list(): + s3_resource = connect() + li = [] + try: + for bucket in s3_resource.buckets.all(): + logging.info(f'bucket_name: {bucket.name}') + li.append(bucket.name) + except ClientError as exc: + logging.error(exc) + return li[0] + + +# این تابع رو درتمامی قسمت های سیستم میتونیم برای ذخیره عکس بر روی استوریج آروان استفاده کنیم + +# def upload_object(image_data, bucket_name, object_name): +# resource_connect = connect() +# s3_resource = resource_connect +# bucket = s3_resource.Bucket(bucket_name) +# with open(object_name, "wb") as fh: +# fh.write(base64.standard_b64decode(image_data)) +# with open(object_name, "rb") as fh: +# bucket.put_object( +# ACL='public-read', +# Body=fh, +# Key=object_name +# ) + +def upload_object(image_data, bucket_name, object_name): + resource_connect = connect() + s3_resource = resource_connect + bucket = s3_resource.Bucket(bucket_name) + buffer = io.BytesIO() + imgdata = base64.b64decode(image_data) + img = Image.open(io.BytesIO(imgdata)) + new_img = img.resize((500, 500)) # x, y + new_img.save(buffer, format="PNG") + img_b64 = base64.b64encode(buffer.getvalue()) + with open(object_name, "wb") as fh: + fh.write(base64.standard_b64decode(img_b64)) + # base64.standard_b64decode(image_data) + with open(object_name, "rb") as fh: + bucket.put_object( + ACL='public-read', + Body=fh, + Key=object_name + ) + + + + +def compress_image(image_data, quality): + imgdata = base64.b64decode(image_data) + img = Image.open(io.BytesIO(imgdata)) + buffer = io.BytesIO() + img.save(buffer, format='JPEG', quality=quality) + compressed_data = buffer.getvalue() + img_b64 = base64.b64encode(compressed_data) + return img_b64 + + +def upload_object_resize(image_data, bucket_name, object_name): + resource_connect = connect() + s3_resource = resource_connect + bucket = s3_resource.Bucket(bucket_name) + # compressed_img = compress_image(image_data, quality=200) # تغییر دهید quality به مقدار دلخواه خود + decoded_image_data = base64.b64decode(image_data) + image_stream = io.BytesIO(decoded_image_data) + bucket.put_object( + ACL='public-read', + Body=image_stream, + Key=object_name + ) + + # with open(object_name, "wb") as fh: + # fh.write(base64.standard_b64decode(compressed_img)) + # + # with open(object_name, "rb") as fh: + # bucket.put_object( + # ACL='public-read', + # Body=fh, + # Key=object_name + # ) + + +# def upload_object_resize(image_data, bucket_name, object_name): +# resource_connect = connect() +# s3_resource = resource_connect +# bucket = s3_resource.Bucket(bucket_name) +# buffer = io.BytesIO() +# imgdata = base64.b64decode(image_data) +# img = Image.open(io.BytesIO(imgdata)) +# img.save(buffer, format="PNG") +# img_b64 = base64.b64encode(buffer.getvalue()) +# with open(object_name, "wb") as fh: +# fh.write(base64.standard_b64decode(img_b64)) +# # base64.standard_b64decode(image_data) +# with open(object_name, "rb") as fh: +# bucket.put_object( +# ACL='public-read', +# Body=fh, +# Key=object_name +# ) + +def upload_object_less_size(image_data, bucket_name, object_name): + resource_connect = connect() + s3_resource = resource_connect + bucket = s3_resource.Bucket(bucket_name) + buffer = io.BytesIO() + imgdata = base64.b64decode(image_data) + img = Image.open(io.BytesIO(imgdata)) + # new_img = img.resize((500, 500)) # x, y + img.save(buffer, format="PNG") + img_b64 = base64.b64encode(buffer.getvalue()) + with open(object_name, "wb") as fh: + fh.write(base64.standard_b64decode(img_b64)) + # base64.standard_b64decode(image_data) + with open(object_name, "rb") as fh: + bucket.put_object( + ACL='public-read', + Body=fh, + Key=object_name + ) + + +def upload_object_for_poultry_science(image_data, bucket_name, object_name): + resource_connect = connect() + s3_resource = resource_connect + bucket = s3_resource.Bucket(bucket_name) + buffer = io.BytesIO() + imgdata = base64.b64decode(image_data) + new_img = Image.open(io.BytesIO(imgdata)) + new_img.save(buffer, format="JPEG") + img_b64 = base64.b64encode(buffer.getvalue()) + with open(object_name, "wb") as fh: + fh.write(base64.standard_b64decode(img_b64)) + with open(object_name, "rb") as fh: + bucket.put_object( + ACL='public-read', + Body=fh, + Key=object_name + ) diff --git a/authentication/filterset.py b/authentication/filterset.py new file mode 100644 index 0000000..0bc12d5 --- /dev/null +++ b/authentication/filterset.py @@ -0,0 +1,29 @@ +from url_filter.filtersets import ModelFilterSet +# from url_filter.filtersets import ModelFilterSet +from authentication.models import ( + UserProfile, + SystemUserProfile, ExternalTransaction +) +from panel.models import PoultryRequestExchange + + +# فیلترست مریوط به مدل کاربر (برای قسمت جستجو اطلاعات کاربراستفاده میشود) +class UserProfileFilterSet(ModelFilterSet): + class Meta: + model = UserProfile + + +# فیلترست مریوط به مدل درخواست مرغدار (برای قسمت جستجو درخواست مرغدار استفاده میشود) +class PoultryRequestExchangeFilterSet(ModelFilterSet): + class Meta: + model = PoultryRequestExchange + + +class SystemUserProfileFilteSet(ModelFilterSet): + class Meta: + model = SystemUserProfile + + +class ExternalTransactionFilterSet(ModelFilterSet): + class Meta: + model = ExternalTransaction diff --git a/authentication/healthcheck.py b/authentication/healthcheck.py new file mode 100644 index 0000000..4c079a2 --- /dev/null +++ b/authentication/healthcheck.py @@ -0,0 +1,5 @@ +from django.http import JsonResponse + + +def health_check(request): + return JsonResponse({"status": "ok"}) diff --git a/authentication/helper/__init__.py b/authentication/helper/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/authentication/helper/helper.py b/authentication/helper/helper.py new file mode 100644 index 0000000..48a3957 --- /dev/null +++ b/authentication/helper/helper.py @@ -0,0 +1,78 @@ +from django.contrib.auth.models import User +from rest_framework import status +from rest_framework.response import Response +from authentication.models import City, SystemUserProfile, SystemAddress +from authentication.views import ARTA_URL_REGISTER +from panel.admin import PROJECT_API_KEY +from panel.models import Guilds, Wallet +import requests + + +def register_user(group, city_name, mobile, first_name, last_name, national_id, postal_code, address_text): + try: + # Fetch city and related province + city = City.objects.select_related('province').get(name=city_name) + province = city.province + except City.DoesNotExist: + return Response({"result": "شهر یافت نشد"}, status=status.HTTP_400_BAD_REQUEST) + + # Check if user profile exists and if they are associated with a guild + system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).last() + if system_profile and Guilds.objects.filter(user=system_profile, trash=False).exists(): + return 'exist' + + # Register a new user if system profile does not exist + if not system_profile: + password = "123456" + registration_data = { + "username": mobile, + "password": password, + "api_key": PROJECT_API_KEY + } + + # Attempt to register the user via ARTA + response = requests.post(ARTA_URL_REGISTER, data=registration_data, verify=False) + if response.status_code != 200: + return None + + + # Create Django user + user = User.objects.create(username=mobile, first_name=first_name, last_name=last_name) + + # Generate base order ID + last_profile = SystemUserProfile.objects.order_by('-base_order').first() + base_order = (last_profile.base_order + 1) if last_profile else 1000 + + # Create system profile + system_profile = SystemUserProfile.objects.create( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=f"{first_name} {last_name}", + user=user, + base_order=base_order, + password=password, + national_id=national_id, + city=city, + province=province + ) + + # Create address for the user + address = SystemAddress.objects.create( + city=city, + province=province, + address=address_text, + postal_code=postal_code + ) + + # Assign role to the user + system_profile.role.add(group) + + # Create wallet for the user + wallet = Wallet.objects.create() + + return { + "system_profile": system_profile, + "address": address, + "wallet": wallet + } diff --git a/authentication/helper/image_services.py b/authentication/helper/image_services.py new file mode 100644 index 0000000..aec5c13 --- /dev/null +++ b/authentication/helper/image_services.py @@ -0,0 +1,21 @@ +from ticket.helper import send_image_to_server + + +def upload_image(req=None, field=None): + if req.data[field] != "": + req.data[field] = send_image_to_server(req.data[field]) + elif req.data[field] == "": + req.data[field] = "empty" + return req + + +def upload_listed_image(req=None, field=None): + image_list = [] + if req.data[field] != []: + for item in req.data[field]: + image_list.append(send_image_to_server(item)) + req.data.pop(field) + req.data[field] = image_list + elif req.data[field] == "": + req.data[field] = "empty" + return req diff --git a/authentication/helper/make_user_gate_way_id.py b/authentication/helper/make_user_gate_way_id.py new file mode 100644 index 0000000..d728fad --- /dev/null +++ b/authentication/helper/make_user_gate_way_id.py @@ -0,0 +1,12 @@ +import string +import random + +from authentication.models import SystemUserProfile +from general_urls import base_user_gate_way_id + +while (True): + res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=5)) + res = base_user_gate_way_id + res + if not SystemUserProfile.objects.filter(user_gate_way_id=res).exists(): + break + diff --git a/authentication/helper/refresh.py b/authentication/helper/refresh.py new file mode 100644 index 0000000..13b45fa --- /dev/null +++ b/authentication/helper/refresh.py @@ -0,0 +1,12 @@ +from django.contrib.auth.models import User +from oauth2_provider.models import AccessToken +from datetime import timedelta +from datetime import datetime + + +def refresh(id): + user = User.objects.get(id=id) + # access = AccessToken.objects.filter(user=user).last() + # access.expires = datetime.now() + timedelta(minutes=30) + # access.save() + diff --git a/authentication/log.py b/authentication/log.py new file mode 100644 index 0000000..5d82b71 --- /dev/null +++ b/authentication/log.py @@ -0,0 +1,82 @@ +import time +from functools import wraps + +from authentication.models import Log, SystemUserProfile +import requests + + +def log_function_info(func): + @wraps(func) + def wrapper(request, *args, **kwargs): + start_time = time.time() + response = func(request, *args, **kwargs) + duration = time.time() - start_time + log = Log( + user=request.user, + function_name=func.__name__, + request=request, + response=response, + request_body=request.data, + response_body=response.data, + duration=duration, + status=response.status_code + ) + log.save() + return response + + return wrapper + + +def log_viewset_info(func): + @wraps(func) + def wrapper(viewset, request, *args, **kwargs): + start_time = time.time() + response = func(viewset, request, *args, **kwargs) + duration = time.time() - start_time + log = Log( + user=request.user, + function_name=func.__name__, + request=request, + response=response, + request_body=request.data, + response_body=response.data, + duration=duration, + status=response.status_code + ) + log.save() + return response + + return wrapper + + +def log_sms(func): + @wraps(func) + def wrapper(request, *args, **kwargs): + response = func(request, *args, **kwargs) + operator = SystemUserProfile.objects.get(user=request.user) + roles = None + users = None + message = request.data['message'] + if 'role' in request.data.keys(): + roles = request.data['role'] + if 'user' in request.data.keys(): + users = request.data['user'] + + if roles != None and users != None: + users = SystemUserProfile.objects.filter(role__name__in=roles, key__in=users, + province=operator.province).order_by('id') + elif roles != None: + users = SystemUserProfile.objects.filter(role__name__in=roles, province=operator.province).order_by('id') + else: + users = SystemUserProfile.objects.filter(key__in=users, province=operator.province).order_by('id') + + for user in users: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + user.mobile, message) + url = u.format() + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + r = requests.request("GET", url, headers=headers, data=payload) + return response + + return wrapper diff --git a/authentication/message/__init__.py b/authentication/message/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/authentication/message/serializers.py b/authentication/message/serializers.py new file mode 100644 index 0000000..b63815d --- /dev/null +++ b/authentication/message/serializers.py @@ -0,0 +1,28 @@ +from rest_framework import serializers +from authentication.models import UserMessage +from ..serializer.serializer import ( + GroupSerializer, + SystemUserProfileSerializer +) + + +# سریالایزر مربوط به سیستم پیام کاربر +class UserMessageSerializer(serializers.ModelSerializer): + users = SystemUserProfileSerializer(required=False, many=True) + roles = GroupSerializer(required=False, many=True) + sender = SystemUserProfileSerializer(required=False) + + class Meta: + model = UserMessage + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'trash', + 'created_by', + 'modified_by', + ) + extra_kwargs = { + 'link_text': {'required': False}, + 'link': {'required': False} + } diff --git a/authentication/message/views.py b/authentication/message/views.py new file mode 100644 index 0000000..94cf2c9 --- /dev/null +++ b/authentication/message/views.py @@ -0,0 +1,195 @@ +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from authentication.message.serializers import UserMessageSerializer +from panel.models import CheckState, OperatorLastTimeEnter +from authentication.sahandsms.sms import sms_reminder +from authentication.models import ( + UserMessage, + UserProfile, + SendingMessageMethod, + UserMessageType, SystemUserProfile +) +from django.contrib.auth.models import Group +from rest_framework.response import Response +from notification.models import ( + NotificationToken, + NotificationType, + Notification +) +from notification.najva import ( + get_segments_detail, + send_notif_to_segments +) +from rest_framework import viewsets +from rest_framework import status +import random +import string +import os + +from ticket.helper import send_image_to_server + +# آدرس پایه ذخیره عکس مربوط به سیستم پیام کاربر در استوریج آروان +ARVAN_user_message_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' + + +# ویو ست کلی برای سیستم پیام کاربر که شامل ساخت و ویرایش و حذف می باشد +# برای ساخت چند حالت دارد که یا برای یک شخص ارسال میشه یا جند شخص یا یک نقش خاص +class UserMessageViewSet(viewsets.ModelViewSet): + queryset = UserMessage.objects.all() + serializer_class = UserMessageSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + try: + images = request.data['image'] + request.data.pop('image') + except: + images = None + + try: + roles = request.data['roles'] + request.data.pop('roles') + except: + roles = None + + try: + users = request.data['users'] + request.data.pop('users') + except: + users = None + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + user_message = serializer.create(validated_data=request.data) + user_message.sender = SystemUserProfile.objects.get(user=request.user) + if roles == None: + pass + else: + for role in roles: + rol = Group.objects.get(name=role) + user_message.roles.add(rol) + if users == None and roles == None: + for user in SystemUserProfile.objects.all(): + user_message.users.add(user) + elif users == None: + user_list = [] + for rol in roles: + persons = SystemUserProfile.objects.filter(role__name=rol) + for user in persons: + user_list.append(user.key) + for user in user_list: + user = SystemUserProfile.objects.get(key__exact=user) + user_message.users.add(user) + else: + for user in users: + user = SystemUserProfile.objects.get(key__exact=user) + user_message.users.add(user) + if images == None: + pass + else: + pic = [] + for image in images: + pic.append(send_image_to_server(image)) + user_message.image = pic + user_message.save() + serializer = self.serializer_class(user_message) + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + if 'sender' in request.GET: + queryset = UserMessage.objects.filter( + sender=SystemUserProfile.objects.get(user=request.user) + ) + if 'receiver' in request.GET: + user_id = SystemUserProfile.objects.get(user_id__exact=request.user.id) + queryset = UserMessage.objects.filter(users=user_id) + + serializer = UserMessageSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user_id=request.user.id) + key = request.data['key'] + queryset = UserMessage.objects.get(key__exact=key) + queryset.users.remove(user) + queryset.save() + return Response(status=status.HTTP_200_OK) + + +class SendingMessageMethodViewSet(viewsets.ModelViewSet): + queryset = SendingMessageMethod.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = UserMessageViewSet + + def create(self, request, *args, **kwargs): + if not SendingMessageMethod.objects.filter(level=request.data['level']): + SendingMessageMethod( + level=request.data['level'], + methods='/'.join(request.data['methods']) + ).save() + return Response({'msg': 'Done'}, status=status.HTTP_200_OK) + return Response({'msg': 'Method Exist'}, status=status.HTTP_403_FORBIDDEN) + + def update(self, request, *args, **kwargs): + method = SendingMessageMethod.objects.get(key__exact=request.data['key']) + method.level = request.data['level'] + method.methods = '/'.join(request.data['methods']) + method.save() + return Response({'msg': 'Done'}, status=status.HTTP_200_OK) + + +class SendSMSViewSet(viewsets.ModelViewSet): + queryset = UserMessage.objects.all() + serializer_class = UserMessageSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + segments = [] + usermessage = UserMessage() + usermessage.message_level = "sms" + if 'value' in request.data.keys(): + for key in request.data['value']: + if UserProfile.objects.filter(key__exact=key): + segments.append(UserProfile.objects.get(key__exact=key)) + if Group.objects.filter(name__exact=key): + for item in UserProfile.objects.filter(role__name__exact=key): + segments.append(item) + usermessage.message_type = UserMessageType.objects.get(name__exact=request.data['request_type']) + for i in segments: + sms_reminder( + receptor=i.mobile, + title=request.data['heading'], + content=request.data['message'], + link_text=request.data['link_text'], + link=request.data['link'], + time=request.data['time'] + ) + if not request.data['value']: + for item in UserProfile.objects.filter(role__name__exact="Poultry"): + sms_reminder( + receptor=item.mobile, + title=request.data['heading'], + content=request.data['message'], + link_text=request.data['link_text'], + link=request.data['link'], + time=request.data['time'] + ) + usermessage.heading = request.data['heading'] + usermessage.message = request.data['message'] + usermessage.link_text = request.data['link_text'] + usermessage.link = request.data['link'] + usermessage.time = request.data['time'] + usermessage.save() + if 'value' in request.data.keys(): + for key in request.data['value']: + if UserProfile.objects.filter(key__exact=key): + usermessage.users.add(UserProfile.objects.get(key__exact=key)) + if Group.objects.filter(name__exact=key): + usermessage.roles.add(Group.objects.get(name__exact=key)) + request.data.pop('value') + request.data.pop('request_type') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + serializer.create(validated_data=request.data) + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) diff --git a/authentication/migrations/0001_initial.py b/authentication/migrations/0001_initial.py new file mode 100644 index 0000000..90c7688 --- /dev/null +++ b/authentication/migrations/0001_initial.py @@ -0,0 +1,431 @@ +# Generated by Django 3.2.13 on 2023-09-18 19:32 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Address', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(default='', max_length=200, null=True)), + ('country', models.CharField(default='', max_length=100, null=True)), + ('province', models.CharField(default='', max_length=50, null=True)), + ('city', models.CharField(default='', max_length=50, null=True)), + ('address', models.CharField(max_length=300, null=True)), + ('postal_code', models.CharField(default='', max_length=20, null=True)), + ('breeding_unique_id', models.CharField(max_length=50, null=True)), + ('phone', models.CharField(default='', max_length=20, null=True)), + ('phone_type', models.CharField(default='', max_length=20, null=True)), + ('no', models.CharField(default='', max_length=5, null=True)), + ('floor', models.IntegerField(default=0, null=True)), + ('unit', models.IntegerField(default=0, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='address_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='address_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='BankCard', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name_of_bank_user', models.CharField(max_length=200, null=True)), + ('bank_name', models.CharField(max_length=30, null=True)), + ('card', models.CharField(max_length=16, null=True)), + ('shaba', models.CharField(max_length=100, null=True)), + ('account', models.CharField(max_length=50, null=True)), + ('user_bank_id_key', models.IntegerField(null=True)), + ('province_name', models.CharField(max_length=50, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bankcard_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bankcard_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='City', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('province_id_foreign_key', models.IntegerField(null=True)), + ('city_id_key', models.IntegerField(null=True)), + ('name', models.CharField(max_length=200, null=True)), + ('province_center', models.BooleanField(default=False)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PermissionLevel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='permissionlevel_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='permissionlevel_modifiedby', to=settings.AUTH_USER_MODEL)), + ('role', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='group_permission', to='auth.group')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Province', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('province_id_key', models.IntegerField(null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SystemUserProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('token', models.CharField(max_length=36, null=True)), + ('user_django_id_foreign_key', models.IntegerField(null=True)), + ('province_id_foreign_key', models.IntegerField(null=True)), + ('city_id_foreign_key', models.IntegerField(null=True)), + ('system_user_profile_id_key', models.IntegerField(null=True)), + ('fullname', models.CharField(max_length=150, null=True)), + ('first_name', models.CharField(max_length=200, null=True)), + ('last_name', models.CharField(max_length=200, null=True)), + ('national_code', models.CharField(max_length=20, null=True)), + ('national_code_image', models.CharField(max_length=500, null=True)), + ('national_id', models.CharField(max_length=20, null=True)), + ('mobile', models.CharField(max_length=11, null=True)), + ('birthday', models.CharField(max_length=20, null=True)), + ('image', models.CharField(max_length=500, null=True)), + ('password', models.CharField(max_length=100, null=True)), + ('active', models.BooleanField(default=True)), + ('state', models.JSONField(default={'birthday': '', 'city': '', 'first_name': '', 'image': '', 'last_name': '', 'mobile': '', 'national_code': '', 'national_id': '', 'province': ''})), + ('base_order', models.BigIntegerField(null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('access_level', models.ManyToManyField(related_name='user_permission_level', to='authentication.PermissionLevel')), + ('city', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_city', to='authentication.city')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='systemuserprofile_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='systemuserprofile_modifiedby', to=settings.AUTH_USER_MODEL)), + ('province', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_province', to='authentication.province')), + ('role', models.ManyToManyField(related_name='user_system_roles', to='auth.Group')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_user_profile_user', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('key', models.UUIDField(default=uuid.uuid4, null=True)), + ('token', models.CharField(default='', max_length=36)), + ('app_token', models.CharField(max_length=36, null=True)), + ('company', models.CharField(max_length=30, null=True)), + ('fullname', models.CharField(default='', max_length=150, null=True)), + ('first_name', models.CharField(default='', max_length=200, null=True)), + ('last_name', models.CharField(default='', max_length=200, null=True)), + ('natinal_id', models.CharField(default='', max_length=10, null=True)), + ('mobile', models.CharField(default='', max_length=11, null=True)), + ('birthday', models.CharField(default='', max_length=20, null=True)), + ('image', models.CharField(max_length=500, null=True)), + ('state', models.CharField(default='register', max_length=20)), + ('unit_name', models.CharField(max_length=100, null=True)), + ('password', models.CharField(max_length=100, null=True)), + ('gis_code', models.CharField(max_length=30, null=True)), + ('operating_licence_capacity', models.BigIntegerField(default=0)), + ('number_of_halls', models.IntegerField(default=0)), + ('tenant', models.BooleanField(null=True)), + ('person_type', models.CharField(max_length=10, null=True)), + ('economic_code', models.CharField(max_length=30, null=True)), + ('system_code', models.CharField(max_length=20, null=True)), + ('epidemiological_code', models.CharField(max_length=20, null=True)), + ('breeding_unique_id', models.CharField(max_length=20, null=True)), + ('total_capacity', models.BigIntegerField(default=0)), + ('licence_number', models.CharField(max_length=20, null=True)), + ('health_certificate_number', models.CharField(max_length=20, null=True)), + ('number_of_requests', models.BigIntegerField(default=0)), + ('hatching_date', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 566242))), + ('last_party_date', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 566242))), + ('number_of_incubators', models.BigIntegerField(default=0)), + ('herd_age_by_day', models.IntegerField(default=0)), + ('herd_age_by_week', models.IntegerField(default=0)), + ('number_of_party', models.IntegerField(default=0)), + ('communication_type', models.CharField(max_length=30, null=True)), + ('cooperative', models.CharField(max_length=50, null=True)), + ('date_of_register', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 566242))), + ('unit_status', models.CharField(max_length=20, null=True)), + ('samasat_user_code', models.CharField(max_length=20, null=True)), + ('base_order', models.BigIntegerField(null=True)), + ('incubation_date', models.DateTimeField(null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_address', to='authentication.address')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='userprofile_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='userprofile_modifiedby', to=settings.AUTH_USER_MODEL)), + ('role', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_role', to='auth.group')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='users', to=settings.AUTH_USER_MODEL)), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bank_user', to='authentication.bankcard')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='UserMessageType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(choices=[('user', 'USER'), ('alluser', 'AllUSER'), ('group', 'GROUP'), ('allgroup', 'AllGROUP'), ('usergroup', 'UserGroup'), ('province_accept', 'ProvinceAccept'), ('province_rejected', 'ProvinceRejected'), ('city_operator_accept', 'CityOperatorAccept'), ('city_operator_rejected', 'CityOperatorRejected'), ('assignment_accepted', 'AssignmentAccepted'), ('assignment_rejected', 'AssignmentRejected')], default='', max_length=50, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='usermessagetype_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='usermessagetype_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='UserMessage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('heading', models.CharField(default='', max_length=100, null=True)), + ('message', models.TextField(default='', max_length=500, null=True)), + ('link_text', models.CharField(max_length=150, null=True)), + ('link', models.CharField(max_length=100, null=True)), + ('image', models.JSONField(default=dict, null=True)), + ('expire', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 32, 12, 570238))), + ('time', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 570238))), + ('state', models.CharField(default='pending', max_length=20)), + ('message_level', models.CharField(max_length=50, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='usermessage_createdby', to=settings.AUTH_USER_MODEL)), + ('message_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='message_type', to='authentication.usermessagetype')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='usermessage_modifiedby', to=settings.AUTH_USER_MODEL)), + ('roles', models.ManyToManyField(blank=True, related_name='user_roles', to='auth.Group')), + ('sender', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='message_sender', to='authentication.systemuserprofile')), + ('users', models.ManyToManyField(blank=True, related_name='user_message', to='authentication.SystemUserProfile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Tenant', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('fullname', models.CharField(max_length=50, null=True)), + ('national_code', models.CharField(max_length=20, null=True)), + ('birthday', models.CharField(max_length=50, null=True)), + ('rental', models.CharField(max_length=30, null=True)), + ('tracking_code', models.CharField(max_length=30, null=True)), + ('rent_date_from', models.CharField(max_length=30, null=True)), + ('rent_date_to', models.CharField(max_length=30, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tenant_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tenant_modifiedby', to=settings.AUTH_USER_MODEL)), + ('userprofile', models.ManyToManyField(related_name='tenant_user', to='authentication.UserProfile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SystemAddress', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('province_id_foreign_key', models.IntegerField(null=True)), + ('city_id_foreign_key', models.IntegerField(null=True)), + ('address_id_key', models.IntegerField(null=True)), + ('address', models.CharField(max_length=300, null=True)), + ('postal_code', models.CharField(default='', max_length=20, null=True)), + ('breeding_unique_id', models.CharField(max_length=50, null=True)), + ('phone', models.CharField(default='', max_length=20, null=True)), + ('phone_type', models.CharField(default='', max_length=20, null=True)), + ('no', models.CharField(default='', max_length=5, null=True)), + ('floor', models.IntegerField(default=0, null=True)), + ('unit', models.IntegerField(default=0, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('city', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_address', to='authentication.city')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='systemaddress_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='systemaddress_modifiedby', to=settings.AUTH_USER_MODEL)), + ('province', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_address', to='authentication.province')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SendingMessageMethod', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('level', models.CharField(max_length=50, null=True)), + ('methods', models.CharField(max_length=150, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sendingmessagemethod_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sendingmessagemethod_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='MultiRole', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='multi_role_address', to='authentication.address')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='multirole_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='multirole_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='multi_role_users', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Log', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('function_name', models.CharField(max_length=200, null=True)), + ('duration', models.FloatField(null=True)), + ('status', models.IntegerField(null=True)), + ('response', models.TextField(null=True)), + ('request', models.TextField(null=True)), + ('request_body', models.TextField(null=True)), + ('response_body', models.TextField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='log_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='log_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='log_user', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='GeoPoint', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=100, null=True)), + ('lang', models.CharField(max_length=50, null=True)), + ('lat', models.CharField(max_length=50, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='geopoint_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='geopoint_modifiedby', to=settings.AUTH_USER_MODEL)), + ('userprofile', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='geo_user', to='authentication.userprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CityUnit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('city_id_foreign_key', models.IntegerField(null=True)), + ('city_unit_id_key', models.IntegerField(null=True)), + ('name', models.CharField(max_length=200, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('city', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_province', to='authentication.city')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityunit_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityunit_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='city', + name='province', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_province', to='authentication.province'), + ), + ] diff --git a/authentication/migrations/0002_auto_20231005_0439.py b/authentication/migrations/0002_auto_20231005_0439.py new file mode 100644 index 0000000..8f4ac51 --- /dev/null +++ b/authentication/migrations/0002_auto_20231005_0439.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2023-10-05 04:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 5, 39, 40, 819402)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 819402)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 819402)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 819402)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 819402)), + ), + ] diff --git a/authentication/migrations/0003_auto_20231112_1026.py b/authentication/migrations/0003_auto_20231112_1026.py new file mode 100644 index 0000000..31ff740 --- /dev/null +++ b/authentication/migrations/0003_auto_20231112_1026.py @@ -0,0 +1,73 @@ +# Generated by Django 3.2.13 on 2023-11-12 10:26 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0002_auto_20231005_0439'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 11, 25, 58, 984672)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 10, 25, 58, 984672)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 10, 25, 58, 984672)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 10, 25, 58, 984672)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 10, 25, 58, 984672)), + ), + migrations.CreateModel( + name='ExternalTransaction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('date', models.DateTimeField(auto_now_add=True)), + ('amount', models.BigIntegerField(default=0)), + ('status', models.CharField(default='pending', max_length=100)), + ('transaction_type', models.CharField(max_length=100, null=True)), + ('description', models.CharField(default=False, max_length=200)), + ('is_complete', models.BooleanField(default=False)), + ('message', models.TextField(null=True)), + ('saleReferenceId', models.CharField(max_length=100, null=True)), + ('refId', models.CharField(max_length=100, null=True)), + ('orderId', models.CharField(max_length=100, null=True)), + ('cardHolderPan', models.CharField(max_length=100, null=True)), + ('receiver_role', models.CharField(max_length=100, null=True)), + ('creator_role', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='externaltransaction_createdby', to=settings.AUTH_USER_MODEL)), + ('creator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='creator_user', to='authentication.systemuserprofile')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='externaltransaction_modifiedby', to=settings.AUTH_USER_MODEL)), + ('receiver', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='receiver_user', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/authentication/migrations/0004_auto_20231112_1223.py b/authentication/migrations/0004_auto_20231112_1223.py new file mode 100644 index 0000000..b0f3987 --- /dev/null +++ b/authentication/migrations/0004_auto_20231112_1223.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2023-11-12 12:23 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0003_auto_20231112_1026'), + ] + + operations = [ + migrations.AddField( + model_name='externaltransaction', + name='payer', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 13, 23, 6, 109087)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 12, 23, 6, 109087)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 12, 23, 6, 105091)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 12, 23, 6, 105091)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 12, 23, 6, 105091)), + ), + ] diff --git a/authentication/migrations/0005_auto_20231112_1544.py b/authentication/migrations/0005_auto_20231112_1544.py new file mode 100644 index 0000000..bb7df8f --- /dev/null +++ b/authentication/migrations/0005_auto_20231112_1544.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2023-11-12 15:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0004_auto_20231112_1223'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 16, 44, 52, 32224)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 15, 44, 52, 32224)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 15, 44, 52, 28223)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 15, 44, 52, 28223)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 15, 44, 52, 28223)), + ), + ] diff --git a/authentication/migrations/0006_auto_20231114_0931.py b/authentication/migrations/0006_auto_20231114_0931.py new file mode 100644 index 0000000..5c4923f --- /dev/null +++ b/authentication/migrations/0006_auto_20231114_0931.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2023-11-14 09:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0005_auto_20231112_1544'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 10, 30, 58, 605133)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 58, 605133)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 58, 605133)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 58, 605133)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 58, 605133)), + ), + ] diff --git a/authentication/migrations/0007_auto_20231120_1913.py b/authentication/migrations/0007_auto_20231120_1913.py new file mode 100644 index 0000000..955d14e --- /dev/null +++ b/authentication/migrations/0007_auto_20231120_1913.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2023-11-20 19:13 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0006_auto_20231114_0931'), + ] + + operations = [ + migrations.AddField( + model_name='usermessage', + name='receive_code', + field=models.CharField(max_length=400, null=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 20, 12, 55, 673532)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 19, 12, 55, 673532)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 19, 12, 55, 670532)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 19, 12, 55, 669532)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 19, 12, 55, 669532)), + ), + ] diff --git a/authentication/migrations/0008_auto_20231120_2009.py b/authentication/migrations/0008_auto_20231120_2009.py new file mode 100644 index 0000000..ca5ab1d --- /dev/null +++ b/authentication/migrations/0008_auto_20231120_2009.py @@ -0,0 +1,61 @@ +# Generated by Django 3.2.13 on 2023-11-20 20:09 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0007_auto_20231120_1913'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 21, 9, 35, 153161)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 20, 9, 35, 153161)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 20, 9, 35, 150161)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 20, 9, 35, 150161)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 20, 9, 35, 150161)), + ), + migrations.CreateModel( + name='UserMessageSend', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('message', models.TextField(max_length=500, null=True)), + ('receive_code', models.CharField(max_length=400, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='usermessagesend_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='usermessagesend_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/authentication/migrations/0009_auto_20231120_2134.py b/authentication/migrations/0009_auto_20231120_2134.py new file mode 100644 index 0000000..45778e6 --- /dev/null +++ b/authentication/migrations/0009_auto_20231120_2134.py @@ -0,0 +1,43 @@ +# Generated by Django 3.2.13 on 2023-11-20 21:34 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0008_auto_20231120_2009'), + ] + + operations = [ + migrations.RemoveField( + model_name='usermessage', + name='receive_code', + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 22, 34, 29, 248210)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 21, 34, 29, 248210)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 21, 34, 29, 245208)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 21, 34, 29, 244207)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 20, 21, 34, 29, 244207)), + ), + ] diff --git a/authentication/migrations/0010_auto_20231202_1108.py b/authentication/migrations/0010_auto_20231202_1108.py new file mode 100644 index 0000000..6f92b5f --- /dev/null +++ b/authentication/migrations/0010_auto_20231202_1108.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2023-12-02 11:08 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0009_auto_20231120_2134'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 12, 8, 44, 239211)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 239211)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 235210)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 235210)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 235210)), + ), + ] diff --git a/authentication/migrations/0011_auto_20231205_1256.py b/authentication/migrations/0011_auto_20231205_1256.py new file mode 100644 index 0000000..b6c0c08 --- /dev/null +++ b/authentication/migrations/0011_auto_20231205_1256.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2023-12-05 12:56 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0010_auto_20231202_1108'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 13, 56, 11, 857259)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 857259)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 853262)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 853262)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 853262)), + ), + ] diff --git a/authentication/migrations/0012_auto_20231211_1102.py b/authentication/migrations/0012_auto_20231211_1102.py new file mode 100644 index 0000000..431672d --- /dev/null +++ b/authentication/migrations/0012_auto_20231211_1102.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2023-12-11 11:02 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0011_auto_20231205_1256'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 2, 7, 786317)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 786317)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 780322)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 780322)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 780322)), + ), + ] diff --git a/authentication/migrations/0013_auto_20231214_1418.py b/authentication/migrations/0013_auto_20231214_1418.py new file mode 100644 index 0000000..7b4f1d9 --- /dev/null +++ b/authentication/migrations/0013_auto_20231214_1418.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2023-12-14 14:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0012_auto_20231211_1102'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 15, 18, 27, 572252)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 572252)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 563261)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 563261)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 563261)), + ), + ] diff --git a/authentication/migrations/0014_auto_20240107_1133.py b/authentication/migrations/0014_auto_20240107_1133.py new file mode 100644 index 0000000..8aca747 --- /dev/null +++ b/authentication/migrations/0014_auto_20240107_1133.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-01-07 11:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0013_auto_20231214_1418'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 12, 32, 59, 193761)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 193761)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 188761)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 187761)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 187761)), + ), + ] diff --git a/authentication/migrations/0015_auto_20240107_2228.py b/authentication/migrations/0015_auto_20240107_2228.py new file mode 100644 index 0000000..a4cf51c --- /dev/null +++ b/authentication/migrations/0015_auto_20240107_2228.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-01-07 22:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0014_auto_20240107_1133'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 23, 28, 10, 522399)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 522399)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 518403)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 518403)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 518403)), + ), + ] diff --git a/authentication/migrations/0016_auto_20240110_0238.py b/authentication/migrations/0016_auto_20240110_0238.py new file mode 100644 index 0000000..8e4ae23 --- /dev/null +++ b/authentication/migrations/0016_auto_20240110_0238.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-01-10 02:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0015_auto_20240107_2228'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 3, 38, 17, 869472)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 869472)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 864477)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 864477)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 864477)), + ), + ] diff --git a/authentication/migrations/0017_auto_20240131_1351.py b/authentication/migrations/0017_auto_20240131_1351.py new file mode 100644 index 0000000..c54e232 --- /dev/null +++ b/authentication/migrations/0017_auto_20240131_1351.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2024-01-31 13:51 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0016_auto_20240110_0238'), + ] + + operations = [ + migrations.AddField( + model_name='externaltransaction', + name='kill_house_id_foreign_key', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 14, 51, 24, 623765)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 13, 51, 24, 623765)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 13, 51, 24, 619768)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 13, 51, 24, 619768)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 13, 51, 24, 619768)), + ), + ] diff --git a/authentication/migrations/0018_auto_20240131_1405.py b/authentication/migrations/0018_auto_20240131_1405.py new file mode 100644 index 0000000..e56a13c --- /dev/null +++ b/authentication/migrations/0018_auto_20240131_1405.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.13 on 2024-01-31 14:05 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0017_auto_20240131_1351'), + ] + + operations = [ + migrations.AddField( + model_name='externaltransaction', + name='kill_house_user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='transaction_kill_house_user', to='authentication.systemuserprofile'), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 15, 5, 12, 182042)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 14, 5, 12, 182042)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 14, 5, 12, 178046)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 14, 5, 12, 177046)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 14, 5, 12, 178046)), + ), + ] diff --git a/authentication/migrations/0019_auto_20240131_1429.py b/authentication/migrations/0019_auto_20240131_1429.py new file mode 100644 index 0000000..e5fd537 --- /dev/null +++ b/authentication/migrations/0019_auto_20240131_1429.py @@ -0,0 +1,43 @@ +# Generated by Django 3.2.13 on 2024-01-31 14:29 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0018_auto_20240131_1405'), + ] + + operations = [ + migrations.RemoveField( + model_name='externaltransaction', + name='kill_house_id_foreign_key', + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 15, 29, 49, 130976)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 14, 29, 49, 130976)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 14, 29, 49, 126982)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 14, 29, 49, 126982)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 31, 14, 29, 49, 126982)), + ), + ] diff --git a/authentication/migrations/0020_auto_20240220_1341.py b/authentication/migrations/0020_auto_20240220_1341.py new file mode 100644 index 0000000..4042f41 --- /dev/null +++ b/authentication/migrations/0020_auto_20240220_1341.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-02-20 13:41 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0019_auto_20240131_1429'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 14, 41, 7, 8616)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 8616)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 3621)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 3621)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 3621)), + ), + ] diff --git a/authentication/migrations/0021_auto_20240326_1330.py b/authentication/migrations/0021_auto_20240326_1330.py new file mode 100644 index 0000000..2e17393 --- /dev/null +++ b/authentication/migrations/0021_auto_20240326_1330.py @@ -0,0 +1,305 @@ +# Generated by Django 3.2.13 on 2024-03-26 13:30 + +import datetime +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0020_auto_20240220_1341'), + ] + + operations = [ + migrations.AlterField( + model_name='address', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='address', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='address', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='bankcard', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='bankcard', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='bankcard', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='city', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='city', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='city', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='cityunit', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='cityunit', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='cityunit', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='externaltransaction', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='externaltransaction', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='externaltransaction', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='geopoint', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='geopoint', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='geopoint', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='log', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='log', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='log', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='multirole', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='multirole', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='multirole', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='permissionlevel', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='permissionlevel', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='permissionlevel', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='province', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='province', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='province', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='sendingmessagemethod', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='sendingmessagemethod', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='sendingmessagemethod', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='systemaddress', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='systemaddress', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='systemaddress', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='systemuserprofile', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='systemuserprofile', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='systemuserprofile', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='tenant', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='tenant', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='tenant', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='usermessage', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 14, 30, 27, 97658)), + ), + migrations.AlterField( + model_name='usermessage', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='usermessage', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 13, 30, 27, 97658)), + ), + migrations.AlterField( + model_name='usermessagesend', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='usermessagesend', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='usermessagesend', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='usermessagetype', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='usermessagetype', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='usermessagetype', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='userprofile', + name='create_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 13, 30, 27, 93663)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 13, 30, 27, 93663)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 13, 30, 27, 93663)), + ), + migrations.AlterField( + model_name='userprofile', + name='modify_date', + field=models.DateTimeField(default=datetime.datetime.now), + ), + ] diff --git a/authentication/migrations/0022_auto_20240326_1425.py b/authentication/migrations/0022_auto_20240326_1425.py new file mode 100644 index 0000000..48b07e0 --- /dev/null +++ b/authentication/migrations/0022_auto_20240326_1425.py @@ -0,0 +1,219 @@ +# Generated by Django 3.2.13 on 2024-03-26 14:25 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0021_auto_20240326_1330'), + ] + + operations = [ + migrations.AlterField( + model_name='address', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='address', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='bankcard', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='bankcard', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='city', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='city', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='cityunit', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='cityunit', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='externaltransaction', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='externaltransaction', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='geopoint', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='geopoint', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='log', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='log', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='multirole', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='multirole', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='permissionlevel', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='permissionlevel', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='province', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='province', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='sendingmessagemethod', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='sendingmessagemethod', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='systemaddress', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='systemaddress', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='systemuserprofile', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='systemuserprofile', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='tenant', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='tenant', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='usermessage', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 15, 25, 26, 958154)), + ), + migrations.AlterField( + model_name='usermessage', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 14, 25, 26, 958154)), + ), + migrations.AlterField( + model_name='usermessagesend', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='usermessagesend', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='usermessagetype', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='usermessagetype', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='userprofile', + name='create_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 14, 25, 26, 953162)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 14, 25, 26, 953162)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 26, 14, 25, 26, 953162)), + ), + migrations.AlterField( + model_name='userprofile', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + ] diff --git a/authentication/migrations/0023_auto_20240408_1626.py b/authentication/migrations/0023_auto_20240408_1626.py new file mode 100644 index 0000000..625e74d --- /dev/null +++ b/authentication/migrations/0023_auto_20240408_1626.py @@ -0,0 +1,87 @@ +# Generated by Django 3.2.13 on 2024-04-08 16:26 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0022_auto_20240326_1425'), + ] + + operations = [ + migrations.CreateModel( + name='Notice', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(max_length=1000, null=True)), + ('text', models.TextField(null=True)), + ('users', models.JSONField(null=True)), + ('read_users', models.JSONField(null=True)), + ('unread_users', models.JSONField(null=True)), + ('roles', models.JSONField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notice_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notice_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 17, 26, 21, 530567)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 16, 26, 21, 530567)), + ), + migrations.AlterField( + model_name='usermessagesend', + name='message', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 16, 26, 21, 526571)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 16, 26, 21, 526571)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 16, 26, 21, 526571)), + ), + migrations.CreateModel( + name='UserNoticeInfo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('seen', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='usernoticeinfo_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='usernoticeinfo_modifiedby', to=settings.AUTH_USER_MODEL)), + ('notice', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_notice', to='authentication.notice')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notice_users', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/authentication/migrations/0024_auto_20240408_1632.py b/authentication/migrations/0024_auto_20240408_1632.py new file mode 100644 index 0000000..3114921 --- /dev/null +++ b/authentication/migrations/0024_auto_20240408_1632.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2024-04-08 16:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0023_auto_20240408_1626'), + ] + + operations = [ + migrations.AddField( + model_name='notice', + name='images', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 17, 32, 52, 144178)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 16, 32, 52, 144178)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 16, 32, 52, 140182)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 16, 32, 52, 140182)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 8, 16, 32, 52, 140182)), + ), + ] diff --git a/authentication/migrations/0025_auto_20240416_1440.py b/authentication/migrations/0025_auto_20240416_1440.py new file mode 100644 index 0000000..f1ee608 --- /dev/null +++ b/authentication/migrations/0025_auto_20240416_1440.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-04-16 14:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0024_auto_20240408_1632'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 15, 40, 32, 497347)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 497347)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 489346)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 489346)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 489346)), + ), + ] diff --git a/authentication/migrations/0026_auto_20240417_1103.py b/authentication/migrations/0026_auto_20240417_1103.py new file mode 100644 index 0000000..921e1ae --- /dev/null +++ b/authentication/migrations/0026_auto_20240417_1103.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2024-04-17 11:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0025_auto_20240416_1440'), + ] + + operations = [ + migrations.AddField( + model_name='externaltransaction', + name='type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 2, 49, 693622)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 693622)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 693622)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 677998)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 677998)), + ), + ] diff --git a/authentication/migrations/0027_auto_20240420_0033.py b/authentication/migrations/0027_auto_20240420_0033.py new file mode 100644 index 0000000..c48f184 --- /dev/null +++ b/authentication/migrations/0027_auto_20240420_0033.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-04-20 00:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0026_auto_20240417_1103'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 1, 33, 3, 837655)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 837655)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 833655)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 833655)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 833655)), + ), + ] diff --git a/authentication/migrations/0028_auto_20240427_1357.py b/authentication/migrations/0028_auto_20240427_1357.py new file mode 100644 index 0000000..737e5d6 --- /dev/null +++ b/authentication/migrations/0028_auto_20240427_1357.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2024-04-27 13:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0027_auto_20240420_0033'), + ] + + operations = [ + migrations.AddField( + model_name='externaltransaction', + name='amount_with_tax', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 14, 56, 47, 586337)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 56, 47, 586337)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 56, 47, 577334)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 56, 47, 577334)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 56, 47, 577334)), + ), + ] diff --git a/authentication/migrations/0029_auto_20240511_1129.py b/authentication/migrations/0029_auto_20240511_1129.py new file mode 100644 index 0000000..f1459ce --- /dev/null +++ b/authentication/migrations/0029_auto_20240511_1129.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-05-11 11:29 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0028_auto_20240427_1357'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 12, 29, 47, 632167)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 632167)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 632167)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 632167)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 632167)), + ), + ] diff --git a/authentication/migrations/0030_auto_20240511_1312.py b/authentication/migrations/0030_auto_20240511_1312.py new file mode 100644 index 0000000..1fc5db4 --- /dev/null +++ b/authentication/migrations/0030_auto_20240511_1312.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-05-11 13:12 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0029_auto_20240511_1129'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 14, 11, 48, 448971)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 448971)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 442972)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 442972)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 442972)), + ), + ] diff --git a/authentication/migrations/0031_auto_20240516_1321.py b/authentication/migrations/0031_auto_20240516_1321.py new file mode 100644 index 0000000..3b75fd1 --- /dev/null +++ b/authentication/migrations/0031_auto_20240516_1321.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.13 on 2024-05-16 13:21 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0030_auto_20240511_1312'), + ] + + operations = [ + migrations.AddField( + model_name='externaltransaction', + name='chain_company_user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='transaction_chain_company_user', to='authentication.systemuserprofile'), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 14, 21, 17, 757672)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 21, 17, 757672)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 21, 17, 748673)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 21, 17, 748673)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 21, 17, 748673)), + ), + ] diff --git a/authentication/migrations/0032_auto_20240517_1337.py b/authentication/migrations/0032_auto_20240517_1337.py new file mode 100644 index 0000000..26a7eae --- /dev/null +++ b/authentication/migrations/0032_auto_20240517_1337.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-05-17 13:37 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0031_auto_20240516_1321'), + ] + + operations = [ + migrations.AddField( + model_name='externaltransaction', + name='city_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='externaltransaction', + name='company_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='externaltransaction', + name='guilds_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='externaltransaction', + name='other_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='externaltransaction', + name='union_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='externaltransaction', + name='wallet_share', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 14, 36, 53, 296879)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 36, 53, 296879)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 36, 53, 292879)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 36, 53, 292879)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 36, 53, 292879)), + ), + ] diff --git a/authentication/migrations/0033_auto_20240517_1351.py b/authentication/migrations/0033_auto_20240517_1351.py new file mode 100644 index 0000000..799f6de --- /dev/null +++ b/authentication/migrations/0033_auto_20240517_1351.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2024-05-17 13:51 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0032_auto_20240517_1337'), + ] + + operations = [ + migrations.AddField( + model_name='externaltransaction', + name='pay_type', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 14, 51, 41, 231332)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 51, 41, 231332)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 51, 41, 222333)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 51, 41, 222333)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 51, 41, 222333)), + ), + ] diff --git a/authentication/migrations/0034_auto_20240527_1506.py b/authentication/migrations/0034_auto_20240527_1506.py new file mode 100644 index 0000000..8fb5481 --- /dev/null +++ b/authentication/migrations/0034_auto_20240527_1506.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2024-05-27 15:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0033_auto_20240517_1351'), + ] + + operations = [ + migrations.AddField( + model_name='systemuserprofile', + name='user_gate_way_id', + field=models.CharField(max_length=6, null=True, unique=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 27, 16, 6, 17, 530512)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 27, 15, 6, 17, 530512)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 27, 15, 6, 17, 526511)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 27, 15, 6, 17, 526511)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 27, 15, 6, 17, 526511)), + ), + ] diff --git a/authentication/migrations/0035_auto_20240612_0954.py b/authentication/migrations/0035_auto_20240612_0954.py new file mode 100644 index 0000000..01fe1ad --- /dev/null +++ b/authentication/migrations/0035_auto_20240612_0954.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-06-12 09:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0034_auto_20240527_1506'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 10, 54, 43, 323313)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 9, 54, 43, 323313)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 9, 54, 43, 320316)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 9, 54, 43, 320316)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 9, 54, 43, 320316)), + ), + ] diff --git a/authentication/migrations/0036_auto_20240612_1137.py b/authentication/migrations/0036_auto_20240612_1137.py new file mode 100644 index 0000000..c48b82f --- /dev/null +++ b/authentication/migrations/0036_auto_20240612_1137.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-06-12 11:37 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0035_auto_20240612_0954'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 36, 51, 452143)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 452143)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 449142)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 449142)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 449142)), + ), + ] diff --git a/authentication/migrations/0037_auto_20240612_1936.py b/authentication/migrations/0037_auto_20240612_1936.py new file mode 100644 index 0000000..a6120c0 --- /dev/null +++ b/authentication/migrations/0037_auto_20240612_1936.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-06-12 19:36 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0036_auto_20240612_1137'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 20, 36, 32, 610011)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 19, 36, 32, 610011)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 19, 36, 32, 606011)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 19, 36, 32, 606011)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 19, 36, 32, 606011)), + ), + ] diff --git a/authentication/migrations/0038_auto_20240613_1101.py b/authentication/migrations/0038_auto_20240613_1101.py new file mode 100644 index 0000000..3fd7cac --- /dev/null +++ b/authentication/migrations/0038_auto_20240613_1101.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-06-13 11:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0037_auto_20240612_1936'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 12, 1, 44, 767799)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 767799)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 764798)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 764798)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 764798)), + ), + ] diff --git a/authentication/migrations/0039_auto_20240616_0956.py b/authentication/migrations/0039_auto_20240616_0956.py new file mode 100644 index 0000000..901e04b --- /dev/null +++ b/authentication/migrations/0039_auto_20240616_0956.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-06-16 09:56 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0038_auto_20240613_1101'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 10, 56, 22, 683195)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 683195)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 680170)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 680170)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 680170)), + ), + ] diff --git a/authentication/migrations/0040_auto_20240618_1451.py b/authentication/migrations/0040_auto_20240618_1451.py new file mode 100644 index 0000000..ce6108c --- /dev/null +++ b/authentication/migrations/0040_auto_20240618_1451.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-06-18 14:51 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0039_auto_20240616_0956'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 15, 51, 39, 156393)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 156393)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 148392)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 148392)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 148392)), + ), + ] diff --git a/authentication/migrations/0041_auto_20240713_0951.py b/authentication/migrations/0041_auto_20240713_0951.py new file mode 100644 index 0000000..5c8ab3e --- /dev/null +++ b/authentication/migrations/0041_auto_20240713_0951.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-07-13 09:51 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0040_auto_20240618_1451'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 51, 8, 10909)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 10909)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 6909)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 6909)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 6909)), + ), + ] diff --git a/authentication/migrations/0042_auto_20240713_1024.py b/authentication/migrations/0042_auto_20240713_1024.py new file mode 100644 index 0000000..0353f9d --- /dev/null +++ b/authentication/migrations/0042_auto_20240713_1024.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-07-13 10:24 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0041_auto_20240713_0951'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 24, 12, 652810)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 652810)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 648804)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 648804)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 648804)), + ), + ] diff --git a/authentication/migrations/0043_auto_20240803_1121.py b/authentication/migrations/0043_auto_20240803_1121.py new file mode 100644 index 0000000..5461c5f --- /dev/null +++ b/authentication/migrations/0043_auto_20240803_1121.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-08-03 11:21 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0042_auto_20240713_1024'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 12, 21, 40, 439193)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 439193)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 435193)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 435193)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 435193)), + ), + ] diff --git a/authentication/migrations/0044_auto_20240820_1038.py b/authentication/migrations/0044_auto_20240820_1038.py new file mode 100644 index 0000000..c9205d7 --- /dev/null +++ b/authentication/migrations/0044_auto_20240820_1038.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-08-20 10:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0043_auto_20240803_1121'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 11, 37, 50, 488910)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 488910)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 479908)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 479908)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 479908)), + ), + ] diff --git a/authentication/migrations/0045_auto_20240830_1034.py b/authentication/migrations/0045_auto_20240830_1034.py new file mode 100644 index 0000000..383b0e3 --- /dev/null +++ b/authentication/migrations/0045_auto_20240830_1034.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-08-30 10:34 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0044_auto_20240820_1038'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 11, 34, 3, 932129)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 34, 3, 932129)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 34, 3, 928091)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 34, 3, 928091)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 34, 3, 928091)), + ), + ] diff --git a/authentication/migrations/0046_auto_20240912_0926.py b/authentication/migrations/0046_auto_20240912_0926.py new file mode 100644 index 0000000..c6c5808 --- /dev/null +++ b/authentication/migrations/0046_auto_20240912_0926.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-09-12 09:26 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0045_auto_20240830_1034'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 10, 25, 52, 994361)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 52, 994361)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 52, 990361)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 52, 990361)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 52, 990361)), + ), + ] diff --git a/authentication/migrations/0047_auto_20240912_1105.py b/authentication/migrations/0047_auto_20240912_1105.py new file mode 100644 index 0000000..b9786e1 --- /dev/null +++ b/authentication/migrations/0047_auto_20240912_1105.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-09-12 11:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0046_auto_20240912_0926'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 5, 45, 59359)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 5, 45, 59359)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 5, 45, 56344)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 5, 45, 56344)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 5, 45, 56344)), + ), + ] diff --git a/authentication/migrations/0048_auto_20240912_1118.py b/authentication/migrations/0048_auto_20240912_1118.py new file mode 100644 index 0000000..b4d663e --- /dev/null +++ b/authentication/migrations/0048_auto_20240912_1118.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-09-12 11:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0047_auto_20240912_1105'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 18, 3, 954859)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 18, 3, 954859)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 18, 3, 951853)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 18, 3, 951853)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 18, 3, 951853)), + ), + ] diff --git a/authentication/migrations/0049_auto_20241005_1324.py b/authentication/migrations/0049_auto_20241005_1324.py new file mode 100644 index 0000000..2bde782 --- /dev/null +++ b/authentication/migrations/0049_auto_20241005_1324.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2024-10-05 13:24 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0048_auto_20240912_1118'), + ] + + operations = [ + migrations.AddField( + model_name='city', + name='product_price', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 14, 24, 2, 356280)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 24, 2, 356280)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 24, 2, 351281)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 24, 2, 351281)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 24, 2, 351281)), + ), + ] diff --git a/authentication/migrations/0050_auto_20241029_1116.py b/authentication/migrations/0050_auto_20241029_1116.py new file mode 100644 index 0000000..eea2db2 --- /dev/null +++ b/authentication/migrations/0050_auto_20241029_1116.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-10-29 11:16 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0049_auto_20241005_1324'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 12, 16, 42, 670857)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 670857)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 670857)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 654920)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 654920)), + ), + ] diff --git a/authentication/migrations/0051_auto_20241130_1837.py b/authentication/migrations/0051_auto_20241130_1837.py new file mode 100644 index 0000000..0c0e314 --- /dev/null +++ b/authentication/migrations/0051_auto_20241130_1837.py @@ -0,0 +1,49 @@ +# Generated by Django 3.2.13 on 2024-11-30 18:37 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0050_auto_20241029_1116'), + ] + + operations = [ + migrations.AddField( + model_name='externaltransaction', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='externaltransaction', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 37, 30, 803723)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 37, 30, 803723)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 37, 30, 799720)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 37, 30, 799720)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 37, 30, 799720)), + ), + ] diff --git a/authentication/migrations/0052_auto_20241208_1147.py b/authentication/migrations/0052_auto_20241208_1147.py new file mode 100644 index 0000000..e4d835d --- /dev/null +++ b/authentication/migrations/0052_auto_20241208_1147.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-12-08 11:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0051_auto_20241130_1837'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 12, 47, 31, 513277)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 513277)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 511274)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 511274)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 511274)), + ), + ] diff --git a/authentication/migrations/0053_auto_20241215_1031.py b/authentication/migrations/0053_auto_20241215_1031.py new file mode 100644 index 0000000..331dff9 --- /dev/null +++ b/authentication/migrations/0053_auto_20241215_1031.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-12-15 10:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0052_auto_20241208_1147'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 31, 13, 476768)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 476768)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 473020)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 473020)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 473020)), + ), + ] diff --git a/authentication/migrations/0054_auto_20241228_0926.py b/authentication/migrations/0054_auto_20241228_0926.py new file mode 100644 index 0000000..8074d63 --- /dev/null +++ b/authentication/migrations/0054_auto_20241228_0926.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2024-12-28 09:26 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0053_auto_20241215_1031'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 28, 10, 26, 11, 380483)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 28, 9, 26, 11, 380483)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 28, 9, 26, 11, 378476)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 28, 9, 26, 11, 378476)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 28, 9, 26, 11, 378476)), + ), + ] diff --git a/authentication/migrations/0055_auto_20250112_1550.py b/authentication/migrations/0055_auto_20250112_1550.py new file mode 100644 index 0000000..421958e --- /dev/null +++ b/authentication/migrations/0055_auto_20250112_1550.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-01-12 15:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0054_auto_20241228_0926'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 16, 50, 33, 128256)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 128256)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 124237)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 124237)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 124237)), + ), + ] diff --git a/authentication/migrations/0056_auto_20250118_1418.py b/authentication/migrations/0056_auto_20250118_1418.py new file mode 100644 index 0000000..310fdfe --- /dev/null +++ b/authentication/migrations/0056_auto_20250118_1418.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-01-18 14:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0055_auto_20250112_1550'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 18, 15, 18, 21, 786785)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 18, 14, 18, 21, 786785)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 18, 14, 18, 21, 782787)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 18, 14, 18, 21, 782787)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 18, 14, 18, 21, 782787)), + ), + ] diff --git a/authentication/migrations/0057_auto_20250121_0857.py b/authentication/migrations/0057_auto_20250121_0857.py new file mode 100644 index 0000000..bb09edb --- /dev/null +++ b/authentication/migrations/0057_auto_20250121_0857.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-01-21 08:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0056_auto_20250118_1418'), + ] + + operations = [ + migrations.AddField( + model_name='systemuserprofile', + name='unit_address', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='systemuserprofile', + name='unit_city', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='systemuserprofile', + name='unit_economical_number', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='systemuserprofile', + name='unit_name', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='systemuserprofile', + name='unit_national_id', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='systemuserprofile', + name='unit_postal_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='systemuserprofile', + name='unit_province', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='systemuserprofile', + name='unit_registration_number', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 9, 57, 41, 955428)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 955428)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 955428)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 955428)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 955428)), + ), + ] diff --git a/authentication/migrations/0058_auto_20250126_2046.py b/authentication/migrations/0058_auto_20250126_2046.py new file mode 100644 index 0000000..191a791 --- /dev/null +++ b/authentication/migrations/0058_auto_20250126_2046.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-01-26 20:46 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0057_auto_20250121_0857'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 21, 45, 45, 347320)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 20, 45, 45, 347320)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 20, 45, 45, 344319)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 20, 45, 45, 344319)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 20, 45, 45, 344319)), + ), + ] diff --git a/authentication/migrations/0059_auto_20250126_2122.py b/authentication/migrations/0059_auto_20250126_2122.py new file mode 100644 index 0000000..d19a7ec --- /dev/null +++ b/authentication/migrations/0059_auto_20250126_2122.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-01-26 21:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0058_auto_20250126_2046'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 22, 22, 22, 642630)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 21, 22, 22, 642630)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 21, 22, 22, 638656)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 21, 22, 22, 638656)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 26, 21, 22, 22, 638656)), + ), + ] diff --git a/authentication/migrations/0060_auto_20250302_1203.py b/authentication/migrations/0060_auto_20250302_1203.py new file mode 100644 index 0000000..bf0f460 --- /dev/null +++ b/authentication/migrations/0060_auto_20250302_1203.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-03-02 12:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0059_auto_20250126_2122'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 2, 54, 212438)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 212438)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 210430)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 210430)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 210430)), + ), + ] diff --git a/authentication/migrations/0061_auto_20250302_1351.py b/authentication/migrations/0061_auto_20250302_1351.py new file mode 100644 index 0000000..2573109 --- /dev/null +++ b/authentication/migrations/0061_auto_20250302_1351.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-03-02 13:51 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0060_auto_20250302_1203'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 51, 24, 153713)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 153713)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 149697)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 149697)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 149697)), + ), + ] diff --git a/authentication/migrations/0062_auto_20250302_1458.py b/authentication/migrations/0062_auto_20250302_1458.py new file mode 100644 index 0000000..397dc8c --- /dev/null +++ b/authentication/migrations/0062_auto_20250302_1458.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-03-02 14:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0061_auto_20250302_1351'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 15, 58, 25, 437483)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 437483)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 433467)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 433467)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 433467)), + ), + ] diff --git a/authentication/migrations/0063_auto_20250303_1205.py b/authentication/migrations/0063_auto_20250303_1205.py new file mode 100644 index 0000000..b434ba3 --- /dev/null +++ b/authentication/migrations/0063_auto_20250303_1205.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-03-03 12:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0062_auto_20250302_1458'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 5, 3, 133575)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 133575)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 130344)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 129310)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 130344)), + ), + ] diff --git a/authentication/migrations/0064_auto_20250303_1315.py b/authentication/migrations/0064_auto_20250303_1315.py new file mode 100644 index 0000000..3de6e1f --- /dev/null +++ b/authentication/migrations/0064_auto_20250303_1315.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-03-03 13:15 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0063_auto_20250303_1205'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 15, 43, 962800)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 43, 962800)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 43, 958810)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 43, 958810)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 43, 958810)), + ), + ] diff --git a/authentication/migrations/0065_auto_20250303_1500.py b/authentication/migrations/0065_auto_20250303_1500.py new file mode 100644 index 0000000..56e14ad --- /dev/null +++ b/authentication/migrations/0065_auto_20250303_1500.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-03-03 15:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0064_auto_20250303_1315'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 15, 59, 55, 26833)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 26833)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 24825)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 24825)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 24825)), + ), + ] diff --git a/authentication/migrations/0066_auto_20250306_1106.py b/authentication/migrations/0066_auto_20250306_1106.py new file mode 100644 index 0000000..d6fe3b9 --- /dev/null +++ b/authentication/migrations/0066_auto_20250306_1106.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-03-06 11:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0065_auto_20250303_1500'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 6, 12, 6, 39, 507190)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 6, 11, 6, 39, 507190)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 6, 11, 6, 39, 503181)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 6, 11, 6, 39, 503181)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 6, 11, 6, 39, 503181)), + ), + ] diff --git a/authentication/migrations/0067_auto_20250525_1503.py b/authentication/migrations/0067_auto_20250525_1503.py new file mode 100644 index 0000000..96c8efd --- /dev/null +++ b/authentication/migrations/0067_auto_20250525_1503.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-05-25 15:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0066_auto_20250306_1106'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 16, 2, 53, 151705)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 151705)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 148412)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 148412)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 148412)), + ), + ] diff --git a/authentication/migrations/0068_auto_20250525_1504.py b/authentication/migrations/0068_auto_20250525_1504.py new file mode 100644 index 0000000..4edd59c --- /dev/null +++ b/authentication/migrations/0068_auto_20250525_1504.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-05-25 15:04 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0067_auto_20250525_1503'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 16, 4, 13, 29545)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 29545)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 26452)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 26452)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 26452)), + ), + ] diff --git a/authentication/migrations/0069_auto_20250525_1505.py b/authentication/migrations/0069_auto_20250525_1505.py new file mode 100644 index 0000000..520205e --- /dev/null +++ b/authentication/migrations/0069_auto_20250525_1505.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-05-25 15:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0068_auto_20250525_1504'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 16, 5, 28, 192717)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 192717)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 188592)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 188592)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 188592)), + ), + ] diff --git a/authentication/migrations/0070_auto_20250527_1154.py b/authentication/migrations/0070_auto_20250527_1154.py new file mode 100644 index 0000000..6b02235 --- /dev/null +++ b/authentication/migrations/0070_auto_20250527_1154.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-05-27 11:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0069_auto_20250525_1505'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 12, 54, 41, 955504)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 11, 54, 41, 955504)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 11, 54, 41, 955504)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 11, 54, 41, 955504)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 11, 54, 41, 955504)), + ), + ] diff --git a/authentication/migrations/0071_auto_20250601_1023.py b/authentication/migrations/0071_auto_20250601_1023.py new file mode 100644 index 0000000..56558b6 --- /dev/null +++ b/authentication/migrations/0071_auto_20250601_1023.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-06-01 10:23 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0070_auto_20250527_1154'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 11, 23, 19, 683163)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 683163)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 681156)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 681156)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 681156)), + ), + ] diff --git a/authentication/migrations/0072_auto_20250901_1207.py b/authentication/migrations/0072_auto_20250901_1207.py new file mode 100644 index 0000000..50fa25a --- /dev/null +++ b/authentication/migrations/0072_auto_20250901_1207.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-09-01 12:07 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0071_auto_20250601_1023'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 13, 6, 58, 640479)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 640479)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 636520)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 636520)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 636520)), + ), + ] diff --git a/authentication/migrations/0073_auto_20250920_1257.py b/authentication/migrations/0073_auto_20250920_1257.py new file mode 100644 index 0000000..e372a91 --- /dev/null +++ b/authentication/migrations/0073_auto_20250920_1257.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-09-20 12:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0072_auto_20250901_1207'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 13, 57, 40, 513826)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 513826)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 509834)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 508831)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 509834)), + ), + ] diff --git a/authentication/migrations/0074_auto_20251028_0856.py b/authentication/migrations/0074_auto_20251028_0856.py new file mode 100644 index 0000000..719c84c --- /dev/null +++ b/authentication/migrations/0074_auto_20251028_0856.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-10-28 08:56 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0073_auto_20250920_1257'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 55, 52, 569561)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 569561)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 565592)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 565592)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 565592)), + ), + ] diff --git a/authentication/migrations/0075_auto_20251029_1055.py b/authentication/migrations/0075_auto_20251029_1055.py new file mode 100644 index 0000000..bcef587 --- /dev/null +++ b/authentication/migrations/0075_auto_20251029_1055.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-10-29 10:55 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0074_auto_20251028_0856'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 11, 54, 57, 498118)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 498118)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 495117)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 495117)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 495117)), + ), + ] diff --git a/authentication/migrations/0076_auto_20251104_1340.py b/authentication/migrations/0076_auto_20251104_1340.py new file mode 100644 index 0000000..d71a47c --- /dev/null +++ b/authentication/migrations/0076_auto_20251104_1340.py @@ -0,0 +1,54 @@ +# Generated by Django 3.2.13 on 2025-11-04 13:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0075_auto_20251029_1055'), + ] + + operations = [ + migrations.AddField( + model_name='systemuserprofile', + name='father_name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='systemuserprofile', + name='gender', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='systemuserprofile', + name='is_alive', + field=models.BooleanField(null=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 14, 40, 24, 948077)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 40, 24, 948077)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 40, 24, 944573)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 40, 24, 944573)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 40, 24, 944573)), + ), + ] diff --git a/authentication/migrations/0077_auto_20251110_1100.py b/authentication/migrations/0077_auto_20251110_1100.py new file mode 100644 index 0000000..c1eccf7 --- /dev/null +++ b/authentication/migrations/0077_auto_20251110_1100.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-11-10 11:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0076_auto_20251104_1340'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 12, 0, 21, 824810)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 824810)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 821718)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 821718)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 821718)), + ), + ] diff --git a/authentication/migrations/0078_auto_20251208_1617.py b/authentication/migrations/0078_auto_20251208_1617.py new file mode 100644 index 0000000..9c32391 --- /dev/null +++ b/authentication/migrations/0078_auto_20251208_1617.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-12-08 16:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0077_auto_20251110_1100'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 17, 14, 44, 867599)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 44, 867599)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 44, 863841)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 44, 863841)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 44, 863841)), + ), + ] diff --git a/authentication/migrations/0079_auto_20251213_1632.py b/authentication/migrations/0079_auto_20251213_1632.py new file mode 100644 index 0000000..f23f4ee --- /dev/null +++ b/authentication/migrations/0079_auto_20251213_1632.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.13 on 2025-12-13 16:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0078_auto_20251208_1617'), + ] + + operations = [ + migrations.AddField( + model_name='systemuserprofile', + name='pos', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 17, 31, 59, 715230)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 715230)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 711672)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 710642)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 710642)), + ), + ] diff --git a/authentication/migrations/0080_auto_20251214_1635.py b/authentication/migrations/0080_auto_20251214_1635.py new file mode 100644 index 0000000..d3a5a7e --- /dev/null +++ b/authentication/migrations/0080_auto_20251214_1635.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-12-14 16:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0079_auto_20251213_1632'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 17, 35, 24, 669993)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 669993)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 666317)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 666317)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 666317)), + ), + ] diff --git a/authentication/migrations/0081_auto_20251217_1648.py b/authentication/migrations/0081_auto_20251217_1648.py new file mode 100644 index 0000000..20aef6d --- /dev/null +++ b/authentication/migrations/0081_auto_20251217_1648.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-12-17 16:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0080_auto_20251214_1635'), + ] + + operations = [ + migrations.AlterField( + model_name='usermessage', + name='expire', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 17, 47, 34, 370198)), + ), + migrations.AlterField( + model_name='usermessage', + name='time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 370198)), + ), + migrations.AlterField( + model_name='userprofile', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 366661)), + ), + migrations.AlterField( + model_name='userprofile', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 366661)), + ), + migrations.AlterField( + model_name='userprofile', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 366661)), + ), + ] diff --git a/authentication/migrations/__init__.py b/authentication/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/authentication/models.py b/authentication/models.py new file mode 100644 index 0000000..81781b5 --- /dev/null +++ b/authentication/models.py @@ -0,0 +1,548 @@ +import string +import random +from django.contrib.postgres.fields import ArrayField +from django.db import models +from django.contrib.auth.models import User, Group +from django.conf import settings +from datetime import datetime, timezone, time, timedelta +from django.utils import timezone + +import uuid + + +# مدل پایه که تمامی مدل ها در سیستم ازین مدل ارث بری می کنند +from general_urls import base_user_gate_way_id + + +class BaseModel(models.Model): + key = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) + create_date = models.DateTimeField(auto_now_add=True) + modify_date = models.DateTimeField(auto_now=True) + created_by = models.ForeignKey( + settings.AUTH_USER_MODEL, + related_name="%(class)s_createdby", + on_delete=models.CASCADE, + null=True, + blank=True, + ) + modified_by = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="%(class)s_modifiedby", + null=True, + blank=True, + ) + trash = models.BooleanField(default=False) + + class Meta: + abstract = True + + +# مدل استان برای ذخیره استان استفاده میشود +class Province(BaseModel): + name = models.CharField(max_length=200, null=True) + province_id_key = models.IntegerField(null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(Province, self).save(*args, **kwargs) + + +# مدل شهرستان برای ذخیره شهرستان استفاده میشود +class City(BaseModel): + province = models.ForeignKey( + Province, on_delete=models.CASCADE, related_name="city_province", null=True + ) + province_id_foreign_key = models.IntegerField(null=True) + city_id_key = models.IntegerField(null=True) + name = models.CharField(max_length=200, null=True) + product_price = models.FloatField(default=0) + province_center = models.BooleanField(default=False) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(City, self).save(*args, **kwargs) + + +# مدل زیربخش شهرستان برای ذخیره زیربخش شهرستان استفاده میشود +class CityUnit(BaseModel): + city = models.ForeignKey( + City, on_delete=models.CASCADE, related_name="city_province", null=True + ) + city_id_foreign_key = models.IntegerField(null=True) + city_unit_id_key = models.IntegerField(null=True) + name = models.CharField(max_length=200, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(CityUnit, self).save(*args, **kwargs) + + +class PermissionLevel(BaseModel): + role = models.ForeignKey( + Group, + on_delete=models.CASCADE, + null=True, + related_name='group_permission' + ) + name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(PermissionLevel, self).save(*args, **kwargs) + + +# مدل آدرس برای ذخیره آدرس استفاده میشود +class SystemAddress(BaseModel): + province = models.ForeignKey( + Province, + on_delete=models.CASCADE, + related_name="province_address", + null=True + ) + city = models.ForeignKey( + City, + on_delete=models.CASCADE, + related_name="city_address", + null=True + ) + province_id_foreign_key = models.IntegerField(null=True) + city_id_foreign_key = models.IntegerField(null=True) + address_id_key = models.IntegerField(null=True) + address = models.CharField(max_length=300, null=True) + postal_code = models.CharField(max_length=20, default="", null=True) + breeding_unique_id = models.CharField(max_length=50, null=True) + phone = models.CharField(max_length=20, default="", null=True) + phone_type = models.CharField(max_length=20, default="", null=True) + no = models.CharField(max_length=5, default="", null=True) + floor = models.IntegerField(default=0, null=True) + unit = models.IntegerField(default=0, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(SystemAddress, self).save(*args, **kwargs) + + +# مدل آدرس برای ذخیره آدرس استفاده میشود +class Address(BaseModel): + title = models.CharField(max_length=200, default="", null=True) + country = models.CharField(max_length=100, default="", null=True) + province = models.CharField(max_length=50, default="", null=True) + city = models.CharField(max_length=50, default="", null=True) + address = models.CharField(max_length=300, null=True) + postal_code = models.CharField(max_length=20, default="", null=True) + breeding_unique_id = models.CharField(max_length=50, null=True) + phone = models.CharField(max_length=20, default="", null=True) + phone_type = models.CharField(max_length=20, default="", null=True) + no = models.CharField(max_length=5, default="", null=True) + floor = models.IntegerField(default=0, null=True) + unit = models.IntegerField(default=0, null=True) + + def save(self, *args, **kwargs): + super(Address, self).save(*args, **kwargs) + + +# مدل اطلاعات بانکی برای ذخیره اطلاعات جساب شخص استفاده میشود +class BankCard(BaseModel): + name_of_bank_user = models.CharField(max_length=200, null=True) + bank_name = models.CharField(max_length=30, null=True) + card = models.CharField(max_length=16, null=True) + shaba = models.CharField(max_length=100, null=True) + account = models.CharField(max_length=50, null=True) + user_bank_id_key = models.IntegerField(null=True) + province_name = models.CharField(max_length=50, null=True) + + # state = models.CharField(max_length=30, null=True) + + +class MultiRole(BaseModel): + user = models.ForeignKey( + User, on_delete=models.CASCADE, related_name="multi_role_users", null=True + ) + address = models.ForeignKey( + Address, + on_delete=models.CASCADE, + related_name='multi_role_address', + null=True + ) + + def save(self, *args, **kwargs): + super(MultiRole, self).save(*args, **kwargs) + + +# مدل پروفایل کاربری برای ذخیره پروفایل کاربری شخص استفاده میشود +class SystemUserProfile(BaseModel): + token = models.CharField(max_length=36, null=True) + user_gate_way_id = models.CharField(max_length=6,null=True, unique=True) + + user = models.ForeignKey( + User, on_delete=models.CASCADE, related_name="system_user_profile_user", null=True + ) + province = models.ForeignKey( + Province, + on_delete=models.CASCADE, + related_name='user_province', + null=True + ) + + city = models.ForeignKey( + City, + on_delete=models.CASCADE, + related_name='user_city', + null=True + ) + + user_django_id_foreign_key = models.IntegerField(null=True) + province_id_foreign_key = models.IntegerField(null=True) + city_id_foreign_key = models.IntegerField(null=True) + system_user_profile_id_key = models.IntegerField(null=True) + fullname = models.CharField(max_length=150, null=True) + first_name = models.CharField(max_length=200, null=True) + last_name = models.CharField(max_length=200, null=True) + father_name = models.CharField(max_length=200, null=True) + gender = models.CharField(max_length=20, null=True) + is_alive = models.BooleanField(null=True) + national_code = models.CharField(max_length=20, null=True) + national_code_image = models.CharField(max_length=500, null=True) + national_id = models.CharField(max_length=20, null=True) + mobile = models.CharField(max_length=11, null=True) + birthday = models.CharField(max_length=20, null=True) + image = models.CharField(max_length=500, null=True) + password = models.CharField(max_length=100, null=True) + active = models.BooleanField(default=True) + state = models.JSONField( + default={ + "province": "", + "city": "", + "first_name": "", + "last_name": "", + "national_code": "", + "national_id": "", + "mobile": "", + "birthday": "", + "image": "" + } + ) + access_level = models.ManyToManyField( + PermissionLevel, + related_name="user_permission_level" + ) + role = models.ManyToManyField( + Group, + related_name='user_system_roles' + ) + base_order = models.BigIntegerField(null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + unit_name = models.CharField(max_length=500, null=True) + unit_national_id = models.CharField(max_length=100, null=True) + unit_registration_number = models.CharField(max_length=100, null=True) + unit_economical_number = models.CharField(max_length=100, null=True) + unit_province = models.CharField(max_length=100, null=True) + unit_city = models.CharField(max_length=100, null=True) + unit_postal_code = models.CharField(max_length=100, null=True) + unit_address = models.TextField(null=True) + pos = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + if self.user_gate_way_id is None: + while (True): + res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=5)) + res = base_user_gate_way_id + res + if not SystemUserProfile.objects.filter(user_gate_way_id=res).exists(): + break + self.user_gate_way_id=res + super(SystemUserProfile, self).save(*args, **kwargs) + + +# مدل پروفایل کاربری برای ذخیره پروفایل کاربری شخص استفاده میشود +class UserProfile(BaseModel): + key = models.UUIDField(default=uuid.uuid4, editable=True, null=True) + token = models.CharField(max_length=36, default="") + app_token = models.CharField(max_length=36, null=True) + user = models.ForeignKey( + User, on_delete=models.CASCADE, related_name="users", null=True + ) + company = models.CharField(max_length=30, null=True) + address = models.ForeignKey( + Address, + on_delete=models.CASCADE, + related_name='user_address', + null=True + ) + role = models.ForeignKey( + Group, + on_delete=models.CASCADE, + null=True, + related_name='user_role' + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="bank_user", + null=True + ) + fullname = models.CharField(max_length=150, null=True, default="") + first_name = models.CharField(max_length=200, null=True, default="") + last_name = models.CharField(max_length=200, null=True, default="") + natinal_id = models.CharField(max_length=10, null=True, default="") + mobile = models.CharField(max_length=11, null=True, default="") + birthday = models.CharField(max_length=20, null=True, default="") + image = models.CharField(max_length=500, null=True) + state = models.CharField(max_length=20, default="register") + unit_name = models.CharField(max_length=100, null=True) + password = models.CharField(max_length=100, null=True) + gis_code = models.CharField(max_length=30, null=True) + operating_licence_capacity = models.BigIntegerField(default=0) + number_of_halls = models.IntegerField(default=0) + tenant = models.BooleanField(null=True) + person_type = models.CharField(max_length=10, null=True) + economic_code = models.CharField(max_length=30, null=True) + system_code = models.CharField(max_length=20, null=True) + epidemiological_code = models.CharField(max_length=20, null=True) + breeding_unique_id = models.CharField(max_length=20, null=True) + total_capacity = models.BigIntegerField(default=0) + licence_number = models.CharField(max_length=20, null=True) + health_certificate_number = models.CharField(max_length=20, null=True) + number_of_requests = models.BigIntegerField(default=0) + hatching_date = models.DateTimeField(default=timezone.now()) + last_party_date = models.DateTimeField(default=timezone.now()) + number_of_incubators = models.BigIntegerField(default=0) + herd_age_by_day = models.IntegerField(default=0) + herd_age_by_week = models.IntegerField(default=0) + number_of_party = models.IntegerField(default=0) + communication_type = models.CharField(max_length=30, null=True) + cooperative = models.CharField(max_length=50, null=True) + date_of_register = models.DateTimeField(default=timezone.now()) + unit_status = models.CharField(max_length=20, null=True) + samasat_user_code = models.CharField(max_length=20, null=True) + base_order = models.BigIntegerField(null=True) + incubation_date = models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + # if self.first_name != None and self.last_name != None: + # self.fullname = self.first_name + " " + self.last_name + super(UserProfile, self).save(*args, **kwargs) + + +# مدل نقاط جغرافیایی برای ذخیره نقاط طولی و عرضی آدرس استفاده میشود +class GeoPoint(BaseModel): + userprofile = models.ForeignKey( + UserProfile, + on_delete=models.CASCADE, + related_name="geo_user", + null=True + ) + name = models.CharField(max_length=100, null=True) + lang = models.CharField(max_length=50, null=True) + lat = models.CharField(max_length=50, null=True) + + +class Tenant(BaseModel): + userprofile = models.ManyToManyField( + UserProfile, + related_name="tenant_user", + ) + fullname = models.CharField(max_length=50, null=True) + national_code = models.CharField(max_length=20, null=True) + birthday = models.CharField(max_length=50, null=True) + rental = models.CharField(max_length=30, null=True) + tracking_code = models.CharField(max_length=30, null=True) + rent_date_from = models.CharField(max_length=30, null=True) + rent_date_to = models.CharField(max_length=30, null=True) + + +class UserMessageType(BaseModel): + message_types = ( + ("user", "USER"), + ("alluser", "AllUSER"), + ("group", "GROUP"), + ("allgroup", "AllGROUP"), + ("usergroup", "UserGroup"), + ("province_accept", "ProvinceAccept"), + ("province_rejected", "ProvinceRejected"), + ("city_operator_accept", "CityOperatorAccept"), + ("city_operator_rejected", "CityOperatorRejected"), + ("assignment_accepted", "AssignmentAccepted"), + ("assignment_rejected", "AssignmentRejected"), + ) + name = models.CharField(choices=message_types, max_length=50, default="", null=True) + + def __str__(self) -> str: + return self.name + + def save(self, *args, **kwargs): + super(UserMessageType, self).save(*args, **kwargs) + + pass + + +# مدل پیام کاربر برای ذخیره پیام کاربر استفاده میشود +class UserMessage(BaseModel): + roles = models.ManyToManyField( + Group, + blank=True, + related_name="user_roles" + ) + users = models.ManyToManyField( + SystemUserProfile, + blank=True, + related_name="user_message" + ) + sender = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="message_sender", + null=True + ) + heading = models.CharField(max_length=100, null=True, default="") + message = models.TextField(max_length=500, null=True, default="") + link_text = models.CharField(max_length=150, null=True) + link = models.CharField(max_length=100, null=True) + image = models.JSONField(default=dict, null=True) + expire = models.DateTimeField(default=datetime.now() + timedelta(hours=1)) + time = models.DateTimeField(default=datetime.now()) + state = models.CharField(max_length=20, default="pending") + message_type = models.ForeignKey( + UserMessageType, + on_delete=models.CASCADE, + null=True, + related_name="message_type" + ) + message_level = models.CharField(max_length=50, null=True) + + def save(self, *args, **kwargs): + super(UserMessage, self).save(*args, **kwargs) + + +class SendingMessageMethod(BaseModel): + level = models.CharField(max_length=50, null=True) + methods = models.CharField(max_length=150, null=True) + + def save(self, *args, **kwargs): + super(SendingMessageMethod, self).save(*args, **kwargs) + + +class Log(BaseModel): + user = models.ForeignKey( + User, on_delete=models.CASCADE, related_name="log_user", null=True + ) + function_name = models.CharField(max_length=200, null=True) + duration = models.FloatField(null=True) + status = models.IntegerField(null=True) + response = models.TextField(null=True) + request = models.TextField(null=True) + request_body = models.TextField(null=True) + response_body = models.TextField(null=True) + + def save(self, *args, **kwargs): + super(Log, self).save(*args, **kwargs) + + +class ExternalTransaction(BaseModel): + date = models.DateTimeField(auto_now_add=True) + amount = models.BigIntegerField(default=0) + amount_with_tax = models.BigIntegerField(default=0) + status = models.CharField(max_length=100, default='pending') + transaction_type = models.CharField(max_length=100, null=True) + type = models.CharField(max_length=100, null=True) + payer = models.CharField(max_length=100, null=True) + description = models.CharField(max_length=200, default=False) + is_complete = models.BooleanField(default=False) + message = models.TextField(null=True) + saleReferenceId = models.CharField(max_length=100, null=True) + refId = models.CharField(max_length=100, null=True) + orderId = models.CharField(max_length=100, null=True) + cardHolderPan = models.CharField(max_length=100, null=True) + receiver_role = models.CharField(max_length=100, null=True) + creator_role = models.CharField(max_length=100, null=True) + kill_house_user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + null=True, + related_name="transaction_kill_house_user" + ) + chain_company_user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + null=True, + related_name="transaction_chain_company_user" + ) + receiver = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + null=True, + related_name="receiver_user" + ) + creator = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + null=True, + related_name="creator_user" + ) + union_share = models.BigIntegerField(default=0) + company_share = models.BigIntegerField(default=0) + guilds_share = models.BigIntegerField(default=0) + city_share = models.BigIntegerField(default=0) + wallet_share = models.BigIntegerField(default=0) + other_share = models.BigIntegerField(default=0) + pay_type = models.CharField(max_length=200, null=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + + + def save(self, *args, **kwargs): + super(ExternalTransaction, self).save(*args, **kwargs) + + +class UserMessageSend(BaseModel): + user = models.ForeignKey(SystemUserProfile, on_delete=models.CASCADE, null=True) + message = models.TextField(null=True) + receive_code = models.CharField(max_length=400, null=True) + + def save(self, *args, **kwargs): + super(UserMessageSend, self).save(*args, **kwargs) + + +class Notice(BaseModel): + title = models.CharField(max_length=1000, null=True) + text = models.TextField(null=True) + users = models.JSONField(null=True) + read_users = models.JSONField(null=True) + unread_users = models.JSONField(null=True) + images = models.JSONField(null=True) + roles = models.JSONField(null=True) + + def save(self, *args, **kwargs): + super(Notice, self).save(*args, **kwargs) + + +class UserNoticeInfo(BaseModel): + notice = models.ForeignKey( + Notice, + related_name="user_notice", + + on_delete=models.CASCADE, + null=True + ) + user = models.ForeignKey( + SystemUserProfile, + related_name="notice_users", + on_delete=models.CASCADE, + null=True + ) + seen = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(UserNoticeInfo, self).save(*args, **kwargs) diff --git a/authentication/permission_views.py b/authentication/permission_views.py new file mode 100644 index 0000000..9c0ec92 --- /dev/null +++ b/authentication/permission_views.py @@ -0,0 +1,75 @@ + +# ویوست و توابعی که برای ایجاد سطج دستزسی جدید در سیستم استفاده میشوند + + +from django.contrib.auth.models import Group +from oauth2_provider.contrib.rest_framework import TokenHasScope, TokenHasReadWriteScope +from rest_framework import viewsets, serializers, status +from rest_framework.permissions import IsAuthenticated +from . import permissions +from rest_framework.response import Response +import logging + +log = logging.getLogger(__name__) + + +class GroupSerializer(serializers.ModelSerializer): + class Meta: + model = Group + fields = ['name'] + + +class GroupPermissionViewset(viewsets.ModelViewSet): + authentication_classes = [] + permission_classes = [TokenHasReadWriteScope] + queryset = Group.objects.all() + serializer_class = GroupSerializer + + def get_queryset(self): + queryset = super(GroupPermissionViewset, self).get_queryset() + log.error(f"here {self.request.user}") + + return queryset + + def list(self, request, *args, **kwargs): + queryset = super(GroupPermissionViewset, self).get_queryset() + log.error(f"here {request.user}") + + serializer = GroupSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + serializer.create(validated_data=request.data) + return Response(serializer.data) + return Response(serializer.errors) + + def retrieve(self, request, pk=None, *args, **kwargs): + key = request.GET['name'] + log.error(f"here {request.user}") + queryset = super(GroupPermissionViewset, self).get_queryset() + + queryset = queryset.get(name__exact=key) + serializer = self.serializer_class(queryset) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + key = request.GET['name'] + queryset = super(GroupPermissionViewset, self).get_queryset() + queryset = queryset.get(name__exact=key) + serializer = self.serializer_class(queryset) + serializer.update(instance=queryset, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def partial_update(self, request, pk=None, *args, **kwargs): + pass + + def destroy(self, request, pk=None, *args, **kwargs): + key = request.GET['name'] + queryset = super(GroupPermissionViewset, self).get_queryset() + + queryset = queryset.get(name__exact=key) + queryset.delete() + queryset.save() + return Response(status=status.HTTP_200_OK) diff --git a/authentication/permissions.py b/authentication/permissions.py new file mode 100644 index 0000000..72115a7 --- /dev/null +++ b/authentication/permissions.py @@ -0,0 +1,329 @@ + +# ویوست ها و توابعی که برای ایجاد سطج دستزسی جدید در سیستم استفاده میشوند + + +from rest_framework.permissions import BasePermission, DjangoModelPermissions +# from django.utils.datetime_safe import datetime +from authentication.models import UserProfile +from django.contrib.auth.models import Group +from datetime import timedelta, datetime +from rest_framework import permissions +from django.utils import timezone + + +class IsAuthenticatedOrCreate(permissions.IsAuthenticated): + def has_permission(self, request, view): + if request.method == 'POST': + return True + return super(IsAuthenticatedOrCreate, self).has_permission(request, view) + + +class IsOwner(permissions.BasePermission): + message = "Not an owner." + + def has_object_permission(self, request, view, obj): + if request.method in permissions.SAFE_METHODS: + return True + return request.user == obj.created_by + + +class AuthorOrReadOnly(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.is_authenticated: + return True + return False + + def has_object_permission(self, request, view, obj): + if obj.author == request.user: + return True + return False + + +class AuthenticatedOnly(permissions.BasePermission): + + def has_object_permission(self, request, view, obj): + if request.user.is_authenticated: + return True + return False + + +class AuthorAllStaffAllButEditOrReadOnly(permissions.BasePermission): + edit_methods = ("PUT", "PATCH") + + def has_permission(self, request, view): + if request.user.is_authenticated: + return True + + def has_object_permission(self, request, view, obj): + if request.user.is_superuser: + return True + + if request.method in permissions.SAFE_METHODS: + return True + + if obj.author == request.user: + return True + + if request.user.is_staff and request.method not in self.edit_methods: + return True + + return False + + +class ExpiredObjectSuperuserOnly(permissions.BasePermission): + message = "This object is expired." # custom error message + + def object_expired(self, obj): + expired_on = timezone.make_aware(datetime.now() - timedelta(minutes=10)) + return obj.created < expired_on + + def has_object_permission(self, request, view, obj): + + if self.object_expired(obj) and not request.user.is_superuser: + return False + else: + return True + + +class IsStaff(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.is_staff: + return True + return False + + def has_object_permission(self, request, view, obj): + if request.user.is_staff: + return True + return False + + +class IsOwner2(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.is_authenticated: + return True + return False + + def has_object_permission(self, request, view, obj): + if obj.author == request.user: + return True + return False + + +class IsFinancesMember(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="Finances").exists(): + return True + + +class IsCustomer(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="Customer").exists(): + return True + + +class IsOperator(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="Operator").exists(): + return True + + +class IsSaler(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="Saler").exists(): + return True + + +class IsSupervisor(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="Supervisor").exists(): + return True + + +class IsStorekeeper(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="Storekeeper").exists(): + return True + + +class IsDeliveryMember(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="Delivery").exists(): + return True + + +class IsAdminMember(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="Admin").exists(): + return True + + +class IsChatRoomOperator(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="ChatRoomOperator").exists(): + return True + + +class IsInformationOperator(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="InformationOperator").exists(): + return True + + +class IsFinanceUnitOperator(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="FinancialUnitOperator").exists(): + return True + + +class IsFinanceUnitAdmin(permissions.BasePermission): + + def has_permission(self, request, view): + if request.user.groups.filter(name="FinancialUnitAdmin").exists(): + return True + + +class IsSuperUser(BasePermission): + + def has_permission(self, request, view): + return request.user and request.user.is_superuser + + +class CityOperator(BasePermission): + + def has_permission(self, request, view): + if UserProfile.objects.filter(user__exact=request.user, role__name__exact="CityOperator").exists(): + return True + else: + return False + + +class ProvinceOperator(BasePermission): + + def has_permission(self, request, view): + if UserProfile.objects.filter(user__exact=request.user, role__name__exact="ProvinceOperator").exists(): + return True + + +class Poultry(BasePermission): + + def has_permission(self, request, view): + if UserProfile.objects.filter(user__exact=request.user, role__exact="Poultry").exists(): + return True + + +class KillHouseOperator(BasePermission): + + def has_permission(self, request, view): + if UserProfile.objects.filter(user__exact=request.user, role__exact="KillHouseOperator").exists(): + return True + + +class OwnerOrModelPermission(DjangoModelPermissions): + + def __same_user(self, obj, request): + from django.contrib.auth.models import User + return isinstance(obj, User) and obj.id == request.user.id + + def __is_owner(self, obj, request): + return hasattr(obj, 'owner') and obj.owner is not None and self.__same_user(obj.owner, request) + + def has_permission(self, request, view): + return request.user.is_superuser or DjangoModelPermissions().has_permission(request, view) + + def has_object_permission(self, request, view, obj): + return request.user.is_superuser or self.__same_user( + obj, request) or self.__is_owner( + obj, request) or DjangoModelPermissions().has_object_permission(request, view, obj) + + +class PaymentRequiredPermission(DjangoModelPermissions): + def can_operate(self, request): + return request.user.has_paid() + + def has_permission(self, request, view): + return self.can_operate(request) + + def has_object_permission(self, request, view, obj): + return self.can_operate(request) + + +class IsUser(BasePermission): + def has_permission(self, request, view): + return request.user and request.user.is_superuser + + def has_object_permission(self, request, view, obj): + return request.user.is_superuser or obj.user.id == request.user.id + + +class APIPermission(permissions.BasePermission): + message = 'Only API user can access APIs' + + group_name = "api" + + def has_permission(self, request, view): + try: + group = request.user.groups.get(name=self.group_name) + except Group.DoesNotExist: + self.message = "Permission denied, user group '{}' does not exists".format(self.group_name) + return False + return group.name == self.group_name + + +def _is_in_group(user, group_name): + """ + Takes a user and a group name, and returns `True` if the user is in that group. + """ + try: + return Group.objects.get(name=group_name).user_set.filter(id=user.id).exists() + except Group.DoesNotExist: + return None + + +def _has_group_permission(user, required_groups): + return any([_is_in_group(user, group_name) for group_name in required_groups]) + + +class IsLoggedInUserOrAdmin(permissions.BasePermission): + # group_name for super admin + required_groups = ['admin'] + + def has_object_permission(self, request, view, obj): + has_group_permission = _has_group_permission(request.user, self.required_groups) + if self.required_groups is None: + return False + return obj == request.user or has_group_permission + + +class IsAdminUser(permissions.BasePermission): + # group_name for super admin + required_groups = ['admin'] + + def has_permission(self, request, view): + has_group_permission = _has_group_permission(request.user, self.required_groups) + return request.user and has_group_permission + + def has_object_permission(self, request, view, obj): + has_group_permission = _has_group_permission(request.user, self.required_groups) + return request.user and has_group_permission + + +class IsAdminOrAnonymousUser(permissions.BasePermission): + required_groups = ['admin', 'anonymous'] + + def has_permission(self, request, view): + has_group_permission = _has_group_permission(request.user, self.required_groups) + return request.user and has_group_permission diff --git a/authentication/register.py b/authentication/register.py new file mode 100644 index 0000000..9970710 --- /dev/null +++ b/authentication/register.py @@ -0,0 +1,4427 @@ +from datetime import datetime, timedelta +import utm +from django.contrib.auth.models import User, Group +from django.db.models.functions import Abs +from django.http import HttpResponse +from django.views.decorators.csrf import csrf_exempt +from rest_framework import status +import openpyxl +from openpyxl.styles import Font, Alignment, PatternFill, Border, Side +from openpyxl.worksheet.datavalidation import DataValidation +from openpyxl.utils import get_column_letter +from io import BytesIO + +from authentication.sahandsms.sms import USERNAME_SMS_FINANCIAL, PASSWORD_SMS_FINANCIAL, OUT_SMS_PASS, OUT_SMS_USER, \ + PASSWORD_SMS_HAMEDAN, USERNAME_SMS_HAMEDAN +from authentication.sms_management import send_sms_request +from authentication.views import ARTA_URL_CHANGE_MOBILE_NUMBER, ARTA_URL_CHANGE_PASSWORD +from general_urls import base_user_gate_way_id, base_url_for_sms_report +from panel.KillHouse.helpers import kill_house_free_sale_product_warehousing, kill_house_requests_product_warehousing, \ + kill_house_free_buying_product_warehousing, kill_house_allocations_product_warehousing +from panel.ProvinceOperator.helpers import guild_steward_allocations_product_warehousing, \ + guild_steward_free_buying_product_warehousing, guild_steward_free_sale_product_warehousing, \ + guild_steward_product_segmentation +from panel.admin import PROJECT_API_KEY +from panel.convert_date import convert_to_miladi +from panel.helper import UNION_NUMBER, check_mobile_number +from panel.helper_excel import percent_of_losses, shamsi_date, to_locale_str +from panel.models import KillHouseDriver, Poultry, PoultryRequest, Wallet, LastUpdate, \ + KillHouseAssignmentInformation, KillHouseRequest, KillHouse, InternalTransaction, Guilds, Steward, GuildSteward, \ + RolesProducts, StewardAllocation, NewProduct, KillHouseFreeBarInformation, KillHouseFreeSaleBarInformation, \ + ColdHouseAllocations, CityOperatorCheckRequest, KillRequest, StewardFreeBarInformation, \ + StewardFreeSaleBarInformation, ChainAllocation, KillHouseWareHouse, VetFarm, CityOperator, CityGuild, \ + BarDifferenceRequest, PosSegmentation, PosMachineTransactions, WarehouseArchive, ProductsTransactions +from authentication.models import SystemUserProfile, City, Province, ExternalTransaction +import requests +from rest_framework.decorators import permission_classes, api_view +from rest_framework.permissions import AllowAny +from django.db.models import Q, F, Count, Sum + +from panel.poultry.helpers import poultry_prediction +from ticket.models import TicketSupport, MessageSupport + +ARTA_REGISTER = "https://userbackend.rasadyar.com/api/register_all/" +from rest_framework.response import Response +import hashlib + + +# pk_assigment = [4990, 4991, 4992, 4385, 4386, 4387, 4447, 4448, 4449, 4839, 4840, 5084, 5109, 5111, 3875, 4895, 4897, +# 4899, 4900, 4901, 4902, 4530, 4531, 4532, 4533, 4534, 4583, 4585, 4630, 4632, 4635, 4034, 3130, 3132, +# 4707, 4708, 4709, 4710, 4711, 3173, 3174, 3176, 3177, 3178, 3179, 3180] +# +# pk_kill_house_request = [12291, 12289, 12288, 11568, 11569, 11567, 11669, 11667, 11671, 12053, 12055, 12368, 12401, +# 12421, 10918, 12124, 12136, 12135, 12137, 12132, 12134, 11734, 11731, 11732, 11733, 11735, +# 11779, 11782, 11875, 11873, 11871, 11142, 10104, 10106, 11886, 11887, 11889, 11891, 11893, +# 10084, 10085, 10080, 10082, 10075, 10077, 10116] +# +# pk_province_kill_request = [4289, 4275, 4275, 4041, 4041, 4038, 4076, 4076, 4055, 4195, 4195, 4316, 4334, 4335, 3811, 4215, +# 4217, 4217, 4217, 4218, 4218, 4104, +# 4104, 4104, 4104, 4104, 4114, 4114, 4136, 4136, 4148, 3877, 3546, 3545, 4151, 4151, 4151, 4151, +# 4151, 3530, 3530, 3542, 3542, 3535, 3535, 3542] +# +# pk_hatching = [1273, 1251, 1251, 1206, 1206, 1252, 1247, 1247, 1206, 1203, 1203, 1276, 1307, 1249, 1143, 1281, 1232, +# 1232, 1232, 1273, 1273, 1240, +# 1240, 1240, 1240, 1240, 1234, 1234, 1200, 1200, 1247, 1186, 1085, 1098, 1251, 1251, 1251, 1251, 1251, +# 1336, 1336, 1113, 1113, 1253, 1253, 1113] + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def create_driver_excel_template(request): + """ + ایجاد فایل اکسل قالب برای ثبت راننده‌ها + پارامتر: kill_house_ids - لیست id کشتارگاه‌ها (کاما جدا شده) + """ + # دریافت id های کشتارگاه از پارامترهای درخواست + kill_house_ids_param = request.GET.get('kill_house_ids', '') + + if kill_house_ids_param: + kill_house_ids = [int(x.strip()) for x in kill_house_ids_param.split(',') if x.strip()] + kill_houses = KillHouse.objects.filter(trash=False, id__in=kill_house_ids) + else: + kill_houses = KillHouse.objects.filter(trash=False) + + # ساخت workbook + workbook = openpyxl.Workbook() + worksheet = workbook.active + worksheet.title = "رانندگان" + worksheet.sheet_view.rightToLeft = True + + # تعریف هدرهای اکسل + headers = [ + 'کشتارگاه', + 'مدل خودرو', + 'نوع خودرو', + 'پلاک خودرو', + 'کد بهداشتی حمل', + 'تاریخ اعتبار بهداشتی', + 'ظرفیت خودرو(قفس)', + 'کد ملی راننده', + 'شماره تماس راننده', + 'ملاحظات' + ] + + # استایل‌ها + header_fill = PatternFill(start_color="1E487B", fill_type="solid") + header_font = Font(size=11, bold=True, color="FFFFFF") + header_alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + thin_border = Border( + left=Side(style='thin'), + right=Side(style='thin'), + top=Side(style='thin'), + bottom=Side(style='thin') + ) + + # نوشتن هدرها + for col_num, header in enumerate(headers, 1): + cell = worksheet.cell(row=1, column=col_num, value=header) + cell.fill = header_fill + cell.font = header_font + cell.alignment = header_alignment + cell.border = thin_border + worksheet.column_dimensions[get_column_letter(col_num)].width = 18 + + # تنظیم عرض ستون‌ها + worksheet.column_dimensions['A'].width = 30 # کشتارگاه + worksheet.column_dimensions['D'].width = 22 # پلاک خودرو + worksheet.column_dimensions['F'].width = 20 # تاریخ اعتبار بهداشتی + worksheet.column_dimensions['J'].width = 25 # ملاحظات + + # ارتفاع ردیف هدر + worksheet.row_dimensions[1].height = 25 + + # ایجاد شیت جدید برای لیست کشتارگاه‌ها + kill_house_sheet = workbook.create_sheet(title="لیست کشتارگاه‌ها") + kill_house_sheet.sheet_view.rightToLeft = True + + # هدر شیت کشتارگاه‌ها + kill_house_headers = ['شناسه (ID)', 'نام کشتارگاه'] + for col_num, header in enumerate(kill_house_headers, 1): + cell = kill_house_sheet.cell(row=1, column=col_num, value=header) + cell.fill = header_fill + cell.font = header_font + cell.alignment = header_alignment + cell.border = thin_border + + kill_house_sheet.column_dimensions['A'].width = 15 + kill_house_sheet.column_dimensions['B'].width = 35 + + # لیست برای dropdown + kill_house_list = [] + + # پر کردن لیست کشتارگاه‌ها + for row_num, kill_house in enumerate(kill_houses, 2): + # فرمت: "id - نام کشتارگاه" + display_value = f"{kill_house.id} - {kill_house.name or 'بدون نام'}" + kill_house_list.append(display_value) + + kill_house_sheet.cell(row=row_num, column=1, value=kill_house.id).border = thin_border + kill_house_sheet.cell(row=row_num, column=2, value=kill_house.name or 'بدون نام').border = thin_border + + # ایجاد dropdown برای ستون کشتارگاه + if kill_house_list: + # اگر تعداد کشتارگاه‌ها زیاد باشد، از reference به شیت دیگر استفاده می‌کنیم + if len(kill_house_list) <= 100: + # استفاده از لیست مستقیم + dv = DataValidation( + type="list", + formula1='"' + ','.join(kill_house_list) + '"', + allow_blank=True + ) + else: + # استفاده از reference به شیت کشتارگاه‌ها + dv = DataValidation( + type="list", + formula1=f"'لیست کشتارگاه‌ها'!$A$2:$A${len(kill_house_list) + 1}", + allow_blank=True + ) + + dv.error = 'لطفاً از لیست کشتارگاه‌ها انتخاب کنید' + dv.errorTitle = 'ورودی نامعتبر' + dv.prompt = 'یک کشتارگاه از لیست انتخاب کنید' + dv.promptTitle = 'انتخاب کشتارگاه' + + # اضافه کردن validation به ستون اول (کشتارگاه) برای 1000 ردیف + dv.add('A2:A1001') + worksheet.add_data_validation(dv) + + # ذخیره فایل در BytesIO + output = BytesIO() + workbook.save(output) + output.seek(0) + + # ارسال فایل به عنوان response + response = HttpResponse( + content=output.getvalue(), + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + ) + response['Content-Disposition'] = 'attachment; filename="driver_template.xlsx"' + + return response + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def upload_driver_excel(request): + from panel.models import KillHouseADDCAR + + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + group = Group.objects.get(name__exact="Driver") + + success_count = 0 + error_list = [] + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i == 1: + continue + + try: + kill_house_value = row[0] + type_car = row[2] # مدل خودرو + pelak = row[3] # پلاک خودرو + health_code = row[4] # کد بهداشتی حمل + health_code_expiry = row[5] # تاریخ اعتبار بهداشتی + capacity = row[6] # ظرفیت خودرو (قفس) + national_code = row[7] # کد ملی راننده + driver_mobile = row[8] # شماره تماس راننده + notes = row[9] if len(row) > 9 else None # ملاحظات + + kill_house_id = None + if kill_house_value: + if isinstance(kill_house_value, int): + kill_house_id = kill_house_value + elif isinstance(kill_house_value, str): + if ' - ' in str(kill_house_value): + kill_house_id = int(str(kill_house_value).split(' - ')[0].strip()) + else: + kill_house_id = int(kill_house_value) + + kill_house = None + if kill_house_id: + kill_house = KillHouse.objects.filter(trash=False, id=kill_house_id).first() + + driver_mobile = str(driver_mobile) if driver_mobile else None + if driver_mobile and len(driver_mobile) <= 10: + driver_mobile = '0' + driver_mobile + + if not driver_mobile: + error_list.append(f"ردیف {i + 1}: شماره تماس راننده خالی است") + continue + + driver_name = "" + if kill_house: + existing_drivers_count = KillHouseADDCAR.objects.filter( + trash=False, + kill_house=kill_house, + archive=False + ).count() + + kill_house_name = kill_house.name or f"کشتارگاه {kill_house.id}" + driver_number = existing_drivers_count + 1 + driver_name = f"راننده {kill_house_name} {driver_number}" + + system_profile = None + try: + system_profile = SystemUserProfile.objects.get(trash=False, mobile=driver_mobile) + if group not in system_profile.role.all(): + system_profile.role.add(group) + + if not system_profile.first_name and driver_name: + system_profile.first_name = driver_name + system_profile.fullname = driver_name + system_profile.save() + + except SystemUserProfile.DoesNotExist: + password = '123456' + hashed_password = hashlib.sha256(str(password).encode()).hexdigest() + + data = { + "username": driver_mobile, + "first_name": driver_name, + "last_name": "", + "password": hashed_password, + "national_code": str(national_code) if national_code else "", + "role": "Driver", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=driver_mobile, first_name=driver_name, last_name="", password=hashed_password) + user.save() + + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + + province_obj = None + city_obj = None + if kill_house and kill_house.system_address: + province_obj = kill_house.system_address.province + city_obj = kill_house.system_address.city + + system_profile = SystemUserProfile( + mobile=driver_mobile, + first_name=driver_name, + last_name="", + fullname=driver_name, + user=user, + base_order=base_id, + password=password, + national_code=str(national_code) if national_code else None, + city=city_obj, + province=province_obj + ) + system_profile.save() + system_profile.role.add(group) + else: + error_list.append(f"ردیف {i + 1}: خطا در ثبت کاربر در سیستم مرکزی") + continue + + province_name = None + province_number = 0 + city_name = None + city_number = 0 + + if kill_house: + province_name = kill_house.province_name + province_number = kill_house.province_number or 0 + city_name = kill_house.city_name + city_number = kill_house.city_number or 0 + + driver = KillHouseDriver( + type_car=str(type_car) if type_car else None, + type='exclusive', + capocity=str(capacity) if capacity else None, + pelak=str(pelak) if pelak else None, + health_code=str(health_code) if health_code else None, + driver_name=driver_name, + driver_mobile=driver_mobile, + user=system_profile, + ) + driver.save() + + if kill_house: + if not KillHouseADDCAR.objects.filter( + trash=False, + kill_house=kill_house, + driver=driver, + archive=False + ).exists(): + add_car = KillHouseADDCAR( + kill_house=kill_house, + driver=driver, + kill_house_id_foreign_key=kill_house.id, + driver_id_foreign_key=driver.id, + province_name=province_name, + province_number=province_number, + city_name=city_name, + city_number=city_number + ) + add_car.save() + + success_count += 1 + + except Exception as e: + error_list.append(f"ردیف {i + 1}: {str(e)}") + continue + + return Response({ + "result": "عملیات با موفقیت انجام شد", + "success_count": success_count, + "errors": error_list + }, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_driver_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + group = Group.objects.get(name__exact="Driver") + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + first_name = row[1] + last_name = row[2] + mobile = row[3] + birthday = row[4] + province = row[5] + city = row[6] + password = row[7] + national_code = row[8] + car = row[9] + capacity = row[10] + plaque = row[11] + health_code = row[12] + hashed_password = hashlib.sha256(str(password).encode()).hexdigest() + + province = Province.objects.filter(name=province) + province = province.last() + city = City.objects.filter(name=city) + city = city.last() + + if i == 0: + continue + mobile = str(mobile) + if len(mobile) <= 10: + mobile = '0' + mobile + try: + system_profile = SystemUserProfile.objects.get(trash=False, mobile=mobile) + if 'Driver' not in system_profile.role.all(): + system_profile.role.add(group) + + except: + + data = { + "username": mobile, + "first_name": first_name, + "last_name": last_name, + "password": hashed_password, + "national_code": national_code, + "role": "Driver", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=first_name + '' + last_name, + user=user, + base_order=base_id, + password=password, + birthday=birthday, + city=city, + province=province + ) + system_profile.save() + system_profile.role.add(group) + + else: + return Response({"result": "مشکلی پیش آمده!"}, status=status.HTTP_401_UNAUTHORIZED) + + if KillHouseDriver.objects.filter(trash=False, user=system_profile, health_code=health_code, + pelak=plaque).exists(): + continue + else: + driver = KillHouseDriver( + type_car=car, + capocity=capacity, + pelak=plaque, + health_code=health_code, + driver_name=first_name + '' + last_name, + driver_mobile=mobile, + user=system_profile, + ) + driver.save() + + return Response({"result": "register"}, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_poultry_hatching_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename='BytesIO(file)', data_only=True) + sheet = wb_obj.active + sheet.delete_rows(sheet.max_row) + + not_find_list = [] + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + breeding_uniq_id = row[4] + licence_number = row[7] + hatching_quantity = row[11] + poultry_name = row[5] + losses = row[22] + if i <= 6: + continue + + poultry = Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id).first() + + if not poultry: + not_find_list.append(breeding_uniq_id) + continue + poultry.unit_name = poultry_name + poultry.save() + hatch = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id') + if hatch: + period = hatch.last().period + 1 + else: + period = 1 + + hatching_date = row[9].split('/') + date = convert_to_miladi( + year=int(hatching_date[0]), + month=int(hatching_date[1]), + day=int(hatching_date[2]) + ) + + poultry_hatching = hatch.filter(trash=False, archive=False, state='pending', + allow_hatching='pending').order_by('id') + + if not poultry_hatching.exists(): + if not hatch.filter(archive=True, state='complete', + allow_hatching="True", licence_number=licence_number).exists(): + hatching = PoultryHatching( + poultry=poultry, + date=date, + quantity=hatching_quantity, + breed=[ + {"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}], + period=period, + chicken_breed='*ترکیبی', + hall=1, + left_over=hatching_quantity, + latest_hatching_change={ + "role": "UnitWindow", + "date": str(datetime.now().date()), + "full_name": "" + }, + licence_number=licence_number, + breeding_unique_id=breeding_uniq_id, + losses=losses + + ) + hatching.save() + + else: + previouse_hatching = poultry_hatching.last() + + hatchings = poultry_hatching.filter(licence_number=licence_number) + if not hatchings: + if previouse_hatching.left_over > (previouse_hatching.quantity * percent_of_losses): + previouse_hatching.violation = True + previouse_hatching.save() + + hatching = PoultryHatching( + poultry=poultry, + date=date, + quantity=hatching_quantity, + breed=[ + {"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}], + period=period, + chicken_breed='*ترکیبی', + hall=1, + left_over=hatching_quantity, + latest_hatching_change={ + "role": "UnitWindow", + "date": str(datetime.now().date()), + "full_name": "" + }, + licence_number=licence_number, + breeding_unique_id=breeding_uniq_id, + losses=losses + + ) + hatching.save() + else: + last_hatchings = hatchings.first() + last_hatchings.date = date + last_hatchings.quantity = hatching_quantity + last_hatchings.losses = losses + last_hatchings.save() + + update = LastUpdate.objects.first() + update.update_date = datetime.now() + update.save() + return Response(not_find_list, status=status.HTTP_201_CREATED) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def check_poultry_hatching_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + inter = [] + for i, row in enumerate(sheet.iter_rows(values_only=True)): + breeding_uniq_id = row[3] + + if i == 7: + continue + poultry = Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id) + if poultry: + poultry = poultry.last() + else: + continue + poultry_hatching = PoultryHatching.objects.filter(trash=False, poultry=poultry, state='pending') + for poultry_hatchings in poultry_hatching: + dict_1 = { + "poultry": poultry_hatchings.poultry.unit_name, + "date": poultry_hatchings.date, + "quantity": poultry_hatchings.quantity, + "breed": poultry_hatchings.chicken_breed, + + } + inter.append(dict_1) + # dict_1.clear() + + return Response(inter, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def check_poultry_in_db(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + list1 = [] + for i, row in enumerate(sheet.iter_rows(values_only=True)): + try: + poultry = Poultry.objects.get(breeding_unique_id=row[6]) + if poultry: + continue + except: + dict1 = { + 'نام مرغدار': row[0], + 'شناسه یکتا': row[6] + } + list1.append(dict1) + return Response(list1, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def reset_hatching_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + l = 0 + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i <= 7: + continue + date = row[8].split('/') + miladi_date = convert_to_miladi( + year=int(date[0]), + month=int(date[1]), + day=int(date[2]) + ) + poultrys = Poultry.objects.filter(trash=False, breeding_unique_id=row[3]) + # return HttpResponse(poultrys.count()) + if poultrys: + for poultry in poultrys: + poultry_hatchings = PoultryHatching.objects.filter(poultry=poultry, date__year=miladi_date.year, + date__month=miladi_date.month, + date__day=miladi_date.day, + archive=False, trash=False, state='pending', + allow_hatching='pending') + if poultry_hatchings: + for poultry_hatching in poultry_hatchings: + l += 1 + if poultry_hatching.quantity - poultry_hatching.left_over == 0: + poultry_hatching.quantity = row[9] + poultry_hatching.left_over = row[9] + poultry_hatching.save() + else: + continue + + else: + continue + return Response(l) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def enter_driver_hamedan(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + group = Group.objects.get(name__exact="Driver") + l = 0 + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i <= 2: + continue + mobile = str(row[2]) + if len(mobile) == 10: + mobile = '0' + str.zfill(mobile, 10) + health_code = 0 + if row[8] is not None: + health_code = row[8] + first_name = row[0] + last_name = [1] + password = '00100' + hashed_password = hashlib.sha256(str(password).encode()).hexdigest() + province = Province.objects.filter(name='همدان') + province = province.last() + city = City.objects.filter(name='همدان') + city = city.last() + + system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).last() + if not system_profile: + data = { + "username": mobile, + "first_name": first_name, + "last_name": last_name, + "password": hashed_password, + "national_code": '0', + "role": "Driver", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=first_name + '' + last_name, + user=user, + base_order=base_id, + password=password, + birthday=str(datetime.now().date()), + city=city, + province=province + ) + system_profile.save() + system_profile.role.add(group) + l += 1 + kill_drivers = KillHouseDriver.objects.filter(trash=False, health_code=health_code, user__mobile=mobile, + driver_mobile=mobile) + if not kill_drivers: + wallet = Wallet() + wallet.save() + KillHouseDriver( + user=system_profile, + driver_name=first_name + ' ' + last_name, + driver_mobile=mobile, + type_car='کامیون', + type='exclusive', + pelak=row[9], + capocity=row[7], + health_code=health_code, + wallet=wallet, + ) + l += 1 + return Response(l) + + +def add_zero_for_user_mobile(request): + users = SystemUserProfile.objects.all() + l = 0 + for user in users: + if len(user.mobile) == 10: + user.mobile = '0' + user.mobile + user.save() + l += 1 + + return HttpResponse(l, status=status.HTTP_200_OK) + + +def integration_of_hatching(request): + poultry = Poultry.objects.filter(trash=False) + for user in poultry: + poultry_hatching = PoultryHatching.objects.filter(trash=False, poultry=user, archive=False, + allow_hatching='pending').order_by('id') + if poultry_hatching: + first_hatching = poultry_hatching.first() + for hatching in poultry_hatching: + if first_hatching != hatching: + first_hatching.quantity += hatching.quantity + first_hatching.left_over += hatching.left_over + first_hatching.killed_quantity += hatching.killed_quantity + p_requests = PoultryRequest.objects.filter(trash=False, hatching=hatching) + if p_requests: + for p_request in p_requests: + p_request.hatching = first_hatching + p_request.save() + hatching.trash = True + hatching.save() + first_hatching.save() + else: + pass + return HttpResponse('ok') + + +def period_to_fix(request): + poultries = Poultry.objects.filter(trash=False).order_by('id') + + for poultry in poultries: + hatch = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id') + # if len(hatch) > 1: + # period = len(hatch) + 1 + # else: + period = 1 + for hatching in hatch: + hatching.period = period + hatching.save() + period += 1 + return HttpResponse('ok') + + +# from panel.models import KillHouseAssignmentInformation, KillHouseRequest +# +# +# def assignment_information_fix_bar_info(request): +# kill_request=KillHouseRequest.objects.filter(trash=False,accepted_real_quantity=0,accepted_real_weight=0).select_related('province_request__poultry_request').only('accepted_real_weight','accepted_real_quantity','province_request__poultry_request') +# for kill in kill_request: +# kill.accepted_real_quantity=kill.quantity +# kill.accepted_real_weight=int(kill.quantity * kill.province_request.poultry_request.Index_weight) +# kill.save() +# +# return HttpResponse('ok') + + +# from panel.models import ProvinceKillRequest, KillHouseRequest +# from django.db.models import Sum +# def assignment_information_fix_bar_info(request): +# province = ProvinceKillRequest.objects.filter(total_killed_quantity=0,trash=False,state__in=('pending','accepted')) +# +# for p in province: +# p.total_killed_quantity=p.main_quantity +# p.total_killed_weight=int(p.main_quantity * p.province_request.poultry_request.Index_weight) +# p.save() +# return HttpResponse('ok') + + +# from panel.models import KillHouseAssignmentInformation, KillHouseRequest +# +# +# def assignment_information_fix_bar_info(request): +# kill_request=KillHouseRequest.objects.filter(trash=False,accepted_real_quantity=0,accepted_real_weight=0).select_related('province_request__poultry_request') +# for kill in kill_request: +# kill.accepted_real_quantity=kill.quantity +# kill.accepted_real_weight=int(kill.quantity * kill.province_request.poultry_request.Index_weight) +# kill.save() +# +# return HttpResponse('ok') +# +# +# def assignment_information_fix_bar_info(request): +# bar_information = KillHouseAssignmentInformation.objects.filter(trash=False).only( +# 'net_weight', 'real_quantity', 'kill_house_request__key').values('net_weight', 'real_quantity', +# 'kill_house_request__key') +# +# for bar in bar_information: +# try: +# kill_request = KillHouseRequest.objects.get(trash=False, key=bar['kill_house_request__key']) +# +# kill_request.accepted_real_quantity = bar['real_quantity'] +# kill_request.accepted_real_weight = bar['net_weight'] +# kill_request.save() +# except: +# pass +# +# +# return HttpResponse('ok') + +# +# from panel.models import KillHouseAssignmentInformation, KillHouseRequest +# # +# # +# def assignment_information_fix_bar_info(request): +# bar_information = KillHouseAssignmentInformation.objects.filter(pk__in=pk_assigment,trash=False).select_related('kill_house_request') +# for bar in bar_information: +# try: +# kill_request = KillHouseRequest.objects.get(trash=False, key=bar.kill_house_request.key) +# +# kill_request.accepted_real_quantity = bar.real_quantity +# kill_request.accepted_real_weight = bar.net_weight +# kill_request.save() +# except: +# pass +# +# return HttpResponse(len(bar_information)) +# +# from panel.models import ProvinceKillRequest, KillHouseRequest +# from django.db.models import Sum +# +# +# def assignment_information_fix_bar_info(request): +# province = ProvinceKillRequest.objects.filter(trash=False,state__in=('pending','accepted')) +# +# for p in province: +# kill_request = KillHouseRequest.objects.filter(trash=False, province_kill_request=p).only( +# 'accepted_real_quantity', 'accepted_real_weight') +# total_killed_quantity = kill_request.aggregate(total=Sum('accepted_real_quantity'))[ +# 'total'] +# total_killed_weight = kill_request.aggregate(total=Sum('accepted_real_weight'))[ +# 'total'] +# +# total_first_car = kill_request.aggregate(total=Sum('quantity'))[ +# 'total'] +# +# p.total_killed_quantity = total_killed_quantity if total_killed_quantity != None else 0 +# p.total_killed_weight = total_killed_weight if total_killed_weight != None else 0 +# p.first_car_allocated_quantity= total_first_car if total_first_car != None else 0 +# +# if p.main_quantity < p.total_killed_quantity: +# p.extra_killed_quantity = p.total_killed_quantity - p.main_quantity +# +# p.save() +# +# p.quantity=p.main_quantity - p.first_car_allocated_quantity if(p.main_quantity - p.first_car_allocated_quantity) > 0 else 0 +# p.save() +# return HttpResponse('ok') + +# from panel.models import ProvinceKillRequest, PoultryHatching +# from django.db.models import Sum +# +# +# def assignment_information_fix_bar_info(request): +# hatchings = PoultryHatching.objects.filter(trash=False).order_by('id') +# +# for hatching in hatchings: +# province_kills = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), +# province_request__poultry_request__hatching=hatching).order_by( +# 'id') +# +# total_extra = province_kills.aggregate(total=Sum('extra_killed_quantity'))[ +# 'total'] +# +# total_killed_quantity = province_kills.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_weight = province_kills.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# +# hatching.killed_quantity = total_killed_quantity if total_killed_quantity != None else 0 +# hatching.total_killed_weight = total_killed_weight if total_killed_weight != None else 0 +# +# province_kill_free = province_kills.filter( +# province_request__poultry_request__free_sale_in_province=True) +# total_killed_free_quantity = province_kill_free.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_free_weight = province_kill_free.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# hatching.free_quantity = total_killed_free_quantity if total_killed_free_quantity != None else 0 +# hatching.free_killed_quantity = total_killed_free_weight if total_killed_free_weight != None else 0 +# +# province_kill_goverment = province_kills.filter( +# province_request__poultry_request__free_sale_in_province=False) +# +# total_killed_goverment_quantity = province_kill_goverment.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_goverment_weight = province_kill_goverment.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# hatching.governmental_quantity = total_killed_goverment_quantity if total_killed_goverment_quantity != None else 0 +# hatching.governmental_killed_quantity = total_killed_goverment_weight if total_killed_goverment_weight != None else 0 +# +# hatching.extra_killed_quantity = total_extra if total_extra != None else 0 +# +# hatching.save() +# return HttpResponse('ok') + + +# from panel.models import ProvinceKillRequest, PoultryHatching +# from django.db.models import Sum +# from panel.models import ProvinceKillRequest, KillHouseRequest +# +# +# def assignment_information_fix_bar_info(request): +# list1 = [1336,1146,1120,1253,1141,1098,1112,1145,1163,1155,1134,1087,1172,1072,1113,1089,1115,1072,1123,1085,1109] +# +# hatchings = PoultryHatching.objects.filter(trash=False, id__in=list1) +# +# province = ProvinceKillRequest.objects.filter(trash=False,state__in=('accepted','pending') ,province_request__poultry_request__hatching__in=hatchings) +# for p in province: +# kill_requests=KillHouseRequest.objects.filter(trash=False,province_kill_request=p) +# total_killed_quantity = kill_requests.aggregate(total=Sum('accepted_real_quantity'))[ +# 'total'] +# total_killed_weight = kill_requests.aggregate(total=Sum('accepted_real_weight'))[ +# 'total'] +# total_car = kill_requests.aggregate(total=Sum('quantity'))[ +# 'total'] +# p.total_killed_quantity=total_killed_quantity if total_killed_quantity !=None else 0 +# p.total_killed_weight=total_killed_weight if total_killed_weight !=None else 0 +# p.first_car_allocated_quantity=total_car if total_car != None else 0 +# +# if p.main_quantity < p.total_killed_quantity: +# p.extra_killed_quantity = p.total_killed_quantity - p.main_quantity +# +# p.save() +# for hatching in hatchings: +# province_kills = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), +# province_request__poultry_request__hatching=hatching).order_by( +# 'id') +# +# total_extra = province_kills.aggregate(total=Sum('extra_killed_quantity'))[ +# 'total'] +# +# total_killed_quantity = province_kills.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_weight = province_kills.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# +# hatching.killed_quantity = total_killed_quantity if total_killed_quantity != None else 0 +# hatching.total_killed_weight = total_killed_weight if total_killed_weight != None else 0 +# +# province_kill_free = province_kills.filter( +# province_request__poultry_request__free_sale_in_province=True) +# total_killed_free_quantity = province_kill_free.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_free_weight = province_kill_free.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# hatching.free_quantity = total_killed_free_quantity if total_killed_free_quantity != None else 0 +# hatching.free_killed_quantity = total_killed_free_weight if total_killed_free_weight != None else 0 +# +# province_kill_goverment = province_kills.filter( +# province_request__poultry_request__free_sale_in_province=False) +# +# total_killed_goverment_quantity = province_kill_goverment.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_goverment_weight = province_kill_goverment.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# hatching.governmental_quantity = total_killed_goverment_quantity if total_killed_goverment_quantity != None else 0 +# hatching.governmental_killed_quantity = total_killed_goverment_weight if total_killed_goverment_weight != None else 0 +# +# hatching.extra_killed_quantity = total_extra if total_extra != None else 0 +# +# hatching.save() +# +# +# return HttpResponse('ok') +# +# from panel.models import ProvinceKillRequest, PoultryHatching +# from django.db.models import Sum +# from panel.models import ProvinceKillRequest, KillHouseRequest +# def assignment_information_fix_bar_info_3_day_ago(request): +# date=datetime.now().date() - timedelta(days=3) +# kill_house_reqs = KillHouseRequest.objects.filter(Q(vet_state= 'pending')|Q(assignment_state_archive='pending') +# ,clearance_code__isnull=True,kill_request__recive_date__date__lte=date, trash=False) +# +# list1=[] +# for kill_house_req in kill_house_reqs: +# kill_house_req.trash = True +# kill_house_req.save() +# hatching = PoultryHatching.objects.get(key=kill_house_req.province_request.poultry_request.hatching.key, trash=False) +# if hatching.id not in list1: +# list1.append(hatching.id) +# +# hatchings = PoultryHatching.objects.filter(trash=False, id__in=list1) +# +# province = ProvinceKillRequest.objects.filter(trash=False,state__in=('accepted','pending') ,province_request__poultry_request__hatching__in=hatchings) +# for p in province: +# kill_requests=KillHouseRequest.objects.filter(trash=False,province_kill_request=p) +# total_killed_quantity = kill_requests.aggregate(total=Sum('accepted_real_quantity'))[ +# 'total'] +# total_killed_weight = kill_requests.aggregate(total=Sum('accepted_real_weight'))[ +# 'total'] +# total_car = kill_requests.aggregate(total=Sum('quantity'))[ +# 'total'] +# p.total_killed_quantity=total_killed_quantity if total_killed_quantity !=None else 0 +# p.total_killed_weight=total_killed_weight if total_killed_weight !=None else 0 +# p.first_car_allocated_quantity=total_car if total_car != None else 0 +# +# if p.main_quantity < p.total_killed_quantity: +# p.extra_killed_quantity = p.total_killed_quantity - p.main_quantity +# +# p.save() +# for hatching in hatchings: +# province_kills = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), +# province_request__poultry_request__hatching=hatching).order_by( +# 'id') +# +# total_extra = province_kills.aggregate(total=Sum('extra_killed_quantity'))[ +# 'total'] +# +# total_killed_quantity = province_kills.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_weight = province_kills.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# +# hatching.killed_quantity = total_killed_quantity if total_killed_quantity != None else 0 +# hatching.total_killed_weight = total_killed_weight if total_killed_weight != None else 0 +# +# province_kill_free = province_kills.filter( +# province_request__poultry_request__free_sale_in_province=True) +# total_killed_free_quantity = province_kill_free.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_free_weight = province_kill_free.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# hatching.free_quantity = total_killed_free_quantity if total_killed_free_quantity != None else 0 +# hatching.free_killed_quantity = total_killed_free_weight if total_killed_free_weight != None else 0 +# +# province_kill_goverment = province_kills.filter( +# province_request__poultry_request__free_sale_in_province=False) +# +# total_killed_goverment_quantity = province_kill_goverment.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_goverment_weight = province_kill_goverment.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# hatching.governmental_quantity = total_killed_goverment_quantity if total_killed_goverment_quantity != None else 0 +# hatching.governmental_killed_quantity = total_killed_goverment_weight if total_killed_goverment_weight != None else 0 +# +# hatching.extra_killed_quantity = total_extra if total_extra != None else 0 +# +# hatching.save() +# +# +# return HttpResponse('ok') + +# def assignment_information_fix_bar_info(request): +# kill_house_requests=(KillHouseRequest.objects.filter(trash=True,clearance_code__isnull=True,message__isnull=False, +# bar_remover__isnull=False)).only('message') +# for kill_house_request in kill_house_requests: +# kill_house_request.message='عدم دریافت کد قرنطینه' +# # kill_house_request.bar_remover={ +# # "date": str(kill_house_request.create_date.date()), +# # "role":"KillHouse", +# # "mobile": kill_house_request.killhouse_user.kill_house_operator.user.mobile, +# # "full_name": kill_house_request.killhouse_user.kill_house_operator.user.fullname, +# # } +# kill_house_request.save() +# return HttpResponse('ok') +# +from panel.models import ProvinceKillRequest, PoultryHatching + + +# def assignment_information_fix_bar_info(request): +# today = datetime.now().date() - timedelta(days=2) +# province_kill_requests = (ProvinceKillRequest.objects.filter(kill_request__recive_date__date__lte=today, +# first_car_allocated_quantity=0, trash=False) +# .select_related('province_request__poultry_request')) +# if province_kill_requests: +# for province_kill_request in province_kill_requests: +# poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key, +# trash=False) +# hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) +# +# if province_kill_request.main_quantity - province_kill_request.quantity == 0: +# province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) +# province_check.quantity += province_kill_request.main_quantity +# province_check.save() +# poultry_request.remain_quantity += province_kill_request.main_quantity +# poultry_request.save() +# +# if poultry_request.free_sale_in_province == True: +# hatching.free_killed_quantity -= province_kill_request.total_killed_weight +# hatching.free_quantity -= province_kill_request.total_killed_quantity +# else: +# hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight +# hatching.governmental_quantity -= province_kill_request.total_killed_quantity +# +# hatching.save() +# province_kill_request.quantity = 0 +# province_kill_request.total_killed_quantity = 0 +# province_kill_request.total_killed_weight = 0 +# province_kill_request.return_to_province = True +# province_kill_request.save() +# return HttpResponse({'msg': 'all done'}) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def register_guilds(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + group = Group.objects.get(name__exact="Guilds") + l = 0 + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i <= 1: + continue + mobile = str(row[2]) + if len(mobile) == 10: + mobile = '0' + str.zfill(mobile, 10) + # postal_code = row[4] + national_code = row[5] + first_name = row[0] + last_name = row[1] + guild_id = row[4] + license_num = 0 + password = '00100' + hashed_password = hashlib.sha256(str(password).encode()).hexdigest() + province = Province.objects.get(id=2) + city = City.objects.get(id=8) + area = 'گوشت و مرغ' + type_act = 'خرده فروش' + system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).first() + if system_profile: + pass + # data = { + # "username": mobile, + # "first_name": first_name, + # "last_name": last_name, + # "password": hashed_password, + # "national_id": national_code, + # "role": "Guilds", + # "api_key": PROJECT_API_KEY + # } + # req = requests.post( + # url=ARTA_REGISTER, + # data=data, + # verify=False + # ) + # + # if req.status_code == 200: + # user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password) + # user.save() + # base_id = SystemUserProfile.objects.all() + # if base_id.count() > 0: + # base_id = int(base_id.last().base_order) + 1 + # else: + # base_id = 1000 + # system_profile = SystemUserProfile( + # mobile=mobile, + # first_name=first_name, + # last_name=last_name, + # fullname=first_name + '' + last_name, + # user=user, + # base_order=base_id, + # password=password, + # birthday=str(datetime.now().date()), + # city=city, + # province=province + # ) + # system_profile.save() + # system_profile.role.add(group) + # l += 1 + # address = SystemAddress(city=city, province=province, address=row[3]) + # address.save() + # wallet = Wallet() + # wallet.save() + # guildss=Guilds( + # user=system_profile, + # license_number=license_num, + # guilds_name=first_name + '' + last_name, + # guilds_id=guild_id, + # area_activity=area, + # type_activity=type_act, + # address=address, + # wallet=wallet, + # ) + # guildss.save() + # l+=1 + # guild = Guilds.objects.filter(trash=False, user=system_profile).first() + # if guild: + + # if not Product.objects.filter(guild__exact=guild): + # l+=1 + # + # additional_products = AdditionalProducts.objects.filter(trash=False).exclude( + # name='سایر محصولات').order_by('id') + # if additional_products: + # for additional_product in additional_products: + # show = True if additional_product.name == 'مرغ گرم' else False + # product = Product( + # name=additional_product.name, + # image=additional_product.image, + # unit_of_measurement=additional_product.unit_of_measurement, + # priority=additional_product.priority, + # guild=guild, + # selling_free_price=additional_product.selling_free_price, + # selling_approved_price=additional_product.selling_approved_price, + # selling_more_than_inventory=additional_product.selling_more_than_inventory, + # selling_other_products=additional_product.selling_other_products, + # price=additional_product.price, + # show=show, + # ) + # product.save() + # company = PosCompany.objects.get(id=1) + # pos_machine=POSMachine.objects.filter(guild__exact=guild).first() + # if not pos_machine: + # while (True): + # res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=10)) + # res = base_pos_id + res + # if not POSMachine.objects.filter(pos_id=res).exists(): + # break + # pos_machine=POSMachine( + # pos_id=res, + # user=guild.user, + # guild=guild, + # pos_company=company + # ) + # pos_machine.save() + # guild.has_pos = True + # guild.save() + # l+=1 + # return Response(l) + + +# from panel.models import ProvinceKillRequest, PoultryHatching +# from django.db.models import Sum +# from panel.models import ProvinceKillRequest, KillHouseRequest +# def assignment_information_fix_bar_info(request): +# hatchings = PoultryHatching.objects.filter(trash=False, pk__in=pk_hatching) +# +# province = ProvinceKillRequest.objects.filter(trash=False ,pk__in=pk_province_kill_request ) +# for p in province: +# kill_requests=KillHouseRequest.objects.filter(trash=False,province_kill_request=p) +# total_killed_quantity = kill_requests.aggregate(total=Sum('accepted_real_quantity'))[ +# 'total'] +# total_killed_weight = kill_requests.aggregate(total=Sum('accepted_real_weight'))[ +# 'total'] +# total_car = kill_requests.aggregate(total=Sum('quantity'))[ +# 'total'] +# p.total_killed_quantity=total_killed_quantity if total_killed_quantity !=None else 0 +# p.total_killed_weight=total_killed_weight if total_killed_weight !=None else 0 +# p.first_car_allocated_quantity=total_car if total_car != None else 0 +# +# if p.main_quantity < p.total_killed_quantity: +# p.extra_killed_quantity = p.total_killed_quantity - p.main_quantity +# +# p.save() +# for hatching in hatchings: +# province_kills = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), +# province_request__poultry_request__hatching=hatching).order_by( +# 'id') +# +# total_extra = province_kills.aggregate(total=Sum('extra_killed_quantity'))[ +# 'total'] +# +# total_killed_quantity = province_kills.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_weight = province_kills.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# +# hatching.killed_quantity = total_killed_quantity if total_killed_quantity != None else 0 +# hatching.total_killed_weight = total_killed_weight if total_killed_weight != None else 0 +# +# province_kill_free = province_kills.filter( +# province_request__poultry_request__free_sale_in_province=True) +# total_killed_free_quantity = province_kill_free.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_free_weight = province_kill_free.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# hatching.free_quantity = total_killed_free_quantity if total_killed_free_quantity != None else 0 +# hatching.free_killed_quantity = total_killed_free_weight if total_killed_free_weight != None else 0 +# +# province_kill_goverment = province_kills.filter( +# province_request__poultry_request__free_sale_in_province=False) +# +# total_killed_goverment_quantity = province_kill_goverment.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] +# total_killed_goverment_weight = province_kill_goverment.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] +# hatching.governmental_quantity = total_killed_goverment_quantity if total_killed_goverment_quantity != None else 0 +# hatching.governmental_killed_quantity = total_killed_goverment_weight if total_killed_goverment_weight != None else 0 +# +# hatching.extra_killed_quantity = total_extra if total_extra != None else 0 +# +# hatching.save() +# +# +# return HttpResponse('ok') + + +def update_chicken_age_from_login(): + poultry_hatching = PoultryHatching.objects.filter(trash=False).only('date', 'chicken_age', 'last_change').order_by( + '-id') + now = datetime.now().date() + for hatching in poultry_hatching: + now_age = (now - hatching.date.date()).days + 1 + if hatching.archive == False and hatching.allow_hatching == 'pending': + hatching.chicken_age = now_age + hatching.save() + elif hatching.archive == True and hatching.allow_hatching == 'True': + if hatching.last_change: + date = datetime.strptime((hatching.last_change['date'].split(' ')[0]), '%Y-%m-%d').date() + age = (date - hatching.date.date()).days + 1 + if age < 80: + hatching.chicken_age = (date - hatching.date.date()).days + 1 + hatching.save() + else: + continue + if now_age <= 120: + hatching.now_age = now_age + hatching.save() + + +def violation_archive_true(request): + poultry_haching = PoultryHatching.objects.filter(allow_hatching='True', archive=True, + trash=False, left_over__gt=F('quantity') * percent_of_losses, + violation=False).only('quantity', 'left_over', 'violation') + l = 0 + for hatching in poultry_haching: + hatching.violation = True + hatching.save() + l += 1 + return HttpResponse(l) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def update_chicken_breed_from_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file), data_only=True) + sheet = wb_obj.active + + sheet.delete_rows(sheet.max_row) + done = 0 + not_done = 0 + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i <= 7: + continue + breeding_uniq_id = row[3] + breed = row[10] + licence_number = row[5] + try: + poultry_hatching = PoultryHatching.objects.filter(violation=False, trash=False, allow_hatching='pending', + state='pending', + poultry__breeding_unique_id=breeding_uniq_id, + licence_number=licence_number).order_by( + 'id').last() + + if poultry_hatching: + if poultry_hatching.chicken_breed == '*ترکیبی': + poultry_hatching.chicken_breed = breed + elif poultry_hatching.chicken_breed != breed and poultry_hatching.chicken_breed != '*ترکیبی': + poultry_hatching.chicken_breed = 'ترکیبی' + else: + continue + + poultry_hatching.save() + done += 1 + except: + not_done += 1 + continue + # hatching.save() + return Response(f'موفق:{done}\n ناموفق ها:{not_done}', status=status.HTTP_201_CREATED) + + +def ye_chee_bani(request): + kill_assigment = KillHouseAssignmentInformation.objects.filter( + ~Q(real_quantity=F('kill_house_request__accepted_real_quantity'))).select_related('kill_house_request') + + list1 = kill_assigment.values_list('kill_house_request__province_request__poultry_request__hatching__pk', flat=True) + # print(list(list1)) + return HttpResponse(list(list1)) + + +def dedicated_killer(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + l = 0 + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i <= 1: + continue + bar_code = row[1] + mobile = str(row[12]) + if len(mobile) == 10: + mobile = '0' + str.zfill(mobile, 10) + try: + kill_req = KillHouseRequest.objects.get(bar_code=bar_code) + killer = KillHouse.objects.get(kill_house_operator__user__mobile=mobile) + kill_req.killer = killer + kill_req.save() + except: + l += 1 + continue + return HttpResponse(l) + + +def valem_kin2(request): + kill_req = KillHouseRequest.objects.filter(archive_wage=True, create_date__date__gte='2024-03-20').only( + 'archive_wage').order_by('id') + m = kill_req.values_list('pk', flat=True) + print(len(m)) + for i in kill_req: + i.archive_wage = False + i.save() + # kill_req = ProvinceKillRequest.objects.filter(archive_wage=True, create_date__date__gte='2024-03-20').only( + # 'archive_wage').order_by('id') + # for i in kill_req: + # i.archive_wage = False + # i.save() + + # kill_req = KillHouseFreeBarInformation.objects.filter(archive_wage=False, create_date__date__lte='2024-04-19').only( + # 'archive_wage').order_by('id') + # for i in kill_req: + # i.archive_wage = True + # i.save() + + return HttpResponse('ok') + + +def transaction_company_for_freezing(request): + poultry_request = PoultryRequest.objects.filter(trash=False, freezing=True).order_by('id') + province_request = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted') + , archive_wage=False, + province_request__poultry_request__in=poultry_request).only( + 'total_killed_weight', 'total_wage_amount', 'company_share', 'wage', 'company_share_percent' + ) + for p in province_request: + amount = int(p.total_killed_weight * 500) + p.total_wage_amount = amount + p.wage = 500 + p.company_share = amount + p.guilds_share = 0 + p.union_share = 0 + p.company_share_percent = 100 + p.union_share_percent = 0 + p.guilds_share_percent = 0 + p.save() + + return HttpResponse('ok') + + +import string +import random + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def make_gate_way_id(request): + users = SystemUserProfile.objects.filter(user_gate_way_id__isnull=True).order_by('id') + for user in users: + while (True): + res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=5)) + res = base_user_gate_way_id + res + if not SystemUserProfile.objects.filter(user_gate_way_id=res).exists(): + break + user.user_gate_way_id = res + user.save() + return HttpResponse('done!') + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_server_time(request): + date = datetime.now() + return Response(date) + + +def transaction_fix(request): + province_request = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted') + , archive_wage=False, + ).only( + 'total_killed_weight', 'total_wage_amount', 'company_share', 'wage', 'company_share_percent', 'other_share', + 'other_share_percent' + ).exclude(id=3868) + for p in province_request: + amount = p.total_wage_amount + + p.guilds_share = amount - (p.company_share + p.union_share) + p.save() + + return HttpResponse('ok') + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def internal_transaction_fix(request): + internals = InternalTransaction.objects.filter(trash=False, status='completed', date__date__gt='2024-06-01' + , transaction_type='wage-gateway-auto') \ + .order_by('date') + for internal in internals: + if internal.amount != ( + internal.company_share + internal.guilds_share + internal.union_share + internal.other_share): + internal.company_share = internal.company_share + ((internal.amount * 1) / 100) + internal.save() + + return Response('ok') + + +def utm_to_loc(easting, northing): + zone_number = 39 + zone_letter = 'N' + lat, lon = utm.to_latlon(easting, northing, zone_number, zone_letter) + zone_number = int((lon + 180) // 6) + 1 + zone_letter = 'CDEFGHJKLMNPQRSTUVWXX'[(int(lat) + 80) // 8] + lat, lon = utm.to_latlon(easting, northing, zone_number, zone_letter) + + return lat, lon + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def convert_utm_to_location(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + list1 = [] + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i < 1: + continue + else: + utm = row[14] + breeding_uniq_id = row[5] + utm = utm.split('/') + easting = int(utm[0]) + northing = int(utm[1]) + lat, long = utm_to_loc(easting, northing) + poultry = Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id).first() + if poultry: + poultry.lat = lat + poultry.long = long + poultry.save() + else: + list1.append(breeding_uniq_id) + + return HttpResponse('ok') + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def fix_internal_transactions(request): + internal = InternalTransaction.objects.filter(trash=False, kill_house__isnull=False) + for i in internal: + i.payer_fullname = i.kill_house.kill_house_operator.user.fullname + i.payer_mobile = i.kill_house.kill_house_operator.user.mobile + i.save() + return Response('ok') + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_hatching(request): + poultryes = Poultry.objects.filter(trash=False) + list1 = [] + + for p in poultryes: + # پیدا کردن تاریخ‌هایی که دوبار یا بیشتر تکرار شده‌اند + repeated_dates = PoultryHatching.objects.values('date__year', 'date__month').annotate( + date_count=Count('id') + ).filter(trash=False, poultry=p, date_count__gt=1) + + # فیلتر کردن رکوردهایی که سال و ماه آنها در لیست تکراری‌ها قرار دارند + query = Q() + for date in repeated_dates: + query |= Q(date__year=date['date__year'], date__month=date['date__month']) + + poultry_hatchings = PoultryHatching.objects.filter(query, trash=False, poultry=p, killed_quantity=0) + # for p in poultry_hatchings: + # p.trash=True + # p.save() + + return Response(list1) + + +def change_last_digit_to_six(request): + user_profile = SystemUserProfile.objects.filter(trash=False, mobile='09216919296').order_by('id') + for u in user_profile: + first_mobile_number = u.mobile + second_mobile_number = '09011110911' + data = { + "first_mobile_number": str(first_mobile_number), + "second_mobile_number": '09011110911', + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + # return Response(req.status_code) + if req.status_code == 200: + print('ok') + second_mobile_number = second_mobile_number + + user = User.objects.filter(id=u.user.id).first() + user.username = second_mobile_number + user.save() + u.mobile = second_mobile_number + u.save() + return HttpResponse('ok') + + +def canceled_out_province_request(): + province_requests = PoultryRequest.objects.filter(state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending'), trash=False, + archive=False, + out_province_request_cancel=False, out=True, wage_pay=False, + has_wage=True) + data = {"date": str(datetime.now()), "role": "SuperAdmin", "mobile": "-", + "fullname": "کنسل شده توسط سیستم به دلیل عدم پرداخت"} + for province_request in province_requests: + if province_request.state_process == 'accepted' and province_request.province_state == 'accepted': + hatching = PoultryHatching.objects.get(key=province_request.hatching.key, trash=False) + hatching.out_province_killed_weight -= int(province_request.quantity * province_request.Index_weight) + hatching.out_province_killed_quantity -= province_request.quantity + hatching.save() + province_request.out_province_request_cancel = True + province_request.out_province_request_canceller = data + province_request.archive = True + province_request.state_process = 'rejected' + province_request.province_state = 'rejected' + province_request.save() + + message = f'بار خارج از استان به شماره {province_request.order_code} به علت عدم پرداخت کنسل شد.' \ + f'\n' \ + f'(سامانه رصدیار)' + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={UNION_NUMBER}&message={message}") + + +def fix_guild_kill_house(request): + guilds = Guilds.objects.filter(trash=False, kill_house_centers_allocation__isnull=False) + for guild in guilds: + list1 = [] + for i in guild.kill_house_centers_allocation: + list1.append(i['value']) + kill_house1 = KillHouse.objects.filter(key__in=list1) + guild.kill_house.set(kill_house1) + + return HttpResponse('ok') + + +def fix_guild_steward_kill_house(request): + stewards = Steward.objects.filter(trash=False, centers_allocation__isnull=False) + for steward in stewards: + guild = Guilds.objects.get(trash=False, id=steward.guilds.id) + list1 = [] + for i in steward.centers_allocation: + list1.append(i['value']) + kill_house1 = KillHouse.objects.filter(key__in=list1) + guild.steward_kill_house.set(kill_house1) + + return HttpResponse('ok') + + +def fix_guild_steward(request): + guild = Guilds.objects.get(id=26, trash=False) + stewards = guild.stewards.all() + list1 = [i['value'] for i in guild.centers_allocation] + + # واکشی مباشرین مرتبط + stewardss = Guilds.objects.filter( + pk__in=Steward.objects.filter(key__in=list1).values_list('guilds', flat=True), + trash=False + ) + + # حذف رابطه‌های قبلی در مدل میانی + GuildSteward.objects.filter(guild=guild).delete() + + # اضافه کردن روابط جدید در مدل میانی + guild_stewards = [GuildSteward(guild=guild, steward=steward) for steward in stewardss] + GuildSteward.objects.bulk_create(guild_stewards) + + return HttpResponse('done!') + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def check_product(request): + product = RolesProducts.objects.get(id=1) + return Response(kill_house_free_sale_product_warehousing(product)) + + +def add_to_steward_temp_key(request): + stewards_allocations = StewardAllocation.objects.filter(steward__isnull=False).order_by('id') + for stewards_allocation in stewards_allocations: + stewards_allocation.steward_temp_key = stewards_allocation.steward.guilds.id + stewards_allocation.save() + return HttpResponse('ok') + + +def add_to_steward(request): + stewards_allocations = StewardAllocation.objects.filter(steward_temp_key__isnull=False).order_by('id') + for stewards_allocation in stewards_allocations: + guild = Guilds.objects.get(id=stewards_allocation.steward_temp_key) + stewards_allocation.steward = guild + stewards_allocation.save() + return HttpResponse('ok') + + +def make_role_prodoct(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).order_by('id') + guilds = Guilds.objects.filter(trash=False) + product = NewProduct.objects.all().first() + for kill_house in kill_houses: + role_product = RolesProducts( + kill_house=kill_house, + parent_product=product, + name='مرغ گرم', + ) + role_product.save() + for guild in guilds: + role_product = RolesProducts( + guild=guild, + parent_product=product, + name='مرغ گرم', + ) + role_product.save() + + return HttpResponse('ok') + + +def fix_steward_allocation(request): + steward_allocations = StewardAllocation.objects.filter(kill_house__isnull=False).order_by('id') + for steward_allocation in steward_allocations: + product = RolesProducts.objects.filter(kill_house=steward_allocation.kill_house).first() + if steward_allocation.guilds is not None: + steward_allocation.to_guilds = steward_allocation.guilds + steward_allocation.allocation_type = 'killhouse_guild' + steward_allocation.guilds = None + elif steward_allocation.steward is not None: + steward_allocation.to_steward = steward_allocation.steward + steward_allocation.allocation_type = 'killhouse_steward' + steward_allocation.steward = None + else: + continue + steward_allocation.product = product + + steward_allocation.save() + return HttpResponse('ok') + + +def fix_KillHouseFreeSaleBarInformation(request): + free_kills = KillHouseFreeSaleBarInformation.objects.filter(trash=False, kill_house__isnull=False).order_by('id') + for free_kill in free_kills: + product = RolesProducts.objects.filter(kill_house=free_kill.kill_house).first() + free_kill.product = product + free_kill.save() + return HttpResponse('ok') + + +def fix_KillHouseFreeBarInformation(request): + free_kills = KillHouseFreeBarInformation.objects.filter(trash=False, kill_house__isnull=False).order_by('id') + for free_kill in free_kills: + product = RolesProducts.objects.filter(kill_house=free_kill.kill_house).first() + free_kill.product = product + free_kill.save() + return HttpResponse('ok') + + +# @api_view(["GET"]) +# @permission_classes([AllowAny]) +# @csrf_exempt +# def kill_house_requests_product_warehousing(request): +# kill_house=KillHouse.objects.get(id=int(request.GET['id'])) +# product=RolesProducts.objects.get(kill_house=kill_house) +# kill_house_requests = KillHouseRequest.objects.filter(killhouse_user=product.kill_house, +# ware_house_confirmation=True, trash=False,calculate_status=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) +# # governmental_kill_house_requests = kill_house_requests.filter( +# # province_request__poultry_request__free_sale_in_province=False, +# # province_request__poultry_request__direct_buying=False) +# # free_kill_house_requests = kill_house_requests.filter( +# # 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() +# return Response("done!") + + +# @api_view(["GET"]) +# @permission_classes([AllowAny]) +# @csrf_exempt +# def kill_house_free_buying_product_warehousing(request): +# kill_house=KillHouse.objects.get(id=int(request.GET['id'])) +# product=RolesProducts.objects.get(kill_house=kill_house) +# kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(kill_house=product.kill_house, trash=False,calculate_status=True) +# 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() +# return Response("done!") + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def kill_house_cold_house_allocations_product_warehousing(request): + kill_house = KillHouse.objects.get(id=int(request.GET['id'])) + product = RolesProducts.objects.get(kill_house=kill_house) + 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() + return Response("done!") + + +# @api_view(["GET"]) +# @permission_classes([AllowAny]) +# @csrf_exempt +# def kill_house_allocations_product_warehousing(request): +# kill_house=KillHouse.objects.get(id=int(request.GET['id'])) +# product=RolesProducts.objects.get(kill_house=kill_house) +# kill_house_allocations = StewardAllocation.objects.filter( +# Q(kill_house=product.kill_house) | Q(to_kill_house=product.kill_house), trash=False,calculate_status=True) +# kill_house_allocated = kill_house_allocations.filter(kill_house__isnull=False) +# kill_house_allocated_from = kill_house_allocations.filter(kill_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) +# +# +# 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.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.save() +# return Response("done!") +# + + +# @api_view(["GET"]) +# @permission_classes([AllowAny]) +# @csrf_exempt +# def kill_house_free_sale_product_warehousing(request): +# kill_house=KillHouse.objects.get(id=int(request.GET['id'])) +# product=RolesProducts.objects.get(kill_house=kill_house) +# kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=product.kill_house, +# +# trash=False,calculate_status=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() +# return Response("done!") +# + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def check_kill_house_request_calculate(request): + check_date = '2024-06-01' + check_date = datetime.strptime(check_date, '%Y-%m-%d').date() + kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__lt=check_date, trash=False) + for kill_house_request in kill_house_requests: + kill_house_request.calculate_status = False + kill_house_request.save() + return Response("done!") + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def check_kill_house_free_bar_information_calculate(request): + check_date = '2024-06-01' + check_date = datetime.strptime(check_date, '%Y-%m-%d').date() + kill_house_free_bars = KillHouseFreeBarInformation.objects.filter(date__date__lt=check_date, trash=False) + for kill_house_free_bar in kill_house_free_bars: + kill_house_free_bar.calculate_status = False + kill_house_free_bar.save() + return Response("done!") + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def check_kill_house_free_sale_bar_information_calculate(request): + check_date = '2024-06-01' + check_date = datetime.strptime(check_date, '%Y-%m-%d').date() + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(date__date__lt=check_date, trash=False) + for kill_house_free_sale_bar in kill_house_free_sale_bars: + kill_house_free_sale_bar.calculate_status = False + kill_house_free_sale_bar.save() + return Response("done!") + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def check_steward_allocations_calculate(request): + check_date = '2024-06-01' + check_date = datetime.strptime(check_date, '%Y-%m-%d').date() + steward_allocations = StewardAllocation.objects.filter(date__date__lt=check_date, trash=False) + for steward_allocation in steward_allocations: + steward_allocation.calculate_status = False + steward_allocation.save() + return Response("done!") + + +def update_trash_status(model, filter_kwargs): + """ + به‌روزرسانی فیلدهای `trash`, `temporary_trash` و `temporary_deleted` برای یک مدل مشخص. + """ + queryset = model.objects.filter(**filter_kwargs).only('temporary_deleted', 'trash', 'temporary_trash') + for item in queryset: + if item.trash == True: + item.temporary_deleted = True + item.trash = True + item.temporary_trash = True + item.save() + + +def temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (PoultryRequest, {"send_date__date__lt": check_date}), + (CityOperatorCheckRequest, {"poultry_request__send_date__date__lt": check_date}), + (KillRequest, {"recive_date__date__lt": check_date}), + (ProvinceKillRequest, {"kill_request__recive_date__date__lt": check_date}), + (KillHouseRequest, {"kill_request__recive_date__date__lt": check_date}), + (KillHouseAssignmentInformation, {"kill_house_request__kill_request__recive_date__date__lt": check_date}), + (KillHouseFreeBarInformation, {"date__date__lt": check_date}), + (KillHouseFreeSaleBarInformation, {"date__date__lt": check_date}), + (StewardAllocation, {"date__date__lt": check_date}), + (ColdHouseAllocations, {"date__date__lt": check_date}), + (StewardFreeBarInformation, {"date__date__lt": check_date}), + (StewardFreeSaleBarInformation, {"date__date__lt": check_date}), + (InternalTransaction, {"date__date__lt": check_date}), + (ExternalTransaction, {"date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def PoultryRequest_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (PoultryRequest, {"send_date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def CityOperatorCheckRequest_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (CityOperatorCheckRequest, {"poultry_request__send_date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def KillRequest_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (KillRequest, {"recive_date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def ProvinceKillRequest_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (ProvinceKillRequest, {"kill_request__recive_date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def KillHouseRequest_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (KillHouseRequest, {"kill_request__recive_date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def KillHouseAssignmentInformation_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (KillHouseAssignmentInformation, {"kill_house_request__kill_request__recive_date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def KillHouseFreeBarInformation_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (KillHouseFreeBarInformation, {"date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def StewardAllocation_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (StewardAllocation, {"date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def ColdHouseAllocations_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (ColdHouseAllocations, {"date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def StewardFreeBarInformation_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (StewardFreeBarInformation, {"date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def StewardFreeSaleBarInformation_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (StewardFreeSaleBarInformation, {"date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def InternalTransaction_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (InternalTransaction, {"date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def ExternalTransaction_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (ExternalTransaction, {"date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def ChainAllocation_temporary_trash_true(request): + check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date() + + models_and_filters = [ + (ChainAllocation, {"date__date__lt": check_date}), + ] + + for model, filter_kwargs in models_and_filters: + update_trash_status(model, filter_kwargs) + + return HttpResponse('ok') + + +def archive_hatching_temporary_true(request): + filtered_poultry_hatch = PoultryHatching.objects.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True)) + for filtered_poultry in filtered_poultry_hatch: + if filtered_poultry.trash == True: + filtered_poultry.temporary_deleted = True + filtered_poultry.trash = True + filtered_poultry.temporary_trash = True + filtered_poultry.save() + return HttpResponse('ok') + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def duplicate_order_code(request): + from django.db.models import Count + + duplicate_order_codes = PoultryRequest.objects.values('order_code').annotate(count=Count('id')).filter(count__gt=1, + trash=False).values_list( + 'order_code', flat=True) + + return Response(duplicate_order_codes) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_duplicate_order_code(request): + duplicate_order_codes = ( + PoultryRequest.objects + .values('order_code') + .annotate(count=Count('id')) + .filter(count__gt=1, trash=False) + .values_list('order_code', flat=True) + ) + + # استخراج شناسه‌های مرغ‌های مرتبط با کدهای تکراری + poultry_ids = ( + PoultryRequest.objects + .filter(order_code__in=duplicate_order_codes, trash=False) + .values_list('poultry__id', flat=True) + .distinct() + ) + + # مرتب‌سازی مرغ‌ها بر اساس شناسه + poultries = Poultry.objects.filter(trash=False, id__in=poultry_ids).order_by('id') + list1 = [] + # بررسی درخواست‌های مرتبط با هر مرغ + for poultry in poultries: + requests = PoultryRequest.objects.filter(trash=False, poultry=poultry).order_by('order_code') + base_order_code = str(poultry.user.base_order) # فرض بر این است که "user" به درستی تعریف شده است + last_order = [] + for req in requests: + if str(req.order_code)[:4] == base_order_code: + last_order.clear() + last_order.append(req.order_code) + # if str(req.order_code)[:4] != base_order_code: + # list1.append(req.id) + if last_order: + last_num = last_order[0] + 1 + for req in requests: + if str(req.order_code)[:4] != base_order_code: + base_order_code = last_num + req.order_code = base_order_code + req.save() + last_num += 1 + last_order.clear() + + return Response(list1) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_duplicate_order_code_new(request): + duplicate_order_codes = ( + PoultryRequest.objects + .values('order_code') + .annotate(count=Count('id')) + .filter(count__gt=1, trash=False) + .values_list('order_code', flat=True) + ) + + # استخراج شناسه‌های مرغ‌های مرتبط با کدهای تکراری + poultry_ids = ( + PoultryRequest.objects + .filter(order_code__in=duplicate_order_codes, trash=False) + .values_list('poultry__user__id', flat=True) + .distinct() + ) + + # مرتب‌سازی مرغ‌ها بر اساس شناسه + poultries = SystemUserProfile.objects.filter(trash=False, id__in=poultry_ids).order_by('id') + list1 = [] + for user in poultries: + print(user.id) + order_code = int(str(user.base_order) + '0001') + requests = PoultryRequest.objects.filter(trash=False, poultry__user=user).order_by('id') + for req in requests: + req.order_code = order_code + req.save() + order_code += 1 + # # بررسی درخواست‌های مرتبط با هر مرغ + # for poultry in poultries: + # requests = PoultryRequest.objects.filter(trash=False,poultry=poultry).order_by('order_code') + # base_order_code = str(poultry.user.base_order) # فرض بر این است که "user" به درستی تعریف شده است + # last_order=[] + # for req in requests: + # if str(req.order_code)[:4] == base_order_code: + # last_order.clear() + # last_order.append(req.order_code) + # # if str(req.order_code)[:4] != base_order_code: + # # list1.append(req.id) + # if last_order: + # last_num=last_order[0] + 1 + # for req in requests: + # if str(req.order_code)[:4] != base_order_code: + # base_order_code = last_num + # req.order_code=base_order_code + # req.save() + # last_num+=1 + # last_order.clear() + + return Response(list1) + + +def add_free_bar_to_warehouse(): + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related( + 'system_address__province') + date = datetime.now().date() - timedelta(days=3) + for kill_house in kill_houses: + free_bars = KillHouseFreeBarInformation.objects.filter(buy_type='live', trash=False, weight_of_carcasses=0, + create_date__date__lt=date, kill_house=kill_house, + ware_house=False) + + if free_bars: + wieght = \ + free_bars.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + for free_bar in free_bars: + product = free_bar.product + real_weight = round((free_bar.live_weight * 75) / 100) + free_bar.number_of_carcasses = int(real_weight / 1.5) + free_bar.weight_of_carcasses = real_weight + free_bar.weight_loss = 25 + free_bar.ware_house = True + free_bar.date = str(datetime.now()) + free_bar.entered_message = 'ورود به انبار توسط سیستم' + free_bar.total_wage_amount = free_bar.wage * int( + free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int( + free_bar.weight_of_carcasses) + + union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0 + company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0 + guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0 + city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0 + wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0 + other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0 + free_bar.union_share = int(union_percent * free_bar.total_wage_amount) + free_bar.company_share = int(company_percent * free_bar.total_wage_amount) + free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount) + free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount) + free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount) + free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount) + free_bar.save() + kill_house_free_buying_product_warehousing(product) + + mobile = kill_house.kill_house_operator.user.mobile + if kill_house.killer == False: + killer = 'کشتارگاه' + else: + killer = 'کشتارکن' + message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ + f'\n' \ + f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \ + f'\n' \ + f'(سامانه رصدیار)' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}") + + +def change_password_poultry(request): + poultries = SystemUserProfile.objects.filter(role__name='Poultry') + for poultry in poultries: + password = random.randint(1000, 9999) + print(password) + data = { + 'username': poultry.mobile, + 'password': str(password) + } + req_change_pass = requests.post( + url=ARTA_URL_CHANGE_PASSWORD, + data=data, + verify=False + ) + if req_change_pass.status_code == 200: + poultry.password = str(password) + poultry.save() + + +def add_vet_farm_to_poultry_request(request): + from django.db.models import F, ExpressionWrapper, DurationField + + requests = PoultryRequest.objects.filter(trash=False, vet_farm__isnull=True).order_by('id') + for r in requests: + vet_farms = VetFarm.objects.filter(poultry=r.poultry).order_by('id') + if len(vet_farms) == 1: + + r.vet_farm = vet_farms.first().vet + r.save() + elif len(vet_farms) > 1: + # محاسبه اختلاف زمان و مرتب‌سازی بر اساس آن + vet_farms_with_diff = vet_farms.annotate( + date_diff=ExpressionWrapper( + F('create_date') - r.send_date, + output_field=DurationField() + ) + ).order_by('-date_diff') + closest_vet_farm = vet_farms_with_diff.first() + if closest_vet_farm: + r.vet_farm = closest_vet_farm.vet + r.save() + return HttpResponse("ok") + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def fix_kill_req_njsndb(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i < 6 or row is None: + continue + poultry = row[3] + date = row[6] + quantity = row[13] + wieght = row[14] + accepterde = row[19] + date = date.split('-') + + date = convert_to_miladi( + year=int(date[0]), + month=int(date[1]), + day=int(date[2]) + ) + kill_req = KillHouseFreeBarInformation.objects.get(trash=False, kill_house=5, + poultry_name=poultry, quantity=int(quantity), + live_weight=int(wieght), date__date=date, + acceptor_rejector=accepterde, + + ) + + kill_house = KillHouse.objects.get(id=int(row[21])) + if kill_house: + print(kill_req.id) + kill_req.exclusive_killer = kill_house + kill_req.save() + + # print(date.date()) + # for kill in kill_req: + # if kill.poultry_name == poultry and kill.quantity== quantity and \ + # kill.live_weight== wieght and kill.date.date() ==date and kill.acceptor_rejector == accepterde: + # print(kill.id) + return HttpResponse('ok') + + +def create_city_guild(request): + city_operator = CityOperator.objects.filter(trash=False, id=1) + prefix = "0918000" # قسمت ثابت شماره موبایل + random_part = random.randint(0, 9999) # تولید یک عدد تصادفی بین ۰ تا ۹۹۹۹ + random_part_str = f"{random_part:04d}" # اطمینان از چهار رقمی بودن (مثلاً ۰۱۲۳ به جای ۱۲۳) + phone_number = prefix + random_part_str + list1 = [] + group = Group.objects.get(name__exact="CityGuild") + for i in city_operator: + first_name = 'شرکت' + last_name = str(i.unit_name.strip().split()[-1]) + password = '2025' + hashed_password = hashlib.sha256(str(password).encode()).hexdigest() + province = Province.objects.filter(id=i.user.province.id).last() + city = City.objects.filter(id=i.user.city.id).last() + data = { + "username": phone_number, + "first_name": first_name, + "last_name": last_name, + "password": hashed_password, + "national_code": '0', + "role": "CityGuild", + "api_key": PROJECT_API_KEY + } + while True: + system_profile = SystemUserProfile.objects.filter(mobile=phone_number, trash=False).last() + if not system_profile: + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + if req.status_code == 200: + break + else: + phone_number = str(int(phone_number) + 1) + else: + phone_number = str(int(phone_number) + 1) + + user = User(username=phone_number, first_name=first_name, last_name=last_name, password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=phone_number, + first_name=first_name, + last_name=last_name, + fullname=first_name + '' + last_name, + user=user, + base_order=base_id, + password=password, + birthday=str(datetime.now().date()), + city=city, + province=province + ) + system_profile.save() + system_profile.role.add(group) + wallet = Wallet() + wallet.save() + guild = CityGuild( + user=system_profile, + address=i.address, + unit_name=f'شرکت پروتئین {last_name}', + wallet=wallet, + wallet_amount=0, + ) + guild.save() + + return HttpResponse('ok') + + +def add_killing_age_to_poultry_request(request): + poultry_requests = PoultryRequest.objects.filter(trash=False, out_province_request_cancel=False).order_by('id') + for poultry_request in poultry_requests: + age = (poultry_request.send_date.date() - poultry_request.hatching.date.date()).days + 1 + poultry_request.killing_age = age + poultry_request.save() + return HttpResponse('ok') + + +def add_poultry_prediction(request): + poultry_hatching = PoultryHatching.objects.filter(trash=False, temporary_trash=False, + temporary_deleted=False).values_list('poultry__id', + flat=True).distinct() + poultrys = Poultry.objects.filter(id__in=poultry_hatching, trash=False) + for poultry in poultrys: + poultry_prediction(poultry) + return HttpResponse('ok') + + +def fix_out_quantity_hatching(request): + hatchings = PoultryHatching.objects.filter(trash=False, allow_hatching='pending', + state='pending') + l = 0 + for hatching in hatchings: + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, + state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending'), + out_province_request_cancel=False, + hatching=hatching) + + total_killed_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] + total_killed_weight = out_poultry_requests.aggregate(total=Sum('Index_weight'))[ + 'total'] + total_killed_weight = total_killed_weight / len(out_poultry_requests) + if total_killed_quantity != hatching.out_province_killed_quantity: + hatching.out_province_killed_quantity = total_killed_quantity + hatching.out_province_killed_weight = int(total_killed_weight * total_killed_quantity) + hatching.save() + return HttpResponse(l) + + +def accept_bar_difference_request_pending_cron_job(): + date = datetime.now().date() - timedelta(days=2) + bar_requests = BarDifferenceRequest.objects.filter(trash=False, + state='pending', create_date__date__lt=date).order_by('id') + for bar_request in bar_requests: + bar_request.state = 'accepted' + bar_request.acceptor_fullname = 'سیستمی' + bar_request.acceptor_mobile = '00000000000' + bar_request.acceptor_date = datetime.now() + bar_request.hatching.bar_difference_request_quantity += bar_request.quantity + bar_request.hatching.bar_difference_request_weight += bar_request.weight + bar_request.hatching.save() + bar_request.save() + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def live_chicken_transportation(request): + import requests + + url = "https://www.samasat.ir/Report/BroilerCarryChickenAccordingToCarriage/_AjaxBinding" + headers = { + "authority": "www.samasat.ir", + "accept": "*/*", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "en-US,en;q=0.9", + "content-type": "application/x-www-form-urlencoded; charset=UTF-8" + } + + cookies = { + "ASP.NET_SessionId": "dl1fj1ad2m4ys1doyjr0gi1c", + ".ASPXAUTH": "01BF39FE4507AAA7C63455A5B32B87A86145C672877A8ACAB074E87A89F13CDA40489ECD2E6732763758CD61528A0AE6BB390A8B3603BDAAA31CDD3AE7509F7885088F9CB51F56128C497F58ADEEFB54791C2F08ACF11AC1662DC1052430AA26E3EF29C1390FEC77C0C27908CC7A7AC9B62D7809419BE9639C848D10EB00022DCEE2B53039E8C13A59E7D50F3BC45D8C2328368285EF992B6FCF076CECFE8EFBE570F3A1FD0831D0B64EB8C9BBD326E088A40BCF3602C565FD00E78309AF4A4B75BA4E99A5A968F2FE666CCB4F176CAD2D9AC75D100EB69EBE4EA832C23C6EC8442B501BE3A014B50B711167292D3934C86843AC8CF151913575473BFE6003332B0DE69FDEAF78993B986CF8766682AC35E7B8A0492CBD59859E94DDABCC0FE6696C4703772CCEA19B05BE641B3F2DB636D79E8AEDB97E81792D9F357E8C8B3A843364032098683E90B61E90A3C2E647AD68BC067624EEB5328D0A22B8D38F9BC2A032C654DEE193580793A0CB0EDA4C65123EF59FC27D44E304FCCD8DB1548A944BEC5D1EE489C95EDBC406E61C603FC479D004DD705AAFE5FC1D10883E416D30AA11A1FF048DC92F41613B54E04F25D63D951F89380518D71CEC42C0E4207B66F0E0A940DF387782BD54A10E84A4F1E0266AB096538577CFA49A64092BC6CEBFED30B4E4F29D1D16EFB78BBF9B54D8047DD8919555906C98D0BFA11D81EDB0C938EAC11561EF3BB403D07A67C32D5F2202FC21881356CC3F954291FCF3C80653C46102A9C45C417D8241569D6D5ABEA8BB26DDA2E8A1E1D2A406A7EBD94F5E2349B5A18FB7C6CFE4E4FAD6C40201EC27F64DB539B964B18BEEA6A1DC188E3981053C0C1572325E54218AB20E663A194C78CEF2716D126456346B8323CCA4387D827AF775C055F7DF1D6131B2AB4B8C4CCC2B5AE7C025A4F6726B42E6BDCB99B8D695E091766B4C61BD16FE16DC8BF096010C6F1C077B12BD702B71C96D46D37670E40056337F971E3B2B8A72E50A64334B0DD480CC2B4E3F658255DF7C5880D6A5B673AE17EDECB65FDB34EF71E378DC1971389FEA8C89F01F96E75E30C4E5B3F42C07823C5AE78A720F71F15BA90FDEE9EE5D22920EB0F9052D083992D3430FCA0D327B365D734E7BBDCACEAAB6C8", + "leggedOut": "-" + } + + payload = { + "sort": "RemoveDateMax-desc", + "page": "1", + "pageSize": "25", + "group": "", + "aggregate": "HatchingCount-sum~RemoveCount-sum", + "filter": "", + "searchVm.ProvinceLocationId": "65550", + "searchVm.UnitName": "", + "searchVm.PersonFullName": "", + "searchVm.PartIdCode": "", + "searchVm.PostalCode": "", + "searchVm.EpidemiologicCode": "", + "searchVm.CapacityFemale": "", + "searchVm.BfrCode": "", + "searchVm.SourceCertId": "", + "searchVm.HatchingCount": "", + "searchVm.RemoveCount": "", + "searchVm.HatchingDateFrom": "", + "searchVm.HatchingDateTo": "", + "searchVm.PercentRemoveTakhlieFromHatchingFrom": "", + "searchVm.PercentRemoveTakhlieFromHatchingTo": "", + "searchVm.RemoveDateMinFrom": "", + "searchVm.RemoveDateMinTo": "", + "searchVm.RemoveDateMaxFrom": "1403/11/24", + "searchVm.RemoveDateMaxTo": "1403/12/04", + "searchVm.RemoveAgeAvgFrom": "", + "searchVm.RemoveAgeAvgTo": "", + "searchVm.RemoveAgeAvgSamasatFrom": "", + "searchVm.RemoveAgeAvgSamasatTo": "", + "searchVm.RemovePartyCountFrom": "", + "searchVm.RemovePartyCountTo": "" + } + + response = requests.post(url, headers=headers, cookies=cookies, data=payload) + + return Response(response.json()) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def heards_meat_flow(request): + import requests + url = "https://www.samasat.ir/Report/BroilerOnFlowFlocksHealthPermitReport/_AjaxBinding" + headers = { + "authority": "www.samasat.ir", + "accept": "*/*", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "en-US,en;q=0.9", + "content-type": "application/x-www-form-urlencoded; charset=UTF-8" + } + + cookies = { + "ASP.NET_SessionId": "dl1fj1ad2m4ys1doyjr0gi1c", + ".ASPXAUTH": "01BF39FE4507AAA7C63455A5B32B87A86145C672877A8ACAB074E87A89F13CDA40489ECD2E6732763758CD61528A0AE6BB390A8B3603BDAAA31CDD3AE7509F7885088F9CB51F56128C497F58ADEEFB54791C2F08ACF11AC1662DC1052430AA26E3EF29C1390FEC77C0C27908CC7A7AC9B62D7809419BE9639C848D10EB00022DCEE2B53039E8C13A59E7D50F3BC45D8C2328368285EF992B6FCF076CECFE8EFBE570F3A1FD0831D0B64EB8C9BBD326E088A40BCF3602C565FD00E78309AF4A4B75BA4E99A5A968F2FE666CCB4F176CAD2D9AC75D100EB69EBE4EA832C23C6EC8442B501BE3A014B50B711167292D3934C86843AC8CF151913575473BFE6003332B0DE69FDEAF78993B986CF8766682AC35E7B8A0492CBD59859E94DDABCC0FE6696C4703772CCEA19B05BE641B3F2DB636D79E8AEDB97E81792D9F357E8C8B3A843364032098683E90B61E90A3C2E647AD68BC067624EEB5328D0A22B8D38F9BC2A032C654DEE193580793A0CB0EDA4C65123EF59FC27D44E304FCCD8DB1548A944BEC5D1EE489C95EDBC406E61C603FC479D004DD705AAFE5FC1D10883E416D30AA11A1FF048DC92F41613B54E04F25D63D951F89380518D71CEC42C0E4207B66F0E0A940DF387782BD54A10E84A4F1E0266AB096538577CFA49A64092BC6CEBFED30B4E4F29D1D16EFB78BBF9B54D8047DD8919555906C98D0BFA11D81EDB0C938EAC11561EF3BB403D07A67C32D5F2202FC21881356CC3F954291FCF3C80653C46102A9C45C417D8241569D6D5ABEA8BB26DDA2E8A1E1D2A406A7EBD94F5E2349B5A18FB7C6CFE4E4FAD6C40201EC27F64DB539B964B18BEEA6A1DC188E3981053C0C1572325E54218AB20E663A194C78CEF2716D126456346B8323CCA4387D827AF775C055F7DF1D6131B2AB4B8C4CCC2B5AE7c025A4F6726B42E6BDCB99B8D695E091766B4C61BD16FE16DC8BF096010C6F1C077B12BD702B71C96D46D37670E40056337F971E3B2B8A72E50A64334B0DD480CC2B4E3F658255DF7C5880D6A5B673AE17EDECB65FDB34EF71E378DC1971389FEA8C89F01F96E75E30C4E5B3F42C07823C5AE78A720F71F15BA90FDEE9EE5D22920EB0F9052D083992D3430FCA0D327B365D734E7BBDCACEAAB6C8", + "leggedOut": "-" + } + + payload = { + "sort": "HatchingDate-desc", + "page": "1", + "pageSize": "25", + "group": "", + "aggregate": "HatchingCount-sum~HatchingCountInBargiri-sum~HatchingCountInTakhlie-sum~TrackingBargiriCount-sum~DiffHamlThanTakhlieCount-sum~DiffTakhlieThanHamlCount-sum~HamlMorghTotalCount-sum~HamlMorghTakhlieCount-sum~EvacuationCount-sum", + "filter": "", + "searchVm.FromDate": "01/09/1403 12:00:00 ق.ظ", + "searchVm.ToDate": "04/12/1403 12:00:00 ق.ظ", + "searchVm.TableName": "Z_002_ReportTempTable_5a2f0974ec3542d4b92ac87e75ef5549", + "searchVm.ProvinceLocationId": "65550", + "searchVm.PartIdCode": "", + "searchVm.UnitName": "", + "searchVm.PostalCode": "", + "searchVm.EpidemiologicCode": "", + "searchVm.PersonFullName": "", + "searchVm.CapacityFemaleFrom": "", + "searchVm.CapacityFemaleTo": "", + "searchVm.RequestCode": "", + "searchVm.DesCertId": "", + "searchVm.FlockAgeDayFrom": "1", + "searchVm.FlockAgeDayTo": "60", + "searchVm.HatchingDateFromPersian": "", + "searchVm.HatchingDateToPersian": "", + "searchVm.MaxHatchingDateFromPersian": "", + "searchVm.MaxHatchingDateToPersian": "", + "searchVm.TrackingStatusId": "", + "searchVm.PercentMorghToJoojeTotalFrom": "", + "searchVm.PercentMorghToJoojeTotalTo": "", + "searchVm.PercentMorghToJoojeTakhlieFrom": "", + "searchVm.PercentMorghToJoojeTakhlieTo": "" + } + + # Send the POST request + response = requests.post(url, headers=headers, cookies=cookies, data=payload) + + return Response(response.json()) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def detail_heards_meat_flow(request): + import requests + + url = "https://www.samasat.ir/WinBroilerFlockRequest/WinBroilerFlockRequestHatchingTrackingRep/_AjaxBindingWinBroilerFlockRequestHatchingTrackingRepVw" + headers = { + "authority": "www.samasat.ir", + "accept": "*/*", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "en-US,en;q=0.9", + "content-type": "application/x-www-form-urlencoded; charset=UTF-8" + } + + cookies = { + "ASP.NET_SessionId": "i2l4rxgagljnsecfg4smvbwg", + ".ASPXAUTH": "681FA227EBBFA8AFFA02E6C23A8B52159139B3D2E6AB49D18E71D6E568273F013CC434A01E2E9B27F6594D01A3B5FBC3923AA876642555D6FDD209306CB9336FE1CC172797B46B72274BDEBFCCD7EAD1EC6C69A30A871BE40FF5C9EDC025E10569533963A92F00B03A3495622A962FBE0FFDAF4B4EC513AF1458BF6282C2C7D2618DCA2A1394D5E1BF34EA50FED6490AD29AA63749DC0EA8849792A6834139F6EDA2C5C938AC36A92371B542C576FEA94A81F3D7274F6EFFCD8FD08820B871D4BD588CB415DCC3D86B5408577D50C1C36B00D6032BE82D85BD80453D5C1FF719C186000C379CB43FB794AE9C91838A0D04D744BEC9E7ADDCCB0668B0326F1B1F50EAE3128537F4ECB07A5453AFBCDD22A5509A1DDE5AA7EF25CBAFBEB06182E468E80BB28C7DEE72D1990FCDE24C6B4E1621E77BCF221A25783CD87D15777C1698052EA6193725C5CB0B3DF1788D1C15DF2AB14357A6051DA5810B948EEDC7697E701EED1D1A69E268742EB63A133F5667D23D2191ABC60C8A0C828A61CBF8432DD6F49DA32B7D9FAE4DA4AF0D7A175A6CCAFDB2DAB13DA6A5AD802945F0A9DB3E9FE8D4694449600109EF2656993993C14F269C8E61747696480B0079765B99386F7A218E38C37A32E9D14C97B246E3102FCFD5E298C11A1955D88FC2D94F5795B7245B62611965C2A46B3E9B0E906D5879B6D3AFF76401E7F5F1CE6E7215CF6AF52D313A3A57853E23F0E2402B9101F482BA857A987EAC5B2895FB29C49840EA2AB0F4A316A3223F8E67967A2ADFB43CFE47109A70A98725EFAB57F68A57E42F5E0DB306339BE841861A094399A8BA9CD98ED065A20CFB30C5ECC46A3CBD9C7B03DFDD603C0C143D353EC1A8A2CE0AB9ADB69A3EFB0B6B953520B133026355CC4FAAFD9D380FE436CD8B87471ED0B507663192A4B35A2D085BAD0A47C9DBC5E813EFF7BE2BB64A2A10A5A8EFE0D80CBE2EE81E2DC0F86DAD4A5D9F2A1F7E32EAFF8669E95616DB93CCF5FD801B293D47AEFAB1EE5C2801D2E916868687226315BAF13A971ED0382D75EF0EA69271962959DD05AB22B2A6397980B026B59A8A38A1385689258D7BB05E0DFAF7E4DF9868A50088D044003FB55A6D20E8EBAF92F457C1BBCD7BFB5E15A0795445A11ECA", + "leggedOut": "-" + } + + payload = { + "sort": "IssueDate-desc", + "page": "1", + "pageSize": "25", + "group": "", + "filter": "", + "certId": "140313016425" + } + + response = requests.post(url, headers=headers, cookies=cookies, data=payload) + + return Response(response.json()) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def breed(request): + import requests + + url = "https://www.samasat.ir/Report/BroilerFlockRequestDetailReport/_AjaxBinding" + headers = { + "authority": "www.samasat.ir", + "accept": "*/*", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "en-US,en;q=0.9", + "content-type": "application/x-www-form-urlencoded; charset=UTF-8" + } + + cookies = { + "ASP.NET_SessionId": "i2l4rxgagljnsecfg4smvbwg", + ".ASPXAUTH": "681FA227EBBFA8AFFA02E6C23A8B52159139B3D2E6AB49D18E71D6E568273F013CC434A01E2E9B27F6594D01A3B5FBC3923AA876642555D6FDD209306CB9336FE1CC172797B46B72274BDEBFCCD7EAD1EC6C69A30A871BE40FF5C9EDC025E10569533963A92F00B03A3495622A962FBE0FFDAF4B4EC513AF1458BF6282C2C7D2618DCA2A1394D5E1BF34EA50FED6490AD29AA63749DC0EA8849792A6834139F6EDA2C5C938AC36A92371B542C576FEA94A81F3D7274F6EFFCD8FD08820B871D4BD588CB415DCC3D86B5408577D50C1C36B00D6032BE82D85BD80453D5C1FF719C186000C379CB43FB794AE9C91838A0D04D744BEC9E7ADDCCB0668B0326F1B1F50EAE3128537F4ECB07A5453AFBCDD22A5509A1DDE5AA7EF25CBAFBEB06182E468E80BB28C7DEE72D1990FCDE24C6B4E1621E77BCF221A25783CD87D15777C1698052EA6193725C5CB0B3DF1788D1C15DF2AB14357A6051DA5810B948EEDC7697E701EED1D1A69E268742EB63A133F5667D23D2191ABC60C8A0C828A61CBF8432DD6F49DA32B7D9FAE4DA4AF0D7A175A6CCAFDB2DAB13DA6A5AD802945F0A9DB3E9FE8D4694449600109EF2656993993C14F269C8E61747696480B0079765B99386F7A218E38C37A32E9D14C97B246E3102FCFD5E298C11A1955D88FC2D94F5795B7245B62611965C2A46B3E9B0E906D5879B6D3AFF76401E7F5F1CE6E7215CF6AF52D313A3A57853E23F0E2402B9101F482BA857A987EAC5B2895FB29C49840EA2AB0F4A316A3223F8E67967A2ADFB43CFE47109A70A98725EFAB57F68A57E42F5E0DB306339BE841861A094399A8BA9CD98ED065A20CFB30C5ECC46A3CBD9C7B03DFDD603C0C143D353EC1A8A2CE0AB9ADB69A3EFB0B6B953520B133026355CC4FAAFD9D380FE436CD8B87471ED0B507663192A4B35A2D085BAD0A47C9DBC5E813EFF7BE2BB64A2A10A5A8EFE0D80CBE2EE81E2DC0F86DAD4A5D9F2A1F7E32EAFF8669E95616DB93CCF5FD801B293D47AEFAB1EE5C2801D2E916868687226315BAF13A971ED0382D75EF0EA69271962959DD05AB22B2A6397980B026B59A8A38A1385689258D7BB05E0DFAF7E4DF9868A50088D044003FB55A6D20E8EBAF92F457C1BBCD7BFB5E15A0795445A11ECA", + "leggedOut": "-" + } + + payload = { + "sort": "SendDate-desc", + "page": "1", + "pageSize": "25", + "group": "", + "aggregate": "RequestCountLong-sum~ChickCountLong-sum", + "filter": "", + "searchVm.FlockRequestId": "", + "searchVm.Islegal": "True", + "searchVm.HatcheryId": "", + "searchVm.ProvinceLocationId": "65550", + "searchVm.PartIdCode": "", + "searchVm.UnitName": "", + "searchVm.BfrRequestCode": "", + "searchVm.CertId": "", + "searchVm.BroilerPedigreeTypeId": "", + "searchVm.SendDateFrom": "1403/11/28", + "searchVm.SendDateTo": "1403/12/05", + "searchVm.ChickCountFrom": "", + "searchVm.ChickCountTo": "", + "searchVm.PedigreeType": "", + "searchVm.SenderUnitName": "", + "searchVm.StartDateFrom": "", + "searchVm.StartDateTo": "", + "searchVm.EndDateFrom": "", + "searchVm.EndDateTo": "", + "searchVm.RequestCountFrom": "", + "searchVm.RequestCountTo": "", + "searchVm.SystemCode": "", + "searchVm.EpidemiologicCode": "", + "searchVm.PostalCode": "", + "searchVm.CapacityFemaleFrom": "", + "searchVm.CapacityFemaleTo": "", + "searchVm.PersonNationalCodeOrId": "", + "searchVm.PersonName": "", + "searchVm.RegDateFrom": "", + "searchVm.RegDateTo": "" + } + + response = requests.post(url, headers=headers, cookies=cookies, data=payload) + + return Response(response.json()) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def chat_bot_info(request): + hatchings = PoultryHatching.objects.filter(trash=False, archive=False, state='pending').order_by('date') + poultry = Poultry.objects.filter(pk__in=hatchings.values_list('poultry', flat=True)) + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), + return_to_province=False, + province_request__poultry_request__hatching__in=hatchings) + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=hatchings) + + result = { + "number_of_hatchings": len(hatchings), + "number_of_poultry": len(poultry), + "hatching_quantity": hatchings.aggregate(total=Sum('quantity'))['total'] or 0, + "number_province_kill_requests": len(province_kill_requests), + "province_kill_requests_quantity": province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0, + "number_of_kill_house_requests": len(kill_house_requests), + "kill_house_requests_quantity": kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0, + } + + return Response(result, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def add_interest_license_id_to_poultry(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + list1 = [] + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i < 6 or row is None: + continue + breeding = row[5] + licenc = row[13] + try: + poultry = Poultry.objects.get(breeding_unique_id=breeding, trash=False) + poultry.interest_license_id = licenc + poultry.save() + except: + list1.append(breeding) + # print(date.date()) + # for kill in kill_req: + # if kill.poultry_name == poultry and kill.quantity== quantity and \ + # kill.live_weight== wieght and kill.date.date() ==date and kill.acceptor_rejector == accepterde: + # print(kill.id) + return HttpResponse(list1) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def add_asddasasd(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + list1 = [] + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i < 1 or row is None: + continue + + east = row[16] + west = row[17] + licenc = row[3] + poultry = Poultry.objects.filter(Lat__isnull=True, interest_license_id=licenc).first() + if poultry: + if east and west is not None: + lon, lat = utm_to_loc(east, west) + poultry.Lat = lon + poultry.Long = lat + poultry.save() + # تبدیل مختصات + # breeding=row[5] + # licenc=row[13] + # try: + # poultry=Poultry.objects.get(breeding_unique_id=breeding,trash=False) + # poultry.interest_license_id=licenc + # poultry.save() + # except: + # list1.append(breeding) + # # print(date.date()) + # for kill in kill_req: + # if kill.poultry_name == poultry and kill.quantity== quantity and \ + # kill.live_weight== wieght and kill.date.date() ==date and kill.acceptor_rejector == accepterde: + # print(kill.id) + return HttpResponse(list1) + + +# def add_to_warehouse_manual(request): +# kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related( +# 'system_address__province') +# for kill_house in kill_houses: +# kill_house_requests = KillHouseRequest.objects.filter( +# Q(killhouse_user=kill_house) | Q(killer=kill_house), +# ware_house_confirmation=False, trash=False, calculate_status=True) +# if kill_house_requests: +# # wieght = \ +# # kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ +# # 'total'] or 0 +# for kill_house_request in kill_house_requests: +# kill_house = kill_house_request.killhouse_user +# product = RolesProducts.objects.filter(parent_product__product_id=2, kill_house=kill_house).first() +# +# +# +# kill_house_request.ware_house_accepted_real_quantity = kill_house_request.accepted_real_quantity +# kill_house_request.ware_house_accepted_real_weight = int(kill_house_request.accepted_real_weight - ( +# (kill_house_request.accepted_real_weight * 25) / 100)) +# kill_house_request.weight_loss = 25 +# kill_house_request.ware_house_input_type = 'loss_weight' +# kill_house_request.ware_house_confirmation = True +# kill_house_request.date_of_ware_house = str(datetime.now()) +# kill_house_request.entered_message='ورود به انبار توسط سیستم' +# kill_house_request.save() +# kill_house_requests_product_warehousing(product) +# +# # mobile=kill_house.kill_house_operator.user.mobile +# # if kill_house.killer == False: +# # killer = 'کشتارگاه' +# # else: +# # killer = 'کشتارکن' +# # message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ +# # f'\n' \ +# # f'تعداد {len(kill_house_requests)} بار با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \ +# # f'\n' \ +# # f'(سامانه رصدیار)' +# # check_mobile = check_mobile_number(mobile) +# # if check_mobile: +# # req = requests.get( +# # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}") +# return HttpResponse('ok') + +def add_free_bar_to_warehouse_automatic_type_manual(request): + if base_url_for_sms_report == 'ha' or base_url_for_sms_report == 'ku': + send_day = 2 + send_time = 48 + else: + send_day = 1 + send_time = 24 + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related( + 'system_address__province') + for kill_house in kill_houses: + free_bars = KillHouseFreeBarInformation.objects.filter( + create_date__date__lt=datetime.now().date() - timedelta(days=send_day), buy_type='live', trash=False, + weight_of_carcasses=0, kill_house=kill_house, ware_house=False, register_type='automatic') + + if free_bars: + wieght = \ + free_bars.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + + len_kill_house_requests = len(free_bars) + ware_house_accepted_real_weight = int((wieght * 75) / 100) + bars_info = [] + for free_bar in free_bars: + product = free_bar.product + real_weight = round((free_bar.live_weight * 75) / 100) + free_bar.number_of_carcasses = int(real_weight / 1.5) + free_bar.weight_of_carcasses = real_weight + free_bar.weight_loss = 25 + free_bar.ware_house = True + free_bar.date = str(datetime.now()) + # free_bar.entered_message = 'ورود به انبار توسط سیستم' + # free_bar.entered_message = 'ورود به انبار مجازی' + free_bar.total_wage_amount = free_bar.wage * int( + free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int( + free_bar.weight_of_carcasses) + + union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0 + company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0 + guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0 + city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0 + wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0 + other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0 + free_bar.union_share = int(union_percent * free_bar.total_wage_amount) + free_bar.company_share = int(company_percent * free_bar.total_wage_amount) + free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount) + free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount) + free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount) + free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount) + free_bar.save() + kill_house_free_buying_product_warehousing(product) + bars_info.append( + 'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format( + free_bar.bar_clearance_code, + to_locale_str(int(free_bar.live_weight)), + to_locale_str(int(real_weight)), + shamsi_date(free_bar.create_date) + )) + # mobile=kill_house.kill_house_operator.user.mobile + # if kill_house.killer == False: + # killer = 'کشتارگاه' + # else: + # killer = 'کشتارکن' + # message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ + # f'\n' \ + # f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \ + # f'\n' \ + # f'(سامانه رصدیار)' + # check_mobile = check_mobile_number(mobile) + # if check_mobile: + # req = requests.get( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}") + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \ + '\n' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به شما، به دلیل گذشت مهلت {send_time} ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار مجازی منتقل گردید.*** ' \ + '\n' \ + f' جزئیات بارهای منتقل شده:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + return HttpResponse('ok') + + +def add_free_bar_to_warehouse_automatic_type_cron(): + # if base_url_for_sms_report == 'ha': + send_day = 2 + send_time = 48 + # else: + # send_day = 1 + # send_time = 24 + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related( + 'system_address__province') + for kill_house in kill_houses: + free_bars = KillHouseFreeBarInformation.objects.filter( + register_date__date__lt=datetime.now().date() - timedelta(days=send_day), buy_type='live', trash=False, + weight_of_carcasses=0, kill_house=kill_house, ware_house=False, register_type='automatic') + + if free_bars: + wieght = \ + free_bars.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + + len_kill_house_requests = len(free_bars) + ware_house_accepted_real_weight = int((wieght * 75) / 100) + bars_info = [] + for free_bar in free_bars: + product = free_bar.product + real_weight = round((free_bar.live_weight * 75) / 100) + free_bar.number_of_carcasses = int(real_weight / 1.5) + free_bar.weight_of_carcasses = real_weight + free_bar.weight_loss = 25 + free_bar.ware_house = True + free_bar.date = str(datetime.now()) + # free_bar.entered_message = 'ورود به انبار توسط سیستم' + # free_bar.entered_message = 'ورود به انبار مجازی' + free_bar.total_wage_amount = free_bar.wage * int( + free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int( + free_bar.weight_of_carcasses) + + union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0 + company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0 + guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0 + city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0 + wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0 + other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0 + free_bar.union_share = int(union_percent * free_bar.total_wage_amount) + free_bar.company_share = int(company_percent * free_bar.total_wage_amount) + free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount) + free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount) + free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount) + free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount) + free_bar.save() + kill_house_free_buying_product_warehousing(product) + bars_info.append( + 'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format( + free_bar.bar_clearance_code, + to_locale_str(int(free_bar.live_weight)), + to_locale_str(int(real_weight)), + shamsi_date(free_bar.create_date) + )) + # mobile=kill_house.kill_house_operator.user.mobile + # if kill_house.killer == False: + # killer = 'کشتارگاه' + # else: + # killer = 'کشتارکن' + # message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ + # f'\n' \ + # f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \ + # f'\n' \ + # f'(سامانه رصدیار)' + # check_mobile = check_mobile_number(mobile) + # if check_mobile: + # req = requests.get( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}") + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \ + '\n' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به شما، به دلیل گذشت مهلت {send_time} ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار مجازی منتقل گردید.*** ' \ + '\n' \ + f' جزئیات بارهای منتقل شده:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + + +def add_free_bar_to_warehouse_manual(request): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related( + 'system_address__province') + for kill_house in kill_houses: + free_bars = KillHouseFreeBarInformation.objects.filter( + create_date__date__lt=datetime.now().date() - timedelta(days=2), buy_type='live', trash=False, + weight_of_carcasses=0, kill_house=kill_house, ware_house=False, register_type='manual') + + if free_bars: + wieght = \ + free_bars.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + + len_kill_house_requests = len(free_bars) + ware_house_accepted_real_weight = int((wieght * 75) / 100) + bars_info = [] + for free_bar in free_bars: + product = free_bar.product + real_weight = round((free_bar.live_weight * 75) / 100) + free_bar.number_of_carcasses = int(real_weight / 1.5) + free_bar.weight_of_carcasses = real_weight + free_bar.weight_loss = 25 + free_bar.ware_house = True + free_bar.date = str(datetime.now()) + free_bar.entered_message = 'ورود به انبار توسط سیستم' + free_bar.total_wage_amount = free_bar.wage * int( + free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int( + free_bar.weight_of_carcasses) + + union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0 + company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0 + guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0 + city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0 + wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0 + other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0 + free_bar.union_share = int(union_percent * free_bar.total_wage_amount) + free_bar.company_share = int(company_percent * free_bar.total_wage_amount) + free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount) + free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount) + free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount) + free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount) + free_bar.save() + kill_house_free_buying_product_warehousing(product) + + bars_info.append( + 'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format( + free_bar.bar_clearance_code, + to_locale_str(int(free_bar.live_weight)), + to_locale_str(int(real_weight)), + shamsi_date(free_bar.date) + )) + # mobile=kill_house.kill_house_operator.user.mobile + # if kill_house.killer == False: + # killer = 'کشتارگاه' + # else: + # killer = 'کشتارکن' + # message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ + # f'\n' \ + # f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \ + # f'\n' \ + # f'(سامانه رصدیار)' + # check_mobile = check_mobile_number(mobile) + # if check_mobile: + # req = requests.get( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}") + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \ + '\n' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به شما، به دلیل گذشت مهلت ۴۸ ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار منتقل گردید.*** ' \ + '***' \ + f' جزئیات بارهای منتقل شده:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + + return HttpResponse('ok') + + +def add_free_bar_to_warehouse_cron(): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related( + 'system_address__province') + for kill_house in kill_houses: + free_bars = KillHouseFreeBarInformation.objects.filter(create_date__date__lt=datetime.now().date() - + timedelta(days=2), buy_type='live', + trash=False, + weight_of_carcasses=0, kill_house=kill_house, + ware_house=False + , register_type='manual') + + if free_bars: + wieght = \ + free_bars.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + + len_kill_house_requests = len(free_bars) + ware_house_accepted_real_weight = int((wieght * 75) / 100) + bars_info = [] + for free_bar in free_bars: + product = free_bar.product + real_weight = round((free_bar.live_weight * 75) / 100) + free_bar.number_of_carcasses = int(real_weight / 1.5) + free_bar.weight_of_carcasses = real_weight + free_bar.weight_loss = 25 + free_bar.ware_house = True + free_bar.date = str(datetime.now()) + free_bar.entered_message = 'ورود به انبار توسط سیستم' + free_bar.total_wage_amount = free_bar.wage * int( + free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int( + free_bar.weight_of_carcasses) + + union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0 + company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0 + guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0 + city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0 + wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0 + other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0 + free_bar.union_share = int(union_percent * free_bar.total_wage_amount) + free_bar.company_share = int(company_percent * free_bar.total_wage_amount) + free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount) + free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount) + free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount) + free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount) + free_bar.save() + kill_house_free_buying_product_warehousing(product) + + bars_info.append( + 'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format( + free_bar.bar_clearance_code, + to_locale_str(int(free_bar.live_weight)), + to_locale_str(int(real_weight)), + shamsi_date(free_bar.date) + )) + # mobile=kill_house.kill_house_operator.user.mobile + # if kill_house.killer == False: + # killer = 'کشتارگاه' + # else: + # killer = 'کشتارکن' + # message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ + # f'\n' \ + # f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \ + # f'\n' \ + # f'(سامانه رصدیار)' + # check_mobile = check_mobile_number(mobile) + # if check_mobile: + # req = requests.get( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}") + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \ + '\n' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به شما، به دلیل گذشت مهلت ۴۸ ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار منتقل گردید.*** ' \ + '***' \ + f' جزئیات بارهای منتقل شده:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + + +def fix_poultry_request_script(request): + hatchings = PoultryHatching.objects.filter(trash=False, archive=False, + allow_hatching='pending') + for hatching in hatchings: + + province_requests = PoultryRequest.objects.filter( + Q(wage_pay=False, has_wage=False) | Q(wage_pay=True, has_wage=True), hatching=hatching + , state_process='accepted', province_state='accepted', trash=False, archive=False, + out_province_request_cancel=False, out=True) + if province_requests: + hatching.out_province_killed_quantity = province_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + hatching.out_province_killed_weight = province_requests.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] + hatching.save() + + return HttpResponse('ok') + + +def add_to_warehouse(): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False) + date = datetime.now().date() - timedelta(days=2) + for kill_house in kill_houses: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__lt=date, + ware_house_confirmation=False, trash=False, calculate_status=True) + if kill_house_requests: + wieght = \ + kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + len_kill_house_requests = len(kill_house_requests) + ware_house_accepted_real_weight = int((wieght * 75) / 100) + bars_info = [] + for kill_house_request in kill_house_requests: + kill_house = kill_house_request.killhouse_user + kill_house_request.ware_house_accepted_real_quantity = kill_house_request.accepted_real_quantity + kill_house_request.ware_house_accepted_real_weight = int( + (kill_house_request.accepted_real_weight * 75) / 100) + kill_house_request.weight_loss = 25 + kill_house_request.ware_house_input_type = 'loss_weight' + kill_house_request.ware_house_confirmation = True + kill_house_request.date_of_ware_house = str(datetime.now()) + kill_house_request.entered_message = 'ورود به انبار توسط سیستم' + kill_house_request.save() + + bars_info.append( + 'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format( + kill_house_request.clearance_code, + to_locale_str(int(kill_house_request.accepted_real_weight)), + to_locale_str(int(kill_house_request.ware_house_accepted_real_weight)), + shamsi_date(kill_house_request.kill_request.recive_date) + )) + product = RolesProducts.objects.filter(kill_house=kill_house).first() + kill_house_requests_product_warehousing(product) + + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \ + '***' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار داخل استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به جنابعالی، به دلیل گذشت مهلت ۴۸ ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار منتقل گردید.' \ + f'***' \ + f' جزئیات بارهای منتقل شده:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + + +def add_to_warehouse_manual(request): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False) + date = datetime.now().date() - timedelta(days=2) + for kill_house in kill_houses: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__lt=date, + ware_house_confirmation=False, trash=False, calculate_status=True) + if kill_house_requests: + wieght = \ + kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + len_kill_house_requests = len(kill_house_requests) + ware_house_accepted_real_weight = int((wieght * 75) / 100) + bars_info = [] + for kill_house_request in kill_house_requests: + kill_house = kill_house_request.killhouse_user + kill_house_request.ware_house_accepted_real_quantity = kill_house_request.accepted_real_quantity + kill_house_request.ware_house_accepted_real_weight = int( + (kill_house_request.accepted_real_weight * 75) / 100) + kill_house_request.weight_loss = 25 + kill_house_request.ware_house_input_type = 'loss_weight' + kill_house_request.ware_house_confirmation = True + kill_house_request.date_of_ware_house = str(datetime.now()) + kill_house_request.entered_message = 'ورود به انبار توسط سیستم' + kill_house_request.save() + + bars_info.append( + 'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format( + kill_house_request.clearance_code, + to_locale_str(int(kill_house_request.accepted_real_weight)), + to_locale_str(int(kill_house_request.ware_house_accepted_real_weight)), + shamsi_date(kill_house_request.kill_request.recive_date) + ) + ) + + product = RolesProducts.objects.filter(kill_house=kill_house).first() + kill_house_requests_product_warehousing(product) + + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \ + '***' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار داخل استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به جنابعالی، به دلیل گذشت مهلت ۴۸ ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار منتقل گردید.' \ + f'***' \ + f' جزئیات بارهای منتقل شده:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + return HttpResponse('ok') + + +def return_from_archive_poultry_hatching_with_cron_job(): + now_date = datetime.now().date() + hatching = PoultryHatching.objects.filter(trash=False, + allow_hatching='True', input_archiver__isnull=True, + last_change__role="automatic-archive", + state='complete', archive=True, last_change__isnull=False).only( + 'allow_hatching', + 'left_over', 'quantity', 'state', + 'archive') + for hatch in hatching: + archive_date = hatch.last_change['date'] + date1 = datetime.strptime(archive_date, '%Y-%m-%d %H:%M:%S.%f').date() + if now_date == date1: + if hatch.left_over > (hatch.quantity * percent_of_losses): + hatch.violation = False + hatch.allow_hatching = 'pending' + hatch.state = 'pending' + hatch.archive = False + if hatch.first_date_input_archive is not None: + hatch.first_date_input_archive = None + + hatch.last_change = None + hatch.save() + + +def warning_free_bar_to_warehouse_manual(request): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related( + 'system_address__province') + for kill_house in kill_houses: + free_bars = KillHouseFreeBarInformation.objects.filter(buy_type='live', trash=False, + weight_of_carcasses=0, kill_house=kill_house, + ware_house=False) + + if free_bars: + wieght = \ + free_bars.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + + len_kill_house_requests = len(free_bars) + bars_info = ['کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - تاریخ بار: ({2})'.format + (free_bar.bar_clearance_code, + to_locale_str(int(free_bar.live_weight)), + shamsi_date(free_bar.date)) + for free_bar in free_bars] + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \ + '\n' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم وارد انبار نگردیده است.' \ + '\n' \ + f' جزئیات بارهای وارد نشده به انبار:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + return HttpResponse('ok') + + +def warning_free_bar_to_warehouse_cron(): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related( + 'system_address__province') + for kill_house in kill_houses: + free_bars = KillHouseFreeBarInformation.objects.filter(buy_type='live', trash=False, + weight_of_carcasses=0, kill_house=kill_house, + ware_house=False) + + if free_bars: + wieght = \ + free_bars.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + + len_kill_house_requests = len(free_bars) + bars_info = ['کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - تاریخ بار: ({2})'.format + (free_bar.bar_clearance_code, + to_locale_str(int(free_bar.live_weight)), + shamsi_date(free_bar.date)) + for free_bar in free_bars] + + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \ + '\n' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم وارد انبار نگردیده است.' \ + '\n' \ + f' جزئیات بارهای وارد نشده به انبار:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + + +def warning_to_warehouse_cron(): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False) + for kill_house in kill_houses: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=False, trash=False, calculate_status=True) + if kill_house_requests: + wieght = \ + kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + len_kill_house_requests = len(kill_house_requests) + bars_info = ['کد بار: {0} - وزن زنده: {1} کیلوگرم - تاریخ بار: {2}'.format( + bar.bar_code, + to_locale_str(int(bar.accepted_real_weight)), + shamsi_date(bar.kill_request.recive_date)) + for bar in kill_house_requests] + + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \ + '***' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار داخل استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم وارد انبار نگردیده است.' \ + f'***' \ + f' جزئیات بارهای وارد نشده به انبار:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + + +def warning_to_warehouse_manual(request): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False) + for kill_house in kill_houses: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=False, trash=False, calculate_status=True) + if kill_house_requests: + wieght = \ + kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + len_kill_house_requests = len(kill_house_requests) + bars_info = ['کد بار: {0} - وزن زنده: {1} کیلوگرم - تاریخ بار: ({2})'.format( + bar.bar_code, + to_locale_str(int(bar.accepted_real_weight)), + shamsi_date(bar.kill_request.recive_date)) + for bar in kill_house_requests] + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \ + '***' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار داخل استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم وارد انبار نگردیده است.' \ + f'***' \ + f' جزئیات بارهای وارد نشده به انبار:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + return HttpResponse('ok') + + +def warning_province_kill_request_without_bar_manual(request): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + kill_houses = KillHouse.objects.filter(out_province=False, trash=False) + for kill_house in kill_houses: + province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + state__in=('pending', 'accepted'), + archive_wage=False, + return_to_province=False, + trash=False, first_car_allocated_quantity=0) + if province_kill_request: + wieght = \ + province_kill_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + len_province_kill_request = len(province_kill_request) + bars_info = ['کد سفارش: {0} - وزن: {1} کیلوگرم - تاریخ تخصیص: ({2})'.format + (bar.province_request.poultry_request.order_code, + to_locale_str(int(bar.quantity)), + shamsi_date(bar.kill_request.recive_date)) + for bar in province_kill_request] + + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \ + '***' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، تخصیصات بدون بار به تعداد {to_locale_str(len_province_kill_request)} تخصیص و وزن {to_locale_str(int(wieght))} کیلوگرم فاقد تخصیص ماشین میباشد.' \ + f'***' \ + f' جزئیات تخصیصات بدون بار:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + return HttpResponse('ok') + + +def warning_province_kill_request_without_bar_cron(): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + kill_houses = KillHouse.objects.filter(out_province=False, trash=False) + for kill_house in kill_houses: + province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + state__in=('pending', 'accepted'), + archive_wage=False, + return_to_province=False, + trash=False, first_car_allocated_quantity=0) + if province_kill_request: + wieght = \ + province_kill_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + len_province_kill_request = len(province_kill_request) + bars_info = ['کد سفارش:{0} - وزن:{1} کیلوگرم - تاریخ تخصیص:{2}'.format + (bar.province_request.poultry_request.order_code, + to_locale_str(int(bar.quantity)), + shamsi_date(bar.province_request.kill_request.recive_date)) + for bar in province_kill_request] + new_ticket = TicketSupport( + user=kill_house.kill_house_operator.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.kill_house_operator.user) + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \ + '***' \ + f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، تخصیصات بدون بار به تعداد {to_locale_str(len_province_kill_request)} تخصیص و وزن {to_locale_str(int(wieght))} کیلوگرم فاقد تخصیص ماشین میباشد.' \ + f'***' \ + f' جزئیات تخصیصات بدون بار:' \ + f'***' \ + f'{bars_details}' \ + f'***' \ + f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \ + f'***' \ + f'با تشکر -ربات هوشمند سامانه رصدیار' + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + + +def update_chicken_age_from_login_manual(request): + poultry_hatching = PoultryHatching.objects.filter(trash=False).only('date', 'chicken_age', 'last_change').order_by( + '-id') + now = datetime.now().date() + for hatching in poultry_hatching: + now_age = (now - hatching.date.date()).days + 1 + if hatching.archive == False and hatching.allow_hatching == 'pending': + hatching.chicken_age = now_age + hatching.save() + elif hatching.archive == True and hatching.allow_hatching == 'True': + if hatching.last_change: + date = datetime.strptime((hatching.last_change['date'].split(' ')[0]), '%Y-%m-%d').date() + age = (date - hatching.date.date()).days + 1 + if age < 80: + hatching.chicken_age = (date - hatching.date.date()).days + 1 + hatching.save() + else: + continue + if now_age <= 120: + hatching.now_age = now_age + hatching.save() + + return HttpResponse('ok') + + +def fix_duplicate_order_code_cron(): + duplicate_order_codes = ( + PoultryRequest.objects + .values('order_code') + .annotate(count=Count('id')) + .filter(count__gt=1, trash=False) + .values_list('order_code', flat=True) + ) + + # استخراج شناسه‌های مرغ‌های مرتبط با کدهای تکراری + poultry_ids = ( + PoultryRequest.objects + .filter(order_code__in=duplicate_order_codes, trash=False) + .values_list('poultry__id', flat=True) + .distinct() + ) + + # مرتب‌سازی مرغ‌ها بر اساس شناسه + poultries = Poultry.objects.filter(trash=False, id__in=poultry_ids).order_by('id') + list1 = [] + # بررسی درخواست‌های مرتبط با هر مرغ + for poultry in poultries: + requests = PoultryRequest.objects.filter(trash=False, poultry=poultry).order_by('order_code') + base_order_code = str(poultry.user.base_order) # فرض بر این است که "user" به درستی تعریف شده است + last_order = [] + for req in requests: + if str(req.order_code)[:4] == base_order_code: + last_order.clear() + last_order.append(req.order_code) + # if str(req.order_code)[:4] != base_order_code: + # list1.append(req.id) + if last_order: + last_num = last_order[0] + 1 + for req in requests: + if str(req.order_code)[:4] != base_order_code: + base_order_code = last_num + req.order_code = base_order_code + req.save() + last_num += 1 + last_order.clear() + + +def fix_duplicate_order_code_new_cron(): + duplicate_order_codes = ( + PoultryRequest.objects + .values('order_code') + .annotate(count=Count('id')) + .filter(count__gt=1, trash=False) + .values_list('order_code', flat=True) + ) + + # استخراج شناسه‌های مرغ‌های مرتبط با کدهای تکراری + poultry_ids = ( + PoultryRequest.objects + .filter(order_code__in=duplicate_order_codes, trash=False) + .values_list('poultry__user__id', flat=True) + .distinct() + ) + + # مرتب‌سازی مرغ‌ها بر اساس شناسه + poultries = SystemUserProfile.objects.filter(trash=False, id__in=poultry_ids).order_by('id') + list1 = [] + for user in poultries: + print(user.id) + order_code = int(str(user.base_order) + '0001') + requests = PoultryRequest.objects.filter(trash=False, poultry__user=user).order_by('id') + for req in requests: + req.order_code = order_code + req.save() + order_code += 1 + # # بررسی درخواست‌های مرتبط با هر مرغ + # for poultry in poultries: + # requests = PoultryRequest.objects.filter(trash=False,poultry=poultry).order_by('order_code') + # base_order_code = str(poultry.user.base_order) # فرض بر این است که "user" به درستی تعریف شده است + # last_order=[] + # for req in requests: + # if str(req.order_code)[:4] == base_order_code: + # last_order.clear() + # last_order.append(req.order_code) + # # if str(req.order_code)[:4] != base_order_code: + # # list1.append(req.id) + # if last_order: + # last_num=last_order[0] + 1 + # for req in requests: + # if str(req.order_code)[:4] != base_order_code: + # base_order_code = last_num + # req.order_code=base_order_code + # req.save() + # last_num+=1 + # last_order.clear() + + +# def fine_cron(): +# now = datetime.now().date() +# province_kill_requests = ProvinceKillRequest.objects.filter(tarsh=False, return_to_province=False, +# kill_request__recive_date__date=now, +# state__in=('pending', 'accepted'), +# first_car_allocated_quantity=0).select_related( +# 'kill_request', 'province_request', 'province_request__poultry_request', +# 'province_request__poultry_request__hatching') +# for province_kill_request in province_kill_requests: +# poultry_request = province_kill_request.province_request.poultry_request +# hatching = province_kill_request.province_request.poultry_request.hatching +# province_check = province_kill_request.province_request +# province_check.quantity += province_kill_request.main_quantity +# province_check.save() +# poultry_request.remain_quantity += province_kill_request.main_quantity +# poultry_request.save() +# kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key) +# kill_request.remain_quantity += province_kill_request.main_quantity +# kill_request.save() +# if poultry_request.export == True: +# hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight) +# hatching.export_killed_quantity -= int(request.data['quantity']) +# elif poultry_request.free_sale_in_province == True: +# hatching.free_killed_quantity -= province_kill_request.total_killed_weight +# # hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight) +# hatching.free_quantity -= province_kill_request.total_killed_quantity +# # hatching.free_quantity -= amount +# else: +# hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight +# hatching.governmental_quantity -= province_kill_request.total_killed_quantity +# hatching.save() +# province_kill_request.quantity = 0 +# province_kill_request.total_killed_quantity = 0 +# province_kill_request.total_killed_weight = 0 +# province_kill_request.return_to_province = True +# province_kill_request.returner = {"fullname": user.fullname, "mobile": user.mobile, +# "date": str(datetime.now())} +# province_kill_request.save() + +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +import requests +from concurrent.futures import ThreadPoolExecutor + + +class KillHouseStressTestView(APIView): + """ + اندپوینتی برای تست فشار (concurrent requests) روی KillHouseMarketInfoViewSet + """ + + def get(self, request): + # آدرس ویوست اصلی (اینجا تغییر بده به آدرس واقعی خودت) + target_url = "http://127.0.0.1:8000/kill-house-market-info/?role=KillHouse" + headers = { + "Authorization": f"Bearer {request.auth}", # یا توکن ثابت بذار + } + + def fetch(i): + try: + resp = requests.get(target_url, headers=headers, timeout=10) + return {"req": i, "status": resp.status_code, "len": len(resp.text)} + except Exception as e: + return {"req": i, "error": str(e)} + + results = [] + with ThreadPoolExecutor(max_workers=10) as executor: # چند تا ریکوست همزمان + futures = [executor.submit(fetch, i) for i in range(20)] # 20 بار + for f in futures: + results.append(f.result()) + + return Response(results, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_warehouse_for_limitation(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, trash=False) + province_kill_requests.update(warehouse=False) + kill_house_requests = KillHouseRequest.objects.filter(killhouse_user__in=kill_houses, trash=False) + kill_house_requests.update(warehouse=False) + steward_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, trash=False) + steward_allocations.update(warehouse=False) + kill_house_free_bars = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, trash=False) + kill_house_free_bars.update(warehouse=False) + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house__in=kill_houses, trash=False) + kill_house_free_sale_bars.update(warehouse=False) + segmentations = PosSegmentation.objects.filter(kill_house__in=kill_houses, trash=False) + segmentations.update(warehouse=False) + archives = WarehouseArchive.objects.filter(trash=False, kill_house__in=kill_houses) + archives.update(warehouse=False) + return Response("ok") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_warehouse_input_province_bars_for_limitation(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first() + kill_house_requests_product_warehousing(product) + return Response("ok") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_warehouse_out_buying_bars_for_limitation(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first() + kill_house_free_buying_product_warehousing(product) + return Response("ok") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_warehouse_in_province_allocations_for_limitation(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first() + kill_house_allocations_product_warehousing(product) + return Response("ok") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_warehouse_free_sale_for_limitation(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first() + kill_house_free_sale_product_warehousing(product) + return Response("ok") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_warehouse_cold_house_for_limitation(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first() + cold_house_allocations = StewardAllocation.objects.filter(kill_house=kill_house, to_cold_house__isnull=False, + receiver_state='accepted', warehouse=True) + kill_house.total_cold_house_governmental_weight = \ + cold_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + kill_house.total_cold_house_free_weight = \ + cold_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + kill_house.save() + return Response("ok") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_warehouse_segmentation_for_limitation(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first() + segmentations = PosSegmentation.objects.filter(kill_house=kill_house, trash=False, warehouse=True) + product.segmentation_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + product.save() + kill_house.total_segmentation_governmental_weight = \ + segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + kill_house.total_segmentation_free_weight = segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + kill_house.save() + return Response("ok") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_kill_house_archive_warehousing(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + 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() + return Response("ok") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_steward_free_buying_product_warehousing_for_limitation(request): + stewards = Guilds.objects.filter(trash=False, steward=True, active=True) + for steward in stewards: + product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward) + guild_steward_free_buying_product_warehousing(product) + return Response("done!") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_steward_guild_steward_allocations_warehousing_for_limitation(request): + stewards = Guilds.objects.filter(trash=False, steward=True, active=True) + for steward in stewards: + product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward) + guild_steward_allocations_product_warehousing(product) + return Response("done!") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_guild_steward_free_sale_warehousing_for_limitation(request): + stewards = Guilds.objects.filter(trash=False, steward=True, active=True) + for steward in stewards: + product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward) + guild_steward_free_sale_product_warehousing(product) + return Response("done!") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_guild_steward_product_segmentation_warehousing_for_limitation(request): + stewards = Guilds.objects.filter(trash=False, steward=True, active=True) + for steward in stewards: + product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward) + guild_steward_product_segmentation(product) + return Response("done!") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_steward_guild_pos_allocations_warehousing_for_limitation(request): + stewards = Guilds.objects.filter(trash=False, steward=True, active=True) + for steward in stewards: + product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward) + product.pos_allocated_weight = 0 + product.save() + return Response("done!") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_guild_steward_archive_warehousing(request): + stewards = Guilds.objects.filter(trash=False, steward=True, active=True) + for steward in stewards: + product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first() + + archives = WarehouseArchive.objects.filter(Q(steward=steward) | Q(guild=steward), 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() + steward.ware_house_archive_governmental_weight = archives_governmental_weight + steward.ware_house_archive_free_weight = archives_free_weight + steward.save() + return Response("done!") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_guild_steward_pos_allocation_weight_for_product(request): + stewards = Guilds.objects.filter(trash=False, steward=True, active=True) + for steward in stewards: + product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first() + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False, + warehouse=True) + product.pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0 + product.save() + pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0 + pos_governmental_allocated_weight = transactions.filter(price_approved=True).aggregate(total=Sum('cur_weight'))[ + 'total'] or 0 + pos_free_allocated_weight = transactions.filter(price_approved=False).aggregate(total=Sum('cur_weight'))[ + 'total'] or 0 + product.guild.pos_allocated_weight = int(pos_allocated_weight / 1000) + product.guild.pos_governmental_allocated_weight = int(pos_governmental_allocated_weight / 1000) + product.guild.pos_free_allocated_weight = int(pos_free_allocated_weight / 1000) + product.guild.save() + return Response("done!") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_steward_warehouse_for_limitation(request): + stewards = Guilds.objects.filter(trash=False, steward=True, active=True) + guild_steward_allocations = StewardAllocation.objects.filter( + Q(guilds__in=stewards) | Q(to_guilds__in=stewards) | Q(steward__in=stewards) | Q(to_steward__in=stewards), + trash=False, calculate_status=True, warehouse=True, steward_warehouse=True) + guild_steward_allocations.update(steward_warehouse=False) + guild_steward_free_buying_bars = StewardFreeBarInformation.objects.filter( + Q(guild__in=stewards) | Q(steward__in=stewards), trash=False, warehouse=True) + guild_steward_free_buying_bars.update(warehouse=False) + + guild_steward_free_sale_bars = StewardFreeSaleBarInformation.objects.filter( + Q(guild__in=stewards) | Q(steward__in=stewards), trash=False, warehouse=True) + guild_steward_free_sale_bars.update(warehouse=False) + segmentations = PosSegmentation.objects.filter(guild__in=stewards, trash=False) + segmentations.update(warehouse=False) + archives = WarehouseArchive.objects.filter(trash=False, steward__in=stewards) + archives.update(warehouse=False) + transactions = PosMachineTransactions.objects.filter(pos__guild__in=stewards, paid=True, trash=False) + transactions.update(warehouse=False) + product_transactions = ProductsTransactions.objects.filter(transaction__pos__guild__in=stewards, + transaction__paid=True, trash=False) + product_transactions.update(warehouse=False) + return Response("done!") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_time_error(request): + return Response(datetime.now()) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def fix_pos_owner(request): + transactions = PosMachineTransactions.objects.filter(live_stock=False, trash=False) + for transaction in transactions: + if transaction.pos.kill_house: + transaction.kill_house = transaction.pos.kill_house + + elif transaction.pos.guild: + transaction.guild = transaction.pos.guild + transaction.save() + + return Response("done!") diff --git a/authentication/sahandsms/__init__.py b/authentication/sahandsms/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/authentication/sahandsms/sms.py b/authentication/sahandsms/sms.py new file mode 100644 index 0000000..4e6d14e --- /dev/null +++ b/authentication/sahandsms/sms.py @@ -0,0 +1,590 @@ +# توابع مورد نیاز برای اتصال به ای پی آی سهند اس ام اس +from panel.helper import check_mobile_number +from ..models import SystemUserProfile +import requests +# USERNAME_SMS='user95' +# PASSWORD_SMS='Mm123456' +USERNAME_SMS='hamedan' +PASSWORD_SMS='hamedan12345' +USERNAME_SMS_FINANCIAL='hamedan' +PASSWORD_SMS_FINANCIAL='hamedan12345' +USERNAME_SMS_HAMEDAN='hamedan' +PASSWORD_SMS_HAMEDAN='hamedan12345' +OUT_SMS_USER='user95' +OUT_SMS_PASS='rasadyar123' +kill_house_price=21000 + +def test(): + user = SystemUserProfile.objects.all() + for i in user: + if i.id > 9: + if i.first_name != None: + first = i.first_name + else: + first = "" + + if i.last_name != None: + last = i.last_name + else: + last = "" + + i.fullname = first + " " + last + i.save() + print("Done") + + +# این تابع برای ارسال پیامک نام کاربری و پسوورد برای مرعدار استفاده میشود +def send_sms(receptor=None, rand=None): + url = 'https://km.ravandno.ir' + receptor = str(receptor) + user = SystemUserProfile.objects.get(id=1825) + mobile = receptor + password = rand + message = '\n' \ + 'اتحادیه مرغ گوشتی استان کرمانشاه' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتاراز طریق سامانه سبحان انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{0}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{1}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{2}' \ + '\n' \ + '\n' \ + 'هرگونه فروش مرغ بدون اطلاع اتحادیه و خارج از سامانه ذکر شده پیگرد قانونی دارد و مجوز جوجه ریزی صادر نخواهد شد.'.format( + url, + mobile, + password) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text, user.fullname, user.mobile, user.password) + + +def send_sms_2(receptor=None, rand=None): + users = SystemUserProfile.objects.filter(role__name='Poultry') + receptor = str(receptor) + for user in users: + url = 'https://sha.ravandno.ir' + message = '\n' \ + 'مرغدار محترم:' \ + '\n' \ + '{0}' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتاراز طریق سامانه رصدیار انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{1}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{2}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{3}' \ + '\n' \ + '\n' \ + 'هرگونه فروش مرغ بدون اطلاع اتحادیه و خارج از سامانه ذکر شده پیگرد قانونی دارد و مجوز جوجه ریزی صادر نخواهد شد.' \ + '\n' \ + '\n' \ + 'اتحادیه مرغ گوشتی'.format( + user.fullname, + url, + user.mobile, + user.password) + check_mobile = check_mobile_number(user.mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + user.mobile, message) + url = u.format() + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + response = requests.request("GET", url, headers=headers, data=payload) + print(user.mobile + " " + user.fullname + " " + "Done") + + +# این تابع برای ارسال پیامک نام کاربری و پسوورد برای کشتارگاه استفاده میشود + +def send_sms_kill_house(receptor=None, rand=None): + users = SystemUserProfile.objects.filter(role__name='KillHouse') + receptor = str(receptor) + for user in users: + url = 'https://sha.ravandno.ir' + # time.sleep(2) + message = '\n' \ + 'کشتارگاه دار محترم:' \ + '\n' \ + '{0}' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتاراز طریق سامانه رصدیار انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{1}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{2}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{3}' \ + '\n' \ + '\n' \ + 'هرگونه خرید مرغ بدون اطلاع اتحادیه و خارج از سامانه ذکر شده پیگرد قانونی دارد.' \ + '\n' \ + '\n' \ + 'اتحادیه مرغ گوشتی'.format( + user.fullname, + url, + user.mobile, + user.password) + check_mobile = check_mobile_number(user.mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + user.mobile, message) + url = u.format() + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + response = requests.request("GET", url, headers=headers, data=payload) + print(user.mobile + " " + user.fullname + " " + "Done") + +# این تابع برای ارسال پیامک نام کاربری و پسوورد برای اپراتور استان استفاده میشود + +def send_sms_province(receptor=None, rand=None): + url = 'https://sha.ravandno.ir' + receptor = str(receptor) + message = '\n' \ + 'اتحادیه مرغ گوشتی استان لرستان' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتاراز طریق سامانه رصدیار انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{0}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{1}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{2}' \ + '\n' \ + '\n' \ + 'هرگونه خرید و فروش مرغ بدون اطلاع اتحادیه شهرستان و استان و خارج از سامانه ذکر شده پیگرد قانونی دارد.'.format( + url, + receptor, + rand) + check_mobile = check_mobile_number(receptor) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + receptor, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +# این تابع برای ارسال پیامک نام کاربری و پسوورد برای اپراتور شهرستان استفاده میشود + +def send_sms_city(receptor, rand): + url = 'https://ravandno.ir' + receptor = str(receptor) + message = '\n' \ + 'اتحادیه مرغ گوشتی استان لرستان' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتاراز طریق سامانه سبحان انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{0}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{1}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{2}' \ + '\n' \ + '\n' \ + 'هرگونه خرید و فروش مرغ بدون اطلاع اتحادیه شهرستان و استان و خارج از سامانه ذکر شده پیگرد قانونی دارد.'.format( + url, + receptor, + rand) + check_mobile = check_mobile_number(receptor) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + receptor, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +# این تابع برای ارسال کد پیامکی (ا تی پی ) به کاربر استفاده میشود + +def send_otp_code(receptor, rand): + receptor = str(receptor) + message = 'سلام همراه عزیز کد پیامکی ارسالی برای شما :{}'.format(rand) + check_mobile = check_mobile_number(receptor) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + receptor, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload, verify=False) + + print(response.text) + + +# این تابع برای ارسال پسورد به کاربر استفاده میشود +def send_password(receptor, rand): + receptor = str(receptor) + message = 'سلام همراه عزیز پسورد ارسالی برای شما :{}'.format(rand) + check_mobile = check_mobile_number(receptor) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from" \ + "=30002501&to={}&message={}".format(receptor, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def sms_reminder(receptor, title, content, link_text, link, time): + receptor = str(receptor) + message = "\n{4}\n{3}\n{2}\n{1}\n{0}".format(title, content, link_text, link, time) + check_mobile = check_mobile_number(receptor) + if check_mobile: + url = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=" \ + "Aht00100&from=30002501&to={}&message={}".format(receptor, message) + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + response = requests.request("GET", url, headers=headers, data=payload) + return response + + +def price_reminder(receptor, fullname): + receptor = str(receptor) + message = 'کاربر گرامی {} 2 ساعت تا شزوع روز بعد باقی است لطفا قیمت های روز بعد را وارد نمایید'.format(fullname) + check_mobile = check_mobile_number(receptor) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + receptor, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +# این تابع برای ارسال اطلاعات بار تخصیصی به کشتارگاه برای راننده استفاده میشود + +def driver_sms(driver_mobile, drive_rname, quantity, poultry, barcode, province, city, address, date, time, kill_house): + message = ' راننده گرامی {0}\nحواله بار {1} قطعه مرغ\n با بارکد: {2}\nاز مرغدار:{3}\nبه آدرس:{4}, {5},{6} در تاریخ {7} با بازه زمانی{8} جهت {9} به شما تخصیص داده شده است.\nنسبت به حمل آن اقدام نمایید.'.format( + drive_rname, quantity, barcode, poultry, province, city, address, date, time, kill_house) + check_mobile = check_mobile_number(driver_mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + driver_mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def send(receptor): + receptor = str(receptor) + message = 'کاربر گرامی آقای امیدی از درخواست کشتار 9000 قطعه شما \n 3000 قطعه به کشتارگاه پرطلایی \n 3000 قطعه به کشتارگاه افلاک \n 3000 قطعه به کشتارگاه پرند\n تخصیص داده شده است نسبت به تحویل بار به این واحد ها اقدام نمایید\n اطلاعات تکمیلی را در پنل سامانه سبحان مشاهده نمایید ' + + check_mobile = check_mobile_number(receptor) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + receptor, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def send_2(receptor): + receptor = str(receptor) + message = '' + check_mobile = check_mobile_number(receptor) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + receptor, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def sms_for_tabriz(receptor): + users = SystemUserProfile.objects.filter(role__name='KillHouse') + receptor = str(receptor) + for user in users: + url = 'https://sha.ravandno.ir' + message = '\n' \ + 'کشتارگاه دار محترم:' \ + '\n' \ + '{0}' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتاراز طریق سامانه رصدیار انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{1}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{2}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{3}' \ + '\n' \ + '\n' \ + 'هرگونه خرید مرغ بدون اطلاع اتحادیه و خارج از سامانه ذکر شده پیگرد قانونی دارد.' \ + '\n' \ + '\n' \ + 'اتحادیه مرغ گوشتی استان آذربایجان شرقی'.format( + user.fullname, + url, + user.mobile, + user.password) + check_mobile = check_mobile_number(user.mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + user.mobile, message) + url = u.format() + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + response = requests.request("GET", url, headers=headers, data=payload) + print(user.mobile + " " + user.fullname + " " + "Done") + +def send_sms_for_jahad(receptor=None, rand=None): + users = SystemUserProfile.objects.filter(role__name='Jahad') + receptor = str(receptor) + for user in users: + url = 'https://sha.ravandno.ir' + message = '\n' \ + 'ناظر محترم جهاد استان:' \ + '\n' \ + '{0}' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتار مرغ گوشتی از طریق سامانه رصدیار انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{1}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{2}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{3}' \ + '\n' \ + '\n' \ + 'جهت راه اندازی سامانه نیاز به همکاری شما دوستان در برطرف کردن مشکلات احتمالی می باشیم.' \ + '\n' \ + '\n' \ + 'باتشکر مدیریت سامانه رصدیار'.format( + user.fullname, + url, + user.mobile, + user.password) + check_mobile = check_mobile_number(user.mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + user.mobile, message) + url = u.format() + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + response = requests.request("GET", url, headers=headers, data=payload) + print(user.mobile + " " + user.fullname + " " + "Done") + + +def send_sms_for_province(receptor=None, rand=None): + users = SystemUserProfile.objects.filter(role__name='ProvinceOperator') + receptor = str(receptor) + for user in users: + url = 'https://sha.ravandno.ir' + message = '\n' \ + 'اپراتور محترم:' \ + '\n' \ + '{0}' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتار مرغ گوشتی از طریق سامانه رصدیار انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{1}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{2}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{3}' \ + '\n' \ + '\n' \ + 'هرگونه خرید و فروش مرغ خارج از سامانه ذکر شده پیگرد قانونی دارد.'.format( + user.fullname, + url, + user.mobile, + user.password) + check_mobile = check_mobile_number(user.mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + user.mobile, message) + url = u.format() + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + response = requests.request("GET", url, headers=headers, data=payload) + print(user.mobile + " " + user.fullname + " " + "Done") + + +def send_sms_for_city(receptor=None, rand=None): + users = SystemUserProfile.objects.filter(role__name='CityOperator') + receptor = str(receptor) + for user in users: + url = 'https://sha.ravandno.ir' + message = '\n' \ + 'اپراتور محترم:' \ + '\n' \ + '{0}' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتار مرغ گوشتی از طریق سامانه رصدیار انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{1}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{2}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{3}' \ + '\n' \ + '\n' \ + 'هرگونه خرید و فروش مرغ خارج از سامانه ذکر شده پیگرد قانونی دارد.'.format( + user.fullname, + url, + user.mobile, + user.password) + check_mobile = check_mobile_number(user.mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + user.mobile, message) + url = u.format() + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + response = requests.request("GET", url, headers=headers, data=payload) + print(user.mobile + " " + user.fullname + " " + "Done") + +def send_sms_for_vet(receptor=None, rand=None): + users = SystemUserProfile.objects.filter(role__name__in=('VetFarm','KillHouseVet')) + receptor = str(receptor) + for user in users: + url = 'https://sha.ravandno.ir' + message = '\n' \ + 'دامپزشک محترم:' \ + '\n' \ + '{0}' \ + '\n' \ + '\n' \ + 'از این پس کلیه امور کشتاراز طریق سامانه رصدیار انجام میگردد.' \ + '\n' \ + '\n' \ + 'لینک ورود به سامانه:' \ + '\n' \ + '\t\t\t{1}' \ + '\n' \ + '\n' \ + 'شماره همراه:\t{2}' \ + '\n' \ + '\n' \ + 'رمز عبور:\t{3}' \ + '\n' \ + '\n' \ + 'هرگونه خرید و فروش مرغ بدون اطلاع اتحادیه و خارج از سامانه ذکر شده پیگرد قانونی دارد.' \ + '\n' \ + '\n' \ + 'اتحادیه مرغ گوشتی'.format( + user.fullname, + url, + user.mobile, + user.password) + check_mobile = check_mobile_number(user.mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=pmstores&password=Aht00100&from=30002501&to={}&message={}".format( + user.mobile, message) + url = u.format() + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + response = requests.request("GET", url, headers=headers, data=payload) + print(user.mobile + " " + user.fullname + " " + "Done") diff --git a/authentication/serializer/__init__.py b/authentication/serializer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/authentication/serializer/serializer.py b/authentication/serializer/serializer.py new file mode 100644 index 0000000..7bb7fd6 --- /dev/null +++ b/authentication/serializer/serializer.py @@ -0,0 +1,308 @@ +from django.contrib.auth.models import User, Group +from django.db.models import Q + +from authentication.models import ( + UserProfile, + Address, + BankCard, + SystemUserProfile, + PermissionLevel, ExternalTransaction +) +from rest_framework import serializers +from authentication.permission_views import GroupSerializer +from authentication.serializers import SystemAddressSerializer, UserSerializer, ProvinceSerializer, CitySerializer +from panel.models import KillHouse, WagePayment, ProvinceKillRequest + + +# سریالایزر مربوط به مدل آدرس +class AddressSerializer(serializers.ModelSerializer): + class Meta: + model = Address + fields = [ + 'key', + 'title', + 'country', + 'province', + 'city', + 'address', + 'postal_code', + 'breeding_unique_id', + 'phone', + 'phone_type', + 'no', + 'floor', + 'unit', + ] + + def create(self, validated_data): + return Address.objects.create(**validated_data) + + +# سریالایزر مربوط به مدل اطلاعات بانکی +class BankCardSerializer(serializers.ModelSerializer): + class Meta: + model = BankCard + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'trash', + 'created_by', + 'modified_by', + ) + extra_kwargs = { + 'name_of_bank_user': {'required': False, 'allow_null': True}, + 'bank_name': {'required': False, 'allow_null': True}, + 'card': {'required': False, 'allow_null': True}, + 'shaba': {'required': False, 'allow_null': True}, + 'account': {'required': False, 'allow_null': True}, + } + + +# سریالایزر مربوط به مدل کاربر +class UserProfileSerializer(serializers.ModelSerializer): + user_bank_info = BankCardSerializer(read_only=True) + address = AddressSerializer(read_only=True) + role = GroupSerializer(read_only=True) + job = serializers.SerializerMethodField('get_job') + + def get_job(self, instance): + # if instance.role.name == 'Poultry': + # pass + # if instance.role.name == 'CityOperator': + # pass + # if instance.role.name == 'ProvinceOperator': + # pass + if instance.role.name == 'KillHouse': + kill_house = KillHouse.objects.get(user=instance).name + return kill_house + else: + return None + + class Meta: + model = UserProfile + fields = [ + 'key', + 'create_date', + # 'token', + 'fullname', + 'first_name', + 'last_name', + 'natinal_id', + 'mobile', + 'birthday', + 'image', + 'state', + 'role', + 'address', + 'unit_name', + 'gis_code', + 'operating_licence_capacity', + 'number_of_halls', + 'tenant', + 'person_type', + 'economic_code', + 'system_code', + 'epidemiological_code', + 'breeding_unique_id', + 'total_capacity', + 'licence_number', + 'health_certificate_number', + 'number_of_requests', + 'hatching_date', + 'last_party_date', + 'number_of_incubators', + 'herd_age_by_day', + 'herd_age_by_week', + 'number_of_party', + 'communication_type', + 'cooperative', + 'date_of_register', + 'unit_status', + 'samasat_user_code', + 'user_bank_info', + 'job', + 'incubation_date', + ] + + +class SystemUserProfileForAutoAllocationSerializer(serializers.ModelSerializer): + class Meta: + model = SystemUserProfile + fields = ['fullname', 'first_name', 'last_name', 'base_order', 'mobile', 'national_id', 'national_code', 'key', + 'city', 'unit_name', 'unit_national_id', 'unit_registration_number', 'unit_economical_number', + 'unit_province', 'unit_city', 'unit_postal_code', 'unit_address'] + depth = 1 + + +class SystemUserProfileForGuildSerializer(serializers.ModelSerializer): + city = serializers.CharField(source='city.name', read_only=True) + + class Meta: + model = SystemUserProfile + fields = ['fullname', 'first_name', 'last_name', 'mobile', 'national_id', 'city','father_name','gender','is_alive','birthday','national_code'] + depth = 1 + + +class SystemUserProfileForInspectionSerializer(serializers.ModelSerializer): + province_name = serializers.CharField(source='province.name', read_only=True) + city_name = serializers.CharField(source='city.name', read_only=True) + + class Meta: + model = SystemUserProfile + fields = ['fullname', 'first_name', 'last_name', 'mobile', 'national_id', 'province_name', 'city_name','is_alive','national_code','gender','father_name','birthday', + 'password'] + + +class SystemUserProfileForAllUsersSerializer(serializers.ModelSerializer): + role = serializers.SerializerMethodField('get_role') + + class Meta: + model = SystemUserProfile + fields = ['fullname', 'national_id', 'mobile', 'birthday', 'password', 'role'] + + def get_role(self, instance): + role_list = [] + for item in instance.role.all(): + role_list.append(item.name) + return role_list + + +class SystemUserProfileSerializer(serializers.ModelSerializer): + # user=UserSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True, required=False) + role = serializers.SerializerMethodField('get_role') + city = serializers.SerializerMethodField('get_city') + province = serializers.SerializerMethodField('get_province') + + class Meta: + model = SystemUserProfile + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'trash', + 'token', + 'created_by', + 'modified_by', + 'user', + # 'password', + 'access_level', + ) + # extra_kwargs = {"access_level": {"required": False, "allow_null": True}} + + def get_city(self, instance): + if instance.city == None: + pass + else: + return instance.city.name + + def get_province(self, instance): + if instance.province == None: + pass + else: + return instance.province.name + + def get_role(self, instance): + role_list = [] + for item in instance.role.all(): + role_list.append(item.name) + return role_list + + +class SystemUserProfileForFactorSerializer(serializers.ModelSerializer): + class Meta: + model = SystemUserProfile + fields = ['key', 'fullname', 'first_name', 'last_name', 'mobile', 'unit_name', 'unit_national_id', + 'unit_registration_number', 'unit_economical_number', 'unit_province', 'unit_city', + 'unit_postal_code', 'unit_address'] + + +class SystemUserProfileBaseInfoSerializer(serializers.ModelSerializer): + role = GroupSerializer(many=True) + city = CitySerializer(read_only=True, required=False) + province = ProvinceSerializer(read_only=True, required=False) + + class Meta: + model = SystemUserProfile + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'trash', + 'token', + 'created_by', + 'modified_by', + 'user', + 'state', + # 'password', + 'access_level', + ) + + +class ExternalTransactionSerializer(serializers.ModelSerializer): + receiver = SystemUserProfileForAutoAllocationSerializer(read_only=True) + creator = SystemUserProfileForAutoAllocationSerializer(read_only=True) + information = serializers.SerializerMethodField('get_information') + + class Meta: + model = ExternalTransaction + fields = '__all__' + + def get_information(self, obj): + total_weight = 0 + total_quantity = 0 + total_request = 0 + wage_payment = WagePayment.objects.filter(Q(orderId=obj.orderId) | Q(tracking_code=obj.saleReferenceId), + trash=False).first() + if wage_payment.province_kill_request != None: + total_request = len(wage_payment.province_kill_request) + for province_kill_req in wage_payment.province_kill_request: + province_kill = ProvinceKillRequest.objects.get(key=province_kill_req, trash=False) + total_weight += province_kill.total_killed_weight + total_quantity += province_kill.total_killed_quantity + return { + "total_weight": total_weight, + "total_quantity": total_quantity, + "total_request_number": total_request, + } + + +class SystemUserProfileForPoultryLocSerializer(serializers.ModelSerializer): + class Meta: + model = SystemUserProfile + fields = ['fullname', 'mobile'] + + +class SystemUserProfileBaseInfoForTicketSerializer(serializers.ModelSerializer): + role = GroupSerializer(many=True) + city = CitySerializer(read_only=True, required=False) + province = ProvinceSerializer(read_only=True, required=False) + + class Meta: + model = SystemUserProfile + fields = ['birthday', 'first_name', 'fullname', 'key', 'last_name', 'mobile', 'national_code', 'role', 'city', + 'province'] + + +class SystemUserProfileForPoultryScienceSerializer(serializers.ModelSerializer): + role = serializers.SerializerMethodField('get_role') + + class Meta: + model = SystemUserProfile + fields = ['fullname', 'mobile','role'] + + def get_role(self, instance): + role_list = [] + for item in instance.role.all(): + role_list.append(item.name) + return role_list + + +class SystemUserProfileForPoultryScienceWithoutRoleSerializer(serializers.ModelSerializer): + city = CitySerializer(read_only=True, required=False) + + class Meta: + model = SystemUserProfile + fields = ['fullname', 'mobile','city'] + diff --git a/authentication/serializers.py b/authentication/serializers.py new file mode 100644 index 0000000..f5d6545 --- /dev/null +++ b/authentication/serializers.py @@ -0,0 +1,106 @@ +from django.contrib.auth.models import User, Group +from rest_framework import serializers + +from authentication.models import ( + UserProfile, + Address, + City, + Province, + SystemAddress, + CityUnit +) + + +# سریالایزر مربوط به مدل استان +from panel.models import ManagementSendSms + + +class ProvinceSerializer(serializers.ModelSerializer): + class Meta: + model = Province + fields = ['key', 'name'] + + +# سریالایزر مربوط به مدل شهرستان +class CitySerializer(serializers.ModelSerializer): + class Meta: + model = City + fields = ['key', 'name'] + + +class CityForProductPricingSerializer(serializers.ModelSerializer): + class Meta: + model = City + fields = ['key', 'name', 'product_price'] + + +# سریالایزر مربوط به مدل زیر بخش شهرستان +class CityUnitSerializer(serializers.ModelSerializer): + city = CitySerializer(read_only=True) + + class Meta: + model = CityUnit + fields = ['key', 'name'] + + +# سریالایزر مربوط به مدل آدرس +class SystemAddressSerializer(serializers.ModelSerializer): + province = ProvinceSerializer(required=False) + city = CitySerializer(required=False) + + class Meta: + model = SystemAddress + fields = ['province', 'city', 'address', 'postal_code'] + + +# سریالایزر مربوط به مدل آدرس +class AddressSerializer(serializers.ModelSerializer): + class Meta: + model = Address + fields = '__all__' + + +# سریالایزر مربوط به مدل کاربر +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = '__all__' + + +# سریالایزر مربوط به مدل نقش +class GroupSerializer(serializers.ModelSerializer): + class Meta: + model = Group + fields = ("name",) + + +# سریالایزر مربوط به مدل پروفایل کاربری +class UserProfileSerializer(serializers.ModelSerializer): + address = AddressSerializer(read_only=True) + + class Meta: + model = UserProfile + fields = '__all__' + + + + +# سریالایزر مربوط به مدل شهرستان +class CityForLocSerializer(serializers.ModelSerializer): + class Meta: + model = City + fields = ['name'] + + +class SystemAddressForLocSerializer(serializers.ModelSerializer): + city = CityForLocSerializer(required=False) + + class Meta: + model = SystemAddress + fields = ['city','address'] + + +class ManagementSendSmsSerializer(serializers.ModelSerializer): + class Meta: + model = ManagementSendSms + fields = '__all__' diff --git a/authentication/sms_management.py b/authentication/sms_management.py new file mode 100644 index 0000000..f2cf70d --- /dev/null +++ b/authentication/sms_management.py @@ -0,0 +1,3070 @@ +from datetime import datetime +import threading + +import jdatetime +from django.db.models import Q, Sum, F +from rest_framework import status, viewsets +from rest_framework.decorators import permission_classes, api_view +from rest_framework.permissions import AllowAny + +from authentication.models import SystemUserProfile, UserMessageSend +from django.views.decorators.csrf import csrf_exempt +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, +) +from django.http import HttpResponse +import xml.etree.ElementTree as ET + +import requests + +from rest_framework.response import Response + +from deposit_percent import wage_percent +from general_urls import base_url_sms, base_url_for_sms_report, base_pos_id +from panel.KillHouse.helpers import get_finance_info +from panel.helper import UNION_NUMBER, COMPANY_NUMBER, GUILD_NUMBER, UNION_SECOND_NUMBER, SUPPORTER_NUMBER, \ + UNION_THIRD_NUMBER, UNION_FOURTH_NUMBER, UNION_NUMBER_2, COMPANY_NUMBER2, UNION_FIFTH_NUMBER, UNION_SIXTH_NUMBER +from panel.helper_excel import shamsi_date, to_locale_str +from panel.models import KillHouseRequest, VetCheckRequest, KillHouseVet, VetCheckAllocations, KillHouse, \ + KillHouseFreeBarInformation, InternalTransaction, ProvinceKillRequest, Poultry, VetFarm, KillHousePurchaseRequest, \ + OutProvincePoultryRequestBuyer, CityOperator, UserReports, ReportsUsers, LastUpdate, PoultryRequest, \ + CompanyBeneficiaryAccount, ManagementSendSms, StewardAllocation, SmsRecipient +from .sahandsms.sms import USERNAME_SMS, PASSWORD_SMS, USERNAME_SMS_FINANCIAL, PASSWORD_SMS_FINANCIAL, \ + USERNAME_SMS_HAMEDAN, PASSWORD_SMS_HAMEDAN, OUT_SMS_USER, OUT_SMS_PASS +from panel.helper import check_mobile_number +from .serializers import ManagementSendSmsSerializer + +management_sms = ManagementSendSms.objects.all() +gate_way = management_sms.filter(name='ارسال بدهی').first() +send_deactivate = management_sms.filter(name='ارسال مسدودی ها').first() +direct_buying = management_sms.filter(name='خرید مستقیم').first() +poultry_request = management_sms.filter(name='درخواست کشتار جدید').first() +poultry_link_out_sale = management_sms.filter(name='ارسال پیامک لینک فروش مرغ به خارج استان').first() +kill_req_market = management_sms.filter(name='پیامک پنل بورسی').first() +poultry_req_market = management_sms.filter(name='پیامک به مرغدار درخواست کشتار مرغدار برای پنل بورسی').first() +steward_allocation = management_sms.filter(name='پیامک کد احراز به مباشر').first() +guild_register = management_sms.filter(name='پیامک کد احراز برای ثبت صنف/مباشر').first() +sms_recipient = management_sms.filter(name='پیامک مرغ زنده و لاشه به شماره های خاص').first() +gate_way_username = gate_way.username +gate_way_password = gate_way.password +send_deactivate_username = send_deactivate.username +send_deactivate_password = send_deactivate.password +direct_buying_username = direct_buying.username +direct_buying_password = direct_buying.password +poultry_request_username = poultry_request.username +poultry_request_password = poultry_request.password +poultry_link_out_sale_username = poultry_link_out_sale.username +poultry_link_out_sale_password = poultry_link_out_sale.password +kill_req_market_username = kill_req_market.username +kill_req_market_password = kill_req_market.password +poultry_req_market_username = poultry_req_market.username +poultry_req_market_password = poultry_req_market.password +steward_allocation_username = steward_allocation.username +steward_allocation_password = steward_allocation.password +guild_register_username = guild_register.username +guild_register_password = guild_register.password +sms_recipient_username = sms_recipient.username +sms_recipient_password = sms_recipient.password + + +def sanitize_sms_message(message): + if not message: + return message + forbidden_words = {'شاه': 'ش..ه', 'SHAH': 'SH..AH', 'Shah': 'Sh..ah', 'shah': 'sh..ah'} + cleaned_message = message + for forbidden, replacement in forbidden_words.items(): + cleaned_message = cleaned_message.replace(forbidden, replacement) + return cleaned_message + + +def send_sms_request(url): + if 'message=' in url: + parts = url.split('message=') + if len(parts) == 2: + before_message = parts[0] + 'message=' + message_and_after = parts[1] + if '&' in message_and_after: + message = message_and_after.split('&')[0] + after_message = '&' + '&'.join(message_and_after.split('&')[1:]) + else: + message = message_and_after + after_message = '' + cleaned_message = sanitize_sms_message(message) + url = before_message + cleaned_message + after_message + return requests.get(url) + + +def transaction_sms_threading(*mobile): + percentage = CompanyBeneficiaryAccount.objects.filter(trash=False) + mother_percent = percentage.filter(unique_code=1).first().percent + for m in mobile: + for k, v in m.items(): + if k == 'payer': + payer = v + if k == 'date': + date = v + if k == 'share': + share = v + mother_share = ((int(v) * mother_percent) / 100) if mother_percent > 0 else 0 + + share = "{:,}".format(int(share)) + mother_share = "{:,}".format(int(mother_share)) + + if k == 'mobile': + phone = v + if k == 'province': + province = v + if k == 'killer': + killer = v + check_mobile = check_mobile_number(phone) + if check_mobile: + if phone == COMPANY_NUMBER: + # message = f'تراکنش موفق استان {province} (سهم شرکت)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {share} ریال ' + # if COMPANY_NUMBER2 is not None: + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={COMPANY_NUMBER2}&message={message}") + message1 = f'تراکنش موفق استان {province} (سهم شرکت مادر)' \ + f'\n' \ + f'پرداخت کننده: {killer} {payer} ' \ + f'\n' \ + f'تاریخ : {date}' \ + f'\n' \ + f' مبلغ سهم شما : {mother_share} ریال ' + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_USER}&from=30002501&to=09121355674&message={message1}") + # message_kiani = f'تراکنش موفق استان {province} (سهم محمد کیانی)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {kiani_share} ریال ' + # req_kiani = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to=09364415690&message={message_kiani}") + # message_momeni = f'تراکنش موفق استان {province} (سهم مومنی)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {momeni_share} ریال ' + # req_momeni = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to=09201917727&message={message_momeni}") + + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={COMPANY_NUMBER}&message={message1}") + # elif phone == UNION_NUMBER: + # message = f'تراکنش موفق استان {province} (سهم اتحادیه)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {share} ریال ' + # if UNION_THIRD_NUMBER is not None: + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={UNION_THIRD_NUMBER}&message={message}") + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={COMPANY_NUMBER}&message={message}") + # elif phone == GUILD_NUMBER: + # message = f'تراکنش موفق {province} (سهم صنف)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {share} ریال ' + # if UNION_THIRD_NUMBER is not None: + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={UNION_THIRD_NUMBER}&message={message}") + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={COMPANY_NUMBER}&message={message}") + # else: + # message = f'تراکنش موفق' \ + # f'\n' \ + # f'پرداخت کننده: {payer}' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {share} ریال ' + # req = send_sms_request( + # url=f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendFromUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&message={message}&fromNumber=30002501&toNumber={phone}") + + +def transaction_sms_threading_in_province(*mobile): + percentage = CompanyBeneficiaryAccount.objects.filter(trash=False) + kiani_percent = percentage.filter(unique_code=2).first().percent + momen_percent = percentage.filter(unique_code=3).first().percent + for m in mobile: + for k, v in m.items(): + if k == 'payer': + payer = v + if k == 'date': + date = v + if k == 'share': + share = v + # mother_share=int(v) * 0.06 + kiani_share = ((int(v) * kiani_percent) / 100) if kiani_percent > 0 else 0 + # momeni_share=((int(v) * momen_percent) / 100) if kiani_percent > 0 else 0 + share = "{:,}".format(int(share)) + # mother_share = "{:,}".format(int(mother_share)) + kiani_share = "{:,}".format(int(kiani_share)) + # momeni_share = "{:,}".format(int(momeni_share)) + if k == 'mobile': + phone = v + if k == 'province': + province = v + if k == 'killer': + killer = v + check_mobile = check_mobile_number(phone) + if check_mobile: + if phone == COMPANY_NUMBER: + # message = f'تراکنش موفق استان {province} (سهم شرکت)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {share} ریال ' + # if COMPANY_NUMBER2 is not None: + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={COMPANY_NUMBER2}&message={message}") + # message1 = f'تراکنش موفق استان {province} (سهم شرکت مادر)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {mother_share} ریال ' + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to=09121355674&message={message1}") + message_kiani = f'تراکنش موفق استان {province} (سهم محمد کیانی)' \ + f'\n' \ + f'پرداخت کننده: {killer} {payer} ' \ + f'\n' \ + f'تاریخ : {date}' \ + f'\n' \ + f' مبلغ سهم شما : {kiani_share} ریال ' + req_kiani = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to=09364415690&message={message_kiani}") + # message_momeni = f'تراکنش موفق استان {province} (سهم مومنی)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {momeni_share} ریال ' + req_momeni = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to=09201917727&message={message_kiani}") + + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={COMPANY_NUMBER}&message={message1}") + # elif phone == UNION_NUMBER: + # message = f'تراکنش موفق استان {province} (سهم اتحادیه)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {share} ریال ' + # if UNION_THIRD_NUMBER is not None: + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={UNION_THIRD_NUMBER}&message={message}") + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={COMPANY_NUMBER}&message={message}") + # elif phone == GUILD_NUMBER: + # message = f'تراکنش موفق {province} (سهم صنف)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {share} ریال ' + # if UNION_THIRD_NUMBER is not None: + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={UNION_THIRD_NUMBER}&message={message}") + # req = send_sms_request( + # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={COMPANY_NUMBER}&message={message}") + # else: + # message = f'تراکنش موفق' \ + # f'\n' \ + # f'پرداخت کننده: {payer}' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ سهم شما : {share} ریال ' + # req = send_sms_request( + # url=f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendFromUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&message={message}&fromNumber=30002501&toNumber={phone}") + + +def transaction_sms_threading_for_company(*mobile): + pass + # for m in mobile: + # for k, v in m.items(): + # if k == 'payer': + # payer = v + # if k == 'date': + # date = v + # if k == 'share': + # share = v + # share = "{:,}".format(int(share)) + # if k == 'mobile': + # phone = v + # if k == 'province': + # province=v + # if k == 'killer': + # killer=v + # message = f'تراکنش موفق استان {province} (کل سهم)' \ + # f'\n' \ + # f'پرداخت کننده: {killer} {payer} ' \ + # f'\n' \ + # f'تاریخ : {date}' \ + # f'\n' \ + # f' مبلغ کل سهم : {share} ریال ' + # req = send_sms_request( + # url=f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendFromUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&message={message}&fromNumber=30002501&toNumber={phone}") + + +def transaction_sms_threading_appreciation(user, mobile): + message = f'کاربر گرامی {user}' \ + '\n' \ + 'از پرداخت شما سپاسگزاریم.' \ + '\n' \ + '(سامانه رصدیار)' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + url=f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendFromUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&message={message}&fromNumber=30002501&toNumber={mobile}") + + +def user_sms_threading(mobile, message): + for i in mobile: + check_mobile = check_mobile_number(i) + if check_mobile: + req = send_sms_request( + url=f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendFromUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&message={message}&fromNumber=30002501&toNumber={i}") + + msg = UserMessageSend( + + message=str(message), + ) + msg.save() + + +@api_view(["POST"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def user_sms(request): + operator = SystemUserProfile.objects.get(user=request.user) + roles = None + users = None + message = request.data['message'] + if 'role' in request.data.keys(): + roles = request.data['role'] + if 'user' in request.data.keys(): + users = request.data['user'] + + if roles != None and users != None: + users = SystemUserProfile.objects.filter(role__name__in=roles, key__in=users, + province=operator.province).only('mobile').order_by('id').values_list( + 'mobile', flat=True) + elif roles != None: + users = SystemUserProfile.objects.filter(role__name__in=roles, province=operator.province).only( + 'mobile').order_by('id').values_list('mobile', flat=True) + else: + users = SystemUserProfile.objects.filter(key__in=users, province=operator.province).only('mobile').order_by( + 'id').values_list('mobile', flat=True) + + send_sms = threading.Thread(target=user_sms_threading, args=(users, message)) + send_sms.start() + + return Response({'msg': 'send'}) + + +def hatching_sms(mobile, poultry_fullname, quantity, date, chicken_breed, province, city + ): + message = ' ثبت جوجه ریزی جدید:\n مرغدار:{0}\nتعداد:{1}\nتاریخ:{2}\nنژاد:{3}\nآدرس:استان {4},شهر {5}'.format( + poultry_fullname, quantity, date, chicken_breed, province, city) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def operator_hatching_sms(mobile, poultry_fullname, quantity, date, chicken_breed, province, city, + + ): + message = ' ثبت جوجه ریزی جدید:\n مرغدار:{0}\nتعداد:{1}\nتاریخ:{2}\nنژاد:{3}\nآدرس:استان {4},شهر {5}'.format( + poultry_fullname, quantity, date, chicken_breed, province, city) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +# USERNAME_SMS +def operator_poultry_request_sms(mobile, poultry_fullname, quantity, chicken_breed, + order_code, send_date, sale_in_province, amount, request_kill_house, poultry_mobile + + ): + sale_type = 'آزاد' if sale_in_province == True else 'دولتی' + amount = "{:,}".format(int(amount)) + quantity = "{:,}".format(int(quantity)) + message = 'درخواست کشتار جدید' \ + f'\n' \ + f'تعداد:{quantity}' \ + f'\n' \ + f'نژاد:{chicken_breed}' \ + f'\n' \ + f'تاریخ کشتار:{send_date}' \ + f'\n' \ + f'نوع فروش:{sale_type}' \ + f'\n' \ + f'مرغدار:{poultry_fullname}' \ + f'\n' \ + f'کدسفارش:{order_code}' \ + f'\n' \ + f'قیمت مرغدار:{amount}' \ + f'\n' \ + f'(سامانه رصدیار)' \ + # message = 'درخواست کشتار\n مرغدار:{0}\nتعداد:{1}\nنژاد:{2}\n کدسفارش:{3}\nتاریخ کشتار:{4}'.format( + # poultry_fullname, quantity, chicken_breed, + # order_code, send_date) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + poultry_request_username, poultry_request_password, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + if UNION_NUMBER_2 is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={poultry_request_username}&password={poultry_request_password}&from=30002501&to={UNION_NUMBER_2}&message={message}") + + message2 = 'درخواست کشتار جدید' \ + f'\n' \ + f'مرغدار:{poultry_fullname}' \ + f'\n' \ + f'تعداد:{quantity}' \ + f'\n' \ + f'نژاد:{chicken_breed}' \ + f'\n' \ + f'تاریخ کشتار:{send_date}' \ + f'\n' \ + f'نوع فروش:{sale_type}' \ + f'\n' \ + f'کشتارگاه:{request_kill_house}' \ + f'\n' \ + f'کدسفارش:{order_code}' \ + f'\n' \ + f'قیمت :{amount} ریال' \ + f'\n' \ + f'(سامانه رصدیار)' + + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={poultry_request_username}&password={poultry_request_password}&from=30002501&to={poultry_mobile}&message={message2}") + + +# USERNAME_SMS +def operator_out_poultry_request_sms(mobile, poultry_fullname, quantity, chicken_breed, + order_code, send_date, sale_in_province, amount, vet_mobile=None + + ): + sale_type = 'آزاد' if sale_in_province == True else 'دولتی' + amount = "{:,}".format(int(amount)) + quantity = "{:,}".format(int(quantity)) + message = 'درخواست کشتار آزاد' \ + f'\n' \ + f'تعداد:{quantity}' \ + f'\n' \ + f'نژاد:{chicken_breed}' \ + f'\n' \ + f'تاریخ کشتار:{send_date}' \ + f'\n' \ + f'نوع فروش:{sale_type}' \ + f'\n' \ + f'مرغدار:{poultry_fullname}' \ + f'\n' \ + f'کدسفارش:{order_code}' \ + f'\n' \ + f'قیمت مرغدار:{amount}' \ + f'\n' \ + f'(سامانه رصدیار)' \ + # message = 'درخواست کشتار آزاد\n مرغدار:{0}\nتعداد:{1}\nنژاد:{2}\n کدسفارش:{3}\nتاریخ کشتار:{4}'.format( + # poultry_fullname, quantity, chicken_breed, + # order_code, send_date) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + if UNION_NUMBER_2 is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={UNION_NUMBER_2}&message={message}") + if vet_mobile is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={vet_mobile}&message={message}") + + +def poultry_request_receive_city_accept_sms(mobile, send_date, order_code, free_sale_in_province + + ): + sale_type = 'آزاد' if free_sale_in_province == True else 'دولتی' + message = ' مرغدار گرامی درخواست کشتار شما با نوع:{2} به تاریخ {0} با شماره سفارش:{1} توسط شهرستان تایید شد.'.format( + send_date, order_code, sale_type) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def poultry_request_receive_province_accept_sms(mobile, order_code + ): + message = 'درخواست کشتار با کد سفارش:{0} توسط استان تایید شد.'.format( + order_code) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +# USERNAME_SMS +def confirm_price_poultry_request_sms(mobile, poultry_fullname, quantity, chicken_breed, order_code, send_date, + free_sale_in_province, amount, request_kill_house, confirm_code): + sale_type = 'آزاد' if free_sale_in_province == True else 'دولتی' + + message = 'درخواست کشتار جدید' \ + f'\n' \ + f'مرغدار:{poultry_fullname}' \ + f'\n' \ + f'تعداد:{quantity}' \ + f'\n' \ + f'نژاد:{chicken_breed}' \ + f'\n' \ + f'تاریخ کشتار:{send_date}' \ + f'\n' \ + f'نوع فروش:{sale_type}' \ + f'\n' \ + f'کشتارگاه:{request_kill_house}' \ + f'\n' \ + f'کدسفارش:{order_code}' \ + f'\n' \ + f'قیمت :{amount} ریال' \ + f'\n' \ + f'کداحراز :{confirm_code}' \ + f'\n' \ + f'(سامانه رصدیار)' + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + poultry_request_username, poultry_request_password, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +# USERNAME_SMS +def confirm_price_poultry_request_direct_buying_sms(mobile, poultry_fullname, quantity, chicken_breed, send_date, + free_sale_in_province, amount, request_kill_house, confirm_code): + sale_type = 'آزاد' if free_sale_in_province == True else 'دولتی' + + message = 'درخواست خرید مستقیم:' \ + f'\n' \ + f'تعداد:{quantity}' \ + f'\n' \ + f'تاریخ کشتار:{send_date}' \ + f'\n' \ + f'نوع فروش:{sale_type}' \ + f'\n' \ + f'خریدار:{request_kill_house}' \ + f'\n' \ + f'قیمت :{int(amount)} ریال' \ + f'\n' \ + f'کداحراز :{confirm_code}' \ + f'\n' \ + f'(سامانه رصدیار)' + # message = 'درخواست خرید مستقیم:' \ + # f'\n' \ + # f'مرغدار:{poultry_fullname}' \ + # f'\n' \ + # f'تعداد:{quantity}' \ + # f'\n' \ + # f'نژاد:{chicken_breed}' \ + # f'\n' \ + # f'تاریخ کشتار:{send_date}' \ + # f'\n' \ + # f'نوع فروش:{sale_type}' \ + # f'\n' \ + # f'خریدار:{request_kill_house}' \ + # f'\n' \ + # f'قیمت :{int(amount)} ریال' \ + # f'\n' \ + # f'کداحراز :{confirm_code}' \ + # f'\n' \ + # f'(سامانه رصدیار)' + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + direct_buying_username, direct_buying_password, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + +# USERNAME_SMS +def kill_request_province_sms(mobile, kill_house_name, quantity, chicken_breed, send_date, province, city, + + ): + message = ' اعلام نیاز جدید کشتارگاه:\n {0}\n تعداد درخواست:{1}\nنژاد:{2}\nتاریخ کشتار:{3}\nآدرس:استان {4}, شهر {5}\n'.format( + kill_house_name, quantity, chicken_breed, send_date, province, city) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + if UNION_NUMBER_2 is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={UNION_NUMBER_2}&message={message}") + + +def kill_request_delete_province_sms(mobile, kill_house_name, quantity, chicken_breed, send_date, province, city, + + ): + message = 'لغو درخواست کشتار:\n {0}\n تعداد درخواست:{1}\nنژاد:{2}\nتاریخ کشتار:{3}\nآدرس:استان {4}, شهر {5}'.format( + kill_house_name, quantity, chicken_breed, send_date, province, city) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def province_kill_request_to_kill_house_sms(mobile, quantity, chicken_breed, send_date, poultry_name, + poultry_mobile, province, city, sale_in_province, amount, kill_house_name + + ): + sale_type = 'آزاد' if sale_in_province == True else 'دولتی' + amount = "{:,}".format(int(amount)) + quantity = "{:,}".format(int(quantity)) + message = 'تخصیص کشتار جدید' \ + f'\n' \ + f'تعداد:{quantity}' \ + f'\n' \ + f'نژاد:{chicken_breed}' \ + f'\n' \ + f'تاریخ کشتار:{send_date}' \ + f'\n' \ + f'نوع فروش:{sale_type}' \ + f'\n' \ + f'خریدار:{kill_house_name}' \ + f'\n' \ + f'مرغدار:{poultry_name}' \ + f'\n' \ + f'تلفن مرغدار:{poultry_mobile}' \ + f'\n' \ + f'آدرس:{province} - {city}' \ + f'\n' \ + f'قیمت مرغدار:{amount}' \ + f'\n' \ + f'(سامانه رصدیار)' \ + # message = 'تخصیص کشتار جدید:\n تعداد:{0}\n نژاد: {1}\nتاریخ کشتار:{2}\nمرغدار:{3}\n تلفن مرغدار:{4}\nآدرس:استان {5}, شهر {6}\n '.format( + # quantity, chicken_breed, send_date, poultry_name, poultry_mobile, province, city, + # ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + if UNION_NUMBER_2 is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={UNION_NUMBER_2}&message={message}") + + +def kill_house_province_kill_request_accept_to_province_sms(mobile, provice_operator_name, quantity, + chicken_breed, send_date, poultry_name, + poultry_mobile, province, city, kill_house_name, + + ): + message = ' اپراتور گرامی: {0}\n تعداد {1} مرغ با نژاد: {2}\nدر تاریخ کشتار:{3}\n از مرغدار:{4} با شماره تماس:{5}\nبه آدرس:استان {6}, شهر {7}\n توسط:{8} تایید شد.'.format( + provice_operator_name, quantity, chicken_breed, send_date, poultry_name, poultry_mobile, province, city, + kill_house_name + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def kill_house_request_to_poultry_sms(mobile, quantity, kill_house_name, send_date, driver_name, + driver_mobile, + type_car, pelak + + ): + message = 'اطلاعات تحویل بار:\n تعداد:{0}\nخریدار:{1}\nتاریخ تحویل:{2}\n راننده:{3}\n تلفن راننده:{4}\n ماشین:{5}\n با پلاک {6}'.format( + quantity, kill_house_name, send_date, driver_name, driver_mobile, type_car, pelak + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def kill_house_request_to_vet_farm_clearnce_sms(mobile, quantity, index_weight, total_weight, poultry_name, + poultry_mobile, kill_house_user_name, kill_house_user_mobile, send_date, + driver_name, + driver_mobile, + type_car, pelak + + ): + message = 'اطلاعات بار(کد قرنطینه):\n تعداد:{0}\nمیانگین وزن:{1}\nوزن کل:{2}\nفروشنده:{3}-{4}\nخریدار:{5}-{6}\nتاریخ تحویل:{7}\nراننده:{8}-{9}\nماشین:{10}-{11}'.format( + quantity, index_weight, total_weight, poultry_name, poultry_mobile, kill_house_user_name, + kill_house_user_mobile, send_date, driver_name, + driver_mobile, + type_car, pelak + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def kill_house_request_to_driver_sms(mobile, send_date, receive_time, quantity, chicken_breed, poultry_name, + poultry_mobile, + poultry_province, poultry_city, poultry_address, + kill_house_name, + kill_house_mobile, + kill_house_province, + kill_house_city, kill_house_address + + ): + message = 'اطلاعات تحویل بار:\nتاریخ:{0}\nازه زمانی:{1}\nتعداد:{2}\nنژاد:{3}\n مبدا:\nمرغدار:{4}\nشماره تماس:{5}\nآدرس:{6},{7},{8}\n مقصد:\nکشتارگاه:{9}\nشماره تماس:{10}\nآدرس:{11},{12},{13}\n'.format( + send_date, receive_time, quantity, chicken_breed, poultry_name, poultry_mobile, + poultry_province, poultry_city, poultry_address, + kill_house_name, + kill_house_mobile, + kill_house_province, + kill_house_city, kill_house_address + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def kill_house_request_to_vet_farm_sms(mobile, send_date, receive_time, quantity, chicken_breed, poultry_name, + poultry_mobile, + poultry_province, poultry_city, poultry_address, + kill_house_name, + kill_house_mobile, + kill_house_province, + kill_house_city, kill_house_address, + driver_name, + driver_mobile, + driver_car, + pelak, + + ): + message = 'اعلام کد ترخیص:\nتاریخ:{0}\nبازه زمانی:{1}\nتعداد:{2}\nنژاد:{3}\n مبدا:\nمرغدار:{4}\nشماره تماس:{5}\nآدرس:{6},{7},{8}\n مقصد:\nکشتارگاه:{9}\nشماره تماس:{10}\nآدرس:{11},{12},{13}\راننده:{14}\n تلفن راننده:{15}\n ماشین:{16}\n با پلاک {17}'.format( + send_date, receive_time, quantity, chicken_breed, poultry_name, poultry_mobile, + poultry_province, poultry_city, poultry_address, + kill_house_name, + kill_house_mobile, + kill_house_province, + kill_house_city, kill_house_address, + driver_name, + driver_mobile, + driver_car, + pelak, + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def kill_house_request_to_kill_house_vet_sms(mobile, send_date, receive_time, quantity, chicken_breed, poultry_name, + driver_name, + driver_car, + pelak, + + ): + message = 'اعلام تحویل بار:\nتاریخ:{0}\nبازه زمانی:{1}\nتعداد:{2}\nنژاد:{3}\nاز مرغدار:{4}\nراننده:{5}\nماشین:{6}\nبا پلاک {7}\nتحویل شما داده میشود.'.format( + send_date, receive_time, quantity, chicken_breed, poultry_name, + driver_name, + driver_car, + pelak, + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def kill_house_vet_to_poultry_sms(mobile, send_date, receive_time, quantity, chicken_breed, poultry_name, + driver_name, + driver_car, + pelak, + + ): + message = 'اعلام تاییدتحویل بار:\nتاریخ:{0}\nبازه زمانی:{1}\nتعداد:{2}\nنژاد:{3}\nاز مرغدار:{4}\nراننده:{5}\nماشین:{6}\nبا پلاک {7}\nتحویل کشتارگاه شد.'.format( + send_date, receive_time, quantity, chicken_breed, poultry_name, + driver_name, + driver_car, + pelak, + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def kill_house_vet_to_province_sms(mobile, send_date, receive_time, quantity, chicken_breed, poultry_name, + driver_name, + driver_car, + pelak, + + ): + message = 'اعلام تاییدتحویل بار:\nتاریخ:{0}\nبازه زمانی:{1}\nتعداد:{2}\nنژاد:{3}\nاز مرغدار:{4}\nراننده:{5}\nماشین:{6}\nبا پلاک {7}\nتحویل کشتارگاه شد.'.format( + send_date, receive_time, quantity, chicken_breed, poultry_name, + driver_name, + driver_car, + pelak, + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def kill_house_vet_to_kill_house_sms(mobile, send_date, receive_time, quantity, chicken_breed, poultry_name, + driver_name, + driver_car, + pelak, + + ): + message = 'اعلام تاییدتحویل بار:\nتاریخ:{0}\nبازه زمانی:{1}\nتعداد:{2}\nنژاد:{3}\nاز مرغدار:{4}\nراننده:{5}\nماشین:{6}\nبا پلاک {7}\nتحویل کشتارگاه شد.'.format( + send_date, receive_time, quantity, chicken_breed, poultry_name, + driver_name, + driver_car, + pelak, + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def province_kill_request_reject_sms(mobile, kill_house_name + ): + message = ' کاربر گرامی: {0}\n درخواست اولیه کشتار شما توسط استان رد شد.'.format( + kill_house_name + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def allow_poultry_city_province_sms(mobile, Poultry_name + ): + message = ' کاربر گرامی:\nوکالت ثبت درخواست کشتار توسط مرغدار:{} برای شما صادر شد.'.format( + Poultry_name + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def allow_poultry_city_for_poultry_sms(mobile, Poultry_name + ): + message = ' مرغدار گرامی:{0}\n وکالت ثبت درخواست کشتار توسط شما برای شهرستان ثیت شد.'.format( + Poultry_name + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def allow_poultry_province_for_poultry_sms(mobile, Poultry_name + ): + message = ' مرغدار گرامی:{0}\n وکالت ثبت درخواست کشتار توسط شما برای استان ثیت شد.'.format( + Poultry_name + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def kill_house_vet_check_receive_sms(request): + url = 'http://webservice.sahandsms.com/NewSMSWebService.asmx/RecieveSMS' + params = {'Username': USERNAME_SMS, 'password': PASSWORD_SMS, 'phNo': '30002501', 'startdate': '5/1/2023', + 'enddate': '6/2/2023'} + response = send_sms_request(url, params=params) + if response.status_code != 200: + pass + else: + + xml_str = response.content + root = ET.fromstring(xml_str) + mobile = root.iter('RcvSmsfrom') + text = root.iter('RcvSmsText') + + for m, t in zip(mobile, text): + kill_house_request = KillHouseRequest.objects.filter(trash=False, bar_code=t.text).first() + if kill_house_request: + vet = KillHouseVet.objects.filter(vet__user__mobile=m.text + , trash=False, + kill_house=kill_house_request.killhouse_user).first() + if vet: + kill_house_request.vet_state = "accepted" + kill_house_request.save() + vet_check_request = VetCheckRequest( + kill_house_vet=vet, + kill_house_request=kill_house_request, + state='accepted' + + ) + vet_check_request.save() + + +def steward_allocation_sms(mobile, date, weight, seller, number, + buyer, amount): + message = 'اطلاعات خرید گوشت مرغ\n' \ + 'فروشنده: {0} \n' \ + 'تاریخ فروش: {1}\n' \ + 'وزن سفارش: {2} (کیلوگرم)\n' \ + 'مبلغ هر کیلو: {3} (ریال)\n' \ + 'کد احراز: {4}\n' \ + 'سامانه رصدیار'.format(seller, date, to_locale_str(weight), to_locale_str(amount), number) + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={steward_allocation_username}" + f"&password={steward_allocation_password}&from=30002501&to={mobile}&message={message}") + + +def direct_buying_code_sms(mobile, buyer, buyer_mobile, quantity, kill_place, date, code + ): + message = 'درخواست خرید مستقیم:\nخریدار:{0}-{1}\nتعداد:{2}\nمحل کشتار:{3}\nتاریخ:{4}\nکد احراز:{5}'.format( + buyer, buyer_mobile, quantity, kill_place, date, code + ) + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +# USERNAME_SMS +def export_code_sms(mobile, buyer, buyer_mobile, quantity, kill_place, date, export_country, code + , poultry_name, province_mobile): + message = f'درخواست خرید برای صادرات:' \ + f'\n' \ + f'مرغدار:{poultry_name}' \ + f'\n' \ + f'تلفن مرغدار:{mobile}' \ + f'\n' \ + f'خریدار:{buyer}' \ + f'\n' \ + f'تلفن خریدار:{buyer_mobile}' \ + f'\n' \ + f'تعداد:{quantity}' \ + f'\n' \ + f'محل کشتار:{kill_place}' \ + f'\n' \ + f'تاریخ:{date}' \ + f'\n' \ + f'کشور مقصد:{export_country}' \ + f'\n' \ + f'کد احراز:{code}' \ + f'\n' \ + f'(سامانه رصدیار)' + + check_mobile = check_mobile_number(mobile) + if check_mobile: + send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password=" + f"{PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password=" + f"{PASSWORD_SMS}&from=30002501&to={province_mobile}&message={message}") + + +def steward2_allocation_sms(mobile=None): + message = 'مورخ تعداد با وزن کیلوگرم از طرف کشتارگاه به شما تخصیص داده شد \n کد احراز:' + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + + +def send_discharge_bar(text, mobile): + user_name = USERNAME_SMS + password = PASSWORD_SMS + message = f' بار با شماره {text} با موفقیت تایید تخلیه شد.' + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = (f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username=" + f"{user_name}&password={password}&from=30002501&to={mobile}&message={message}") + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + requests.request("GET", url, headers=headers, data=payload) + + +def receive_sms_panel(): + now = datetime.now().date() + user_name = USERNAME_SMS + password = PASSWORD_SMS + + url = 'http://webservice.sahandsms.com/NewSMSWebService.asmx/RecieveSMS' + params = {f'Username': {user_name}, 'password': {password}, 'phNo': '30002501', 'startdate': {now}, + 'enddate': {now}} + + response = send_sms_request(url, params=params) + + xml_str = response.content + root = ET.fromstring(xml_str) + mobile = root.iter('RcvSmsfrom') + text = root.iter('RcvSmsText') + + for m, t in zip(mobile, text): + try: + kill_house_request = KillHouseRequest.objects.filter(trash=False, bar_code=t.text, + vet_state='pending').first() + except: + continue + if kill_house_request: + kill_house_vet = KillHouseVet.objects.filter(vet__user__mobile=m.text, + kill_house=kill_house_request.killhouse_user).first() + if kill_house_vet: + kill_house_request.vet_state = 'complate' + VetCheckRequest.objects.create( + kill_house_vet=kill_house_vet, + kill_house_request=kill_house_request, + state='complete' + ) + VetCheckAllocations.objects.create( + vet=kill_house_vet.vet, + kill_house_request=kill_house_request + ) + kill_house_request.save() + send_sms = threading.Thread(target=send_discharge_bar, args=(t.text, m.text)) + send_sms.start() + + +def condition_of_sms(request): + query = UserMessageSend.objects.filter(trash=False).select_related('user') + list1 = [] + for q in query: + if len(q.receive_code) > 3: + req = send_sms_request( + url=f"http://webservice.sahandsms.com/newsmswebservice.asmx/GetQueueMessageStatus?username={USERNAME_SMS}&password={PASSWORD_SMS}&MessageIds={q.receive_code}" + ) + root = ET.fromstring(req.content) + int_value = int(root.find('.//{http://tempuri.org/}int').text) + else: + int_value = None + dict1 = { + "role": q.user.role.name, + "user": q.user.fullname, + "mobile": q.user.mobile, + "message": q.message, + "create_date": q.create_date, + 'receive_code': int_value, + } + list1.append(dict1) + return HttpResponse(list1) + + +def send_gate_way_sms(): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).select_related('kill_house_operator__user') \ + .only('name', 'killer', 'kill_house_operator__user__user_gate_way_id', 'kill_house_operator__user__mobile') + for kill_house in kill_houses: + total_paid_wage = 0 + total_unpaid_wage = get_finance_info(kill_house)['total_price'] + # province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + # state__in=('pending', 'accepted'), + # trash=False, + # return_to_province=False, + # first_car_allocated_quantity=0, + # archive_wage=False, + # ).exclude(union_share=0, company_share=0, + # guilds_share=0).only( + # 'total_killed_weight', 'union_share', 'company_share', + # 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + # freezing_province_kill_requests = province_kill_requests.filter( + # province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + # 'company_share', + # 'guilds_share', 'total_wage_amount', + # 'total_killed_quantity') + # + # kill_house_requests = KillHouseRequest.objects.filter( + # Q(Q(killer=kill_house) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) | Q(killer=kill_house)), + # archive_wage=False, + # trash=False + # ).select_related('province_kill_request').only('accepted_real_weight', + # 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', + # 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', + # 'accepted_real_quantity', 'accepted_real_quantity') + # kill_house_requests = kill_house_requests.filter( + # Q(killer=kill_house) | Q(killhouse_user=kill_house)).select_related( + # 'province_kill_request').only( + # 'accepted_real_weight', 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', 'accepted_real_quantity') + # + # freezing_kill_house_requests = kill_house_requests.filter( + # province_kill_request__province_request__poultry_request__freezing=True).select_related( + # 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', + # 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', 'accepted_real_quantity') + # + # free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, archive_wage=False, + # trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount') + # free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount') + # free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount' + # ) + # + # + # province_kill_requests_total_wage = \ + # province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + # total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # if wage_percent > 0: + # province_kill_requests_total_wage -= province_kill_requests_total_wage * wage_percent + # freezing_province_kill_request_total_wage = \ + # freezing_province_kill_requests.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + # + # kill_house_reqest_total_wage = \ + # kill_house_requests.filter( + # province_kill_request__province_request__poultry_request__freezing=False).aggregate( + # total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + # 'total'] or 0 + # if wage_percent > 0: + # kill_house_reqest_total_wage -= kill_house_reqest_total_wage * wage_percent + # freezing_kill_house_reqest_total_wage = \ + # freezing_kill_house_requests.aggregate( + # total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + # 'total'] or 0 + # + # free_bars_live_total_wage = free_bars_live.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # + # free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # total_unpaid_wage = free_bars_carcases_total_wage + kill_house_reqest_total_wage + \ + # freezing_kill_house_reqest_total_wage + province_kill_requests_total_wage + \ + # freezing_province_kill_request_total_wage + free_bars_live_total_wage + slaughter_transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), status='completed', + trash=False).only('union_share', 'company_share', 'guilds_share', 'amount') + total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + if kill_house.killer == False: + killer = 'کشتارگاه' + else: + killer = 'کشتارکن' + kill_house_purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first() + + total_wage = total_unpaid_wage - (total_paid_wage + kill_house.off) + unpaid = "{:,}".format(int(total_wage)) + user_token = 'k' + kill_house.kill_house_operator.user.user_gate_way_id + message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ + '\n' \ + 'باسلام' \ + '\n' \ + f'مبلغ بدهی تعرفه شما {unpaid} ریال می باشدبا توجه به سقف مجاز بدهی تعیین شده، در اسرع وقت اقدام به پرداخت تعرفه خود کنید.' \ + '\n' \ + f'https://rasadyar.net/pay/{base_pos_id}/{user_token}' \ + f'\n' \ + f'(سامانه رصدیار)' + + if kill_house_purchase and kill_house_purchase.limitation_number <= total_wage and \ + kill_house_purchase.limitation == True: + continue + else: + if int(total_wage) > 0: + # if kill_house_purchase.limitation_number > total_wage: + # debt=int(kill_house_purchase.limitation_number*0.5) + # if int(total_wage >= debt): + check_mobile = check_mobile_number(kill_house.kill_house_operator.user.mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={gate_way_username}&password={gate_way_password}&from=30002501&to={kill_house.kill_house_operator.user.mobile}&message={message}") + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={gate_way_username}&password={gate_way_password}&from=30002501&to={COMPANY_NUMBER}&message={message}") + if UNION_THIRD_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={gate_way_username}&password={gate_way_password}&from=30002501&to={UNION_THIRD_NUMBER}&message={message}") + + if UNION_FOURTH_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={gate_way_username}&password={gate_way_password}&from=30002501&to={UNION_FOURTH_NUMBER}&message={message}") + + +# OUT_SMS_PASS +def send_gate_way_sms_manual(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).select_related('kill_house_operator__user') \ + .only('name', 'killer', 'kill_house_operator__user__user_gate_way_id', 'kill_house_operator__user__mobile') + for kill_house in kill_houses: + total_paid_wage = 0 + total_unpaid_wage = get_finance_info(kill_house)['total_price'] + # province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + # state__in=('pending', 'accepted'), + # trash=False, + # return_to_province=False, + # first_car_allocated_quantity=0, + # archive_wage=False, + # ).exclude(union_share=0, company_share=0, + # guilds_share=0).only( + # 'total_killed_weight', 'union_share', 'company_share', + # 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + # freezing_province_kill_requests = province_kill_requests.filter( + # province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + # 'company_share', + # 'guilds_share', 'total_wage_amount', + # 'total_killed_quantity') + # + # kill_house_requests = KillHouseRequest.objects.filter( + # Q(Q(killer=kill_house) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) | Q(killer=kill_house)), + # archive_wage=False, + # trash=False + # ).select_related('province_kill_request').only('accepted_real_weight', + # 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', + # 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', + # 'accepted_real_quantity', 'accepted_real_quantity') + # kill_house_requests = kill_house_requests.filter( + # Q(killer=kill_house) | Q(killhouse_user=kill_house)).select_related( + # 'province_kill_request').only( + # 'accepted_real_weight', 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', 'accepted_real_quantity') + # + # freezing_kill_house_requests = kill_house_requests.filter( + # province_kill_request__province_request__poultry_request__freezing=True).select_related( + # 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', + # 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', 'accepted_real_quantity') + # + # free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, archive_wage=False, + # trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount') + # free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount') + # free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount' + # ) + # + # + # province_kill_requests_total_wage = \ + # province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + # total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # if wage_percent > 0: + # province_kill_requests_total_wage -= province_kill_requests_total_wage * wage_percent + # freezing_province_kill_request_total_wage = \ + # freezing_province_kill_requests.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + # + # kill_house_reqest_total_wage = \ + # kill_house_requests.filter( + # province_kill_request__province_request__poultry_request__freezing=False).aggregate( + # total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + # 'total'] or 0 + # if wage_percent > 0: + # kill_house_reqest_total_wage -= kill_house_reqest_total_wage * wage_percent + # freezing_kill_house_reqest_total_wage = \ + # freezing_kill_house_requests.aggregate( + # total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + # 'total'] or 0 + # + # free_bars_live_total_wage = free_bars_live.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # + # free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # total_unpaid_wage = free_bars_carcases_total_wage + kill_house_reqest_total_wage + \ + # freezing_kill_house_reqest_total_wage + province_kill_requests_total_wage + \ + # freezing_province_kill_request_total_wage + free_bars_live_total_wage + slaughter_transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), status='completed', + trash=False).only('union_share', 'company_share', 'guilds_share', 'amount') + total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + if kill_house.killer == False: + killer = 'کشتارگاه' + else: + killer = 'کشتارکن' + kill_house_purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first() + + total_wage = total_unpaid_wage - (total_paid_wage + kill_house.off) + unpaid = "{:,}".format(int(total_wage)) + user_token = 'k' + kill_house.kill_house_operator.user.user_gate_way_id + message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ + '\n' \ + 'باسلام' \ + '\n' \ + f'مبلغ بدهی تعرفه شما {unpaid} ریال می باشدبا توجه به سقف مجاز بدهی تعیین شده، در اسرع وقت اقدام به پرداخت تعرفه خود کنید.' \ + '\n' \ + f'https://rasadyar.net/pay/{base_pos_id}/{user_token}' \ + f'\n' \ + f'(سامانه رصدیار)' + + if kill_house_purchase and kill_house_purchase.limitation_number <= total_wage and \ + kill_house_purchase.limitation == True: + continue + else: + if int(total_wage) > 0: + # if kill_house_purchase.limitation_number > total_wage: + # debt=int(kill_house_purchase.limitation_number*0.5) + # if int(total_wage >= debt): + check_mobile = check_mobile_number(kill_house.kill_house_operator.user.mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={gate_way_username}&password={gate_way_password}&from=30002501&to={kill_house.kill_house_operator.user.mobile}&message={message}") + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={gate_way_username}&password={gate_way_password}&from=30002501&to={COMPANY_NUMBER}&message={message}") + if UNION_THIRD_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={gate_way_username}&password={gate_way_password}&from=30002501&to={UNION_THIRD_NUMBER}&message={message}") + + if UNION_FOURTH_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={gate_way_username}&password={gate_way_password}&from=30002501&to={UNION_FOURTH_NUMBER}&message={message}") + return HttpResponse('ok') + + +def send_province_request_pdf_sms(): + mobile = [UNION_NUMBER] + date = datetime.now().date() + province_kill_requests = ProvinceKillRequest.objects.filter(kill_request__recive_date__date=date, trash=False, + state__in=('pending', 'accepted'), + return_to_province=False) + poultry = Poultry.objects.filter( + key__in=province_kill_requests.values_list('province_request__poultry_request__poultry__key', flat=True)) + vat_farm = VetFarm.objects.filter(trash=False, poultry__in=poultry).values_list('vet__user__mobile', + flat=True).distinct() + mobile.extend(vat_farm) + message = 'کاربرگرامی' \ + '\n' \ + 'جهت دریافت گزارش روزانه تخصیص مرغ استان بر روی لینک کلیک کنید:' \ + '\n' \ + f'https://{base_url_sms}.rasadyaar.ir/reports/ds' + for m in mobile: + check_mobile = check_mobile_number(m) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={m}&message={message}") + + +def send_deactivate_panel_debt_sms(): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + kill_house_purchase = KillHousePurchaseRequest.objects.filter(limitation=True, kill_house=kill_house).first() + if kill_house_purchase: + total_unpaid_wage = get_finance_info(kill_house)['total_price'] + total_paid_wage = 0 + # province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + # state__in=('pending', 'accepted'), + # trash=False, + # return_to_province=False, + # first_car_allocated_quantity=0, + # archive_wage=False, + # ).exclude(union_share=0, company_share=0, + # guilds_share=0).only( + # 'total_killed_weight', 'union_share', 'company_share', + # 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + # freezing_province_kill_requests = province_kill_requests.filter( + # province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + # 'company_share', + # 'guilds_share', 'total_wage_amount', + # 'total_killed_quantity') + # + # kill_house_requests = KillHouseRequest.objects.filter( + # Q(Q(killer=kill_house) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) | Q(killer=kill_house)), + # archive_wage=False, + # trash=False + # ).select_related('province_kill_request').only('accepted_real_weight', + # 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', + # 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', + # 'accepted_real_quantity', 'accepted_real_quantity') + # kill_house_requests = kill_house_requests.filter(Q(killer=kill_house) | Q(killhouse_user=kill_house)).select_related( + # 'province_kill_request').only( + # 'accepted_real_weight', 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', 'accepted_real_quantity') + # + # freezing_kill_house_requests = kill_house_requests.filter( + # province_kill_request__province_request__poultry_request__freezing=True).select_related( + # 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', + # 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', 'accepted_real_quantity') + # + # free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, archive_wage=False, + # trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount') + # free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount') + # free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount' + # ) + slaughter_transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).only('union_share', 'company_share', 'guilds_share', 'amount') + + # province_kill_requests_total_wage = \ + # province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + # total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # if wage_percent > 0: + # province_kill_requests_total_wage -= province_kill_requests_total_wage * wage_percent + # freezing_province_kill_request_total_wage = \ + # freezing_province_kill_requests.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + # + # kill_house_reqest_total_wage = \ + # kill_house_requests.filter( + # province_kill_request__province_request__poultry_request__freezing=False).aggregate( + # total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + # 'total'] or 0 + # if wage_percent > 0: + # kill_house_reqest_total_wage -= kill_house_reqest_total_wage * wage_percent + # freezing_kill_house_reqest_total_wage = \ + # freezing_kill_house_requests.aggregate( + # total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + # 'total'] or 0 + # + # free_bars_live_total_wage = free_bars_live.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # + # free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # total_unpaid_wage = free_bars_carcases_total_wage + kill_house_reqest_total_wage + \ + # freezing_kill_house_reqest_total_wage + province_kill_requests_total_wage + \ + # freezing_province_kill_request_total_wage + free_bars_live_total_wage + + total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + total_wage = total_unpaid_wage - (total_paid_wage + kill_house.off) + if kill_house_purchase.limitation_number <= total_wage: + unpaid = "{:,}".format(int(total_wage)) + if kill_house.killer == False: + killer = 'کشتارگاه' + else: + killer = 'کشتارکن' + amount = "{:,}".format(int(kill_house_purchase.limitation_number)) + user_token = 'k' + kill_house.kill_house_operator.user.user_gate_way_id + message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ + f'\n' \ + f'باسلام واحترام ' \ + f'\n' \ + f'باتوجه به عدم پرداخت بدهی تعرفه سامانه به مبلغ{unpaid} امکان ثبت کشتار برای شما وجود ندارد.جهت فعال سازی پنل، بدهی شما باید کمتر از {amount} ریال باشد.' \ + f'\n' \ + f'لازم به توضیح است که کشتار خارج از سامانه به عنوان کشتار و عرضه خارج از شبکه محسوب میگردد.' \ + f'\n' \ + f'لینک مشاهده و پرداخت بدهی:' \ + f'\n' \ + f'https://rasadyar.net/pay/{base_pos_id}/{user_token} \n' \ + f'\n' \ + f'(سامانه رصدیار)' + check_mobile = check_mobile_number(kill_house.kill_house_operator.user.mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={kill_house.kill_house_operator.user.mobile}&message={message}") + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={COMPANY_NUMBER}&message={message}") + if UNION_SECOND_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={UNION_SECOND_NUMBER}&message={message}") + if UNION_THIRD_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={UNION_THIRD_NUMBER}&message={message}") + if UNION_FIFTH_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={UNION_FIFTH_NUMBER}&message={message}") + if UNION_SIXTH_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={UNION_SIXTH_NUMBER}&message={message}") + + +# OUT_SMS_PASS +def send_deactivate_panel_debt_sms_manual(request): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + kill_house_purchase = KillHousePurchaseRequest.objects.filter(limitation=True, kill_house=kill_house).first() + if kill_house_purchase: + total_unpaid_wage = get_finance_info(kill_house)['total_price'] + total_paid_wage = 0 + # province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + # state__in=('pending', 'accepted'), + # trash=False, + # return_to_province=False, + # first_car_allocated_quantity=0, + # archive_wage=False, + # ).exclude(union_share=0, company_share=0, + # guilds_share=0).only( + # 'total_killed_weight', 'union_share', 'company_share', + # 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + # freezing_province_kill_requests = province_kill_requests.filter( + # province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + # 'company_share', + # 'guilds_share', 'total_wage_amount', + # 'total_killed_quantity') + # + # kill_house_requests = KillHouseRequest.objects.filter( + # Q(Q(killer=kill_house) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) | Q(killer=kill_house)), + # archive_wage=False, + # trash=False + # ).select_related('province_kill_request').only('accepted_real_weight', + # 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', + # 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', + # 'accepted_real_quantity', 'accepted_real_quantity') + # kill_house_requests = kill_house_requests.filter(Q(killer=kill_house) | Q(killhouse_user=kill_house)).select_related( + # 'province_kill_request').only( + # 'accepted_real_weight', 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', 'accepted_real_quantity') + # + # freezing_kill_house_requests = kill_house_requests.filter( + # province_kill_request__province_request__poultry_request__freezing=True).select_related( + # 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + # 'province_kill_request__wage', 'accepted_real_weight', + # 'province_kill_request__guilds_share_percent', + # 'province_kill_request__company_share_percent', 'accepted_real_quantity') + # + # free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, archive_wage=False, + # trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount') + # free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount') + # free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', 'union_share', + # 'weight_of_carcasses', + # 'company_share', + # 'guilds_share', + # 'total_wage_amount' + # ) + slaughter_transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).only('union_share', 'company_share', 'guilds_share', 'amount') + + # province_kill_requests_total_wage = \ + # province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + # total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # if wage_percent > 0: + # province_kill_requests_total_wage -= province_kill_requests_total_wage * wage_percent + # freezing_province_kill_request_total_wage = \ + # freezing_province_kill_requests.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + # + # kill_house_reqest_total_wage = \ + # kill_house_requests.filter( + # province_kill_request__province_request__poultry_request__freezing=False).aggregate( + # total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + # 'total'] or 0 + # if wage_percent > 0: + # kill_house_reqest_total_wage -= kill_house_reqest_total_wage * wage_percent + # freezing_kill_house_reqest_total_wage = \ + # freezing_kill_house_requests.aggregate( + # total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + # 'total'] or 0 + # + # free_bars_live_total_wage = free_bars_live.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # + # free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # total_unpaid_wage = free_bars_carcases_total_wage + kill_house_reqest_total_wage + \ + # freezing_kill_house_reqest_total_wage + province_kill_requests_total_wage + \ + # freezing_province_kill_request_total_wage + free_bars_live_total_wage + + total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + total_wage = total_unpaid_wage - (total_paid_wage + kill_house.off) + if kill_house_purchase.limitation_number <= total_wage: + unpaid = "{:,}".format(int(total_wage)) + if kill_house.killer == False: + killer = 'کشتارگاه' + else: + killer = 'کشتارکن' + amount = "{:,}".format(int(kill_house_purchase.limitation_number)) + user_token = 'k' + kill_house.kill_house_operator.user.user_gate_way_id + message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \ + f'\n' \ + f'باسلام واحترام ' \ + f'\n' \ + f'باتوجه به عدم پرداخت بدهی تعرفه سامانه به مبلغ{unpaid} امکان ثبت کشتار برای شما وجود ندارد.جهت فعال سازی پنل، بدهی شما باید کمتر از {amount} ریال باشد.' \ + f'\n' \ + f'لازم به توضیح است که کشتار خارج از سامانه به عنوان کشتار و عرضه خارج از شبکه محسوب میگردد.' \ + f'\n' \ + f'لینک مشاهده و پرداخت بدهی:' \ + f'\n' \ + f'https://rasadyar.net/pay/{base_pos_id}/{user_token} \n' \ + f'\n' \ + f'(سامانه رصدیار)' + check_mobile = check_mobile_number(kill_house.kill_house_operator.user.mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={kill_house.kill_house_operator.user.mobile}&message={message}") + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={COMPANY_NUMBER}&message={message}") + if UNION_SECOND_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={UNION_SECOND_NUMBER}&message={message}") + if UNION_THIRD_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={UNION_THIRD_NUMBER}&message={message}") + if UNION_FIFTH_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={UNION_FIFTH_NUMBER}&message={message}") + if UNION_SIXTH_NUMBER is not None: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={send_deactivate_username}&password={send_deactivate_password}&from=30002501&to={UNION_SIXTH_NUMBER}&message={message}") + return HttpResponse('ok') + + +# USERNAME_SMS_FINANCIAL +def province_out_request_transaction_sms(province, buyer, poultry_name, quantity, index_weight, wage, mobile, + order_code, date, amount, sale_type): + date1 = datetime.strptime(str(date), + '%Y-%m-%d').date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + date = separate.join(reversed_date) + all_wage = "{:,}".format(int(wage)) + amount = "{:,}".format(int(amount)) + sale_type_free = 'آزاد' if sale_type == False else 'دولتی' + message = f'سفارش فروش مرغ زنده استان {province}' \ + '\n' \ + f'تاریخ: {date}' \ + f'\n' \ + f'خریدار: {buyer}' \ + '\n' \ + f'مرغدار: {poultry_name}' \ + '\n' \ + f'نوع فروش:{sale_type_free}' \ + '\n' \ + f'تعداد: {quantity}' \ + '\n' \ + f'وزن تقریبی سفارش: {index_weight}' \ + f'\n' \ + f'وزن تقریبی کل سفارش: {int(index_weight * quantity)}' \ + f'\n' \ + f'قیمت مرغدار:{amount}' \ + f'\n' \ + f'مبلغ کل تعرفه:{all_wage} ریال ' \ + f'\n' \ + f'لینک مشاهده و پرداخت تعرفه:' \ + f'\n' \ + f'https://rasadyar.net/pay/{base_pos_id}/{order_code}' \ + f'\n' \ + f'سامانه رصدیار' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={mobile}&message={message}") + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={COMPANY_NUMBER}&message={message}") + + +# def daily_report_excel_and_pdf_send_from_sms(): +# message = f'سفارش فروش مرغ زنده استان {province}' \ +# '\n' \ +# f'تاریخ: {date}' \ +# f'\n' \ +# f'خریدار: {buyer}' \ +# '\n' \ +# f'مرغدار: {poultry_name}' \ +# '\n' \ +# f'تعداد: {quantity}' \ +# '\n' \ +# f'وزن تقریبی سفارش: {index_weight}' \ +# f'\n' \ +# f'مبلغ کل تعرفه:{all_wage} ریال ' \ +# f'\n' \ +# f'لینک مشاهده و پرداخت تعرفه:' \ +# f'\n' \ +# f'https://{base_url_sms}.rasadyar.net/pay/{order_code}' \ +# f'\n' \ +# f'سامانه رصدیار' +# check_mobile = check_mobile_number(mobile) +# if check_mobile: +# req = send_sms_request( +# f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={mobile}&message={message}") + +# USERNAME_SMS_FINANCIAL + +def send_sms_for_final_approval_out_province_threading(buyer_list, poultry_request_list): + # users = SystemUserProfile.objects.filter(id__in=poultry_list).select_related('province').only('mobile', 'user_gate_way_id','province__name','fullname') + if base_url_sms == 'ha': + province_name = 'همدان' + elif base_url_sms == 'ku': + province_name = 'کردستان' + elif base_url_sms == 'ma': + province_name = 'مرکزی' + else: + province_name = 'تست' + base_url = f'rasadyar.net/pay/{base_pos_id}' + if poultry_request_list is not None: + poultry_requests = PoultryRequest.objects.filter(trash=False, id__in=poultry_request_list) + for poultry_request in poultry_requests: + if poultry_request.interface_number is not None: + mobile = poultry_request.interface_number + else: + mobile = poultry_request.poultry.user.mobile + token_user = 'p' + poultry_request.poultry.user.user_gate_way_id + + message = f' مرغدار محترم {poultry_request.poultry.user.fullname} ' \ + f'\n' \ + f'سفارش خرید مرغ زنده(فروش خارج از استان) با کد سفارش {poultry_request.order_code} برای شما در سامانه رصدیار استان {province_name} ثبت گردید جهت پرداخت تعرفه از طریق لینک زیر اقدام نمایید.' \ + f'\n' \ + f'**لازم به ذکر است: در صورت عدم پرداخت تعرفه تا پایان وقت امروز(16 بعد از ظهر) سفارشات شما لغو میگردد!' \ + f'\n' \ + f'لینک مشاهده و پرداخت تعرفه :' \ + f'\n' \ + f'https://{base_url}/{token_user}{poultry_request.order_code}' \ + f'\n' \ + f'سامانه رصدیار' + + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={poultry_link_out_sale_username}&password={poultry_link_out_sale_password}&from=30002501&to={mobile}&message={message}") + + users = SystemUserProfile.objects.filter(id__in=buyer_list).select_related('province').only('mobile', + 'user_gate_way_id', + 'province__name', + 'fullname') + for user in users: + mobile = user.mobile + token_user = 'b' + user.user_gate_way_id + + message = f' خریدار محترم {user.fullname} ' \ + f'\n' \ + f'سفارش خرید مرغ زنده(فروش خارج از استان) برای شما در سامانه رصدیار استان {province_name} ثبت گردید جهت پرداخت تعرفه از طریق لینک زیر اقدام نمایید.' \ + f'\n' \ + f'**لازم به ذکر است: در صورت عدم پرداخت تعرفه تا پایان وقت امروز(16 بعد از ظهر) سفارشات شما لغو میگردد!' \ + f'\n' \ + f'لینک مشاهده و پرداخت تعرفه :' \ + f'\n' \ + f'https://{base_url}/{token_user}' \ + f'\n' \ + f'سامانه رصدیار' + + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={poultry_link_out_sale_username}&password={poultry_link_out_sale_password}&from=30002501&to={mobile}&message={message}") + + +def send_sms_for_final_approval_out_province_buyer_threading(buyer_list): + users = SystemUserProfile.objects.filter(id__in=buyer_list).select_related('province').only('mobile', + 'user_gate_way_id', + 'province__name', + 'fullname') + for user in users: + mobile = user.mobile + token_user = 'b' + user.user_gate_way_id + message = f' خریدار محترم {user.fullname} ' \ + f'\n' \ + f'سفارش خرید مرغ زنده برای شما در سامانه رصدیار استان {user.province.name} ثبت گردید جهت پرداخت تعرفه از طریق لینک زیر اقدام نمایید.' \ + f'\n' \ + f'لازم به ذکر است در صورت عدم پرداخت تعرفه تا پایان وقت امروز(۱۲ شب) سفارشات شما لغو میگردد!' \ + f'\n' \ + f'لینک مشاهده و پرداخت تعرفه :' \ + f'\n' \ + f'https://rasadyar.net/pay/{base_pos_id}/{token_user}' \ + f'\n' \ + f'سامانه رصدیار' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={mobile}&message={message}") + print({"status": req.status_code, "mobile": user.mobile}) + + +def sms_allocation_for_vet_farm(poultry_name, poultry_mobile, quantity, Index_weight, kill_house_name, kill_house_mobile + , city, send_date, mobile): + quantity_1 = "{:,}".format(int(quantity)) + message = f'تخصیص مرغ زنده (کشتار داخل استان)' \ + f'\n' \ + f'مرغدار:{poultry_name}' \ + f'\n' \ + f'تلفن:{poultry_mobile}' \ + f'\n' \ + f'تعداد:{quantity_1}' \ + f'\n' \ + f'میانگین وزن: {Index_weight}' \ + f'\n' \ + f'خریدار:{kill_house_name}' \ + f'\n' \ + f'تلفن:{kill_house_mobile}' \ + f'\n' \ + f'ادرس:{city}' \ + f'\n' \ + f'تاریخ کشتار:{send_date}' \ + f'\n' \ + f'توضیحات: قبل از صدور مجوز حمل با مرغدار هماهنگی های لازم انجام دهید و کد قرنطینه در سامانه رصدیار ثبت گردد.(اتحادیه مرغداران گوشتی استان همدان)' \ + f'\n' \ + f'(سامانه رصدیار)' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + + +def sms_chain_company_for_ver_farm(poultry_name, poultry_mobile, quantity, Index_weight, kill_house_name, + kill_house_mobile + , city, send_date, mobile, province): + quantity_1 = "{:,}".format(int(quantity)) + message = f'تخصیص مرغ زنده (کشتار زنجیره ها)' \ + f'\n' \ + f'مرغدار:{poultry_name}' \ + f'\n' \ + f'تلفن:{poultry_mobile}' \ + f'\n' \ + f'تعداد:{quantity_1}' \ + f'\n' \ + f'میانگین وزن: {Index_weight}' \ + f'\n' \ + f'خریدار:{kill_house_name}' \ + f'\n' \ + f'تلفن:{kill_house_mobile}' \ + f'\n' \ + f'ادرس:{city}' \ + f'\n' \ + f'تاریخ کشتار:{send_date}' \ + f'\n' \ + f'اتحادیه مرغداران گوشتی استان {province}' \ + f'\n' \ + f'(سامانه رصدیار)' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={mobile}&message={message}") + + +def sms_ticket(province, fullname): + message = f'یک تیکت جدید از استان {province} دارید .' \ + '\n' \ + f'کاربر: {fullname}' + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={SUPPORTER_NUMBER}&message={message}") + + +def document_discrepancy_sms(killer, name, bar_code, doc, mobile, date): + killer_user = 'کشتارکن' if killer == True else 'کشتارگاه' + date1 = datetime.strptime(str(date), + '%Y-%m-%d').date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + date = separate.join(reversed_date) + message = f' کاربر گرامی {killer_user} {name}' \ + '\n' \ + f'بار به شماره {bar_code} در تاریخ({date}) به علت وضعیت ({doc}) نیازمند ویرایش میباشد.' \ + f'\n' \ + f'جهت ویرایش اطلاعات به پنل کاربری خود مراجعه فرمایید.' \ + f'\n' \ + f'(سامانه رصدیار)' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={COMPANY_NUMBER}&message={message}") + + +def confirmation_of_the_need_for_slaughterhouse_sms_threading(name): + city_operator = CityOperator.objects.filter(trash=False).select_related('user').only('user__mobile') + mobiles = city_operator.values_list('user__mobile', flat=True).distinct() + message = f' کاربر گرامی {name}' \ + '\n' \ + 'باسلام' \ + '\n' \ + 'صرفا جهت اطلاع' \ + '\n' \ + f'درخواست نیاز شما مورد تایید قرار گرفت و امکان ثبت درخواست کشتار را دارید.' \ + f'\n' \ + f'(سامانه رصدیار)' + for mobile in mobiles: + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + + +# USERNAME_SMS +def province_kill_request_accept_sms(kill_house_name + ): + city_operator = CityOperator.objects.filter(trash=False).select_related('user').only('user__mobile') + mobiles = city_operator.values_list('user__mobile', flat=True).distinct() + message = f' کاربر گرامی {kill_house_name}' \ + '\n' \ + 'باسلام' \ + '\n' \ + 'صرفا جهت اطلاع' \ + '\n' \ + f'درخواست نیاز شما مورد تایید قرار گرفت و امکان ثبت درخواست کشتار را دارید.' \ + f'\n' \ + f'(سامانه رصدیار)' + for mobile in mobiles: + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + + +def reporting_sms(): + now = datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + date = separate.join(reversed_date) + reporst = ReportsUsers.objects.filter(active=True) + for r in reporst: + user_reporst = UserReports.objects.filter(active=True, user=r).order_by('id') + + message = f'کاربرگرامی {r.fullname}' \ + '\n' \ + 'با سلام' \ + '\n' \ + f'احتراماً لیست گزارشات کشتار و توزیع مرغ گوشتی استان مورخ {date} جهت اطلاع بحضورتان ارسال میگردد.' \ + '\n' + l = 1 + if user_reporst: + for user in user_reporst: + message = message + '\n' \ + f'{l}_{user.report.title}' \ + '\n' \ + f'https://{base_url_for_sms_report}backend.rasadyaar.ir/{user.report.end_point}/?key={r.user_token}' \ + '\n' + l += 1 + else: + message = message + '\n' \ + '(سامانه رصدیار)' + check_mobile = check_mobile_number(r.mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={r.mobile}&message={message}") + + +def car_allocation_vet_farm_sms(date, poultry, age, quantity, car, code, pelak, kill_house, mobile, amount, + free_sale_in_province): + date1 = datetime.strptime(str(date), + '%Y-%m-%d').date() + date = shamsi_date(date1) + quantity = "{:,}".format(int(quantity)) + amount = "{:,}".format(int(amount)) + sale_type = 'آزاد' if free_sale_in_province == False else 'دولتی' + message = f'اطلاعات بار' \ + f'\n' \ + f'تاریخ کشتار: {date}' \ + f'\n' \ + f'نوع کشتار:{sale_type}' \ + f'\n' \ + f'مرغدار: {poultry}' \ + f'\n' \ + f'سن: {age}' \ + f'\n' \ + f'قطعه: {quantity}' \ + f'\n' \ + f'قیمت مرغدار:{amount}' \ + f'\n' \ + f'ماشین: {car}' \ + f'\n' \ + f'کد حمل: {code}' \ + f'\n' \ + f'پلاک: {pelak}' \ + f'\n' \ + f'کشتارگاه: {kill_house}' \ + '\n' \ + '(سامانه رصدیار)' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + + +def delete_car_allocation_vet_farm_sms(date, poultry, age, quantity, car, code, pelak, kill_house, mobile, amount, + free_sale_in_province): + date1 = datetime.strptime(str(date), + '%Y-%m-%d').date() + date = shamsi_date(date1) + quantity = "{:,}".format(int(quantity)) + amount = "{:,}".format(int(amount)) + sale_type = 'آزاد' if free_sale_in_province == False else 'دولتی' + message = f'اطلاعات بار حذف شده' \ + f'\n' \ + f'تاریخ کشتار: {date}' \ + f'\n' \ + f'نوع کشتار:{sale_type}' \ + f'\n' \ + f'مرغدار: {poultry}' \ + f'\n' \ + f'سن: {age}' \ + f'\n' \ + f'قطعه: {quantity}' \ + f'\n' \ + f'قیمت مرغدار:{amount}' \ + f'\n' \ + f'ماشین: {car}' \ + f'\n' \ + f'کد حمل: {code}' \ + f'\n' \ + f'پلاک: {pelak}' \ + f'\n' \ + f'کشتارگاه: {kill_house}' \ + '\n' \ + '(سامانه رصدیار)' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + + +def cron_for_update_sms(): + update_date = LastUpdate.objects.first().update_date.date() + num_list = [SUPPORTER_NUMBER, COMPANY_NUMBER, '09201917727'] + if base_url_for_sms_report == 'ha': + base = 'همدان' + elif base_url_for_sms_report == 'ma': + base = 'مرکزی' + else: + base = 'بوشهر' + if not update_date == datetime.now().date(): + message = f'جوجه ریزی آپدیت نشده است. استان {base}' + for num in num_list: + send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}" + f"&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={num}&message={message}") + + +def ticket_answered(mobile): + message = f'تیکت شما پاسخ داده شد.' \ + '\n' \ + f'(سامانه رصدیار)' + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={mobile}&message={message}") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def send_again_sms_for_final_approval_out_province(request): + key = request.GET['key'] + poultry_request = PoultryRequest.objects.get(trash=False, key=key) + if base_url_sms == 'ha': + province_name = 'همدان' + elif base_url_sms == 'ku': + province_name = 'کردستان' + elif base_url_sms == 'ma': + province_name = 'مرکزی' + else: + + province_name = 'تست' + base_url = f'rasadyar.net/pay/{base_pos_id}' + if poultry_request.payer_type == 'poultry': + if poultry_request.interface_number is not None: + mobile = poultry_request.interface_number + else: + mobile = poultry_request.poultry.user.mobile + token_user = 'p' + poultry_request.poultry.user.user_gate_way_id + + message = f' مرغدار محترم {poultry_request.poultry.user.fullname} ' \ + f'\n' \ + f'سفارش خرید مرغ زنده(فروش خارج از استان) با کد سفارش {poultry_request.order_code} برای شما در سامانه رصدیار استان {province_name} ثبت گردید جهت پرداخت تعرفه از طریق لینک زیر اقدام نمایید.' \ + f'\n' \ + f'**لازم به ذکر است: در صورت عدم پرداخت تعرفه تا پایان وقت امروز(16 بعد از ظهر) سفارشات شما لغو میگردد!' \ + f'\n' \ + f'لینک مشاهده و پرداخت تعرفه :' \ + f'\n' \ + f'https://{base_url}/{token_user}{poultry_request.order_code}' \ + f'\n' \ + f'سامانه رصدیار' + + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={poultry_link_out_sale_username}&password={poultry_link_out_sale_password}&from=30002501&to={mobile}&message={message}") + else: + mobile = poultry_request.buyer_mobile + user = SystemUserProfile.objects.filter(mobile=mobile).first() + token_user = 'b' + user.user_gate_way_id + + message = f' خریدار محترم {user.fullname} ' \ + f'\n' \ + f'سفارش خرید مرغ زنده(فروش خارج از استان) برای شما در سامانه رصدیار استان {province_name} ثبت گردید جهت پرداخت تعرفه از طریق لینک زیر اقدام نمایید.' \ + f'\n' \ + f'**لازم به ذکر است: در صورت عدم پرداخت تعرفه تا پایان وقت امروز(16 بعد از ظهر) سفارشات شما لغو میگردد!' \ + f'\n' \ + f'لینک مشاهده و پرداخت تعرفه :' \ + f'\n' \ + f'https://{base_url}/{token_user}' \ + f'\n' \ + f'سامانه رصدیار' + + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={poultry_link_out_sale_username}&password={poultry_link_out_sale_password}&from=30002501&to={mobile}&message={message}") + return HttpResponse('ok', status=status.HTTP_200_OK) + + +def vet_farm_out_poultry_request_sms(mobile, poultry_fullname, quantity, chicken_breed, + order_code, send_date, sale_in_province, amount): + sale_type = 'آزاد' if sale_in_province == True else 'دولتی' + amount = "{:,}".format(int(amount)) + quantity = "{:,}".format(int(quantity)) + message = 'درخواست فروش به خارج از استان' \ + f'\n' \ + f'تعداد:{quantity}' \ + f'\n' \ + f'نژاد:{chicken_breed}' \ + f'\n' \ + f'تاریخ کشتار:{send_date}' \ + f'\n' \ + f'نوع فروش:{sale_type}' \ + f'\n' \ + f'مرغدار:{poultry_fullname}' \ + f'\n' \ + f'کدسفارش:{order_code}' \ + f'\n' \ + f'قیمت مرغدار:{amount}' \ + f'\n' \ + f'(سامانه رصدیار)' + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + +def send_sms_for_kill_house_not_add_to_inventory(mobile, quantity): + quantity = "{:,}".format(int(quantity)) + message = 'درخواست فروش به خارج از استان' \ + f'\n' \ + f'تعداد:{quantity}' \ + f'\n' \ + f'\n' \ + f'(سامانه رصدیار)' + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = "http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={}&password={}&from=30002501&to={}&message={}".format( + USERNAME_SMS, PASSWORD_SMS, + mobile, message) + + +def send_sms_for_bar_difference_request(mobile, quantity, poultry): + message = 'با سلام و احترام' \ + '\n' \ + f'کاربر گرامی برای شما حجم {quantity} قطعه اختلاف کشتار از مرغدار {poultry} ثبت گردیده لطفا جهت تعیین تکلیف به بخش مدیریت بار قسمت اختلاف کشتار مراجعه نمایید.باتشکر سامانه رصدیار ' + check_mobile = check_mobile_number(mobile) + if check_mobile: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={mobile}&message={message}") + + +class ManagementSendSmsViewSet(viewsets.ModelViewSet): + queryset = ManagementSendSms.objects.all().order_by('id') + serializer_class = ManagementSendSmsSerializer + permission_classes = [TokenHasReadWriteScope] + + +def send_sms_fro_kill_request_market(kill_req): + poultry_name = kill_req.poultry.unit_name + mobile = kill_req.poultry.user.mobile + kill_house_name = kill_req.kill_house.name + kill_house_mobile = kill_req.kill_house.kill_house_operator.user.mobile + message = f' مرغدار محترم {poultry_name} ' \ + f'\n' \ + f'سفارش مرغ زنده در پنل بورسی برای شما ثبت شد:' \ + f'\n' \ + f'خریدار:{kill_house_name}({kill_house_mobile})' \ + f'\n' \ + f'حجم:{to_locale_str(kill_req.kill_capacity)}(قطعه)' \ + f'\n' \ + f'وزن:{to_locale_str(int(kill_req.kill_capacity * kill_req.Index_weight))}(کیلوگرم)' \ + f'\n' \ + f'مبلغ هر کیلو:{to_locale_str(kill_req.amount)}(ریال)' \ + f'\n' \ + f'حداکثر مهلت تسویه:{shamsi_date(kill_req.payment_deadline_date)}' \ + f'\n' \ + f'کد احراز:{kill_req.market_code}' \ + f'\n' \ + f'مهلت وارد کردن کد احراز 30 دقیقه میباشد و پس از آن درخواست لغو خواهد شد و گزارش برای دستگاه نظارتی ارسال میگردد.' \ + f'\n' \ + 'سامانه رصدیار' + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={kill_req_market_username}" + f"&password={kill_req_market_password}&from=30002501&to={mobile}&message={message}") + + +def send_sms_for_poultry_market(poultry_req): + poultry_name = poultry_req.poultry.unit_name + mobile = poultry_req.poultry.user.mobile + quantity = to_locale_str(poultry_req.quantity) + amount = to_locale_str(poultry_req.amount) + send_date = shamsi_date(poultry_req.send_date) + message = 'مرغدار محترم {0}' \ + '\n' \ + 'تعداد {1} قطعه مرغ گوشتی سهمیه کشتار در تاریخ {3} با قیمت مصوب {2} (ریال) برای شما در پنل بورسی سامانه رصدیار ثبت شده است.' \ + '\n' \ + 'درصورت عدم موجوی و یا عدم امکان تحویل تعداد مذکور با تعاونی شهرستان خود یا کاربر سامانه در اتحادیه استان تماس حاصل فرمایید.' \ + '\n' \ + 'سامانه رصدیار'.format(poultry_name, quantity, amount, send_date) + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={poultry_req_market_username}" + f"&password={poultry_req_market_password}&from=30002501&to={mobile}&message={message}") + + +def send_sms_for_guild(guilds): + mobile = guilds.user.mobile + type_role = 'مباشر' if guilds.steward == True else 'صنف' + message = 'کاربر گرامی\n' \ + 'برای شما کاربری {5} توسط {6}({7}) در سامانه رصدیار ثبت شده است.\n' \ + 'نام و نام خانوادگی: {0}\n' \ + 'نام واحد صنفی: {1}\n' \ + 'شهر: {2}\n' \ + 'آدرس: {3}\n' \ + 'درصورتی که اطلاعات مورد تایید شما میباشد کد احراز را به ثبت کننده تحویل دهید.\n' \ + 'کد احراز: {4}\n' \ + 'سامانه رصدیار'.format(guilds.user.fullname, guilds.guilds_name, guilds.address.city.name, + guilds.address.address, guilds.register_code, type_role, + guilds.registerar_fullname, + guilds.registerar_mobile) + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={guild_register_username}" + f"&password={guild_register_password}&from=30002501&to={mobile}&message={message}") + + +def send_sms_for_guild_for_register(guilds): + mobile = guilds.user.mobile + type_role = 'مباشر' if guilds.steward == True else 'صنف' + message = 'کاربر گرامی\n' \ + 'برای شما کاربری {5} در سامانه رصدیار ثبت شده است.\n' \ + 'نام و نام خانوادگی: {0}\n' \ + 'نام واحد صنفی: {1}\n' \ + 'شهر: {2}\n' \ + 'آدرس: {3}\n' \ + 'درصورتی که اطلاعات مورد تایید شما میباشد برای احراز شما در سامانه لطفا کد رو تحویل ثبت کننده دهید.\n' \ + 'کد احراز: {4}\n' \ + 'سامانه رصدیار'.format(guilds.user.fullname, guilds.guilds_name, guilds.address.city.name, + guilds.address.address, guilds.register_code, type_role, + guilds.registerar_fullname if guilds.registerar_fullname else '-', + guilds.registerar_mobile if guilds.registerar_mobile else '-') + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={guild_register_username}" + f"&password={guild_register_password}&from=30002501&to={mobile}&message={message}") + + +def send_sms_for_sale_bar(bar): + mobile = bar.buyer_mobile + date = shamsi_date(bar.date) + seller = bar.kill_house.name + weight = bar.weight_of_carcasses + number = bar.registration_code + buyer = bar.buyer_name + quanarntine_code = bar.clearance_code + provicne = bar.province + city = bar.city + + message = 'اطلاعات توزیع لاشه به خارج استان\n' \ + 'فروشنده: {0} \n' \ + 'تاریخ فروش: {1}\n' \ + 'خریدار: {2}\n' \ + 'استان: {6}\n' \ + 'شهر: {7}\n' \ + 'وزن لاشه: {3} (کیلوگرم)\n' \ + 'کد قرنطینه: {4} \n' \ + 'کد احراز: {5}\n' \ + 'سامانه رصدیار'.format(seller, date, buyer, to_locale_str(weight), quanarntine_code, number, provicne, + city) + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={steward_allocation_username}" + f"&password={steward_allocation_password}&from=30002501&to={mobile}&message={message}") + + +def send_sms_for_sale_bar_for_steward(bar): + mobile = bar.buyer_mobile + date = shamsi_date(bar.date) + seller = bar.steward.guilds_name + weight = bar.weight_of_carcasses + number = bar.registration_code + buyer = bar.buyer_name + quanarntine_code = bar.clearance_code + provicne = bar.province + city = bar.city + + message = 'اطلاعات توزیع لاشه به خارج استان\n' \ + 'فروشنده: {0} \n' \ + 'تاریخ فروش: {1}\n' \ + 'خریدار: {2}\n' \ + 'استان: {6}\n' \ + 'شهر: {7}\n' \ + 'وزن لاشه: {3} (کیلوگرم)\n' \ + 'کد قرنطینه: {4} \n' \ + 'کد احراز: {5}\n' \ + 'سامانه رصدیار'.format(seller, date, buyer, to_locale_str(weight), quanarntine_code, number, provicne, + city) + + check_mobile = check_mobile_number(mobile) + if check_mobile: + u = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={steward_allocation_username}" + f"&password={steward_allocation_password}&from=30002501&to={mobile}&message={message}") + + +def send_daily_slaughter_statistics_sms(): + mobile_objects = SmsRecipient.objects.filter(is_active=True) + mobile_numbers = [obj.phone_number for obj in mobile_objects] + # mobile_numbers = [ + # '09188176737', + # '09011110919', + # '09181112717', + # '09185914818', + # '09187040838', + # '09393946626', + # '09127687317', + # '09033073493', + # ] + + target_date = datetime.now().date() + date_shamsi = shamsi_date(target_date) + + if base_url_for_sms_report == 'ha': + province_name = 'همدان' + elif base_url_for_sms_report == 'ku': + province_name = 'کردستان' + elif base_url_for_sms_report == 'ma': + province_name = 'مرکزی' + else: + province_name = 'تست' + + province_kill_requests = ProvinceKillRequest.objects.filter( + trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=target_date + ).aggregate( + total_orders=Sum('id'), + total_quantity=Sum('total_killed_quantity'), + total_live_weight=Sum('total_killed_weight'), + ) + + orders_count = ProvinceKillRequest.objects.filter( + trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=target_date + ).count() + + total_quantity = province_kill_requests['total_quantity'] or 0 + total_live_weight = province_kill_requests['total_live_weight'] or 0 + total_carcass_weight = int(total_live_weight * 0.75) + average_weight = round(total_live_weight / total_quantity, 1) if total_quantity > 0 else 0 + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date=target_date, + trash=False + ).aggregate( + total_quantity=Sum('accepted_real_quantity'), + total_weight=Sum('accepted_real_weight') + ) + + loads_count = KillHouseRequest.objects.filter( + kill_request__recive_date__date=target_date, + trash=False + ).count() + + loads_quantity = kill_house_requests['total_quantity'] or 0 + loads_weight = kill_house_requests['total_weight'] or 0 + + formatted_quantity = to_locale_str(int(total_quantity)) + formatted_live_weight = to_locale_str(int(total_live_weight)) + formatted_carcass_weight = to_locale_str(int(total_carcass_weight)) + formatted_loads_quantity = to_locale_str(int(loads_quantity)) + formatted_loads_weight = to_locale_str(int(loads_weight)) + + message = f'اطلاعات کشتار مرغ گوشتی مورخ {date_shamsi} استان {province_name}\n' \ + f'تعداد سفارشات: {orders_count}\n' \ + f'حجم سفارش کشتار: {formatted_quantity} قطعه\n' \ + f'وزن تقریبی زنده: {formatted_live_weight} کیلوگرم\n' \ + f'وزن تقریبی لاشه: {formatted_carcass_weight} کیلوگرم\n' \ + f'میانگین وزن زنده: {average_weight} کیلوگرم\n' \ + f'اطلاعات بارایجاد شده:\n' \ + f'تعداد بار: {loads_count}\n' \ + f'حجم بارها: {formatted_loads_quantity} قطعه\n' \ + f'وزن بارها(زنده): {formatted_loads_weight} کیلوگرم\n' \ + f'سامانه رصدیار' + + for mobile in mobile_numbers: + check_mobile = check_mobile_number(mobile) + if check_mobile: + try: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={sms_recipient_username}" + f"&password={sms_recipient_password}&from=30002501&to={mobile}&message={message}") + except Exception as e: + print(f"Error sending SMS to {mobile}: {str(e)}") + + +def send_daily_distribution_report_sms(): + mobile_objects = SmsRecipient.objects.filter(is_active=True) + mobile_numbers = [obj.phone_number for obj in mobile_objects] + # mobile_numbers = [ + # '09188176737', + # '09011110919', + # '09181112717', + # '09185914818', + # '09187040838', + # '09393946626', + # '09127687317', + # '09033073493', + # ] + + target_date = datetime.now().date() + date_shamsi = shamsi_date(target_date) + + if base_url_for_sms_report == 'ha': + province_name = 'همدان' + elif base_url_for_sms_report == 'ku': + province_name = 'کردستان' + elif base_url_for_sms_report == 'ma': + province_name = 'مرکزی' + else: + province_name = 'تست' + + kill_houses = KillHouse.objects.filter(out_province=False, active=True, trash=False).order_by('name') + + distribution_data = [] + total_distribution_weight = 0 + + for kill_house in kill_houses: + kill_house_allocations = StewardAllocation.objects.filter( + kill_house=kill_house, + trash=False, + receiver_state__in=('pending', 'accepted'), + to_cold_house__isnull=True, + date__date=target_date, + warehouse=True + ).aggregate( + total_weight=Sum('real_weight_of_carcasses') + ) + + allocation_weight = kill_house_allocations['total_weight'] + + if allocation_weight and allocation_weight > 0: + distribution_data.append({ + 'name': kill_house.name, + 'weight': allocation_weight + }) + total_distribution_weight += allocation_weight + + if not distribution_data: + return HttpResponse('هیچ توزیعی برای امروز ثبت نشده است', status=status.HTTP_200_OK) + + message_lines = [f'گزارش توزیع گوشت مرغ داخل استان'] + message_lines.append(f'مورخ {date_shamsi} استان {province_name}') + + for item in distribution_data: + formatted_weight = to_locale_str(int(item['weight'])) + message_lines.append("kg {1}: {0}".format(item['name'], formatted_weight)) + + message_lines.append('-------------------------') + formatted_total = to_locale_str(int(total_distribution_weight)) + message_lines.append(' مجموع کل توزیع: {} kg'.format(formatted_total)) + message_lines.append('سامانه رصدیار') + + message = '\n'.join(message_lines) + + for mobile in mobile_numbers: + check_mobile = check_mobile_number(mobile) + if check_mobile: + try: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={sms_recipient_username}" + f"&password={sms_recipient_password}&from=30002501&to={mobile}&message={message}") + except Exception as e: + print(f"Error sending SMS to {mobile}: {str(e)}") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def send_daily_distribution_report_sms_manual(request): + mobile_objects = SmsRecipient.objects.filter(is_active=True) + mobile_numbers = [obj.phone_number for obj in mobile_objects] + # mobile_numbers = [ + # '09188176737', + # '09011110919', + # '09181112717', + # '09185914818', + # '09187040838', + # '09393946626', + # '09127687317', + # '09033073493', + # ] + + target_date = datetime.now().date() + date_shamsi = shamsi_date(target_date) + + if base_url_for_sms_report == 'ha': + province_name = 'همدان' + elif base_url_for_sms_report == 'ku': + province_name = 'کردستان' + elif base_url_for_sms_report == 'ma': + province_name = 'مرکزی' + else: + province_name = 'تست' + + kill_houses = KillHouse.objects.filter(out_province=False, active=True, trash=False).order_by('name') + + distribution_data = [] + total_distribution_weight = 0 + + for kill_house in kill_houses: + kill_house_allocations = StewardAllocation.objects.filter( + kill_house=kill_house, + trash=False, + receiver_state__in=('pending', 'accepted'), + to_cold_house__isnull=True, + date__date=target_date, + warehouse=True + ).aggregate( + total_weight=Sum('real_weight_of_carcasses') + ) + + allocation_weight = kill_house_allocations['total_weight'] + + if allocation_weight and allocation_weight > 0: + distribution_data.append({ + 'name': kill_house.name, + 'weight': allocation_weight + }) + total_distribution_weight += allocation_weight + + if not distribution_data: + return HttpResponse('هیچ توزیعی برای امروز ثبت نشده است', status=status.HTTP_200_OK) + + message_lines = [f'گزارش توزیع گوشت مرغ داخل استان'] + message_lines.append(f'مورخ {date_shamsi} استان {province_name}') + + for item in distribution_data: + formatted_weight = to_locale_str(int(item['weight'])) + message_lines.append("kg {1}: {0}".format(item['name'], formatted_weight)) + + message_lines.append('-------------------------') + formatted_total = to_locale_str(int(total_distribution_weight)) + message_lines.append(' مجموع کل توزیع: {} kg'.format(formatted_total)) + message_lines.append('سامانه رصدیار') + + message = '\n'.join(message_lines) + + success_count = 0 + failed_numbers = [] + + for mobile in mobile_numbers: + check_mobile = check_mobile_number(mobile) + if check_mobile: + try: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={sms_recipient_username}" + f"&password={sms_recipient_password}&from=30002501&to={mobile}&message={message}") + success_count += 1 + except Exception as e: + failed_numbers.append(mobile) + print(f"Error sending SMS to {mobile}: {str(e)}") + else: + failed_numbers.append(mobile) + + return HttpResponse( + f'گزارش توزیع با موفقیت برای {success_count} شماره ارسال شد. تعداد کشتارگاه: {len(distribution_data)}. شماره های ناموفق: {failed_numbers if failed_numbers else "ندارد"}', + status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def send_daily_slaughter_statistics_sms_manual(request): + mobile_objects = SmsRecipient.objects.filter(is_active=True) + mobile_numbers = [obj.phone_number for obj in mobile_objects] + # mobile_numbers = [ + # '09188176737', + # '09011110919', + # '09181112717', + # '09185914818', + # '09187040838', + # '09393946626', + # '09127687317', + # '09033073493', + # ] + + target_date = datetime.now().date() + date_shamsi = shamsi_date(target_date) + + if base_url_for_sms_report == 'ha': + province_name = 'همدان' + elif base_url_for_sms_report == 'ku': + province_name = 'کردستان' + elif base_url_for_sms_report == 'ma': + province_name = 'مرکزی' + else: + province_name = 'تست' + + province_kill_requests = ProvinceKillRequest.objects.filter( + trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=target_date + ).aggregate( + total_orders=Sum('id'), + total_quantity=Sum('total_killed_quantity'), + total_live_weight=Sum('total_killed_weight'), + ) + + orders_count = ProvinceKillRequest.objects.filter( + trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=target_date + ).count() + + total_quantity = province_kill_requests['total_quantity'] or 0 + total_live_weight = province_kill_requests['total_live_weight'] or 0 + total_carcass_weight = int(total_live_weight * 0.75) + average_weight = round(total_live_weight / total_quantity, 1) if total_quantity > 0 else 0 + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date=target_date, + trash=False + ).aggregate( + total_quantity=Sum('accepted_real_quantity'), + total_weight=Sum('accepted_real_weight') + ) + + loads_count = KillHouseRequest.objects.filter( + kill_request__recive_date__date=target_date, + trash=False + ).count() + + loads_quantity = kill_house_requests['total_quantity'] or 0 + loads_weight = kill_house_requests['total_weight'] or 0 + + formatted_quantity = to_locale_str(int(total_quantity)) + formatted_live_weight = to_locale_str(int(total_live_weight)) + formatted_carcass_weight = to_locale_str(int(total_carcass_weight)) + formatted_loads_quantity = to_locale_str(int(loads_quantity)) + formatted_loads_weight = to_locale_str(int(loads_weight)) + + message = f'اطلاعات کشتار مرغ گوشتی مورخ {date_shamsi} استان {province_name}\n' \ + f'تعداد سفارشات: {orders_count}\n' \ + f'حجم سفارش کشتار: {formatted_quantity} قطعه\n' \ + f'وزن تقریبی زنده: {formatted_live_weight} کیلوگرم\n' \ + f'وزن تقریبی لاشه: {formatted_carcass_weight} کیلوگرم\n' \ + f'میانگین وزن زنده: {average_weight} کیلوگرم\n' \ + f'اطلاعات بارایجاد شده:\n' \ + f'تعداد بار: {loads_count}\n' \ + f'حجم بارها: {formatted_loads_quantity} قطعه\n' \ + f'وزن بارها(زنده): {formatted_loads_weight} کیلوگرم\n' \ + f'سامانه رصدیار' + + success_count = 0 + failed_numbers = [] + + for mobile in mobile_numbers: + check_mobile = check_mobile_number(mobile) + if check_mobile: + try: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={sms_recipient_username}" + f"&password={sms_recipient_password}&from=30002501&to={mobile}&message={message}") + success_count += 1 + except Exception as e: + failed_numbers.append(mobile) + print(f"Error sending SMS to {mobile}: {str(e)}") + else: + failed_numbers.append(mobile) + + return HttpResponse( + f'پیامک با موفقیت برای {success_count} شماره ارسال شد. شماره های ناموفق: {failed_numbers if failed_numbers else "ندارد"}', + status=status.HTTP_200_OK) + + +def test_sms_simple(): + """ + تابع ساده برای تست ارسال پیامک + """ + mobile = '09165597588' + message = 'تست ارسال پیامک از سامانه رصدیار' + + check_mobile = check_mobile_number(mobile) + if check_mobile: + try: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + print(f"SMS sent successfully. Status: {req.status_code}") + return f"پیامک با موفقیت ارسال شد. Status: {req.status_code}" + except Exception as e: + print(f"Error sending SMS: {str(e)}") + return f"خطا در ارسال پیامک: {str(e)}" + else: + return "شماره موبایل معتبر نیست" + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def test_sms_endpoint(request): + print('so') + """ + Endpoint برای تست ارسال پیامک + """ + result = test_sms_simple() + return HttpResponse(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/authentication/tests.py b/authentication/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/authentication/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/authentication/urls.py b/authentication/urls.py new file mode 100644 index 0000000..252a155 --- /dev/null +++ b/authentication/urls.py @@ -0,0 +1,235 @@ +from django.urls import path, include +import oauth2_provider.views as oauth2_views +from rest_framework import routers +from django.conf import settings + +from authentication.healthcheck import health_check +from authentication.message.views import ( + UserMessageViewSet, + SendingMessageMethodViewSet, + SendSMSViewSet +) +from authentication.register import get_driver_excel, create_driver_excel_template, upload_driver_excel, get_poultry_hatching_excel, check_poultry_hatching_excel, \ + reset_hatching_excel, enter_driver_hamedan, integration_of_hatching, check_poultry_in_db, \ + update_chicken_age_from_login, violation_archive_true, update_chicken_breed_from_excel, ye_chee_bani, \ + get_server_time, transaction_fix, internal_transaction_fix, convert_utm_to_location, change_last_digit_to_six, \ + fix_guild_steward, check_product, kill_house_requests_product_warehousing, \ + kill_house_free_buying_product_warehousing, kill_house_allocations_product_warehousing, \ + kill_house_free_sale_product_warehousing, kill_house_cold_house_allocations_product_warehousing, \ + check_kill_house_request_calculate, check_kill_house_free_bar_information_calculate, \ + check_kill_house_free_sale_bar_information_calculate, check_steward_allocations_calculate, temporary_trash_true, \ + archive_hatching_temporary_true, PoultryRequest_temporary_trash_true, CityOperatorCheckRequest_temporary_trash_true, \ + KillRequest_temporary_trash_true, ProvinceKillRequest_temporary_trash_true, KillHouseRequest_temporary_trash_true, \ + KillHouseAssignmentInformation_temporary_trash_true, KillHouseFreeBarInformation_temporary_trash_true, \ + StewardAllocation_temporary_trash_true, ColdHouseAllocations_temporary_trash_true, \ + StewardFreeBarInformation_temporary_trash_true, StewardFreeSaleBarInformation_temporary_trash_true, \ + InternalTransaction_temporary_trash_true, ExternalTransaction_temporary_trash_true, \ + ChainAllocation_temporary_trash_true, duplicate_order_code, fix_duplicate_order_code, fix_duplicate_order_code_new, \ + add_vet_farm_to_poultry_request, create_city_guild, add_killing_age_to_poultry_request, add_poultry_prediction, \ + fix_out_quantity_hatching, live_chicken_transportation, heards_meat_flow, chat_bot_info, detail_heards_meat_flow, \ + breed, fix_kill_req_njsndb, add_to_warehouse_manual, add_free_bar_to_warehouse_manual, \ + warning_free_bar_to_warehouse_manual, warning_to_warehouse_manual, warning_province_kill_request_without_bar_manual, \ + update_chicken_age_from_login_manual, add_free_bar_to_warehouse_automatic_type_manual, KillHouseStressTestView, \ + fix_warehouse_input_province_bars_for_limitation, fix_warehouse_out_buying_bars_for_limitation, \ + fix_warehouse_in_province_allocations_for_limitation, fix_warehouse_free_sale_for_limitation, \ + fix_warehouse_cold_house_for_limitation, fix_warehouse_segmentation_for_limitation, fix_warehouse_for_limitation, \ + fix_time_error, fix_steward_free_buying_product_warehousing_for_limitation, \ + fix_guild_steward_product_segmentation_warehousing_for_limitation, \ + fix_guild_steward_free_sale_warehousing_for_limitation, \ + fix_steward_guild_steward_allocations_warehousing_for_limitation, \ + fix_steward_guild_pos_allocations_warehousing_for_limitation, fix_steward_warehouse_for_limitation, fix_pos_owner, \ + fix_guild_steward_archive_warehousing, fix_guild_steward_pos_allocation_weight_for_product, \ + fix_kill_house_archive_warehousing +from authentication.sms_management import user_sms, kill_house_vet_check_receive_sms, \ + send_again_sms_for_final_approval_out_province, send_gate_way_sms_manual, send_deactivate_panel_debt_sms_manual, \ + ManagementSendSmsViewSet, test_sms_endpoint +from authentication.views import ( + login, + register, + new_login, + new_register, + new_send_otp, + forget_password, + UserProfileViewSet, + check_otp, + change_password, + AddressViewSet, + BankCardViewSet, + UserProfileSearchViewSet, + CheckChickenQuntityViewSet, + ProvinceViewSet, + CityViewSet, + CityUnitViewSet, + SystemAddressViewSet, + SystemUserProfileViewSet, ShowSystemUserProfileViewSet, ForceDiagramViewSet, CityWithOutProvinceKeyViewSet, + ProvinceChangeBankCardViewSet, TotalSystemUserProfileStatisticsDashboardViewSet, + TotalPricingStatisticsDashboardViewSet, ExternalTransactionViewSet, pos_login, show_transaction_info, + TokenVerification, new_pos_login, CityForProducctPricingViewSet, register_tenant, + SystemUserProfileّForFactorProfileViewSet, CitysViewSet +) + +router = routers.DefaultRouter() +router.register(r'user-profile', UserProfileViewSet, basename='user-profile') +router.register(r'transactions', ExternalTransactionViewSet, basename='transactions') +router.register(r'system_user_profile', SystemUserProfileViewSet, basename='system-user-profile') +router.register(r'system_user_profile-for-factor', SystemUserProfileّForFactorProfileViewSet, basename='system_user_profile-for-factor') +router.register(r'user-profile_search', UserProfileSearchViewSet, basename='user-profile_search') +router.register(r'user-bank_card', BankCardViewSet, basename='user-bank_card') +router.register(r'province_change_bank_card', ProvinceChangeBankCardViewSet, basename='province_change_bank_card') +router.register(r'address', AddressViewSet, basename='address') +router.register(r'province', ProvinceViewSet, basename='province') +router.register(r'city', CityViewSet, basename='city') +router.register(r'city-product-pricing', CityForProducctPricingViewSet, basename='city-product-pricing') +router.register(r'province_cities', CityWithOutProvinceKeyViewSet, basename='province_cities') +router.register(r'cities', CitysViewSet, basename='cities') +router.register(r'city-unit', CityUnitViewSet, basename='city-unit') +router.register(r'system_address', SystemAddressViewSet, basename='system_address') +router.register(r'user_message', UserMessageViewSet, basename="user_message") +router.register(r'show_users', ShowSystemUserProfileViewSet, basename='show_users') +router.register(r'diageram', ForceDiagramViewSet, basename='diageram') +router.register(r'total_system_user_profile_dashboard', TotalSystemUserProfileStatisticsDashboardViewSet, + basename='total_system_user_profile_dashboard') +router.register(r'total_pricing_dashboard', TotalPricingStatisticsDashboardViewSet, + basename='total_pricing_dashboard') +router.register(r'sending_message_method', SendingMessageMethodViewSet, basename="sending_message_method") +router.register(r'send_sms', SendSMSViewSet, basename="send_sms") +router.register(r'quantity', CheckChickenQuntityViewSet, basename="quantity") +router.register(r'management-send-sms', ManagementSendSmsViewSet, basename="management-send-sms") + +oauth2_endpoint_views = [ + path('login/', new_login, name="login"), + path('pos-login/', pos_login, name="pos-login"), + path('new-pos-login/', new_pos_login, name="new-pos-login"), + path('newregister/', new_register, name="new_register"), + path('new_send/', new_send_otp, name='new_send'), + path('send/', new_send_otp, name="send_otp"), + path('check/', check_otp, name="check_otp"), + # path('login/', login, name="login"), + path('register/', register, name="register"), + path('forget/', forget_password, name="forget_password"), + path('change_password/', change_password, name="change_password"), + path('token/', oauth2_views.TokenView.as_view(), name="token"), + +] + +if settings.DEBUG: + # OAuth2 Application Management endpoints + oauth2_endpoint_views += [ + path('applications/', oauth2_views.ApplicationList.as_view(), name="list"), + path('applications/register/', oauth2_views.ApplicationRegistration.as_view(), name="register"), + path('applications//', oauth2_views.ApplicationDetail.as_view(), name="detail"), + path('applications//delete/', oauth2_views.ApplicationDelete.as_view(), name="delete"), + path('applications//update/', oauth2_views.ApplicationUpdate.as_view(), name="update"), + ] + + # OAuth2 Token Management endpoints + oauth2_endpoint_views += [ + path('authorized-tokens/', oauth2_views.AuthorizedTokensListView.as_view(), name="authorized-token-list"), + path('authorized-tokens//delete/', oauth2_views.AuthorizedTokenDeleteView.as_view(), + name="authorized-token-delete"), + ] + +urlpatterns = [ + path('', include(router.urls)), + path('api/', include((oauth2_endpoint_views, 'oauth2_provider.urls'), namespace="oauth2_provider")), + # path('sms/', user_sms_wrapper), + path('sms/', user_sms), + path("health/", health_check), + path('driver_excel/', get_driver_excel), + path('driver_excel_template/', create_driver_excel_template), + path('upload_driver_excel/', upload_driver_excel), + path('hatching_excel/', get_poultry_hatching_excel), + path('check_hatching_excel/', check_poultry_hatching_excel), + path('vet_check_sms/', kill_house_vet_check_receive_sms), + path('reset_hatching_excel/', reset_hatching_excel), + path('enter_driver_hamedan/', enter_driver_hamedan), + path('integration_of_hatching/', integration_of_hatching), + path('check_poultry_in_db/', check_poultry_in_db), + path('show_transaction_info/', show_transaction_info), + path('update_chicken_age_from_login/', update_chicken_age_from_login), + path('violation_archive_true/', violation_archive_true), + path('update_chicken_breed_from_excel/', update_chicken_breed_from_excel), + path('token-verification/', TokenVerification), + path('ye_chee_bani/', ye_chee_bani), + path('get_server_time/', get_server_time), + path('transaction_fix/', transaction_fix), + path('internal_transaction_fix/', internal_transaction_fix), + path('convert_utm_to_location/', convert_utm_to_location), + path('change_last_digit_to_six/', change_last_digit_to_six), + path('send_again_sms_for_final_approval_out_province/', send_again_sms_for_final_approval_out_province), + path('fix_guild_steward/', fix_guild_steward), + path('check_product/', check_product), + path('register_tenant/', register_tenant), + path('kill_house_requests_product_warehousing/', kill_house_requests_product_warehousing), + path('kill_house_free_buying_product_warehousing/', kill_house_free_buying_product_warehousing), + path('kill_house_allocations_product_warehousing/', kill_house_allocations_product_warehousing), + path('kill_house_free_sale_product_warehousing/', kill_house_free_sale_product_warehousing), + path('kill_house_cold_house_allocations_product_warehousing/', + kill_house_cold_house_allocations_product_warehousing), + path('check_kill_house_request_calculate/', check_kill_house_request_calculate), + path('check_kill_house_free_bar_information_calculate/', check_kill_house_free_bar_information_calculate), + path('check_kill_house_free_sale_bar_information_calculate/', check_kill_house_free_sale_bar_information_calculate), + path('check_steward_allocations_calculate/', check_steward_allocations_calculate), + path('temporary_trash_true/', temporary_trash_true), + path('archive_hatching_temporary_true/', archive_hatching_temporary_true), + path('PoultryRequest_temporary_trash_true/', PoultryRequest_temporary_trash_true), + path('CityOperatorCheckRequest_temporary_trash_true/', CityOperatorCheckRequest_temporary_trash_true), + path('KillRequest_temporary_trash_true/', KillRequest_temporary_trash_true), + path('ProvinceKillRequest_temporary_trash_true/', ProvinceKillRequest_temporary_trash_true), + path('KillHouseRequest_temporary_trash_true/', KillHouseRequest_temporary_trash_true), + path('KillHouseAssignmentInformation_temporary_trash_true/', KillHouseAssignmentInformation_temporary_trash_true), + path('KillHouseFreeBarInformation_temporary_trash_true/', KillHouseFreeBarInformation_temporary_trash_true), + path('StewardAllocation_temporary_trash_true/', StewardAllocation_temporary_trash_true), + path('ColdHouseAllocations_temporary_trash_true/', ColdHouseAllocations_temporary_trash_true), + path('StewardFreeBarInformation_temporary_trash_true/', StewardFreeBarInformation_temporary_trash_true), + path('StewardFreeSaleBarInformation_temporary_trash_true/', StewardFreeSaleBarInformation_temporary_trash_true), + path('InternalTransaction_temporary_trash_true/', InternalTransaction_temporary_trash_true), + path('ExternalTransaction_temporary_trash_true/', ExternalTransaction_temporary_trash_true), + path('ChainAllocation_temporary_trash_true/', ChainAllocation_temporary_trash_true), + path('duplicate_order_code/', duplicate_order_code), + path('fix_duplicate_order_code/', fix_duplicate_order_code), + path('fix_duplicate_order_code_new/', fix_duplicate_order_code_new), + path('add_vet_farm_to_poultry_request/', add_vet_farm_to_poultry_request), + path('create_city_guild/', create_city_guild), + path('add_killing_age_to_poultry_request/', add_killing_age_to_poultry_request), + path('add_poultry_prediction/', add_poultry_prediction), + path('fix_out_quantity_hatching/', fix_out_quantity_hatching), + path('live_chicken_transportation/', live_chicken_transportation), + path('heards_meat_flow/', heards_meat_flow), + path('detail_heards_meat_flow/', detail_heards_meat_flow), + path('breed/', breed), + path('chat_bot_info/', chat_bot_info), + path('fix_kill_req_njsndb/', fix_kill_req_njsndb), + path('add_to_warehouse_manual/', add_to_warehouse_manual), + path('add_free_bar_to_warehouse_manual/', add_free_bar_to_warehouse_manual), + path('send_gate_way_sms_manual/', send_gate_way_sms_manual), + path('fix_warehouse_for_limitation/', fix_warehouse_for_limitation), + path('fix_warehouse_input_province_bars_for_limitation/', fix_warehouse_input_province_bars_for_limitation), + path('fix_warehouse_out_buying_bars_for_limitation/', fix_warehouse_out_buying_bars_for_limitation), + path('fix_warehouse_in_province_allocations_for_limitation/', fix_warehouse_in_province_allocations_for_limitation), + path('fix_warehouse_free_sale_for_limitation/', fix_warehouse_free_sale_for_limitation), + path('fix_warehouse_cold_house_for_limitation/', fix_warehouse_cold_house_for_limitation), + path('fix_warehouse_segmentation_for_limitation/', fix_warehouse_segmentation_for_limitation), + path('fix_kill_house_archive_warehousing/', fix_kill_house_archive_warehousing), + path('fix_time_error/', fix_time_error), + path('fix_pos_owner/', fix_pos_owner), + path('send_deactivate_panel_debt_sms_manual/', send_deactivate_panel_debt_sms_manual), + path('test_sms/', test_sms_endpoint), + path('warning_free_bar_to_warehouse_manual/', warning_free_bar_to_warehouse_manual), + path('warning_to_warehouse_manual/', warning_to_warehouse_manual), + path('warning_province_kill_request_without_bar_manual/', warning_province_kill_request_without_bar_manual), + path('update_chicken_age_from_login_manual/', update_chicken_age_from_login_manual), + path('add_free_bar_to_warehouse_automatic_type_manual/', add_free_bar_to_warehouse_automatic_type_manual), + + path('fix_steward_free_buying_product_warehousing_for_limitation/', fix_steward_free_buying_product_warehousing_for_limitation), + path('fix_steward_guild_steward_allocations_warehousing_for_limitation/', fix_steward_guild_steward_allocations_warehousing_for_limitation), + path('fix_guild_steward_free_sale_warehousing_for_limitation/', fix_guild_steward_free_sale_warehousing_for_limitation), + path('fix_guild_steward_product_segmentation_warehousing_for_limitation/', fix_guild_steward_product_segmentation_warehousing_for_limitation), + path('fix_steward_guild_pos_allocations_warehousing_for_limitation/', fix_steward_guild_pos_allocations_warehousing_for_limitation), + path('fix_steward_warehouse_for_limitation/', fix_steward_warehouse_for_limitation), + path('fix_guild_steward_archive_warehousing/', fix_guild_steward_archive_warehousing), + path('fix_guild_steward_pos_allocation_weight_for_product/', fix_guild_steward_pos_allocation_weight_for_product), + + path("killhouse-stress/", KillHouseStressTestView.as_view(), name="killhouse-stress"), + +] diff --git a/authentication/views.py b/authentication/views.py new file mode 100644 index 0000000..dd91517 --- /dev/null +++ b/authentication/views.py @@ -0,0 +1,3163 @@ +import datetime +import threading +from datetime import timedelta +from django.shortcuts import get_object_or_404, redirect + +import jdatetime +from django.http import HttpResponse +from rest_framework import viewsets +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, + OAuth2Authentication, +) +from oauth2_provider.models import AccessToken +from rest_framework.pagination import PageNumberPagination + +from general_urls import CLIENT_ID, CLIENT_SECRET, BASE_URL +from panel.ReportingPanel.filterset import ProfileFilterSet +from panel.admin import PROJECT_API_KEY +from panel.filterset import WagePaymentFilterSet +from panel.models import WareHouseFactor, InspectorOperator, KillHouseVet, Itransaction, Wallet, KillHousePercentage, \ + Jahad, Admin, VetSupervisor, ProvincialGovernment, CityJahad, ProvinceAllowKillHouseChooseStewardGuilds, \ + ProvinceAllowPoultryChooseKillHouse, Pricing, Guilds, POSMachine, PosVersion, PosItem, POSId, UserLoginLog, \ + ProvinceAllowKillHouseDirectBuying +from ticket.helper import send_image_to_server +from .filterset import UserProfileFilterSet, SystemUserProfileFilteSet, ExternalTransactionFilterSet +from .helper.refresh import refresh +from .sahandsms.sms import ( + send_sms, + send_otp_code, + send_password +) +from .serializer.serializer import ( + AddressSerializer, + UserProfileSerializer, + BankCardSerializer, + SystemUserProfileSerializer, SystemUserProfileForAllUsersSerializer, SystemUserProfileBaseInfoSerializer, + ExternalTransactionSerializer, + # SystemUserProfileInfoSerializer +) +from .serializers import SystemAddressSerializer, CityForProductPricingSerializer +from panel.CityOperator.serializers import CityOperatorSerializer, CityOperatorForAllUserSerializer +from panel.ProvinceOperator.serializers import ProvinceOperatorSerializer, InspectorOperatorSerializer, JahadSerializer, \ + AdminSerializer, VetSupervisorSerializer, ProvincialGovernmentSerializer, ProvinceOperatorForAllUserSerializer, \ + InspectorOperatorForAllUserSerializer, JahadForAllUserSerializer, AdminForAllUserSerializer, \ + VetSupervisorForAllUserSerializer, ProvincialGovernmentForAllUserSerializer, CityJahadForAllUserSerializer, \ + PricingSerializer, GeneralGuildsSerializer +from panel.poultry.serializers import ( + PoultrySerializer, + PoultryTenantSerializer, PoultryForAllUserSerializer +) +from panel.KillHouse.serializers import ( + KillHouseOperatorSerializer, + VetSerializer, KillHouseSerializer, KillHouseVetSerializer, KillHouseDriverSerializer, + KillHouseOperatorForAllUserSerializer, VetForAllUserSerializer, KillHouseDriverForAllUserSerializer, + KillHouseVetForAllUserSerializer, KillHouseForAllUserSerializer +) +from rest_framework.permissions import ( + AllowAny, + IsAuthenticated, + DjangoModelPermissions +) +from rest_framework.authentication import TokenAuthentication +from rest_framework.decorators import permission_classes, api_view +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.decorators import authentication_classes +from rest_framework.authentication import get_authorization_header +from django.core.cache.backends.base import DEFAULT_TIMEOUT +from authentication.models import CityUnit, ExternalTransaction +from django.contrib.auth.hashers import make_password +from django.contrib.auth.views import LoginView +from panel.helper import ( + create_except_profile, + update_except_profile, + remove_null_fields, operator_update_except_profile +) +from authentication.models import ( + UserProfile, + Address, + BankCard, + SystemUserProfile, + SystemAddress, + City, + Province +) +from panel.models import ( + Poultry, + ProvinceOperator, + CityOperator, + KillHouseOperator, + Vet, + KillHouseDriver, + KillHouseADDCAR, + PoultryTenant, + KillHouse, + +) +from rest_framework.response import Response +from django.contrib.auth.models import User, Group +from django.core.cache import cache +from django.conf import settings +from rest_framework import status +from oauth2_provider.models import AccessToken +from .helper.image_services import ( + upload_image, + upload_listed_image +) +from django.http.response import JsonResponse, HttpResponseRedirect +import requests +import json +import random +import uuid +from django.contrib.auth.views import LoginView +from django.contrib.auth.hashers import make_password +import cryptocode +import string +import random +import os +from django_filters.rest_framework import DjangoFilterBackend +from django.http import QueryDict +import xlsxwriter +from io import StringIO, BytesIO + +# آدرس پایه برای ارسال در خواست ثبت نام به سیستم پایه شرکت آرتا +from .serializers import SystemAddressSerializer, CityUnitSerializer, CitySerializer, ProvinceSerializer + +ARTA_URL_REGISTER = "https://userbackend.rasadyar.com/api/register/" +# آدرس پایه برای ارسال در خواست ورود به سیستم پایه شرکت آرتا +ARTA_URL_LOGIN = "https://userbackend.rasadyar.com/api/login/" +# آدرس پایه برای سیستم ورود و ثبت نام بر اساس توکن +ARTA_URL_CHANGE_MOBILE_NUMBER = "https://userbackend.rasadyar.com/change_mobile_number/" +CACHE_TTL = getattr(settings, "CACHE_TTL", DEFAULT_TIMEOUT) +# آدرس پایه برای ذخیره تصویر کاربر در استوریج آروان +ARVAN_User_Image_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' +# ARVAN_User_Image_URL = 'http://user-image-gallery.s3.ir-thr-at1.arvanstorage.ir/' + +ARTA_URL_SEND_OTP = "https://userbackend.rasadyar.com/api/send_otp/" +ARTA_URL_CHECK_OTP = "https://userbackend.rasadyar.com/api/check_otp/" +ARTA_URL_CHANGE_PASSWORD = "https://userbackend.rasadyar.com/api/change_password/" + + +class CustomPagination(PageNumberPagination): + page_size = 10 + + +class ExternalTransactionViewSet(viewsets.ModelViewSet): + queryset = ExternalTransaction.objects.all() + serializer_class = ExternalTransactionSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = ExternalTransactionFilterSet + filterset_fields = [ + 'saleReferenceId', + 'refId', + 'orderId', + 'cardHolderPan', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + transactions_list = [] + if request.GET['role'] == 'KillHouse': + + if request.GET['state'] == 'failed': + if 'type' in request.GET: + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + kill_house_user=user, + status='failed', + transaction_type='wallet', + + trash=False).order_by('id') + else: + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + kill_house_user=user, + status='failed', + transaction_type='wage-gateway', + + trash=False).order_by('id') + else: + if 'type' in request.GET: + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + kill_house_user=user, + status='completed', + transaction_type='wallet', + trash=False).order_by('id') + else: + + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + kill_house_user=user, + status='completed', + transaction_type='wage-gateway', + trash=False).order_by('id') + else: + + if request.GET['state'] == 'failed': + if 'type' in request.GET: + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='failed', + transaction_type='wallet', + trash=False).order_by('id') + else: + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='failed', + transaction_type='wage-gateway', + trash=False).order_by('id') + else: + if 'type' in request.GET: + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + transaction_type='wallet', + trash=False).order_by('id') + else: + + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + transaction_type='wage-gateway', + trash=False).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = ExternalTransactionSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = ExternalTransactionSerializer(transactions, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به استان +class ProvinceViewSet(viewsets.ModelViewSet): + queryset = Province.objects.all() + serializer_class = ProvinceSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + province = Province.objects.filter(key=user.province.key) + serializer = CitySerializer(province, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به شهرستان +class CityViewSet(viewsets.ModelViewSet): + queryset = City.objects.all() + serializer_class = CitySerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + refresh(request.user.id) + city = City.objects.filter( + province=Province.objects.get(key=request.GET['province_key']) + # province=Province.objects.get(key='1e364f53-f873-4af9-9e93-7e4816e889ae') + ) + serializer = CitySerializer(city, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityForProducctPricingViewSet(viewsets.ModelViewSet): + queryset = City.objects.all() + serializer_class = CityForProductPricingSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + city = City.objects.filter(trash=False, province=user.province).order_by('id') + serializer = self.serializer_class(city, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + city = City.objects.get(trash=False, key=request.data['city_key']) + request.data.pop('city_key') + serializer = self.serializer_class(city) + serializer.update(instance=city, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityWithOutProvinceKeyViewSet(viewsets.ModelViewSet): + queryset = City.objects.all() + serializer_class = CitySerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + city = City.objects.filter( + province=Province.objects.get(key=user.province.key) + ) + serializer = CitySerializer(city, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CitysViewSet(viewsets.ModelViewSet): + queryset = City.objects.all() + serializer_class = CitySerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + city = City.objects.filter( + province=Province.objects.get(key=user.province.key) + ).exclude(name='فاقد شهرستان') + serializer = CitySerializer(city, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به زیربخش شهرستان +class CityUnitViewSet(viewsets.ModelViewSet): + queryset = CityUnit.objects.all() + serializer_class = CityUnitSerializer + permission_classes = [TokenHasReadWriteScope] + + +# ویوست مربوط به آدرس +class SystemAddressViewSet(viewsets.ModelViewSet): + queryset = SystemAddress.objects.all() + serializer_class = SystemAddressSerializer + permission_classes = [TokenHasReadWriteScope] + + +# ویوست مربوط به جستجو اطلاعات کاربر یا کاربران +class UserProfileSearchViewSet(viewsets.ModelViewSet): + queryset = UserProfile.objects.all() + serializer_class = UserProfileSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = UserProfileFilterSet + filterset_fields = [ + 'fullname', + 'mobile', + 'first_name', + 'last_name', + 'breeding_unique_id', + 'address__city', + 'address__province', + 'role__name', + ] + + def list(self, request, *args, **kwargs): + if 'type' in request.GET: + if request.GET['type'] == 'filter': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=self.queryset + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=self.queryset) + filtered_user = ps.filter() + serializer = self.serializer_class(filtered_user, many=True) + return Response(serializer.data) + return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN) + else: + queryset = self.queryset.all() + serializer = UserProfileSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به پروفایل کاربری که شامل ساخت و ویرایش و حذف +class UserProfileViewSet(viewsets.ModelViewSet): + queryset = UserProfile.objects.all() + serializer_class = UserProfileSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ثبت پروفایل کاربر + def create(self, request, *args, **kwargs): + role = Group.objects.get(name__exact=request.data['role']) + request.data.pop('role') + city = request.data['city'] + province = request.data['province'] + address = request.data['address'] + try: + image = request.data['image'] + request.data.pop('image') + except: + image = "" + + request.data.pop('city') + request.data.pop('province') + request.data.pop('address') + mobile = request.data['mobile'] + if UserProfile.objects.filter(mobile=mobile): + return Response('user already exist') + index = UserProfile.objects.all().last().base_order + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + user_profile = serializer.create(validated_data=request.data) + user_profile.image = send_image_to_server(image) + password = str(random.randint(10000, 99000)) + + user = User( + first_name=user_profile.fullname, + username=user_profile.mobile, + password=cryptocode.encrypt(password, password) + ) + user.save() + user_address = Address( + city=city, + province=province, + address=address, + ) + user_address.save() + user_profile.user = user + user_profile.role = role + user_profile.address = user_address + user_profile.base_order = index + 1 + user_profile.fullname = user_profile.first_name + " " + user_profile.last_name + user_profile.save() + send_password(user_profile.mobile, password) + + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع مربوط به نمایش اطلاعات پروفایل کاربر + def list(self, request, *args, **kwargs): + if 'type' in request.GET: + if request.GET['type'] == 'operator': + queryset = self.queryset.filter(role__name__exact="Poultry") + serializer = UserProfileSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + if request.GET['type'] == 'user': + queryset = UserProfile.objects.all().filter(user__exact=request.user) + serializer = UserProfileSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response({'Msg': 'Enter type parameter in url'}) + + # تابع مربوط به ویرایش اطلاعات پروفایل کاربر + def update(self, request, pk=None, *args, **kwargs): + try: + if request.data['image'] == "": + user_image = None + + else: + user_image = request.data['image'] + request.data.pop('image') + + except: + user_image = None + + try: + role = request.data['role'] + request.data.pop('role') + + except: + role = None + + try: + city = request.data['city'] + request.data.pop('city') + + except: + city = None + + try: + province = request.data['province'] + request.data.pop('province') + + except: + province = None + + try: + address = request.data['address'] + request.data.pop('address') + + except: + address = None + + queryset = UserProfile.objects.get(key=request.data["key"]) + user_address = Address.objects.get(id=queryset.address.id) + request.data.pop('key') + if user_image: + queryset.image = send_image_to_server(user_image) + if role: + queryset.role = Group.objects.get(name__exact=role) + if city: + user_address.city = city + if province: + user_address.province = province + if address: + user_address.address = address + user_address.save() + queryset.save() + serializer = self.serializer_class(queryset) + serializer.update(instance=queryset, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع مربوط به حذف اطلاعات پروفایل کاربر + def destroy(self, request, pk=None, *args, **kwargs): + user_profile = UserProfile.objects.get(key__exact=request.GET["key"]) + user = User.objects.get(id=user_profile.user.id) + address = Address.objects.get(id=user_profile.address.id) + user_profile.delete() + user.delete() + address.delete() + return Response('user deleted', status=status.HTTP_200_OK) + + +class ForceDiagramViewSet(viewsets.ModelViewSet): + queryset = SystemUserProfile.objects.all() + serializer_class = SystemUserProfileSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + + if 'role' in request.GET: + role = request.GET['role'].split(',') + new_persons = [] + + persons = SystemUserProfile.objects.filter(role__name__in=role, province=user.province).order_by('id') + if persons.count() > 0: + for person in persons: + if person in new_persons: + pass + else: + new_persons.append(person) + serializer = SystemUserProfileSerializer(new_persons, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + if 'all' in request.GET: + poultry = Poultry.objects.filter(user__province=user.province) + city_operator = CityOperator.objects.filter(user__province=user.province) + province_operator = ProvinceOperator.objects.filter(user__province=user.province, + user__role__name='ProvinceOperator') + financial_operator = Poultry.objects.filter(user__province=user.province, + user__role__name='ProvinceFinancial') + inspector_operator = InspectorOperator.objects.filter(user__province=user.province) + killhouse_operator = KillHouseOperator.objects.filter(user__province=user.province) + driver = KillHouseDriver.objects.filter(user__province=user.province) + vet = Vet.objects.filter(user__province=user.province) + killhouse_vet = KillHouseVet.objects.filter(vet__user__province=user.province) + diageram_dict = { + "poultry": poultry.count(), + "city_operator": city_operator.count(), + "province_operator": province_operator.count(), + "financial_operator": financial_operator.count(), + "inspector_operator": inspector_operator.count(), + "killhouse_operator": killhouse_operator.count(), + "driver": driver.count(), + "vet": vet.count(), + "killhouse_vet": killhouse_vet.count(), + } + + return Response(diageram_dict, status=status.HTTP_200_OK) + elif 'Poultry' in request.GET: + poultry = Poultry.objects.filter(address__province=user.province) + serializer = PoultrySerializer(poultry, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif 'CityOperator' in request.GET: + cityoperator = CityOperator.objects.filter(address__province=user.province) + serializer = CityOperatorSerializer(cityoperator, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif 'ProvinceOperator' in request.GET: + operator = SystemUserProfile.objects.filter(role__name='ProvinceOperator', + province=user.province) + provinceoperator = ProvinceOperator.objects.filter(user=operator.last()) + serializer = ProvinceOperatorSerializer(provinceoperator, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'ProvinceFinancial' in request.GET: + operator = SystemUserProfile.objects.filter(role__name='ProvinceFinancial', + province=user.province) + provincefinancial = ProvinceOperator.objects.filter(user=operator.last()) + + serializer = ProvinceOperatorSerializer(provincefinancial, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif 'ProvinceInspector' in request.GET: + provinceinspector = InspectorOperator.objects.filter(address__province=user.province) + serializer = InspectorOperatorSerializer(provinceinspector, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif 'KillHouse' in request.GET: + killhouse = KillHouse.objects.filter(system_address__province=user.province) + serializer = KillHouseSerializer(killhouse, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif 'KillHouseVet' in request.GET: + killhousevet = KillHouseVet.objects.filter(kill_house__system_address__province=user.province) + serializer = KillHouseVetSerializer(killhousevet, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + # elif 'VetFarm' in request.GET: + # + # vetfarm = SystemUserProfile.objects.filter(role__name='VetFarm', + # province=user.province) + # serializer = self.serializer_class(vetfarm, many=True) + # return Response(serializer.data, status=status.HTTP_200_OK) + elif 'Driver' in request.GET: + + driver = KillHouseDriver.objects.filter(address_province=user.province) + serializer = KillHouseDriverSerializer(driver, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalSystemUserProfileStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = SystemUserProfile.objects.all() + serializer_class = SystemUserProfileSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + users = SystemUserProfile.objects.filter().only('user_id') + guilds = Guilds.objects.filter(trash=False) + poultrys = Poultry.objects.filter(trash=False).only('user_id') + price = Pricing.objects.filter(trash=False).last() + + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + poultries = poultrys.filter(city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + poultries = poultrys.filter(address__city=user.city) + else: + poultries = poultrys + else: + poultries = poultrys + return Response({ + "users": users.count(), + "poultries": poultries.count(), + "guilds": guilds.count(), + }) + + +class TotalPricingStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = Pricing.objects.all() + serializer_class = PricingSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + price = Pricing.objects.filter(trash=False).last() + + return Response( + {"last_price": price.live_chicken_price, "last_change": str(price.modify_date.date())} + ) + + +class ShowSystemUserProfileViewSet(viewsets.ModelViewSet): + queryset = SystemUserProfile.objects.all() + serializer_class = SystemUserProfileSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به نمایش اطلاعات پروفایل کاربر + def list(self, request, *args, **kwargs): + refresh(request.user.id) + if 'role' in request.GET: + queryset = self.queryset.filter(role__name__exact=request.GET['role']) + if queryset.count() > 0: + serializer = UserProfileSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response([], status=status.HTTP_200_OK) + else: + users_info = [] + for user in SystemUserProfile.objects.all().exclude(role__isnull=True): + city = user.city.name if user.city != None else None + province = user.province.name if user.province != None else None + for role in user.role.all(): + if role.name == 'KillHouse': + oprator = KillHouseOperator.objects.get(user=user) + kill_house_wallet = oprator.wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=kill_house_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + + internal_dict = { + "base_orde": user.base_order, + "fullname": user.fullname, + "id": user.id, + "role": role.name, + "mobile": user.mobile, + "national_id": user.national_id, + "wallet_key": oprator.wallet.key, + "inventory": oprator.wallet.inventory, + "city": city, + "province": province, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + users_info.append(internal_dict) + + elif role.name == 'Poultry': + poultry_wallet = Poultry.objects.get(user=user).wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=poultry_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + internal_dict = { + "base_orde": user.base_order, + "fullname": user.fullname, + "id": user.id, + "role": role.name, + "mobile": user.mobile, + "wallet_key": poultry_wallet.key, + "national_id": user.national_id, + "province": province, + "city": city, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + users_info.append(internal_dict) + elif role.name == 'CityOperator': + + city_wallet = CityOperator.objects.get(user=user).wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=city_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + internal_dict = { + "base_orde": user.base_order, + "fullname": user.fullname, + "id": user.id, + "role": role.name, + "mobile": user.mobile, + "wallet_key": city_wallet.key, + "national_id": user.national_id, + "province": province, + "city": city, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "depositable": (creditor + deposit) - (debtor + penalty) + } + users_info.append(internal_dict) + elif role.name == 'ProvinceOperator': + province_wallet = ProvinceOperator.objects.get(user=user).wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=province_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + + internal_dict = { + "base_orde": user.base_order, + "fullname": user.fullname, + "id": user.id, + "role": role.name, + "mobile": user.mobile, + "wallet_key": province_wallet.key, + "national_id": user.national_id, + "province": province, + "city": city, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + users_info.append(internal_dict) + elif role.name == 'ProvinceInspector': + inspector_wallet = InspectorOperator.objects.get(user=user).wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=inspector_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + internal_dict = { + "base_orde": user.base_order, + "fullname": user.fullname, + "id": user.id, + "role": role.name, + "mobile": user.mobile, + "wallet_key": inspector_wallet.key, + "national_id": user.national_id, + "province": province, + "city": city, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + users_info.append(internal_dict) + elif role.name == 'ProvinceFinancial': + financial_wallet = ProvinceOperator.objects.get(user=user).wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=financial_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + internal_dict = { + "base_orde": user.base_order, + "fullname": user.fullname, + "id": user.id, + "role": role.name, + "mobile": user.mobile, + "wallet_key": financial_wallet.key, + "national_id": user.national_id, + "province": province, + "city": city, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + users_info.append(internal_dict) + elif role.name == 'Driver': + + driver_wallet = KillHouseDriver.objects.get(user=user).wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=driver_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + internal_dict = { + "base_orde": user.base_order, + "fullname": user.fullname, + "id": user.id, + "role": role.name, + "mobile": user.mobile, + "wallet_key": driver_wallet.key, + "national_id": user.national_id, + "province": province, + "city": city, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + users_info.append(internal_dict) + elif role.name == 'KillHouseVet': + kill_house_vet_wallet = Vet.objects.get(user=user).wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=kill_house_vet_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + internal_dict = { + "base_orde": user.base_order, + "fullname": user.fullname, + "id": user.id, + "role": role.name, + "mobile": user.mobile, + "wallet_key": kill_house_vet_wallet.key, + "national_id": user.national_id, + "province": province, + "city": city, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + users_info.append(internal_dict) + return Response(users_info, status=status.HTTP_200_OK) + + +# class StandardResultsSetPagination(PageNumberPagination): +# page_size = 2 +# page_size_query_param = 'page_size' +# max_page_size = 1000 + + +object_classes_total = { + 'Poultry': Poultry, + 'CityOperator': CityOperator, + 'ProvinceOperator': ProvinceOperator, + 'KillHouse': KillHouse, + 'ProvinceInspector': InspectorOperator, + 'ProvinceFinancial': ProvinceOperator, + 'Vet': Vet, + 'Jahad': Jahad, + 'CityJahad': CityJahad, + 'Driver': KillHouseDriver, + 'Admin': Admin, + 'VetFarm': Vet, + 'KillHouseVet': KillHouseVet, + 'VetSupervisor': VetSupervisor, + 'ProvincialGovernment': ProvincialGovernment, +} +serializer_object_classes_total = { + + 'Poultry': PoultryForAllUserSerializer, + 'CityOperator': CityOperatorForAllUserSerializer, + 'ProvinceOperator': ProvinceOperatorForAllUserSerializer, + 'KillHouse': KillHouseForAllUserSerializer, + # 'KillHouse': KillHouseOperatorForAllUserSerializer, + 'ProvinceInspector': InspectorOperatorForAllUserSerializer, + 'ProvinceFinancial': ProvinceOperatorForAllUserSerializer, + 'Vet': VetForAllUserSerializer, + 'Jahad': JahadForAllUserSerializer, + 'CityJahad': CityJahadForAllUserSerializer, + 'Driver': KillHouseDriverForAllUserSerializer, + 'Admin': AdminForAllUserSerializer, + 'VetFarm': VetForAllUserSerializer, + 'KillHouseVet': KillHouseVetForAllUserSerializer, + 'VetSupervisor': VetSupervisorForAllUserSerializer, + 'ProvincialGovernment': ProvincialGovernmentForAllUserSerializer, +} + + +def get_data_list(user): + data_list = [] + for item in user.role.all(): + object_class = object_classes_total.get(item.name) + serializer = serializer_object_classes_total.get(item.name) + if object_class and serializer: + if item.name == 'KillHouseVet': + query = object_class.objects.filter(vet__user=user) + elif item.name == 'KillHouse': + query = object_class.objects.filter(kill_house_operator__user=user) + else: + query = object_class.objects.filter(user=user) + if query.exists(): + for queries in query: + data_list.append({ + "role_name": item.name, + "details": serializer(queries).data + }) + return data_list + + +class SystemUserProfileViewSet(viewsets.ModelViewSet): + queryset = SystemUserProfile.objects.all() + serializer_class = SystemUserProfileSerializer + permission_classes = [AllowAny] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ProfileFilterSet + filterset_fields = [ + 'base_order', + 'mobile', + 'fullname', + 'first_name', + 'last_name', + 'city__name', + + ] + + object_classes = { + 'Poultry': Poultry, + 'CityOperator': CityOperator, + 'ProvinceOperator': ProvinceOperator, + 'KillHouse': KillHouseOperator, + 'ProvinceInspector': InspectorOperator, + 'ProvinceFinancial': ProvinceOperator, + 'Vet': Vet, + 'Jahad': ProvinceOperator, + 'Driver': KillHouseDriver, + 'PoultryTenant': PoultryTenant, + 'VetFarm': Vet, + 'Guilds': Guilds, + 'Steward': Guilds, + 'KillHouseVet': KillHouseVet + } + serializer_object_classes = { + 'Poultry': PoultrySerializer, + 'CityOperator': CityOperatorSerializer, + 'ProvinceOperator': ProvinceOperatorSerializer, + 'Guilds': GeneralGuildsSerializer, + 'Steward': GeneralGuildsSerializer, + 'KillHouse': KillHouseOperatorSerializer, + 'ProvinceInspector': InspectorOperatorSerializer, + 'ProvinceFinancial': ProvinceOperatorSerializer, + 'Vet': VetSerializer, + 'Jahad': ProvinceOperatorSerializer, + 'Driver': KillHouseDriverSerializer, + # 'PoultryTenant': PoultryTenant, + 'VetFarm': VetSerializer, + 'KillHouseVet': KillHouseVetSerializer + } + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + if 'self-profile' in request.GET: + userprofile = SystemUserProfile.objects.get(user=request.user) + serializer = self.serializer_class(userprofile) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'city_users' in request.GET: + out_list = [] # contains out put list + users = [] + + city_operator = CityOperator.objects.get(user=SystemUserProfile.objects.get(user=request.user)) + city = city_operator.address.city + city_unit_list = [] + city_units = CityUnit.objects.filter(city=city) + for city in city_units: + city_unit_list.append(city.name) + + for u in SystemUserProfile.objects.filter(role__name='Poultry', city__name__in=city_unit_list): + users.append(u) + for user_without_role in SystemUserProfile.objects.filter(city__name__in=city_unit_list): + if len(user_without_role.role.all()) == 0: + users.append(user_without_role) + for user in users: + out_list.append({'profile': self.serializer_class(user).data}) + return Response(out_list, status=status.HTTP_200_OK) + elif 'users_info' in request.GET: + # inspector = InspectorOperator.objects.get(user=SystemUserProfile.objects.get(user=request.user)) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + userprofile_list = [] + province = user.province + out_put = [] # contains out put list + role = request.GET['roles'].split(',') if request.GET['roles'] != "" else None + if role != None: + userprofile = SystemUserProfile.objects.filter(role__name__in=role, province=province, trash=False) + else: + userprofile = SystemUserProfile.objects.filter(province=province, trash=False).exclude( + role__name='SuperAdmin') # contains userprofile object + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=userprofile + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=userprofile) + userprofile_list = ps.filter() + userprofile = [] if len(userprofile_list) == 0 else userprofile_list + # if request.GET['search'] == 'filter': + # if request.GET['value'] != "": + # for item in self.filterset_fields: + # query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + # if (self.filterset_class( + # data=query, + # queryset=userprofile + # ) + # ).filter(): + # ps = self.filterset_class(data=query, queryset=userprofile) + # userprofile_list = ps.filter() + # userprofile = [] if len(userprofile_list) == 0 else userprofile_list + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(userprofile) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(userprofile, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + # for user in userprofile: + # out_put.append({'profile': self.serializer_class(user).data}) + # return Response(out_put, status=status.HTTP_200_OK) + + elif 'users_base_info' in request.GET: + users = SystemUserProfile.objects.filter(province=user.province, trash=False) + serializer_base_info = SystemUserProfileBaseInfoSerializer(users, many=True) + return Response(serializer_base_info.data, status=status.HTTP_200_OK) + + elif 'all_users' in request.GET: + user = self.queryset.get(key=request.GET['userprofile_key']) + data_list = get_data_list(user) + return Response(data_list, status=status.HTTP_200_OK) + # return super().list(request, *args, **kwargs) + + # if 'page' in request.GET: + # end = int(request.GET['page']) * 3 + # start = end - 3 + + def retrieve(self, request, *args, **kwargs): + refresh(request.user.id) + user = self.queryset.get(key=request.GET['userprofile_key']) # contains user profile object + + data_list = [] # contains list of roles data + role_list = [] # contains list of roles names + + # iterate in user roles + if user.role is not None: + for item in user.role.all(): + if item.name == 'Admin': + continue + object_class = self.object_classes[item.name] # contains related class object to role + if item.name == 'KillHouseVet': + if object_class.objects.filter(vet__user=user).exists(): + query = object_class.objects.filter(vet__user=user) # contains query objects + for queries in query: + serializer = self.serializer_object_classes[ + item.name] # contains related serializer to role + data_list.append({item.name: serializer(queries).data}) + role_list.append(item.name) + + else: + if object_class.objects.filter(user=user).exists(): + query = object_class.objects.filter(user=user) # contains query objects + for queries in query: + serializer = self.serializer_object_classes[ + item.name] # contains related serializer to role + data_list.append({item.name: serializer(queries).data}) + role_list.append(item.name) + + serializer = self.serializer_class(user) + + return Response({ + 'profile': serializer.data, + 'roles_data': data_list, + 'roles_list': role_list + }, + status=status.HTTP_200_OK + ) + + # if user does not exists + else: + return Response(status=status.HTTP_409_CONFLICT) + + def create(self, request, *args, **kwargs): + refresh(request.user.id) + if 'userprofile_key' in request.data.keys(): + person = SystemUserProfile.objects.get(key=request.data['userprofile_key']) + else: + person = None + + edit_type = request.data['type'] + request.data.pop('type') + + if edit_type == 'check_user': + # if user exists in system + if self.queryset.filter( + mobile=request.data['value'] + ).exists() or self.queryset.filter( + national_id=request.data['value'] + ).exists() or self.queryset.filter( + base_order=request.data['value'] + ).exists(): + + if self.queryset.filter( + mobile=request.data['value'] + ).exists(): + # contains user object + user = self.queryset.get( + mobile=request.data['value'], + ) + + if self.queryset.filter( + national_id=request.data['value'] + ).exists(): + # contains user object + user = self.queryset.get( + national_id=request.data['value'], + ) + if self.queryset.filter( + base_order=request.data['value'] + ).exists(): + # contains user object + user = self.queryset.get( + base_order=request.data['value'], + ) + + data_list = [] # contains list of roles data + role_list = [] # contains list of roles names + + # iterate in user roles + if user.role is not None: + for item in user.role.all(): + if item.name == 'Admin': + continue + object_class = self.object_classes[item.name] # contains related class object to role + if item.name == 'KillHouseVet': + if object_class.objects.filter(vet__user=user).exists(): + query = object_class.objects.filter(vet__user=user) # contains query objects + for queries in query: + serializer = self.serializer_object_classes[ + item.name] # contains related serializer to role + data_list.append({item.name: serializer(queries).data}) + role_list.append(item.name) + else: + if object_class.objects.filter(user=user).exists(): + query = object_class.objects.filter(user=user) # contains query objects + for queries in query: + serializer = self.serializer_object_classes[ + item.name] # contains related serializer to role + data_list.append({item.name: serializer(queries).data}) + role_list.append(item.name) + + serializer = self.serializer_class(user) + + return Response({ + 'profile': serializer.data, + 'roles_data': data_list, + 'roles_list': role_list + }, + status=status.HTTP_200_OK + ) + + # if user does not exists + else: + url = 'https://userbackend.rasadyar.com/user_identity/' + # url = 'https://artasystemback.sstit.ir/user_identity/' + headers = { + "Authorization": str(request.headers['Authorization']), + "Content-Type": "application/json" + } + request.data['type'] = edit_type + + req = requests.post( + url=url, + data=json.dumps(request.data), + headers=headers, + verify=False + ) + if req.status_code == 200: + return Response(req.json(), status=status.HTTP_200_OK) + else: + return Response(status=status.HTTP_409_CONFLICT) + if edit_type == 'profile': + + # create user object + if not User.objects.filter(username=request.data['mobile']).exists(): + user = User(username=request.data['mobile']) + else: + return Response({"result": "کاربر قبلا ثیت شده است !"}, status=status.HTTP_403_FORBIDDEN) + + # register user to base system + data = { + "username": request.data['mobile'], + "password": request.data['password'], + "first_name": request.data['first_name'], + "last_name": request.data['last_name'], + "national_code": request.data['national_code'], + "api_key": PROJECT_API_KEY, + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + if req.status_code == 200: + # set password for user by admin + if request.data['password'] != "": + password = request.data['password'] + user.password = cryptocode.encrypt(password, password) + user.save() + + # get city object + city = City.objects.get( + key=request.data['city'] + ) + request.data.pop('city') + + # get province object + province = Province.objects.get( + key=request.data['province'] + ) + request.data.pop('province') + + # upload user image + req = upload_image(req=request, field='image') + + # send request data to serializer + serializer = self.serializer_class(data=req.data) + base_order = SystemUserProfile.objects.all() + if base_order.count(): + base_order = base_order.last().base_order + 1 + else: + base_order = 1000 + if serializer.is_valid(): + userprofile_object = serializer.create(validated_data=req.data) + userprofile_object.city = city + userprofile_object.province = province + userprofile_object.user = user + userprofile_object.password = password + userprofile_object.base_order = base_order + userprofile_object.save() + serializer = self.serializer_class(userprofile_object) + return Response(serializer.data, status=status.HTTP_201_CREATED) + else: + return Response({"result": "کاربر قبلا ثیت شده است !"}, status=status.HTTP_400_BAD_REQUEST) + if edit_type == "Poultry": + # poultry owner object + user = self.queryset.get(key=request.data['owner_key']) + + for poultry_items in request.data['poultry_list']: + # if poultry exists show response + if Poultry.objects.filter(breeding_unique_id=poultry_items['breeding_unique_id']).exists(): + return Response({"result": "مرغداری قبلا ثبت شده است !"}, status=status.HTTP_403_FORBIDDEN) + + if poultry_items['address'] != "" or poultry_items['address'] is not None: + # Create Address Object + city = City.objects.get(key=poultry_items['address']['city_key']) # contain city object + poultry_items['address'].pop('city_key') + + # contains province object + province = Province.objects.get(key=poultry_items['address']['province_key']) + poultry_items['address'].pop('province_key') + + # object created + address = SystemAddress.objects.create(**poultry_items['address']) + address.city = city + address.province = province + address.save() + poultry_items.pop('address') # remove address key from data + else: + address = None + + if poultry_items['user_bank_info'] != "" or poultry_items['user_bank_info'] is not None: + # Create Bank Card Object + bank_info = BankCard.objects.create(**poultry_items['user_bank_info']) + poultry_items.pop('user_bank_info') + else: + bank_info = None + + wallet = Wallet() + wallet.save() + + # tenant user key + if 'tenant_key' in poultry_items.keys(): + tenant_key = poultry_items['tenant_key'] + poultry_items.pop('tenant_key') + else: + tenant_key = "" + + # send data to serializer to create poultry + serializer = PoultrySerializer(data=poultry_items) + if serializer.is_valid(): + poultry_object = serializer.create(validated_data=poultry_items) + poultry_object.user = user + poultry_object.incubation_date = datetime.datetime.now() + poultry_object.address = address + poultry_object.user_bank_info = bank_info + poultry_object.wallet = wallet + poultry_object.save() + create_province_allow_poultry_choose_kill_house = ProvinceAllowPoultryChooseKillHouse( + poultry=poultry_object) + create_province_allow_poultry_choose_kill_house.save() + owner_poultry = Poultry.objects.get(key=poultry_object.key) # contains poultry owner object + else: + return Response({"result": "وارد کردن تمامی مقادیر الزامیست! "}, status=status.HTTP_403_FORBIDDEN) + + if tenant_key != "": + # get tenant user object + tenant_user = self.queryset.get(key=tenant_key) + + owner_poultry.has_tenant = True + owner_poultry.save() + + # Copy Poultry Object and Create New One + poultry_object.pk = None + poultry_object.key = uuid.uuid4() + poultry_object.user = tenant_user + poultry_object.save() # save copied object + poultry_object.owner = owner_poultry + poultry_object.wallet = wallet + poultry_object.save() + + user.role.add(Group.objects.get(name='Poultry')) + return Response(status=status.HTTP_201_CREATED) + if edit_type == "CityOperator": + # if person != None: + # city_unit = CityUnit.objects.get(name=person.city.name) + # if CityOperator.objects.filter(address__city__name=city_unit.city.name).exists(): + # return Response({"msg": "exist"}, status=status.HTTP_406_NOT_ACCEPTABLE) + + serializer = create_except_profile( + request=request, + queryset=CityOperator, + serializer=CityOperatorSerializer, + role=edit_type + ) + return Response(serializer[0], status=serializer[1]) + if edit_type == "ProvinceOperator": + if person != None: + province_operator = SystemUserProfile.objects.filter(role__name='ProvinceOperator', + province=person.province) + if province_operator.count() > 0: + if ProvinceOperator.objects.filter(user=province_operator.last()).exists(): + return Response({"msg": "exist"}, status=status.HTTP_406_NOT_ACCEPTABLE) + if SystemUserProfile.objects.filter(role__name='ProvinceFinancial', province=person.province, + key=person.key).exists(): + group = Group.objects.get(name=edit_type) + person.role.add(group) + return Response(status=status.HTTP_201_CREATED) + else: + + serializer = create_except_profile( + request=request, + queryset=ProvinceOperator, + serializer=ProvinceOperatorSerializer, + role=edit_type + ) + return Response(serializer[0], status=serializer[1]) + if edit_type == "ProvinceFinancial": + if person != None: + province_operator = SystemUserProfile.objects.filter(role__name='ProvinceFinancial', + province=person.province) + if province_operator.count() > 0: + if ProvinceOperator.objects.filter(user=province_operator.last()).exists(): + return Response({"msg": "exist"}, status=status.HTTP_406_NOT_ACCEPTABLE) + if SystemUserProfile.objects.filter(role__name='ProvinceOperator', province=person.province, + key=person.key).exists(): + group = Group.objects.get(name=edit_type) + person.role.add(group) + return Response(status=status.HTTP_201_CREATED) + + else: + serializer = create_except_profile( + request=request, + queryset=ProvinceOperator, + serializer=ProvinceOperatorSerializer, + role=edit_type + ) + return Response(serializer[0], status=serializer[1]) + if edit_type == "KillHouse": + + # contains kill house data + kill_house_data = request.data['killhouse_data'] + request.data.pop('killhouse_data') + if 'address' in request.data.keys(): + if request.data['address'] == "": + request.data.pop('address') + if 'postal_code' in request.data.keys(): + if request.data['postal_code'] == "": + request.data.pop('postal_code') + + serializer = create_except_profile( + request=request, + queryset=KillHouseOperator, + serializer=KillHouseOperatorSerializer, + role=edit_type + ) + + for items in kill_house_data: + if items['address'] != "" or items['address'] is not None: + # Create Address Object + city = City.objects.get(key=items['address']['city_key']) # contain city object + items['address'].pop('city_key') + + # contains province object + province = Province.objects.get(key=items['address']['province_key']) + items['address'].pop('province_key') + if items['address']['postal_code'] == "": + items['address'].pop('postal_code') + + # object created + address = SystemAddress.objects.create(**items['address']) + address.city = city + address.province = province + address.save() + items.pop('address') # remove address key from data + else: + address = None + if 'user_bank_info' in items.keys(): + items.pop('user_bank_info') + + # send data to serializer to create poultry + if 'capacity' in items.keys(): + if items['capacity'] == "": + items.pop('capacity') + if 'name' in items.keys(): + if items['name'] == "": + items.pop('name') + if 'phone' in items.keys(): + if items['phone'] == "": + items.pop('phone') + + kill_house_serializer = KillHouseSerializer(data=items) + if kill_house_serializer.is_valid(): + kill_house_object = kill_house_serializer.create(validated_data=items) + kill_house_object.system_address = address + kill_house_object.kill_house_operator = serializer[2] + kill_house_object.save() + create_choose_steward_guilds = ProvinceAllowKillHouseChooseStewardGuilds( + kill_house=kill_house_object) + create_choose_steward_guilds.save() + percentage = KillHousePercentage(kill_house=kill_house_object) + percentage.save() + province_allow_kill_house_choose_steward_guilds = ProvinceAllowKillHouseChooseStewardGuilds( + kill_house=kill_house_object) + province_allow_kill_house_choose_steward_guilds.save() + province_allow_direct_buying = ProvinceAllowKillHouseDirectBuying(kill_house=kill_house_object) + province_allow_direct_buying.save() + + return Response(status=status.HTTP_201_CREATED) + if edit_type == "KillHouseVet": + # get kill house object + kill_house_object = KillHouse.objects.get(key=request.data['kill_house_key']) + request.data.pop('kill_house_key') + if 'address' in request.data.keys(): + if request.data['address'] == "": + request.data.pop('address') + if 'postal_code' in request.data.keys(): + if request.data['postal_code'] == "": + request.data.pop('postal_code') + # Create Kill House Vet Object + + kill_house_vet = KillHouseVet() + vet = Vet.objects.filter(user=person) + if vet.count() > 0: + vet = vet.last() + kill_house_vet.vet = vet + + + else: + serializer = create_except_profile( + request=request, + queryset=Vet, + serializer=VetSerializer, + role=edit_type + ) + kill_house_vet.vet = serializer[2] + + kill_house_vet.kill_house = kill_house_object + kill_house_vet.save() + + # send object to serializer + serializer = KillHouseVetSerializer(kill_house_vet) + return Response(serializer.data, status=status.HTTP_201_CREATED) + if edit_type == "Driver": + # get user profile object + userprofile = self.queryset.get(key=request.data['userprofile_key']) + request.data.pop('userprofile_key') + + # Create driver Bank Account Information + bank_info_object = BankCard.objects.create(**request.data['user_bank_info']) + request.data.pop('user_bank_info') + + # send data to serializer for create object + serializer = KillHouseDriverSerializer(data=request.data) + if serializer.is_valid(): + driver_object = serializer.create(validated_data=request.data) + driver_wallet = Wallet() + driver_wallet.save() + driver_object.user = userprofile + driver_object.user_bank_info = bank_info_object + driver_object.wallet = driver_wallet + driver_object.save() + userprofile.role.add( + Group.objects.get(name='Driver') + ) + serializer = KillHouseDriverSerializer(driver_object) + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + if edit_type == "VetFarm": + if Vet.objects.filter(user=person).exists(): + group = Group.objects.get(name=edit_type) + person.role.add(group) + return Response(status=status.HTTP_201_CREATED) + else: + serializer = create_except_profile( + request=request, + queryset=Vet, + serializer=VetSerializer, + role=edit_type + ) + return Response(serializer[0], status=serializer[1]) + if edit_type == "ProvinceInspector": + if person != None: + province_operator = SystemUserProfile.objects.filter(role__name='ProvinceInspector', + province=person.province) + if province_operator.count() > 0: + if InspectorOperator.objects.filter(user=province_operator.last()).exists(): + return Response({"msg": "exist"}, status=status.HTTP_406_NOT_ACCEPTABLE) + serializer = create_except_profile( + request=request, + queryset=InspectorOperator, + serializer=InspectorOperatorSerializer, + role=edit_type + ) + return Response(serializer[0], status=serializer[1]) + + return Response({"msg": "error"}, status=status.HTTP_403_FORBIDDEN) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + if 'second_mobile_number' in request.data.keys(): + user_profile = SystemUserProfile.objects.get(key=request.data['userprofile_key']) + first_mobile_number = user_profile.mobile + second_mobile_number = request.data['second_mobile_number'] + request.data.pop('second_mobile_number') + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + # return Response(req.status_code) + if req.status_code == 200: + second_mobile_number = second_mobile_number + # request.data.pop('userprofile_key') + user = User.objects.get(id=user_profile.user.id) + user.username = second_mobile_number + user.save() + user_profile.mobile = second_mobile_number + user_profile.save() + # return Response({"result": "شماره تماس با موفقیت ویرایش شد."}, status=status.HTTP_200_OK) + # else: + # return Response({"result": "مشکلی پیش آمده است !"}, status=status.HTTP_200_OK) + if 'last_name' in request.data: + if request.data['last_name'] == "": + request.data.pop('last_name') + if 'national_code' in request.data: + if request.data['national_code'] == "": + request.data.pop('national_code') + if 'national_id' in request.data: + if request.data['national_id'] == "": + request.data.pop('national_id') + edit_type = request.data['type'] + request.data.pop('type') + + person_type = request.data['person_type'] + request.data.pop('person_type') + + # edit profile & roles by user + if person_type == 'self': + if edit_type == 'self_profile': + + url = 'https://userbackend.rasadyar.com/user_identity/0/' + headers = { + "Authorization": str(request.headers['Authorization']), + "Content-Type": "application/json" + } + + # remove null fields from request + request = remove_null_fields(type='req', request=request) + # get profile object + queryset = self.queryset.get(user=request.user) + + payload = { + 'userprofile_key': str(queryset.key), + 'mobile': queryset.mobile, + 'first_name': queryset.first_name, + 'last_name': queryset.last_name, + 'national_id': queryset.national_id, + 'national_code': queryset.national_code + } + req = requests.put( + url=url, + data=json.dumps(payload), + headers=headers, + verify=False + ) + + if req.status_code == 200: + # upload image + req = upload_image(req=request, field='image') + + # send data to serializer + serializer = self.serializer_class(data=req.data) + if serializer.is_valid(): + obj = serializer.update(validated_data=req.data, instance=queryset) + serializer = self.serializer_class(obj) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors) + else: + return Response({'msg': 'Bad Request'}, status=status.HTTP_400_BAD_REQUEST) + if edit_type == 'Poultry': + pass + if edit_type == "CityOperator": + serializer = update_except_profile( + model=CityOperator, + serializer=CityOperatorSerializer, + request=request + ) + return Response(serializer, status=status.HTTP_200_OK) + if edit_type == "ProvinceOperator": + serializer = update_except_profile( + model=ProvinceOperator, + serializer=ProvinceOperatorSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "ProvinceFinancial": + serializer = update_except_profile( + model=ProvinceOperator, + serializer=ProvinceOperatorSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "ProvinceInspector": + serializer = update_except_profile( + model=InspectorOperator, + serializer=InspectorOperatorSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "KillHouse": + serializer = update_except_profile( + model=KillHouseOperator, + serializer=KillHouseOperatorSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "KillHouseVet": + # get kill house object + kill_house_object = KillHouse.objects.get(key=request.data['kill_house_key']) + + # get kill house vet object + kill_house_vet_object = KillHouseVet.objects.get(key=request.data['vet_key']) + + kill_house_vet_object.kill_house = kill_house_object + kill_house_vet_object.save() + + # send object to serializer + serializer = KillHouseVetSerializer(kill_house_vet_object) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "VetFarm": + serializer = update_except_profile( + model=Vet, + serializer=VetSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "Driver": + # get driver object + driver = KillHouseDriver.objects.get(key=request.data['driver_key']) + request.data.pop('driver_key') + + # send data to serializer for update + serializer = KillHouseDriverSerializer(data=request.data) + if serializer.is_valid(): + driver_update = serializer.update(instance=driver, validated_data=request.data) + serializer = KillHouseDriverSerializer(driver_update) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + # edit profile & roles by operator + if person_type == 'operator': + if edit_type == 'self_profile': + # remove null fields from request + request = remove_null_fields(type='req', request=request) + + # get profile object + queryset = self.queryset.get(key=request.data['userprofile_key']) + request.data.pop('userprofile_key') + + # upload image + req = upload_image(req=request, field='image') + + # Change Password By Operator + if req.data['password'] != "": + data = { + 'username': queryset.mobile, + 'password': req.data['password'] + } + req_change_pass = requests.post( + url=ARTA_URL_CHANGE_PASSWORD, + data=data, + verify=False + ) + if req_change_pass.status_code == 200: + queryset.password = req.data['password'] + queryset.save() + req.data.pop('password') + else: + return Response({"Msg": "Password Not Change"}, status=status.HTTP_400_BAD_REQUEST) + else: + req.data.pop('password') + + # send data to serializer + serializer = self.serializer_class(data=req.data) + + if serializer.is_valid(): + # if 'city' in request.data.keys(): + # city = City.objects.get(key=request.data['city']) + # request.data.pop('city') + # queryset.city = city + # queryset.save() + obj = serializer.update(validated_data=req.data, instance=queryset) + serializer = self.serializer_class(queryset) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors) + if edit_type == "CityOperator": + serializer = operator_update_except_profile( + model=CityOperator, + serializer=CityOperatorSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "ProvinceOperator": + serializer = operator_update_except_profile( + model=ProvinceOperator, + serializer=ProvinceOperatorSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "ProvinceFinancial": + serializer = operator_update_except_profile( + model=ProvinceOperator, + serializer=ProvinceOperatorSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "ProvinceInspector": + serializer = operator_update_except_profile( + model=InspectorOperator, + serializer=InspectorOperatorSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "Poultry": + serializer = operator_update_except_profile( + model=Poultry, + serializer=PoultrySerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "KillHouse": + serializer = operator_update_except_profile( + model=KillHouseOperator, + serializer=KillHouseOperatorSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "KillHouseVet": + # get kill house object + kill_house_object = KillHouse.objects.get(key=request.data['kill_house_key']) + + # get kill house vet object + kill_house_vet_object = KillHouseVet.objects.get(key=request.data['vet_key']) + + kill_house_vet_object.kill_house = kill_house_object + kill_house_vet_object.save() + + # send object to serializer + serializer = KillHouseVetSerializer(kill_house_vet_object) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "VetFarm": + serializer = operator_update_except_profile( + model=Vet, + serializer=VetSerializer, + request=request + ) + return Response(serializer.data, status=status.HTTP_200_OK) + if edit_type == "Driver": + # get driver object + driver = KillHouseDriver.objects.get(key=request.data['driver_key']) + request.data.pop('driver_key') + + # send data to serializer for update + serializer = KillHouseDriverSerializer(data=request.data) + if serializer.is_valid(): + if driver.user_bank_info is not None: + bank_serializer = BankCardSerializer(data=request.data['user_bank_info']) + if bank_serializer.is_valid(): + bank_object = bank_serializer.update( + instance=driver.user_bank_info, + validated_data=request.data['user_bank_info'] + ) + driver.user_bank_info = bank_object + else: + bank_serializer = BankCardSerializer(data=request.data['user_bank_info']) + if bank_serializer.is_valid(): + bank_object = bank_serializer.create( + validated_data=request.data['user_bank_info'] + ) + driver.user_bank_info = bank_object + driver.save() + request.data.pop('user_bank_info') + driver_update = serializer.update(instance=driver, validated_data=request.data) + serializer = KillHouseDriverSerializer(driver_update) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def destroy(self, request, *args, **kwargs): + refresh(request.user.id) + + # contains role class model + role_class = self.object_classes[request.GET['role']] + + # get role class object + role_object = role_class.objects.get(key=request.GET['role_data_key']) + + # deactivate role class models + if request.GET['type'] == 'Deactivate': + if request.GET['role'] == 'KillHouseVet': + role_object.vet.trash = True # set trash field to False + role_object.vet.save() + if request.GET['role'] == 'VetFarm': + role_object.vet.trash = True # set trash field to False + role_object.vet.save() + role_object.trash = True # set trash field to False + role_object.save() + return Response({'Msg': 'Deactivated'}, status=status.HTTP_200_OK) + + # activate role class models + elif request.GET['type'] == 'Activate': + if request.GET['role'] == 'KillHouseVet': + role_object.vet.trash = False # set trash field to False + role_object.vet.save() + if request.GET['role'] == 'VetFarm': + role_object.vet.trash = False # set trash field to False + role_object.vet.save() + role_object.trash = False # set trash field to False + role_object.save() + return Response({'Msg': 'Activated'}, status=status.HTTP_200_OK) + + +class SystemUserProfileّForFactorProfileViewSet(viewsets.ModelViewSet): + queryset = SystemUserProfile.objects.all() + serializer_class = SystemUserProfileSerializer + permission_classes = [AllowAny] + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(key=request.data['userprofile_key'], trash=False) + request.data.pop('userprofile_key') + serializer = self.serializer_class(user) + serializer.update(instance=user, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class AdminSystemUserProfileViewSet(viewsets.ModelViewSet): + queryset = SystemUserProfile.objects.all() + serializer_class = SystemUserProfileSerializer + permission_classes = [AllowAny] + + def create(self, request, *args, **kwargs): + refresh(request.user.id) + city = City.objects.get(key=request.data['city']) + province = Province.objects.get(key=request.data['province']) + address = request.data['address'] + password = request.data['password'] + role = Group.objects.get(name=request.data['role']).name + main_address = SystemAddress(city=city, province=province, address=address) + main_address.save() + data = { + "username": request.data['mobile'], + "password": password, + "role": role, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + if req.status_code == 200: + user = User( + username=request.data['mobile'], + first_name=request.data['firstname'], + last_name=request.data['lastname'] + ) + user.save() + base_id = SystemUserProfile.objects.all().last() + system_profile = SystemUserProfile( + mobile=request.data['mobile'], + fullname=request.data['firstname'] + " " + request.data['lastname'], + user=user, + birthday=request.data['birthday'], + national_id=request.data['national_id'], + city=city, + province=province, + base_order=int(base_id.base_order) + 1, + password=password + ) + system_profile.save() + system_profile.role.add(role) + system_profile.save() + if role == 'CityOperator': + city_operator = CityOperator(user=system_profile, address=main_address) + city_operator.save() + elif role == 'ProvinceOperator' or role == 'ProvinceFinancial': + province_operator = ProvinceOperator(user=system_profile, address=main_address) + province_operator.save() + elif role == 'ProvinceInspector': + province_inspector = InspectorOperator(user=system_profile, address=main_address) + province_inspector.save() + elif role == 'KillHouse': + kill_house_operator = KillHouseOperator(user=system_profile, address=main_address) + kill_house_operator.save() + kill_house = KillHouse( + kill_house_operator=kill_house_operator, + system_address=main_address, + name=request.data['name'], + capacity=request.data['capacity'], + phone=request.data['phone'], + ) + kill_house.save() + elif role == 'KillHouseVet': + vet = Vet(user=system_profile, address=main_address) + vet.save() + kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) + kill_house_vet = KillHouseVet(vet=vet, kill_house=kill_house) + kill_house_vet.save() + # elif role == 'KillHouseVet': + + +class CheckChickenQuntityViewSet(viewsets.ModelViewSet): + queryset = UserProfile.objects.all() + serializer_class = UserProfileSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + refresh(request.user.id) + info_list = [] + users = UserProfile.objects.all() + now = datetime.datetime.now() + timedelta(days=6) + for i in range(10, 13): + count = 0 + poultry = [] + for user in users: + age = (now - user.hatching_date).days + if i == age: + poultry.append({ + 'full_name': user.fullname, + 'quantity': user.number_of_incubators + }) + count += user.number_of_incubators + + internal_dict_info = {'age': i, + 'count': count, + 'weight': count * 3} + internal_dict_info.update({'users': poultry}) + info_list.append(internal_dict_info) + + return Response(info_list) + + +# ویوست مربوط اطلاعات حساب بانکی کاربر +class BankCardViewSet(viewsets.ModelViewSet): + queryset = BankCard.objects.all() + serializer_class = BankCardSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ثبت اطلاعات حساب بانکی کاربر + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + bank_card = serializer.create(validated_data=request.data) + if 'role' in request.GET: + if request.GET['role'] == 'Poultry': + poultry = Poultry.objects.get(key=request.data['key']) + poultry.user_bank_info = bank_card + poultry.save() + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + city_operator.user_bank_info = bank_card + city_operator.save() + elif request.GET['role'] == 'ProvinceFinancial': + province_operator = ProvinceOperator.objects.get(user=user) + province_operator.user_bank_info = bank_card + province_operator.save() + elif request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.get(user=user) + kill_house_operator.user_bank_info = bank_card + kill_house_operator.save() + elif request.GET['role'] == 'Vet': + vet = Vet.objects.get(user=user) + vet.user_bank_info = bank_card + vet.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع مربوط به ویرایش اطلاعات حساب بانکی کاربر + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + bank_card = BankCard.objects.get(key__exact=request.data["key"]) + request.data.pop('key') + bank_card.save() + serializer = self.serializer_class(bank_card) + serializer.update(instance=bank_card, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProvinceChangeBankCardViewSet(viewsets.ModelViewSet): + queryset = BankCard.objects.all() + serializer_class = BankCardSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ثبت اطلاعات حساب بانکی کاربر + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + role = request.data['role'] + if role == 'Poultry': + poultry = Poultry.objects.get(key=request.data['poultry_key'], trash=False) + if poultry.user_bank_info != None: + request.data.pop('role') + request.data.pop('poultry_key') + bank_card = BankCard.objects.get(key=poultry.user_bank_info.key) + serializer = self.serializer_class(bank_card) + serializer.update(instance=bank_card, validated_data=request.data) + else: + request.data.pop('role') + request.data.pop('poultry_key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + bank_card = serializer.create(validated_data=request.data) + poultry.user_bank_info = bank_card + poultry.save() + else: + operator = ProvinceOperator.objects.filter(key=request.data['operator_key'], trash=False) + if operator.user_bank_info != None: + request.data.pop('role') + request.data.pop('operator_key') + bank_card = BankCard.objects.get(key=operator.user_bank_info.key) + serializer = self.serializer_class(bank_card) + serializer.update(instance=bank_card, validated_data=request.data) + else: + request.data.pop('role') + request.data.pop('poultry_key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + bank_card = serializer.create(validated_data=request.data) + operator.user_bank_info = bank_card + operator.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +# ویوست مربوط آدرس کاربر +class AddressViewSet(viewsets.ModelViewSet): + queryset = Address.objects.all() + serializer_class = AddressSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + if "key" in request.GET: + add_obj = Address.objects.get(key__exact=request.GET["key"]) + serializer = self.serializer_class(add_obj) + return Response(serializer.data, status=status.HTTP_200_OK) + if "title" in request.GET: + add_obj = Address.objects.filter(user_id=request.user.id) + query = [x for x in add_obj] + serializer = self.serializer_class(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + queryset = Address.objects.all() + serializer = self.serializer_class(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + address = serializer.create(validated_data=request.data) + address.user = UserProfile.objects.get(user=request.user) + address.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def retrieve(self, request, pk=None, *args, **kwargs): + queryset = Address.objects.get(key__exact=request.GET["key"]) + serializer = self.serializer_class(queryset) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + queryset = Address.objects.get(key__exact=request.GET["key"]) + queryset.save() + serializer = self.serializer_class(queryset) + serializer.update(instance=queryset, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def partial_update(self, request, pk=None, *args, **kwargs): + pass + + def destroy(self, request, pk=None, *args, **kwargs): + queryset = Address.objects.get(key__exact=request.GET["wallet_id"]) + queryset.trash = True + queryset.save() + return Response(status=status.HTTP_200_OK) + + +@api_view(['POST']) +@permission_classes([AllowAny]) +def new_send_otp(request): + # if request.headers['Origin'] == 'test.sstit.ir': + # return redirect('test.ravandno.ir') + # else: + req = requests.post( + url=ARTA_URL_SEND_OTP, + data=request.data, + verify=False + ) + + return Response(req.json()) + + +# تابع برای برای بررسی یکسان بودن کد پیامکی استفاده میشود +@api_view(["POST"]) +@permission_classes([AllowAny]) +def check_otp(request): + req = requests.post( + url=ARTA_URL_CHECK_OTP, + data=request.data, + verify=False + ) + return Response(req.json(), status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@authentication_classes([OAuth2Authentication]) +def change_password(request): + user = SystemUserProfile.objects.get(user=request.user) + req = requests.post( + url=ARTA_URL_CHANGE_PASSWORD, + data=request.data, + verify=False + ) + if req.status_code == 200: + user.password = request.data['password'] + user.save() + + return Response(req.json(), status=status.HTTP_200_OK) + + +@api_view(['POST']) +@permission_classes([AllowAny]) +def new_register(request): + req = requests.post( + url=ARTA_URL_REGISTER, + data=request.data, + verify=False + ) + if req.status_code == 500: + error_message = req.content.decode('utf-8') # Decode response content + return Response(error_message) + if req.status_code == 200: + role = Group.objects.get(name=request.data['role']) + password = request.data['password'] + user = User( + username=request.data['username'], + password=cryptocode.encrypt(password, password) + ) + user.save() + userprofile = SystemUserProfile( + user=user, + mobile=request.data['username'], + password=password + ) + + userprofile.base_order = \ + 1000 if len(SystemUserProfile.objects.all()) == 0 \ + else SystemUserProfile.objects.all().order_by('create_date').last().base_order + 1 + userprofile.save() + userprofile.role.add(role) + + # add tenant for a Poultry + if 'tenant' in request.data.keys(): + + # Check if has access + if get_authorization_header(request) != "": + # complete UserProfile information + province = Province.objects.get(key=request.data['tenant']['province']) + city = City.objects.get(key=request.data['tenant']['city']) + userprofile.province = province + userprofile.city = city + userprofile.national_code = request.data['tenant']['national_code'] + userprofile.first_name = request.data['tenant']['first_name'] + userprofile.last_name = request.data['tenant']['last_name'] + userprofile.save() + + # set the tenant poultry owner + owner_poultry = Poultry.objects.get(key=request.data['tenant']['poultry_key']) + owner_poultry.has_tenant = True + owner_poultry.save() + + # create tenant + address = SystemAddress( + city=city, + province=province, + address=request.data['tenant']['address'], + postal_code=request.data['tenant']['postal_code'] + ) + address.save() + tenant_poultry = Poultry( + user=userprofile, + owner=owner_poultry, + unit_name=owner_poultry.unit_name, + breeding_unique_id=request.data['tenant']['unique_id'], + address=address + ) + tenant_poultry.tenant = True + tenant_poultry.save() + serializer = PoultrySerializer(tenant_poultry) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + access_token = AccessToken( + token=req.json()['access_token'], + user=user, + expires=req.json()['expire_time'], + scope="read write" + ) + access_token.save() + return Response(req.json(), status.HTTP_201_CREATED) + if req.status_code == 400: + return Response({"result": 'کاربر قبلا ثبت شده است !'}, status.HTTP_403_FORBIDDEN) + + +# @api_view(['POST']) +# @permission_classes([AllowAny]) +# def new_login(request): +# if User.objects.filter(username__exact=request.data['username']).exists(): +# user = User.objects.get(username__exact=request.data['username']) +# userprofile = SystemUserProfile.objects.get( +# user=user +# ) +# +# # for recognize if user role are deactivated can not login +# role_classes = SystemUserProfileViewSet.object_classes +# role_object = role_classes[request.data['role']].objects.filter(user=userprofile) +# for item in role_object: +# if item.trash == False: +# return Response(status=status.HTTP_203_NON_AUTHORITATIVE_INFORMATION) +# # ########################################################################## +# +# roles = [] +# for item in userprofile.role.all(): +# roles.append(item.name) +# request.data['role'] = roles +# request.data['user_key'] = str(userprofile.key) +# req = requests.post( +# url=ARTA_URL_LOGIN, +# json=request.data, +# verify=False +# ) +# if req.status_code == 200: +# access_token = AccessToken( +# user=user, +# token=req.json()['access_token'], +# expires=req.json()['expire_time'], +# scope="read write" +# ) +# access_token.save() +# userprofile.token = access_token.token +# userprofile.save() +# for item in req.json()['role']: +# group = Group.objects.get(name=item) +# if not SystemUserProfile.objects.filter(user=user, role=group): +# userprofile.role.add(group) +# internal_login_dict = { +# "access_token": req.json()['access_token'], +# "expires_in": req.json()['token_type'], +# "scope": req.json()['scope'], +# "expire_time": req.json()['expire_time'], +# "mobile": userprofile.mobile, +# "fullname": userprofile.fullname, +# "firstname": userprofile.first_name, +# "lastname": userprofile.last_name, +# "city": userprofile.city.name, +# "province": userprofile.province.name, +# "national_code": userprofile.national_code, +# "national_id": userprofile.national_id, +# "birthday": userprofile.birthday, +# "image": userprofile.image, +# "base_order": userprofile.base_order, +# "role": req.json()['role'], +# } +# +# return Response(internal_login_dict, status.HTTP_200_OK) +# if req.status_code == 401: +# return Response({'msg': 'unauthorized'}, status.HTTP_401_UNAUTHORIZED) +# else: +# return Response({'msg': 'unauthorized'}, status.HTTP_401_UNAUTHORIZED) + + +def expire_user_access_tokens(token,user): + now = datetime.datetime.now().date() + accesses = AccessToken.objects.filter(user=user,created__date=now).exclude(token=token).order_by('-created') + accesses_to_expire = accesses[1:] + for access in accesses_to_expire: + access.expires = now - timedelta(days=2) + access.save() + + +def create_login_log(request, user_profile): + headers = dict(request.headers) + + UserLoginLog.objects.create( + user_profile=user_profile, + headers=headers, + ip_address=request.META.get('REMOTE_ADDR'), + user_agent=request.META.get('HTTP_USER_AGENT') + ) + + +@api_view(['POST']) +@permission_classes([AllowAny]) +def new_login(request): + username = request.data['username'] + if User.objects.filter(username__exact=username).exists(): + user = User.objects.get(username__exact=username) + userprofile = SystemUserProfile.objects.get(user=user) + roles = list(userprofile.role.all().values_list('name', flat=True)) + request.data['role'] = roles + request.data['user_key'] = str(userprofile.key) + req_data = { + "api_key": PROJECT_API_KEY, + "password": request.data['password'], + "username": request.data['username'], + "user_key": str(userprofile.key), + "role": roles, + } + req = requests.post( + url=ARTA_URL_LOGIN, + json=req_data, + verify=False + ) + if req.status_code == 200: + expires_datetime = datetime.datetime.strptime(req.json()['expire_time'], + "%Y-%m-%dT%H:%M:%S.%f") + datetime.timedelta(days=1) + access_token = AccessToken( + user=user, + token=req.json()['access_token'], + expires=expires_datetime, + scope="read write" + ) + access_token.save() + userprofile.token = access_token.token + userprofile.save() + for item in req.json()['role']: + group = Group.objects.get(name=item) + if not SystemUserProfile.objects.filter(user=user, role=group): + userprofile.role.add(group) + internal_login_dict = { + "access_token": req.json()['access_token'], + "expires_in": req.json()['token_type'], + "scope": req.json()['scope'], + "expire_time": req.json()['expire_time'], + "mobile": userprofile.mobile, + "fullname": userprofile.fullname, + "firstname": userprofile.first_name, + "lastname": userprofile.last_name, + "city": userprofile.city.name, + "province": userprofile.province.name, + "national_code": userprofile.national_code, + "national_id": userprofile.national_id, + "birthday": userprofile.birthday, + "image": userprofile.image, + "base_order": userprofile.base_order, + "role": req.json()['role'], + } + # expire_user_access_tokens_tread = threading.Thread(target=expire_user_access_tokens, args=(req.json()['access_token'],user)) + # expire_user_access_tokens_tread.start() + try: + create_login_log(request, userprofile) + except: + pass + return Response(internal_login_dict, status.HTTP_200_OK) + if req.status_code == 401: + return Response({'msg': 'unauthorized'}, status.HTTP_410_GONE) + else: + return Response({'msg': 'unauthorized'}, status.HTTP_410_GONE) +# def new_login(request): +# username = request.data['username'] +# password = (request.data['password'],) +# +# if User.objects.filter(username__exact=username).exists(): +# user = User.objects.get(username__exact=username) +# userprofile = SystemUserProfile.objects.get(user=user) +# decrypted_password = cryptocode.decrypt(user.password, password[0]) +# if decrypted_password != password[0]: +# return Response({'result': 'رمز ورود اشتباه است!'}, status=status.HTTP_401_UNAUTHORIZED) +# roles = list(userprofile.role.all().values_list('name', flat=True)) +# data = { +# "username": user.username, +# "password": userprofile.password, +# "client_id": CLIENT_ID, +# "client_secret": CLIENT_SECRET, +# "grant_type": "client_credentials", +# "scope": "read write", +# } +# +# r = requests.post(url=BASE_URL + "token/", data=json.dumps(data), verify=False) +# access_token = AccessToken.objects.get(token=r.json()["access_token"]) +# access_token.user = user +# access_token.expires += timedelta(days=3) +# access_token.save() +# userprofile.token = access_token.token +# userprofile.save() +# internal_login_dict = { +# "access_token": access_token.token, +# "expires_in": access_token.expires, +# "scope": "read write", +# "expire_time": access_token.expires, +# "mobile": userprofile.mobile, +# "fullname": userprofile.fullname, +# "firstname": userprofile.first_name, +# "lastname": userprofile.last_name, +# "city": userprofile.city.name, +# "province": userprofile.province.name, +# "national_code": userprofile.national_code, +# "national_id": userprofile.national_id, +# "birthday": userprofile.birthday, +# "image": userprofile.image, +# "base_order": userprofile.base_order, +# "role": roles, +# } +# +# return Response(internal_login_dict, status.HTTP_200_OK) +# +# else: +# return Response({'msg': 'unauthorized'}, status.HTTP_410_GONE) + + +# تابع مربوط به ازسال کد پیامکی برای چند حالت استفاده می شود +# یرای فراموشی رمز عبور و برای تغییر رمز عبور و تغییر موبایل و ... +# @api_view(["POST"]) +# @permission_classes([AllowAny]) +# def send_otp(request): +# mobile = request.data["mobile"] +# state = request.data["state"] +# if len(mobile) < 11 or len(mobile) > 11: +# return Response({"pattern": "wrong", }, status=status.HTTP_403_FORBIDDEN, ) +# key = str(uuid.uuid4()) +# rand = random.randint(10000, 99000) +# cache.set(key, str(rand), timeout=CACHE_TTL) +# userprofile = SystemUserProfile.objects.filter(mobile=mobile) +# +# if userprofile.count() == 0: +# return Response({"is_user": False}, status=status.HTTP_404_NOT_FOUND) +# +# elif state == "forget_password": +# receptor = mobile +# send_otp_code(receptor, rand) +# return Response({"is_user": True, "key": key}, status=status.HTTP_200_OK) +# +# elif state == "change_password": +# receptor = mobile +# send_otp_code(receptor, rand) +# return Response({"is_user": True, "key": key}, status=status.HTTP_200_OK, ) +# +# elif state == "change_mobile": +# receptor = mobile +# send_otp_code(receptor, rand) +# return Response({"state": "change_mobile", "key": key}, status=status.HTTP_200_OK) +# +# elif state == "": +# list1 = [] +# if userprofile.count() > 1: +# +# for user in userprofile: +# user_dict = { +# "userprofile_id": user.id, +# "fullname": user.fullname, +# "first_name": user.first_name, +# "last_name": user.last_name, +# "mobile": user.mobile, +# "role": user.role.name, +# "province": user.address.province, +# "city": user.address.city, +# "address": user.address.address +# } +# list1.append(user_dict) +# return Response( +# { +# "result": list1, +# }, +# status=status.HTTP_200_OK, +# ) +# +# else: +# +# return Response( +# { +# "is_user": True, +# }, +# status=status.HTTP_200_OK, +# ) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +def login(request): + username = request.data["mobile"] + password = request.data["password"] + api_key = request.data["api_key"] + data = { + "username": username, + "password": password, + "api_key": api_key, + } + r = requests.post(url=ARTA_URL_LOGIN, data=data) + if "is_user" in r.json().keys(): + return Response({'is_user': False}, status=status.HTTP_401_UNAUTHORIZED) + elif "password" in r.json().keys(): + return Response({'password': 'wrong'}, status=status.HTTP_401_UNAUTHORIZED) + user_profile = UserProfile.objects.get(mobile=username) + user = User.objects.get(id=user_profile.user.id) + user_profile.token = r.json()["access_token"] + user_profile.save() + access = AccessToken(token=r.json()['access_token'], user=user, scope=r.json()['scope'], + expires=r.json()['expire_time']) + access.save() + role = Group.objects.get(id=user_profile.role.id) + response = { + "access_token": r.json()['access_token'], + "expires_in": r.json()['expires_in'], + "token_type": r.json()['token_type'], + "scope": r.json()['scope'], + "role": role.name + } + return Response(response, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +def register(request): + username = request.data["username"] + password = request.data["password"] + api_key = request.data["api_key"] + province = request.data['province'] + city = request.data['city'] + role = request.data['role'] + role = Group.objects.get(name=role) + data = { + "username": username, + "password": password, + "api_key": api_key, + } + r = requests.post(url=ARTA_URL_REGISTER, data=data) + if 'result' in r.json().keys(): + return Response({"result": "user already exist"}) + + user = User( + username=username, password=cryptocode.encrypt(password, password) + ) + user.save() + access = AccessToken(token=r.json()['access_token'], user=user, scope=r.json()['scope'], + expires=r.json()['expire_time']) + access.save() + + address = Address(province=province, city=city) + address.save() + userprofile = UserProfile(user=user, mobile=username, address=address, role=role) + userprofile.base_order = 1000 if len(UserProfile.objects.all()) == 0 else UserProfile.objects.all().order_by( + 'create_date').last().base_order + 1 + userprofile.user = user + userprofile.token = r.json()['access_token'] + userprofile.save() + return Response(r.json(), status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +# @authentication_classes([OAuth2Authentication]) +def forget_password(request): + # user = SystemUserProfile.objects.get(user=request.user) + # user.password = request.data['password'] + # user.save() + req = requests.post( + url=ARTA_URL_CHANGE_PASSWORD, + data=request.data, + verify=False + ) + if req.status_code == 200: + user = SystemUserProfile.objects.get(mobile=request.data['username']) + + user.password = request.data['password'] + user.save() + + return Response(req.json(), status=status.HTTP_200_OK) + + # mobile = request.data["mobile"] + # password = request.data["password"] + # try: + # userprofile = UserProfile.objects.get(mobile__exact=mobile) + # except UserProfile.DoesNotExist: + # return Response(status=status.HTTP_401_UNAUTHORIZED) + # user = User.objects.get(id=userprofile.user.id) + # user.password = cryptocode.encrypt(password, password) + # user.save() + # data = { + # "username": str(user.username), + # "password": user.password, + # "client_id": CLIENT_ID, + # "client_secret": CLIENT_SECRET, + # "grant_type": "client_credentials", + # "scope": "read write", + # } + # r = requests.post(url=BASE_URL + "token/", data=json.dumps(data)) + # userprofile.token = r.json()["access_token"] + # userprofile.save() + # access = AccessToken.objects.get(token=userprofile.token) + # access.user = userprofile.user + # access.save() + # role = Group.objects.get(id=userprofile.role.id) + # response = { + # "access_token": r.json()['access_token'], + # "expires_in": r.json()['expires_in'], + # "token_type": r.json()['token_type'], + # "scope": r.json()['scope'], + # "role": role.name + # } + # return Response(response, status=status.HTTP_200_OK) + + +# @api_view(["GET"]) +# @permission_classes([AllowAny]) +# تابع برای گرفتن گزارش تعداد جوجه و سن جوجه مرغداران استفاده میشود که بصورت فایل اکسل است +def resulting(request): + list2 = [] + today = datetime.datetime.now() + if 'age' in request.GET: + users = UserProfile.objects.filter(role_id=1).exclude(incubation_date=None) + for user in users: + age = (today - user.incubation_date).days + if int(age) == int(request.GET['age']): + list2.append(user) + elif 'state' in request.GET: + users = UserProfile.objects.filter(role_id=1).exclude(incubation_date=None) + for user in users: + age = (today - user.incubation_date).days + if int(age) >= int(request.GET['age1']) and int(age) <= int(request.GET['age2']): + list2.append(user) + excel_options = [ + 'نام و نام خانوادگی' + , 'تاریخ جوجه ریزی' + , 'سن مرغ' + , 'تعداد جوجه ریزی', + 'شماره همراه', 'استان', + 'شهرستان', + 'آدرس' + ] + output = BytesIO() + workbook = xlsxwriter.Workbook(output) + worksheet = workbook.add_worksheet() + for count in range(len(excel_options)): + worksheet.write(0, count, excel_options[count]) + l = 0 + for user in list2: + l += 1 + today = datetime.datetime.now() + if user.incubation_date != None: + age = (today - user.incubation_date).days + gregorian_date = jdatetime.date.fromgregorian( + day=user.incubation_date.day, + month=user.incubation_date.month, + year=user.incubation_date.year + ) + incubation_date = gregorian_date + else: + age = 'ندارد' + incubation_date = 'ندارد' + list1 = [ + user.fullname, + str(incubation_date), + str(age), + user.number_of_incubators, + user.mobile, + user.address.province, + user.address.city, + user.address.address, + ] + for item in range(len(list1)): + worksheet.write(l, item, list1[item]) + list1 = [] + workbook.close() + output.seek(0) + + response = HttpResponse(content_type='application/vnd.ms-excel') + + response['Content-Disposition'] = 'attachment;filename="Reporting.xlsx"' + response.write(output.getvalue()) + + return response + + +# تابع برای دریافت گزارش اطلاعات مربوط به فاکتور های مرغ منجمد به صورت فایل اکسل استفاده میشود +def ware_house_factor(request): + list2 = [] + factors = WareHouseFactor.objects.filter(trash=False).order_by('create_date') + for factor in factors: + list2.append(factor) + + excel_options = [ + 'تاریخ', + 'نام و نام خانوادگی', + 'کدملی' + , 'شماره همراه' + , 'نوع کالا' + , + 'شماره نامه جهاد', + 'شماره نامه استان', + 'قیمت', + 'وزن' + ] + output = BytesIO() + workbook = xlsxwriter.Workbook(output) + worksheet = workbook.add_worksheet() + for count in range(len(excel_options)): + worksheet.write(0, count, excel_options[count]) + l = 0 + for factor in factors: + l += 1 + gregorian_date = jdatetime.date.fromgregorian( + day=factor.date.day, + month=factor.date.month, + year=factor.date.year + ) + list1 = [ + str(gregorian_date), + factor.customer, + str(factor.national_code), + factor.mobile, + factor.product_type, + str(factor.letter_number_jahad), + factor.letter_number, + factor.fee, + factor.weight + ] + for item in range(len(list1)): + worksheet.write(l, item, list1[item]) + + list1 = [] + + workbook.close() + output.seek(0) + + response = HttpResponse(content_type='application/vnd.ms-excel') + + response['Content-Disposition'] = 'attachment;filename="Reporting.xlsx"' + response.write(output.getvalue()) + + return response + + +@api_view(['POST']) +@permission_classes([AllowAny]) +def pos_login(request): + build_id = None + link = None + pos_version = PosVersion.objects.filter(trash=False).first() + if pos_version: + build_id = pos_version.build_id + link = pos_version.latest_downloadlink + try: + pos = POSMachine.objects.get(pos_id=request.data['pos-id'], trash=False) + if pos.active == False: + return Response({"result": "این کلید غیر فعال میباشد! "}, status=status.HTTP_401_UNAUTHORIZED) + + + except: + return Response({"result": "دستگاه پوزی با این شناسه وجود ندارد! "}, status=status.HTTP_401_UNAUTHORIZED) + + if User.objects.filter(username__exact=pos.user.mobile).exists(): + user = User.objects.get(username__exact=pos.user.mobile) + userprofile = SystemUserProfile.objects.get( + user=user + ) + data = { + "username": user.username, + "password": userprofile.password, + "client_id": CLIENT_ID, + "client_secret": CLIENT_SECRET, + "grant_type": "client_credentials", + "scope": "read write", + } + + r = requests.post(url=BASE_URL + "token/", data=json.dumps(data), verify=False) + access_token = AccessToken.objects.get(token=r.json()["access_token"]) + access_token.user = user + access_token.expires += timedelta(days=3) + access_token.save() + userprofile.token = access_token.token + userprofile.save() + pos.token = access_token.token + pos.save() + if pos.guild: + store_name = pos.guild.guilds_name + phone = pos.guild.phone + else: + store_name = pos.kill_house.name + phone = pos.kill_house.phone + internal_login_dict = { + "access_token": userprofile.token, + "build_id": build_id, + "latest_downloadlink": link, + "profile": { + "pos_id": pos.pos_id, + "store_name": store_name, + "phone": phone, + "mobile": userprofile.mobile, + "fullname": userprofile.fullname, + "firstname": userprofile.first_name, + "lastname": userprofile.last_name, + "city": userprofile.city.name, + "province": userprofile.province.name, + "national_code": userprofile.national_code, + "national_id": userprofile.national_id, + "birthday": userprofile.birthday, + } + + } + for pos_item in PosItem.objects.all(): + internal_login_dict[pos_item.name] = pos_item.value + + return Response(internal_login_dict, status.HTTP_200_OK) + + else: + return Response({'msg': 'unauthorized'}, status.HTTP_410_GONE) + + +@api_view(['POST']) +@permission_classes([AllowAny]) +def new_pos_login(request): + pos_id = request.data.get('pos-id') + pos = get_object_or_404(POSMachine, pos_id=pos_id, trash=False) + + if not pos.active: + return Response({"result": "این کلید غیر فعال میباشد! "}, status=status.HTTP_401_UNAUTHORIZED) + + user = get_object_or_404(User, username=pos.user.mobile) + user_profile = get_object_or_404(SystemUserProfile, user=user) + + pos_info = get_pos_info(pos) + + data = { + "username": user.username, + "password": user_profile.password, + "client_id": CLIENT_ID, + "client_secret": CLIENT_SECRET, + "grant_type": "client_credentials", + "scope": "read write", + } + + response = requests.post(url=f"{BASE_URL}token/", data=json.dumps(data), verify=False) + access_token = update_access_token(response.json()["access_token"], user) + + user_profile.token = access_token.token + user_profile.save() + + pos.token = access_token.token + pos.save() + + internal_login_dict = build_internal_login_response(user_profile, pos_info, pos.pos_id) + + return Response(internal_login_dict, status.HTTP_200_OK) + + +def get_pos_info(pos): + if pos.kill_house: + return { + "type": "KillHouse", + "name": pos.kill_house.name, + "phone": pos.kill_house.phone + } + elif pos.guild: + return { + "type": "Guild", + "name": pos.guild.guilds_name, + "phone": pos.guild.phone + } + else: + return { + "type": "Dispenser", + "name": pos.dispenser.user.fullname, + "phone": pos.dispenser.user.mobile + } + + +def update_access_token(token_str, user): + access_token = AccessToken.objects.get(token=token_str) + access_token.user = user + access_token.expires += timedelta(days=3) + access_token.save() + return access_token + + +def build_internal_login_response(user_profile, pos_info, pos_id): + return { + "access_token": user_profile.token, + "type": pos_info["type"], + "profile": { + "pos_id": pos_id, + "name": pos_info["name"], + "phone": pos_info["phone"], + "mobile": user_profile.mobile, + "fullname": user_profile.fullname, + "firstname": user_profile.first_name, + "lastname": user_profile.last_name, + "city": user_profile.city.name, + "province": user_profile.province.name, + "national_code": user_profile.national_code, + "national_id": user_profile.national_id, + "birthday": user_profile.birthday, + } + } + + +@api_view(['POST']) +@permission_classes([AllowAny]) +def show_transaction_info(request): + request.data['registered'] = True + return Response(request.data) + + +@api_view(['POST']) +@permission_classes([AllowAny]) +def TokenVerification(request): + token = AccessToken.objects.get(token=request.data['token']) + user = SystemUserProfile.objects.filter(user=token.user, trash=False).select_related('province', 'city').first() + + return Response({ + "username": user.mobile, + "password": user.password, + "province": user.province.name, + "city": user.city.name, + }) + + # def create(self, request, *args, **kwargs): + # group = Group.objects.filter(name__in=request.data['roles']) + # users = SystemUserProfile.objects.filter(trash=False,role__in=group).order_by('id') + # notis_user = users.values_list('id',flat=True) + # return Response(notis_user) + # serializer = self.serializer_class(data=request.data) + # if serializer.is_valid(): + # notice = serializer.create(validated_data=request.data) + # notice.users = notis_user + # notice.save() + # for user in notis_user: + # user_notice = UserNoticeInfo( + # notice=notice, + # user = user, + # + # ) + # user_notice.save() + # serializer = self.serializer_class(notice) + # return Response(serializer.data) + # return Response(serializer.errors) + + +@api_view(['POST']) +@permission_classes([AllowAny]) +def register_tenant(request): + province = Province.objects.get(key=request.data['province']) + city = City.objects.get(key=request.data['city']) + breeding_uniq_id = request.data['unique_id'] + if Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id).exists(): + return Response({'result': 'شناسه یکتا برای شخص دیگری است!'}, status=status.HTTP_403_FORBIDDEN) + owner_poultry = Poultry.objects.get(key=request.data['poultry_key']) + owner_poultry.has_tenant = True + + address = SystemAddress( + city=city, + province=province, + address=request.data['address'], + postal_code=request.data['postal_code'] + ) + address.save() + tenant_poultry = Poultry( + user=owner_poultry.user, + owner=owner_poultry, + unit_name=request.data['unit_name'], + breeding_unique_id=breeding_uniq_id, + address=address, + city_number=city.id, + province_number=province.id, + city_name=city.name, + province_name=province.name + ) + tenant_poultry.tenant = True + owner_poultry.save() + tenant_poultry.save() + serializer = PoultrySerializer(tenant_poultry) + return Response(serializer.data, status=status.HTTP_201_CREATED) diff --git a/bot_eata.py b/bot_eata.py new file mode 100644 index 0000000..d105194 --- /dev/null +++ b/bot_eata.py @@ -0,0 +1,1855 @@ +from datetime import datetime, timedelta + +import jdatetime +import requests +from django.db.models import Sum, Q, F +from django.http import HttpResponse + +from general_urls import base_url_for_sms_report +from helper_eata import token, chat_id, chat_id_mali +from panel.ProvinceOperator.serializers import TotalWageInformationSerializer +from panel.helper_excel import shamsi_date, to_locale_str +from panel.models import PoultryHatching, ProvinceKillRequest, KillHousePercentage, TotalWageInformation, \ + InternalTransaction, TokenEitaaForEachVet, VetFarm, KillHouseRequest, PoultryRequest, Poultry + + +def format_datetime_to_shamsi(input_date): + if isinstance(input_date, datetime): + input_date = input_date.date() + + shamsi_date = jdatetime.date.fromgregorian(date=input_date) + shamsi_date_str = shamsi_date.strftime('%Y/%m/%d') + + weekday_str = input_date.strftime('%A') + weekdays = { + 'Saturday': 'شنبه', + 'Sunday': 'یکشنبه', + 'Monday': 'دوشنبه', + 'Tuesday': 'سه‌شنبه', + 'Wednesday': 'چهارشنبه', + 'Thursday': 'پنج‌شنبه', + 'Friday': 'جمعه' + } + weekday_str_fa = weekdays.get(weekday_str, '') + + formatted_date = f"گزارش {weekday_str_fa} به تاریخ {shamsi_date_str}" + + return formatted_date + + +def bot_eitaa_for_bar(request): + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + response = requests.get( + f'https://{base_url_for_sms_report}backend.rasadyaar.ir/province_request_letter/?date={date}') + date_time_jalali = format_datetime_to_shamsi(date) + + if response.status_code == 200: + data = response.json() + + allocation = data.get('allocation', []) + kill_house_num = 1 + messages_sent = 0 + + for entry in allocation: + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_بار_داخل_استان #{date_shamsi}\n\n' + total_quantity = entry.get('total_quantity') + if total_quantity and int(total_quantity) > 0: + len_bar = entry.get('province_kill_request') + killer = 'کشتارگاه' if entry.get('killer') == False else 'کشتارکن' + name = entry.get("name").replace(' ', '_') + mobile = entry.get("kill_house_operator").get("user").get("mobile") + total_quantity = "{:,}".format(int(total_quantity)) + + current_message = base_message + current_message += f'🟢 {killer} #{name} ({mobile})\n' + current_message += f'تعداد کل بار: {len(len_bar)}\n' + current_message += f'حجم کل بار: {total_quantity}\n' + current_message += f'--------------------------------\n' + + m = 1 + for request1 in entry.get('province_kill_request', []): + poultry = request1.get('poultry', 'نامشخص') + poultry_mobile = request1.get('poultry_mobile', 'نامشخص') + quantity = request1.get('quantity', 0) + average_weight = request1.get('Index_weight', 'نامشخص') + weight = request1.get('weight', 'نامشخص') + car_type = request1.get('car_type', 'نامشخص') + driver_name = request1.get('driver_name', 'نامشخص') + traffic_code = request1.get('traffic_code', 'نامشخص') + pelak = request1.get('pelak', 'نامشخص') + quantity = "{:,}".format(int(quantity)) + weight = "{:,}".format(int(weight)) + + current_message += f'\n🔸{m}-مرغدار: {poultry} ({poultry_mobile})\n' + current_message += f'میانگین وزن بار: {average_weight}\n' + current_message += f'حجم بار: {quantity}\n' + current_message += f'وزن بار: {weight}\n' + current_message += f'نوع ماشین: {car_type}\n' + current_message += f'نام راننده: {driver_name}\n' + current_message += f'کد حمل و نقل: {traffic_code}\n' + current_message += f'پلاک: {pelak}\n' + current_message += '-' * 30 + '\n' + m += 1 + + data = { + 'chat_id': chat_id, + 'text': current_message, + } + response = requests.post(url, data=data, verify=False) + if response.status_code == 200: + messages_sent += 1 + kill_house_num += 1 + + return HttpResponse(f'{messages_sent} پیام با موفقیت ارسال شد.') + + return HttpResponse('Error fetching data', status=500) + + +def bot_eitaa_free_bar(request): + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + response = requests.get( + f'https://{base_url_for_sms_report}backend.rasadyaar.ir/province_request_letter/?date={date}') + date_time_jalali = format_datetime_to_shamsi(date) + if response.status_code == 200: + data = response.json() + date_shamsi = shamsi_date(date).replace('-', '_') + out_province = data.get('out_province', []) + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_خارج_استان #{date_shamsi}\n\n' + base_message += f'تعداد کل سفارشات: {len(out_province)}\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + m = 1 + for entry in out_province: + quantity = entry['quantity'] + poultry_name = entry['poultry']['user']['fullname'] + poultry_mobile = entry['poultry']['user']['mobile'] + buyer_fullname = entry['out_province_poultry_request_buyer']['fullname'] + buyer_mobile = entry['out_province_poultry_request_buyer']['mobile'] + buyer_city = entry['out_province_poultry_request_buyer']['city'] + city = entry['poultry']['user']['city']['name'] + weight = entry.get('Index_weight', 'نامشخص') + weight_all = quantity * weight + quantity = "{:,}".format(entry['quantity']) + weight_all = "{:,}".format(int(weight_all)) + + new_message_part = f'{m}:\n' + new_message_part += f"🟢 مرغدار : {poultry_name} ({poultry_mobile})\n" + new_message_part += f"شهر: {city}\n" + new_message_part += f"🔸 خریدار : {buyer_fullname} ({buyer_mobile})\n" + new_message_part += f"شهر: {buyer_city}\n" + new_message_part += f"میانگین وزن : {weight}\n" + new_message_part += f" تعداد : {quantity}\n" + new_message_part += f" وزن تقریبی : {weight_all}\n" + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + m += 1 + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + + for message in messages: + data = { + 'chat_id': chat_id, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + return HttpResponse(f'{len(messages)} پیام ارسال شد.') + + +def bot_eitaa_for_hatching_gt_50(request): + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + date_time_jalali = format_datetime_to_shamsi(date) + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_فارم_بالای_50_روز #{date_shamsi}\n\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + poultry_hatching = PoultryHatching.objects.filter(trash=False, chicken_age__gte=50) + m = 1 + for hatching in poultry_hatching: + message = f'{m}-مرغدار {hatching.poultry.unit_name}\n' \ + f'' + m += 1 + base_message += message + data = { + 'chat_id': chat_id, + 'text': base_message, + } + response = requests.post(url, data=data, verify=False) + return HttpResponse(f'{len(base_message)} پیام ارسال شد.') + + +def bot_eitaa_for_province_kill_request(request): + if base_url_for_sms_report in ('ma', 'test'): + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('accepted', 'pending'), + return_to_province=False, + kill_request__recive_date__date=date) \ + .order_by('-kill_request__recive_date').only('main_quantity', 'quantity', + 'province_request__poultry_request__Index_weight', + 'main_quantity', 'province_request__poultry_request__export', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__city_request_Poultry__poultry_request__poultry__user__mobile', + 'province_request__city_request_Poultry__poultry_request__poultry__user__city__name', + 'kill_request__kill_house__name', + 'kill_request__kill_house__kill_house_operator__user__mobile', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__order_code', + 'kill_request__kill_house__system_address__city__name') + date_time_jalali = format_datetime_to_shamsi(date) + + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_تخصیصات #{date_shamsi}\n\n' + base_message += f'تعداد کل تخصیصات: {len(province_kill_requests)}\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + m = 1 + for entry in province_kill_requests: + main_quantity = entry.main_quantity + remain_quantity = entry.quantity if entry.return_to_province == False else 0 + poultry_name = entry.province_request.poultry_request.poultry.unit_name + poultry_mobile = entry.province_request.poultry_request.poultry.user.mobile + + city = entry.province_request.poultry_request.poultry.user.city.name + buyer = entry.kill_request.kill_house.name + buyer_city = entry.kill_request.kill_house.system_address.city.name + buyer_mobile = entry.kill_request.kill_house.kill_house_operator.user.mobile + weight = entry.province_request.poultry_request.Index_weight + order_code = entry.province_request.poultry_request.order_code + weight_all = remain_quantity * weight + main_quantity = "{:,}".format(main_quantity) + remain_quantity = "{:,}".format(remain_quantity) + weight_all = "{:,}".format(int(weight_all)) + + if entry.province_request.poultry_request.direct_buying == True: + province_type = 'خرید مستقیم' + elif entry.province_request.poultry_request.export == True: + province_type = 'فروش به خارج استان' + else: + province_type = 'اتحادیه' + new_message_part = f'{m}:\n' + new_message_part += f"🟢 مرغدار : {poultry_name} ({poultry_mobile})\n" + new_message_part += f"شهر: {city}\n" + new_message_part += f"کد سفارش: {order_code}\n" + new_message_part += f"نوع فروش: {province_type}\n" + new_message_part += f" تعداد تخصیصی :{main_quantity}\n" + new_message_part += f"مانده قابل تخصیص :{remain_quantity}\n" + new_message_part += f"میانگین وزن : {weight}\n" + new_message_part += f"وزن تقریبی :{weight_all}\n" + new_message_part += f"\n" + new_message_part += f"🔴🔴خریدار : {buyer} ({buyer_mobile})\n" + new_message_part += f"شهر خریدار: {buyer_city}\n" + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + m += 1 + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + + for message in messages: + data = { + 'chat_id': chat_id, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + return HttpResponse(f'{len(messages)} پیام ارسال شد.') + + +def bot_eitaa_for_each_province_kill_request(entry, vet): + if base_url_for_sms_report in ('ma', 'test'): + messages = [] + chat_id_eitaa = None + if vet: + chat_id_eitaa = TokenEitaaForEachVet.objects.filter(vet_mobile=vet.vet.user.mobile).first() + + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + + date_time_jalali = format_datetime_to_shamsi(date) + + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_تخصیصات #{date_shamsi}\n\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + current_message = base_message + m = 1 + + main_quantity = entry.main_quantity + remain_quantity = (entry.main_quantity - entry.total_killed_quantity) if ( + entry.main_quantity - entry.total_killed_quantity) > 0 else 0 + poultry_name = entry.province_request.poultry_request.poultry.unit_name + poultry_mobile = entry.province_request.poultry_request.poultry.user.mobile + + city = entry.province_request.poultry_request.poultry.user.city.name + buyer = entry.kill_request.kill_house.name + buyer_city = entry.kill_request.kill_house.system_address.city.name + buyer_mobile = entry.kill_request.kill_house.kill_house_operator.user.mobile + weight = entry.province_request.poultry_request.Index_weight + order_code = entry.province_request.poultry_request.order_code + weight_all = entry.total_killed_quantity * weight + main_quantity = "{:,}".format(main_quantity) + remain_quantity = "{:,}".format(remain_quantity) + weight_all = "{:,}".format(int(weight_all)) + + if entry.province_request.poultry_request.direct_buying == True: + province_type = 'خرید مستقیم' + elif entry.province_request.poultry_request.export == True: + province_type = 'فروش به خارج استان' + elif entry.market == True: + province_type = 'پنل معاملاتی' + else: + province_type = 'اتحادیه' + new_message_part = f'{m}:\n' + new_message_part += f"🟢 مرغدار : {poultry_name} ({poultry_mobile})\n" + new_message_part += f"شهر: {city}\n" + new_message_part += f"کد سفارش: {order_code}\n" + new_message_part += f"نوع فروش: {province_type}\n" + new_message_part += f" تعداد تخصیصی :{main_quantity}\n" + new_message_part += f"مانده قابل تخصیص :{remain_quantity}\n" + new_message_part += f"میانگین وزن : {weight}\n" + new_message_part += f"وزن تقریبی :{weight_all}\n" + new_message_part += f"\n" + new_message_part += f"🔴🔴خریدار : {buyer} ({buyer_mobile})\n" + new_message_part += f"شهر خریدار: {buyer_city}\n" + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + m += 1 + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + if chat_id_eitaa: + chat_id_eitaa = chat_id_eitaa.token + for message in messages: + data = { + 'chat_id': chat_id_eitaa, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + for message in messages: + data = { + 'chat_id': chat_id, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + +def bot_eitaa_for_each_delete_province_kill_request(entry): + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + order_code = entry.province_request.poultry_request.order_code + date_time_jalali = format_datetime_to_shamsi(date) + + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_تخصیصات_حذف_شده #{date_shamsi}\n\n' + base_message += f'❗❗❗❗اصلاحیه تخصیص حذف شده با کد سفارش {order_code}❗❗❗❗\n\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + m = 1 + + main_quantity = entry.main_quantity + remain_quantity = (entry.main_quantity - entry.total_killed_quantity) if ( + entry.main_quantity - entry.total_killed_quantity) > 0 else 0 + poultry_name = entry.province_request.poultry_request.poultry.unit_name + poultry_mobile = entry.province_request.poultry_request.poultry.user.mobile + + city = entry.province_request.poultry_request.poultry.user.city.name + buyer = entry.kill_request.kill_house.name + buyer_city = entry.kill_request.kill_house.system_address.city.name + buyer_mobile = entry.kill_request.kill_house.kill_house_operator.user.mobile + weight = entry.province_request.poultry_request.Index_weight + + weight_all = entry.total_killed_quantity * weight + main_quantity = "{:,}".format(main_quantity) + remain_quantity = "{:,}".format(remain_quantity) + weight_all = "{:,}".format(int(weight_all)) + + if entry.province_request.poultry_request.direct_buying == True: + province_type = 'خرید مستقیم' + elif entry.province_request.poultry_request.export == True: + province_type = 'فروش به خارج استان' + elif entry.market == True: + province_type = 'پنل معاملاتی' + else: + province_type = 'اتحادیه' + new_message_part = f'{m}:\n' + new_message_part += f"🟢 مرغدار : {poultry_name} ({poultry_mobile})\n" + new_message_part += f"شهر: {city}\n" + new_message_part += f"کد سفارش: {order_code}\n" + new_message_part += f"نوع فروش: {province_type}\n" + new_message_part += f" تعداد تخصیصی :{main_quantity}\n" + new_message_part += f"مانده قابل تخصیص :{remain_quantity}\n" + new_message_part += f"میانگین وزن : {weight}\n" + new_message_part += f"وزن تقریبی :{weight_all}\n" + new_message_part += f"\n" + new_message_part += f"🔴🔴خریدار : {buyer} ({buyer_mobile})\n" + new_message_part += f"شهر خریدار: {buyer_city}\n" + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + new_message_part += f'❗❗❗تخصیص با کد سفارش {order_code} حذف شده است❗❗❗' + m += 1 + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + + for message in messages: + data = { + 'chat_id': chat_id, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + +def bot_eitaa_out_province_live_bar(request, poultry_requests, vet): + chat_id_eitaa = None + if vet: + chat_id_eitaa = TokenEitaaForEachVet.objects.filter(vet_mobile=vet.vet.user.mobile).first() + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + response = poultry_requests + date_time_jalali = format_datetime_to_shamsi(date) + + date_shamsi = shamsi_date(date).replace('-', '_') + out_province = len(poultry_requests) + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_فروش_مرغ_زنده_خارج_استان #{date_shamsi}\n\n' + base_message += f'تعداد کل سفارشات: {out_province}\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + m = 1 + + quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_name = poultry_requests.last().poultry.user.fullname + poultry_mobile = poultry_requests.last().poultry.user.mobile + buyer_fullname = poultry_requests.last().out_province_poultry_request_buyer.fullname + buyer_mobile = poultry_requests.last().out_province_poultry_request_buyer.mobile + buyer_city = poultry_requests.last().out_province_poultry_request_buyer.city + city = poultry_requests.last().poultry.user.city.name + weight = poultry_requests.aggregate(total=Sum('Index_weight'))[ + 'total'] or 0 + weight = weight / out_province if out_province > 0 else 0 + weight_all = quantity * weight + quantity = "{:,}".format(quantity) + weight_all = "{:,}".format(int(weight_all)) + + new_message_part = f'{m}:\n' + new_message_part += f"🟢 مرغدار : {poultry_name} ({poultry_mobile})\n" + new_message_part += f"شهر: {city}\n" + new_message_part += f"🔸 خریدار : {buyer_fullname} ({buyer_mobile})\n" + new_message_part += f"شهر: {buyer_city}\n" + new_message_part += f"میانگین وزن : {weight}\n" + new_message_part += f" تعداد : {quantity}\n" + new_message_part += f" وزن تقریبی : {weight_all}\n" + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + m += 1 + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + if chat_id_eitaa: + chat_id_eitaa = chat_id_eitaa.token + for message in messages: + data = { + 'chat_id': chat_id_eitaa, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + for message in messages: + data = { + 'chat_id': chat_id, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + return HttpResponse(f'{len(messages)} پیام ارسال شد.') + + +def transaction_for_eata(request, transaction): + if transaction.payer_type == 'poultry': + pass + else: + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + if base_url_for_sms_report == 'ma': + province = 'مرکزی' + elif base_url_for_sms_report == 'ha': + province = 'همدان' + elif base_url_for_sms_report == 'ku': + province = 'کردستان' + elif base_url_for_sms_report == 'bu': + province = 'بوشهر' + else: + province = 'تست' + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f' #گزارش_تراکنش_پرداختی #{date_shamsi}\n' + base_message += f' #استان_{province}\n\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + + from_date = jdatetime.date.fromgregorian( + year=transaction.date.year, + month=transaction.date.month, + day=transaction.date.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + date = separate.join(reversed_date) + union_share = "{:,}".format(transaction.union_share) + company_share = "{:,}".format(transaction.company_share) + guilds_share = "{:,}".format(transaction.guilds_share) + others_share = "{:,}".format(transaction.other_share) + amount = "{:,}".format(transaction.amount) + + if transaction.payer_type == 'kill_house': + if transaction.kill_house.killer == True and transaction.kill_house.type == 'exclusive': + parent = KillHousePercentage.objects.get(kill_house=transaction.kill_house, trash=False) + payer_type = f'کشتارکن اختصاصی {parent.kill_house_for_killer.name}' + elif transaction.kill_house.killer == True and transaction.kill_house.type == 'public': + payer_type = 'کشتارکن عمومی' + else: + payer_type = 'کشتارگاه' + payer_unit_name = transaction.kill_house.name + else: + payer_type = 'مرغدار' + payer_unit_name = transaction.poultry.unit_name + + new_message_part = f"🟢 پرداخت کننده : {transaction.payer_fullname}\n" + new_message_part += f"🟢 تلفن : {transaction.payer_mobile}\n" + new_message_part += f"🟢 ماهیت پرداخت کننده : {payer_type}\n" + new_message_part += f"🟢 نام واحد : {payer_unit_name}\n" + new_message_part += f"تاریخ پرداخت: {date}\n" + new_message_part += f"مبلغ کل تراکنش: {amount} ریال \n" + new_message_part += f"\n" + new_message_part += f"🔸 سهم اتحادیه مرغدارن : {union_share} ریال \n" + new_message_part += f"🔸 سهم شرکت : {company_share} ریال \n" + new_message_part += f"🔸 سهم صنف پروتئین : {guilds_share} ریال \n" + new_message_part += f"🔸 سهم دامپزشک : {others_share} ریال \n" + new_message_part += f"\n" + if base_url_for_sms_report == 'ma': + new_message_part += f"‼توجه: سهم صنف پروتئین به حساب اتحادیه مرغدارن واریز شد.‼" + else: + new_message_part += f"‼توجه: سهم صنف پروتئین و مسئول فنی فارم به حساب اتحادیه مرغدارن واریز شد.‼" + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + + for message in messages: + data = { + 'chat_id': chat_id_mali, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + return HttpResponse('ok') + + +def daily_cron_job_transaction_for_eata(): + total_wage_info = TotalWageInformation.objects.get(trash=False) + serializer = TotalWageInformationSerializer(total_wage_info).data + total_wage = "{:,}".format(int(serializer['wage_info']['total_wage'])) + total_unpaid_wage = "{:,}".format(int(serializer['wage_info']['total_unpaid_wage'])) + total_paid_wage = "{:,}".format(int(serializer['wage_info']['total_paid_wage'])) + + company_unpaid_wage = next( + (share["total_unpaid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "شرکت"), None) + company_total_unpaid_wage = "{:,}".format(int(company_unpaid_wage)) if company_unpaid_wage is not None else "0" + company_total_wage = next( + (share["total_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "شرکت"), None) + company_total_wage = "{:,}".format(int(company_total_wage)) if company_total_wage is not None else "0" + company_paid_wage = next( + (share["total_paid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "شرکت"), + None) + company_total_paid_wage = "{:,}".format(int(company_paid_wage)) if company_paid_wage is not None else "0" + + guilds_unpaid_wage = next( + (share["total_unpaid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "صنف پروتئین"), + None) + guilds_total_unpaid_wage = "{:,}".format(int(guilds_unpaid_wage)) if guilds_unpaid_wage is not None else "0" + guilds_wage = next( + (share["total_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "صنف پروتئین"), None) + guilds_total_wage = "{:,}".format(int(guilds_wage)) if guilds_wage is not None else "0" + + guilds_paid_wage = next( + (share["total_paid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "صنف پروتئین"), + None) + guilds_total_paid_wage = "{:,}".format(int(guilds_paid_wage)) if guilds_paid_wage is not None else "0" + + union_unpaid_wage = next( + (share["total_unpaid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "اتحادیه"), None) + union_total_unpaid_wage = "{:,}".format(int(union_unpaid_wage)) if union_unpaid_wage is not None else "0" + union_wage = next( + (share["total_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "اتحادیه"), None) + union_total_wage = "{:,}".format(int(union_wage)) if union_wage is not None else "0" + union_paid_wage = next( + (share["total_paid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "اتحادیه"), + None) + union_total_paid_wage = "{:,}".format(int(union_paid_wage)) if union_paid_wage is not None else "0" + + other_unpaid_wage = next( + (share["total_unpaid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "دامپزشک"), None) + other_total_unpaid_wage = "{:,}".format(int(other_unpaid_wage)) if other_unpaid_wage is not None else "0" + other_wage = next( + (share["total_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "دامپزشک"), None) + other_total_wage = "{:,}".format(int(other_wage)) if other_wage is not None else "0" + other_paid_wage = next( + (share["total_paid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "دامپزشک"), None) + other_total_paid_wage = "{:,}".format(int(other_paid_wage)) if other_paid_wage is not None else "0" + + date = datetime.now().date() + + url = f'https://eitaayar.ir/api/{token}/sendMessage' + + if base_url_for_sms_report == 'ma': + province = 'مرکزی' + elif base_url_for_sms_report == 'ha': + province = 'همدان' + elif base_url_for_sms_report == 'ku': + province = 'کردستان' + elif base_url_for_sms_report == 'bu': + province = 'بوشهر' + else: + province = 'تست' + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f' #اطلاعات_جامع_تعرفه #{date_shamsi}\n' + base_message += f' #استان_{province}\n\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + + union_share = union_total_paid_wage + company_share = company_total_paid_wage + guilds_share = guilds_total_paid_wage + other_share = other_total_paid_wage + + amount = total_paid_wage + + new_message_part = f"مجموع تعرفه: {total_wage} ریال \n" + new_message_part += f"مجموع پرداختی: {amount} ریال \n" + new_message_part += f"مجموع باقیمانده: {total_unpaid_wage} ریال \n" + new_message_part += f"\n" + new_message_part += f"🔸 کل سهم اتحادیه مرغدارن : {union_total_wage} ریال \n" + new_message_part += f"🔸واریزی سهم اتحادیه مرغدارن : {union_share} ریال \n" + new_message_part += f"🔸مانده سهم اتحادیه مرغدارن : {union_total_unpaid_wage} ریال \n" + new_message_part += f"\n" + new_message_part += f"🔹کل سهم شرکت : {company_total_wage} ریال \n" + new_message_part += f"🔹واریزی سهم شرکت : {company_share} ریال \n" + new_message_part += f"🔹مانده سهم شرکت : {company_total_unpaid_wage} ریال \n" + new_message_part += f"\n" + new_message_part += f"🔻 کل سهم صنف پروتئین : {guilds_total_wage} ریال \n" + new_message_part += f"🔻 واریزی سهم صنف پروتئین : {guilds_share} ریال \n" + new_message_part += f"🔻 مانده سهم صنف پروتئین : {guilds_total_unpaid_wage} ریال \n" + new_message_part += f"\n" + if base_url_for_sms_report == 'ma': + new_message_part += f"‼توجه: سهم صنف پروتئین به حساب اتحادیه مرغدارن واریز شد.‼" + else: + new_message_part += f"\n" + new_message_part += f"🔻 کل سهم دامپزشک : {other_total_wage} ریال \n" + new_message_part += f"🔻 واریزی سهم دامپزشک : {other_share} ریال \n" + new_message_part += f"🔻 مانده سهم دامپزشک : {other_total_unpaid_wage} ریال \n" + new_message_part += f"\n" + new_message_part += f"‼توجه: سهم صنف پروتئین و مسئول فنی فارم به حساب اتحادیه مرغدارن واریز شد.‼" + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + + for message in messages: + data = { + 'chat_id': chat_id_mali, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + +def bot_eitaa_for_bug_reporter(text): + token = "bot363954:e3d4dca2-f1b3-4f44-b5a9-d48aa11c79b8" + chat_id = 10473672 + url = f'https://eitaayar.ir/api/{token}/sendMessage' + t = f"\n" + t += f" {text['result']} \n" + t += f"\n" + t += f"\n" + t += f"عنوان خطا:" + t += f"\n" + t += f"\n" + t += f"{text['error_title']} \n" + t += f"\n" + t += f"\n" + t += f"پیغام خطا:" + t += f"\n" + t += f"\n" + t += f"{text['error_message']} \n" + t += f"\n" + t += f"\n" + t += f"توضیحات بیشتر:" + t += f"\n" + t += f"\n" + t += f"{text['error_traceback']} \n" + + data = { + 'chat_id': chat_id, + 'text': t, + } + response = requests.post(url, data=data, verify=False) + + +def daily_manual_transaction_for_eata(request): + total_wage_info = TotalWageInformation.objects.get(trash=False) + serializer = TotalWageInformationSerializer(total_wage_info).data + total_wage = "{:,}".format(int(serializer['wage_info']['total_wage'])) + total_unpaid_wage = "{:,}".format(int(serializer['wage_info']['total_unpaid_wage'])) + total_paid_wage = "{:,}".format(int(serializer['wage_info']['total_paid_wage'])) + + company_unpaid_wage = next( + (share["total_unpaid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "شرکت"), None) + company_total_unpaid_wage = "{:,}".format(int(company_unpaid_wage)) if company_unpaid_wage is not None else "0" + company_total_wage = next( + (share["total_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "شرکت"), None) + company_total_wage = "{:,}".format(int(company_total_wage)) if company_total_wage is not None else "0" + company_paid_wage = next( + (share["total_paid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "شرکت"), + None) + company_total_paid_wage = "{:,}".format(int(company_paid_wage)) if company_paid_wage is not None else "0" + + guilds_unpaid_wage = next( + (share["total_unpaid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "صنف پروتئین"), + None) + guilds_total_unpaid_wage = "{:,}".format(int(guilds_unpaid_wage)) if guilds_unpaid_wage is not None else "0" + guilds_wage = next( + (share["total_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "صنف پروتئین"), None) + guilds_total_wage = "{:,}".format(int(guilds_wage)) if guilds_wage is not None else "0" + + guilds_paid_wage = next( + (share["total_paid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "صنف پروتئین"), + None) + guilds_total_paid_wage = "{:,}".format(int(guilds_paid_wage)) if guilds_paid_wage is not None else "0" + + union_unpaid_wage = next( + (share["total_unpaid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "اتحادیه"), None) + union_total_unpaid_wage = "{:,}".format(int(union_unpaid_wage)) if union_unpaid_wage is not None else "0" + union_wage = next( + (share["total_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "اتحادیه"), None) + union_total_wage = "{:,}".format(int(union_wage)) if union_wage is not None else "0" + union_paid_wage = next( + (share["total_paid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "اتحادیه"), + None) + union_total_paid_wage = "{:,}".format(int(union_paid_wage)) if union_paid_wage is not None else "0" + + other_unpaid_wage = next( + (share["total_unpaid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "دامپزشک"), None) + other_total_unpaid_wage = "{:,}".format(int(other_unpaid_wage)) if other_unpaid_wage is not None else "0" + other_wage = next( + (share["total_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "دامپزشک"), None) + other_total_wage = "{:,}".format(int(other_wage)) if other_wage is not None else "0" + other_paid_wage = next( + (share["total_paid_wage"] for share in serializer['wage_info']['shares'] if share["name"] == "دامپزشک"), None) + other_total_paid_wage = "{:,}".format(int(other_paid_wage)) if other_paid_wage is not None else "0" + + date = datetime.now().date() + + url = f'https://eitaayar.ir/api/{token}/sendMessage' + + if base_url_for_sms_report == 'ma': + province = 'مرکزی' + elif base_url_for_sms_report == 'ha': + province = 'همدان' + elif base_url_for_sms_report == 'ku': + province = 'کردستان' + elif base_url_for_sms_report == 'bu': + province = 'بوشهر' + else: + province = 'تست' + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f' #اطلاعات_جامع_تعرفه #{date_shamsi}\n' + base_message += f' #استان_{province}\n\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + + union_share = union_total_paid_wage + company_share = company_total_paid_wage + guilds_share = guilds_total_paid_wage + other_share = other_total_paid_wage + + amount = total_paid_wage + + new_message_part = f"مجموع تعرفه: {total_wage} ریال \n" + new_message_part += f"مجموع پرداختی: {amount} ریال \n" + new_message_part += f"مجموع باقیمانده: {total_unpaid_wage} ریال \n" + new_message_part += f"\n" + new_message_part += f"🔸 کل سهم اتحادیه مرغدارن : {union_total_wage} ریال \n" + new_message_part += f"🔸واریزی سهم اتحادیه مرغدارن : {union_share} ریال \n" + new_message_part += f"🔸مانده سهم اتحادیه مرغدارن : {union_total_unpaid_wage} ریال \n" + new_message_part += f"\n" + new_message_part += f"🔹کل سهم شرکت : {company_total_wage} ریال \n" + new_message_part += f"🔹واریزی سهم شرکت : {company_share} ریال \n" + new_message_part += f"🔹مانده سهم شرکت : {company_total_unpaid_wage} ریال \n" + new_message_part += f"\n" + new_message_part += f"🔻 کل سهم صنف پروتئین : {guilds_total_wage} ریال \n" + new_message_part += f"🔻 واریزی سهم صنف پروتئین : {guilds_share} ریال \n" + new_message_part += f"🔻 مانده سهم صنف پروتئین : {guilds_total_unpaid_wage} ریال \n" + new_message_part += f"\n" + if base_url_for_sms_report == 'ma': + new_message_part += f"‼توجه: سهم صنف پروتئین به حساب اتحادیه مرغدارن واریز شد.‼" + else: + new_message_part += f"\n" + new_message_part += f"🔻 کل سهم دامپزشک : {other_total_wage} ریال \n" + new_message_part += f"🔻 واریزی سهم دامپزشک : {other_share} ریال \n" + new_message_part += f"🔻 مانده سهم دامپزشک : {other_total_unpaid_wage} ریال \n" + new_message_part += f"\n" + new_message_part += f"‼توجه: سهم صنف پروتئین و مسئول فنی فارم به حساب اتحادیه مرغدارن واریز شد.‼" + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + + for message in messages: + data = { + 'chat_id': chat_id_mali, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + return HttpResponse('ok') + + +def transaction_for_eata_new(request): + transactions = InternalTransaction.objects.filter(trash=False, status='completed', date__date=datetime.now().date()) + for transaction in transactions: + if transaction.payer_type == 'poultry': + pass + else: + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + if base_url_for_sms_report == 'ma': + province = 'مرکزی' + elif base_url_for_sms_report == 'ha': + province = 'همدان' + elif base_url_for_sms_report == 'ku': + province = 'کردستان' + elif base_url_for_sms_report == 'bu': + province = 'بوشهر' + else: + province = 'تست' + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f' #گزارش_تراکنش_پرداختی #{date_shamsi}\n' + base_message += f' #استان_{province}\n\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + + from_date = jdatetime.date.fromgregorian( + year=transaction.date.year, + month=transaction.date.month, + day=transaction.date.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + date = separate.join(reversed_date) + union_share = "{:,}".format(transaction.union_share) + company_share = "{:,}".format(transaction.company_share) + guilds_share = "{:,}".format(transaction.guilds_share) + others_share = "{:,}".format(transaction.other_share) + amount = "{:,}".format(transaction.amount) + + if transaction.payer_type == 'kill_house': + if transaction.kill_house.killer == True and transaction.kill_house.type == 'exclusive': + parent = KillHousePercentage.objects.get(kill_house=transaction.kill_house, trash=False) + payer_type = f'کشتارکن اختصاصی {parent.kill_house_for_killer.name}' + elif transaction.kill_house.killer == True and transaction.kill_house.type == 'public': + payer_type = 'کشتارکن عمومی' + else: + payer_type = 'کشتارگاه' + payer_unit_name = transaction.kill_house.name + else: + payer_type = 'مرغدار' + payer_unit_name = transaction.poultry.unit_name + + new_message_part = f"🟢 پرداخت کننده : {transaction.payer_fullname}\n" + new_message_part += f"🟢 تلفن : {transaction.payer_mobile}\n" + new_message_part += f"🟢 ماهیت پرداخت کننده : {payer_type}\n" + new_message_part += f"🟢 نام واحد : {payer_unit_name}\n" + new_message_part += f"تاریخ پرداخت: {date}\n" + new_message_part += f"مبلغ کل تراکنش: {amount} ریال \n" + new_message_part += f"\n" + new_message_part += f"🔸 سهم اتحادیه مرغدارن : {union_share} ریال \n" + new_message_part += f"🔸 سهم شرکت : {company_share} ریال \n" + new_message_part += f"🔸 سهم صنف پروتئین : {guilds_share} ریال \n" + new_message_part += f"🔸 سهم دامپزشک : {others_share} ریال \n" + new_message_part += f"\n" + if base_url_for_sms_report == 'ma': + new_message_part += f"‼توجه: سهم صنف پروتئین به حساب اتحادیه مرغدارن واریز شد.‼" + else: + new_message_part += f"‼توجه: سهم صنف پروتئین و مسئول فنی فارم به حساب اتحادیه مرغدارن واریز شد.‼" + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + + for message in messages: + data = { + 'chat_id': chat_id_mali, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + return HttpResponse('ok') + + +def daily_report_for_each_vet_farm_manual(request): + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + url = f'https://eitaayar.ir/api/{token}/sendMessage' + today = datetime.now().date() + date_time_jalali = format_datetime_to_shamsi(today) + date_shamsi = shamsi_date(date1).replace('-', '_') + date_shamsi2 = shamsi_date(date2).replace('-', '_') + + vet_tokens = list( + TokenEitaaForEachVet.objects + .all() + .only("vet_mobile", "token") + .values_list('vet_mobile', flat=True) + .distinct() + ) + if not vet_tokens: + return HttpResponse('no vets') + + vet_farms_qs = VetFarm.objects.filter(trash=False, vet__user__mobile__in=vet_tokens) \ + .only("id", "vet__user__mobile", "poultry__id") + + poultry_qs = Poultry.objects.filter(trash=False, id__in=vet_farms_qs.values_list('poultry__id', flat=True)) \ + .only("id", "unit_name", "breeding_unique_id") + + poultry_map = {p.id: p.breeding_unique_id for p in poultry_qs} + poultry_breeding_ids = set(poultry_map.values()) + + vet_farm_pairs = list(vet_farms_qs.values_list('vet__user__mobile', 'poultry__id')) + breeding_to_vets = {} + for vet_mobile, poultry_id in vet_farm_pairs: + breeding = poultry_map.get(poultry_id) + if breeding: + breeding_to_vets.setdefault(breeding, set()).add(vet_mobile) + + kill_request_qs = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultry_qs + ).only( + "bar_code", "accepted_real_quantity", "clearance_code", "quarantine_quantity", + "quarantine_code_state", + "kill_request__recive_date", + "killhouse_user__name", + "province_request__poultry_request__poultry__unit_name", + ) + + poultry_request_out_qs = PoultryRequest.objects.filter( + trash=False, + out=True, + send_date__date__gte=date1, + send_date__date__lte=date2, + poultry__in=poultry_qs + ).only( + "order_code", "quantity", "send_date", "quarantine_code", + "buyer_fullname", "buyer_province", "buyer_city", + "poultry__unit_name" + ) + + kill_house_request_code_quarantine = list(kill_request_qs.values_list('clearance_code', flat=True).distinct()) + kill_house_free_sale = list(poultry_request_out_qs.filter(quarantine_code__isnull=False) + .values_list('quarantine_code', flat=True).distinct()) + result = list(filter(None, kill_house_request_code_quarantine)) + list(filter(None, kill_house_free_sale)) + + rsi_url = ( + f'https://rsibackend.rasadyar.com/app/send_different_bar/?province={base_url_for_sms_report}' + f'&date1={date1}&date2={date2}' + ) + try: + rsi_resp = requests.post(rsi_url, json=result, headers={'Content-Type': 'application/json'}) + rsi_data = rsi_resp.json() if rsi_resp.status_code == 200 else [] + except Exception: + rsi_data = [] + + diffrent_rsi_by_vet = {vet: {'in': [], 'out': []} for vet in vet_tokens} + + for data in rsi_data: + try: + part_code = data['hatching']['poultry']['PartIdCode'] + except Exception: + continue + if part_code not in breeding_to_vets: + continue + date_str = str(data.get('Date', '')).split('T')[0] + try: + date_n = datetime.strptime(date_str, '%Y-%m-%d').date() + except Exception: + continue + + info = 'کد قرنطینه: {0} - حجم: {1} قطعه-مرغدار:{2} - مقصد بار: {3} - تاریخ بار: ({4})'.format( + data.get('TrackingCode', ''), + to_locale_str(int(data.get('GoodAmount', 0))), + data.get('hatching', {}).get('poultry', {}).get('UnitName', ''), + data.get('DesUnitName', ''), + shamsi_date(date_n), + ) + vets_for_part = breeding_to_vets.get(part_code, set()) + for v in vets_for_part: + if data.get('Out') is False: + diffrent_rsi_by_vet[v]['in'].append(info) + else: + diffrent_rsi_by_vet[v]['out'].append(info) + + for vet_mobile in vet_tokens: + vet_specific_farms_qs = vet_farms_qs.filter(vet__user__mobile=vet_mobile) + if not vet_specific_farms_qs.exists(): + continue + + vet_poultry_ids = list(vet_specific_farms_qs.values_list('poultry__id', flat=True).distinct()) + + vet_kill_request = kill_request_qs.filter( + province_request__poultry_request__poultry__in=vet_poultry_ids + ) + vet_poultry_request_out = poultry_request_out_qs.filter(poultry__in=vet_poultry_ids) + + base_message = ( + '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + f'❗{date_time_jalali}❗\n' + f' #گزارش_بارهای_فاقد_مجوز_از_تاریخ_{date_shamsi}_تا_تاریخ_{date_shamsi2} #\n\n' + f'➖➖➖➖➖➖➖➖➖➖\n' + ) + current_message = base_message + messages = [] + + def _add_text(txt): + nonlocal current_message, messages, base_message + if not txt: + return + if len(current_message) + len(txt) > 4000: + messages.append(current_message) + current_message = base_message + current_message += txt + + in_has_code_qs = vet_kill_request.filter(clearance_code__isnull=False) + in_no_code_qs = vet_kill_request.filter(clearance_code__isnull=True) + in_has_code_count = in_has_code_qs.count() + in_no_code_count = in_no_code_qs.count() + + base_vet_message = 'دامپزشک محترم فارم({0}) گزارش عملکرد بارها به شرح زیر میباشد:\n'.format( + vet_specific_farms_qs.first() + .vet.user.fullname if vet_specific_farms_qs.first() else '-') + _add_text(base_vet_message) + bars_info = [] + for kill_req in in_no_code_qs: + try: + unit_name = kill_req.province_request.poultry_request.poultry.unit_name + except Exception: + unit_name = '' + bars_info.append( + 'کد بار: {0} - حجم: {1} قطعه-مرغدار:{4} - مقصد بار: {2} - تاریخ بار: ({3})'.format( + kill_req.bar_code, + to_locale_str(int(kill_req.accepted_real_quantity or 0)), + getattr(kill_req.killhouse_user, 'name', ''), + shamsi_date(kill_req.kill_request.recive_date) if getattr(kill_req.kill_request, 'recive_date', + None) else '', + unit_name + ) + ) + bars_details = "\n".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + diffrent_bars_info = [] + diffrent_qs = in_has_code_qs.filter(~Q(quarantine_quantity=F('quantity'))) + for kill_req in diffrent_qs: + if kill_req.quarantine_quantity: + quarantine_quantity = to_locale_str(int(kill_req.quarantine_quantity)) + diffrent_quantity = to_locale_str( + int(kill_req.quarantine_quantity) - int(kill_req.accepted_real_quantity)) + else: + state = getattr(kill_req, 'quarantine_code_state', None) + if state == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif state == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif state == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + else: + quarantine_quantity = 'ادغام' + diffrent_quantity = 0 + diffrent_bars_info.append( + 'کد بار: {0} - حجم: {1} قطعه-مرغدار:{4} - کد قرنطینه: {2} - استعلام از قرنطینه: ({3})-اختلاف:{6}- تاریخ بار: ({5})'.format( + kill_req.bar_code, + to_locale_str(int(kill_req.accepted_real_quantity or 0)), + kill_req.clearance_code or '', + quarantine_quantity, + getattr(kill_req.province_request.poultry_request.poultry, 'unit_name', ''), + shamsi_date(kill_req.kill_request.recive_date) if getattr(kill_req.kill_request, 'recive_date', + None) else '', + diffrent_quantity + ) + ) + diffrent_bars_details = "\n".join([f"{i + 1}. {info}" for i, info in enumerate(diffrent_bars_info)]) + + new_message_part_in = '❗❗ - تعداد بارهای داخل استان دارای مجوز قرنطینه {0} عدد و تعداد بار های فاقد مجوز {1} عدد میباشد.\n\n'.format( + in_has_code_count, in_no_code_count + ) + if bars_info: + new_message_part_in += "بارهای داخل استان فاقد قرنطینه به شرح زیر میباشد:\n" + new_message_part_in += f"{bars_details}\n" + new_message_part_in += "--------------------------------\n" + if diffrent_bars_info: + new_message_part_in += "از بارهای داخل استان دارای مجوز تعداد {} بار دارای مغایرت در داده هستند:\n".format( + diffrent_qs.count()) + new_message_part_in += f"{diffrent_bars_details}\n" + new_message_part_in += "--------------------------------\n" + + rsi_in_list = diffrent_rsi_by_vet.get(vet_mobile, {}).get('in', []) + if rsi_in_list: + new_message_part_in += "با توجه به رصد هوش مصنوعی سامانه تعداد {} بار داخل استان در سامانه رصدیار ثبت نشده است:\n".format( + len(rsi_in_list)) + new_message_part_in += "\n".join([f"{i + 1}. {it}" for i, it in enumerate(rsi_in_list)]) + new_message_part_in += "\n--------------------------------\n" + + new_message_part_in += "\n➖➖➖➖➖➖➖➖➖➖\n" + + _add_text(new_message_part_in) + + out_has_code_count = vet_poultry_request_out.filter(quarantine_code__isnull=False).count() + out_no_code_qs = vet_poultry_request_out.filter(quarantine_code__isnull=True) + out_no_code_count = out_no_code_qs.count() + + bars_info_out = [] + for poultry_req in out_no_code_qs: + bars_info_out.append( + 'کد سفارش: {0} - حجم: {1} قطعه-مرغدار:{4} - خریدار: {2} - استان خریدار:{5} - شهر خریدار:{6} - تاریخ بار: ({3})'.format( + poultry_req.order_code, + to_locale_str(int(poultry_req.quantity or 0)), + poultry_req.buyer_fullname or '', + shamsi_date(poultry_req.send_date) if getattr(poultry_req, 'send_date', None) else '', + getattr(poultry_req.poultry, 'unit_name', ''), + poultry_req.buyer_province or '', + poultry_req.buyer_city or '', + ) + ) + bars_details_out = "\n".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info_out)]) + + new_message_part_out = '❗❗ - تعداد بارهای خارج استان دارای مجوز قرنطینه {0} عدد و تعداد بار های فاقد مجوز {1} عدد میباشد.\n\n'.format( + out_has_code_count, out_no_code_count + ) + if bars_info_out: + new_message_part_out += "بارهای خارج استان فاقد قرنطینه به شرح زیر میباشد:\n" + new_message_part_out += f"{bars_details_out}\n" + new_message_part_out += "--------------------------------\n" + + rsi_out_list = diffrent_rsi_by_vet.get(vet_mobile, {}).get('out', []) + if rsi_out_list: + new_message_part_out += "با توجه به رصد هوش مصنوعی سامانه تعداد {} بار خارج استان در سامانه رصدیار ثبت نشده است:\n".format( + len(rsi_out_list)) + new_message_part_out += "\n".join([f"{i + 1}. {it}" for i, it in enumerate(rsi_out_list)]) + new_message_part_out += "\n--------------------------------\n" + + new_message_part_out += "\n➖➖➖➖➖➖➖➖➖➖\n" + + _add_text(new_message_part_out) + + if current_message and current_message != base_message: + messages.append(current_message) + + chat_token = TokenEitaaForEachVet.objects.filter(vet_mobile=vet_mobile).values_list('token', flat=True).first() + if chat_token and messages: + for message in messages: + try: + requests.post(url, data={'chat_id': chat_token, 'text': message}, verify=False) + except Exception: + pass + for message in messages: + data = { + 'chat_id': chat_id, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + return HttpResponse('ok') + + +def daily_report_for_each_vet_farm_cron(): + today = datetime.now().date() - timedelta(days=1) + + date1 = today + date2 = today + + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date_time_jalali = format_datetime_to_shamsi(today) + date_shamsi = shamsi_date(date1).replace('-', '_') + date_shamsi2 = shamsi_date(date2).replace('-', '_') + + vet_tokens = list( + TokenEitaaForEachVet.objects + .all() + .only("vet_mobile", "token") + .values_list('vet_mobile', flat=True) + .distinct() + ) + if not vet_tokens: + return HttpResponse('no vets') + + vet_farms_qs = VetFarm.objects.filter(trash=False, vet__user__mobile__in=vet_tokens) \ + .only("id", "vet__user__mobile", "poultry__id") + + poultry_qs = Poultry.objects.filter(trash=False, id__in=vet_farms_qs.values_list('poultry__id', flat=True)) \ + .only("id", "unit_name", "breeding_unique_id") + + poultry_map = {p.id: p.breeding_unique_id for p in poultry_qs} + poultry_breeding_ids = set(poultry_map.values()) + + vet_farm_pairs = list(vet_farms_qs.values_list('vet__user__mobile', 'poultry__id')) + breeding_to_vets = {} + for vet_mobile, poultry_id in vet_farm_pairs: + breeding = poultry_map.get(poultry_id) + if breeding: + breeding_to_vets.setdefault(breeding, set()).add(vet_mobile) + + kill_request_qs = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultry_qs + ).only( + "bar_code", "accepted_real_quantity", "clearance_code", "quarantine_quantity", + "quarantine_code_state", + "kill_request__recive_date", + "killhouse_user__name", + "province_request__poultry_request__poultry__unit_name", + ) + + poultry_request_out_qs = PoultryRequest.objects.filter( + trash=False, + out=True, + send_date__date__gte=date1, + send_date__date__lte=date2, + poultry__in=poultry_qs + ).only( + "order_code", "quantity", "send_date", "quarantine_code", + "buyer_fullname", "buyer_province", "buyer_city", + "poultry__unit_name" + ) + + kill_house_request_code_quarantine = list(kill_request_qs.values_list('clearance_code', flat=True).distinct()) + kill_house_free_sale = list(poultry_request_out_qs.filter(quarantine_code__isnull=False) + .values_list('quarantine_code', flat=True).distinct()) + result = list(filter(None, kill_house_request_code_quarantine)) + list(filter(None, kill_house_free_sale)) + + rsi_url = ( + f'https://rsibackend.rasadyar.com/app/send_different_bar/?province={base_url_for_sms_report}' + f'&date1={date1}&date2={date2}' + ) + try: + rsi_resp = requests.post(rsi_url, json=result, headers={'Content-Type': 'application/json'}) + rsi_data = rsi_resp.json() if rsi_resp.status_code == 200 else [] + except Exception: + rsi_data = [] + + diffrent_rsi_by_vet = {vet: {'in': [], 'out': []} for vet in vet_tokens} + + for data in rsi_data: + try: + part_code = data['hatching']['poultry']['PartIdCode'] + except Exception: + continue + if part_code not in breeding_to_vets: + continue + date_str = str(data.get('Date', '')).split('T')[0] + try: + date_n = datetime.strptime(date_str, '%Y-%m-%d').date() + except Exception: + continue + + info = 'کد قرنطینه: {0} - حجم: {1} قطعه-مرغدار:{2} - مقصد بار: {3} - تاریخ بار: ({4})'.format( + data.get('TrackingCode', ''), + to_locale_str(int(data.get('GoodAmount', 0))), + data.get('hatching', {}).get('poultry', {}).get('UnitName', ''), + data.get('DesUnitName', ''), + shamsi_date(date_n), + ) + vets_for_part = breeding_to_vets.get(part_code, set()) + for v in vets_for_part: + if data.get('Out') is False: + diffrent_rsi_by_vet[v]['in'].append(info) + else: + diffrent_rsi_by_vet[v]['out'].append(info) + + for vet_mobile in vet_tokens: + vet_specific_farms_qs = vet_farms_qs.filter(vet__user__mobile=vet_mobile) + if not vet_specific_farms_qs.exists(): + continue + + vet_poultry_ids = list(vet_specific_farms_qs.values_list('poultry__id', flat=True).distinct()) + + vet_kill_request = kill_request_qs.filter( + province_request__poultry_request__poultry__in=vet_poultry_ids + ) + vet_poultry_request_out = poultry_request_out_qs.filter(poultry__in=vet_poultry_ids) + + base_message = ( + '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + f'❗{date_time_jalali}❗\n' + f' #گزارش_بارهای_فاقد_مجوز_از_تاریخ_{date_shamsi}_تا_تاریخ_{date_shamsi2} #\n\n' + f'➖➖➖➖➖➖➖➖➖➖\n' + ) + current_message = base_message + messages = [] + + def _add_text(txt): + nonlocal current_message, messages, base_message + if not txt: + return + if len(current_message) + len(txt) > 4000: + messages.append(current_message) + current_message = base_message + current_message += txt + + in_has_code_qs = vet_kill_request.filter(clearance_code__isnull=False) + in_no_code_qs = vet_kill_request.filter(clearance_code__isnull=True) + in_has_code_count = in_has_code_qs.count() + in_no_code_count = in_no_code_qs.count() + + base_vet_message = 'دامپزشک محترم فارم({0}) گزارش عملکرد بارها به شرح زیر میباشد:\n'.format( + vet_specific_farms_qs.first() + .vet.user.fullname if vet_specific_farms_qs.first() else '-') + _add_text(base_vet_message) + bars_info = [] + for kill_req in in_no_code_qs: + try: + unit_name = kill_req.province_request.poultry_request.poultry.unit_name + except Exception: + unit_name = '' + bars_info.append( + 'کد بار: {0} - حجم: {1} قطعه-مرغدار:{4} - مقصد بار: {2} - تاریخ بار: ({3})'.format( + kill_req.bar_code, + to_locale_str(int(kill_req.accepted_real_quantity or 0)), + getattr(kill_req.killhouse_user, 'name', ''), + shamsi_date(kill_req.kill_request.recive_date) if getattr(kill_req.kill_request, 'recive_date', + None) else '', + unit_name + ) + ) + bars_details = "\n".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + + diffrent_bars_info = [] + diffrent_qs = in_has_code_qs.filter(~Q(quarantine_quantity=F('quantity'))) + for kill_req in diffrent_qs: + if kill_req.quarantine_quantity: + quarantine_quantity = to_locale_str(int(kill_req.quarantine_quantity)) + diffrent_quantity = to_locale_str( + int(kill_req.quarantine_quantity) - int(kill_req.accepted_real_quantity)) + else: + state = getattr(kill_req, 'quarantine_code_state', None) + if state == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif state == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif state == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + else: + quarantine_quantity = 'ادغام' + diffrent_quantity = 0 + diffrent_bars_info.append( + 'کد بار: {0} - حجم: {1} قطعه-مرغدار:{4} - کد قرنطینه: {2} - استعلام از قرنطینه: ({3})-اختلاف:{6}- تاریخ بار: ({5})'.format( + kill_req.bar_code, + to_locale_str(int(kill_req.accepted_real_quantity or 0)), + kill_req.clearance_code or '', + quarantine_quantity, + getattr(kill_req.province_request.poultry_request.poultry, 'unit_name', ''), + shamsi_date(kill_req.kill_request.recive_date) if getattr(kill_req.kill_request, 'recive_date', + None) else '', + diffrent_quantity + ) + ) + diffrent_bars_details = "\n".join([f"{i + 1}. {info}" for i, info in enumerate(diffrent_bars_info)]) + + new_message_part_in = '❗❗ - تعداد بارهای داخل استان دارای مجوز قرنطینه {0} عدد و تعداد بار های فاقد مجوز {1} عدد میباشد.\n\n'.format( + in_has_code_count, in_no_code_count + ) + if bars_info: + new_message_part_in += "بارهای داخل استان فاقد قرنطینه به شرح زیر میباشد:\n" + new_message_part_in += f"{bars_details}\n" + new_message_part_in += "--------------------------------\n" + if diffrent_bars_info: + new_message_part_in += "از بارهای داخل استان دارای مجوز تعداد {} بار دارای مغایرت در داده هستند:\n".format( + diffrent_qs.count()) + new_message_part_in += f"{diffrent_bars_details}\n" + new_message_part_in += "--------------------------------\n" + + rsi_in_list = diffrent_rsi_by_vet.get(vet_mobile, {}).get('in', []) + if rsi_in_list: + new_message_part_in += "با توجه به رصد هوش مصنوعی سامانه تعداد {} بار داخل استان در سامانه رصدیار ثبت نشده است:\n".format( + len(rsi_in_list)) + new_message_part_in += "\n".join([f"{i + 1}. {it}" for i, it in enumerate(rsi_in_list)]) + new_message_part_in += "\n--------------------------------\n" + + new_message_part_in += "\n➖➖➖➖➖➖➖➖➖➖\n" + + _add_text(new_message_part_in) + + out_has_code_count = vet_poultry_request_out.filter(quarantine_code__isnull=False).count() + out_no_code_qs = vet_poultry_request_out.filter(quarantine_code__isnull=True) + out_no_code_count = out_no_code_qs.count() + + bars_info_out = [] + for poultry_req in out_no_code_qs: + bars_info_out.append( + 'کد سفارش: {0} - حجم: {1} قطعه-مرغدار:{4} - خریدار: {2} - استان خریدار:{5} - شهر خریدار:{6} - تاریخ بار: ({3})'.format( + poultry_req.order_code, + to_locale_str(int(poultry_req.quantity or 0)), + poultry_req.buyer_fullname or '', + shamsi_date(poultry_req.send_date) if getattr(poultry_req, 'send_date', None) else '', + getattr(poultry_req.poultry, 'unit_name', ''), + poultry_req.buyer_province or '', + poultry_req.buyer_city or '', + ) + ) + bars_details_out = "\n".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info_out)]) + + new_message_part_out = '❗❗ - تعداد بارهای خارج استان دارای مجوز قرنطینه {0} عدد و تعداد بار های فاقد مجوز {1} عدد میباشد.\n\n'.format( + out_has_code_count, out_no_code_count + ) + if bars_info_out: + new_message_part_out += "بارهای خارج استان فاقد قرنطینه به شرح زیر میباشد:\n" + new_message_part_out += f"{bars_details_out}\n" + new_message_part_out += "--------------------------------\n" + + rsi_out_list = diffrent_rsi_by_vet.get(vet_mobile, {}).get('out', []) + if rsi_out_list: + new_message_part_out += "با توجه به رصد هوش مصنوعی سامانه تعداد {} بار خارج استان در سامانه رصدیار ثبت نشده است:\n".format( + len(rsi_out_list)) + new_message_part_out += "\n".join([f"{i + 1}. {it}" for i, it in enumerate(rsi_out_list)]) + new_message_part_out += "\n--------------------------------\n" + + new_message_part_out += "\n➖➖➖➖➖➖➖➖➖➖\n" + + _add_text(new_message_part_out) + + if current_message and current_message != base_message: + messages.append(current_message) + + chat_token = TokenEitaaForEachVet.objects.filter(vet_mobile=vet_mobile).values_list('token', flat=True).first() + if chat_token and messages: + for message in messages: + try: + requests.post(url, data={'chat_id': chat_token, 'text': message}, verify=False) + except Exception: + pass + for message in messages: + data = { + 'chat_id': chat_id, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + +def send_all_bar_to_eitaa(request): + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + + all_kill_house_requests = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date=date + ).select_related( + 'province_request__poultry_request__poultry__user__city', + 'kill_request__kill_house__kill_house_operator__user', + 'kill_request__kill_house__system_address__city', + 'add_car__driver' + ) + + poultry_ids = all_kill_house_requests.values_list( + 'province_request__poultry_request__poultry__id', + flat=True + ).distinct() + + vet_farms = VetFarm.objects.filter( + trash=False, + poultry__id__in=poultry_ids + ).select_related('vet__user', 'poultry') + + vet_to_poultries = {} + for vet_farm in vet_farms: + vet_mobile = vet_farm.vet.user.mobile + if vet_mobile not in vet_to_poultries: + vet_to_poultries[vet_mobile] = [] + vet_to_poultries[vet_mobile].append(vet_farm.poultry.id) + + if not vet_to_poultries: + return HttpResponse('هیچ دامپزشکی یافت نشد.') + + for vet_mobile, poultry_list in vet_to_poultries.items(): + chat_id_eitaa = TokenEitaaForEachVet.objects.filter(vet_mobile=vet_mobile).first() + + if not chat_id_eitaa: + continue + + vet_kill_requests = all_kill_house_requests.filter( + province_request__poultry_request__poultry__id__in=poultry_list + ) + + if not vet_kill_requests.exists(): + continue + + date_time_jalali = format_datetime_to_shamsi(date) + date_shamsi = shamsi_date(date).replace('-', '_') + + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_بارها #{date_shamsi}\n\n' + base_message += f'تعداد کل بارها: {vet_kill_requests.count()}\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + m = 1 + + for entry in vet_kill_requests: + try: + main_quantity = entry.accepted_real_quantity + real_weight = entry.accepted_real_weight + poultry_name = entry.province_request.poultry_request.poultry.unit_name + poultry_mobile = entry.province_request.poultry_request.poultry.user.mobile + + city = entry.province_request.poultry_request.poultry.user.city.name + buyer = entry.kill_request.kill_house.name + buyer_city = entry.kill_request.kill_house.system_address.city.name + buyer_mobile = entry.kill_request.kill_house.kill_house_operator.user.mobile + weight = entry.province_request.poultry_request.Index_weight + order_code = entry.bar_code + recive_date = entry.kill_request.recive_date + recive_date_shamsi = shamsi_date(recive_date) if recive_date else '' + main_quantity = "{:,}".format(int(main_quantity)) + real_weight = "{:,}".format(int(real_weight)) + + driver_name = '-' + driver_mobile = '-' + driver_pelak = '-' + driver_health_code = '-' + if entry.add_car and entry.add_car.driver: + driver_name = entry.add_car.driver.driver_name or '-' + driver_mobile = entry.add_car.driver.driver_mobile or '-' + driver_pelak = entry.add_car.driver.pelak or '-' + driver_health_code = entry.add_car.driver.health_code or '-' + + if entry.province_request.poultry_request.direct_buying == True: + province_type = 'خرید مستقیم' + elif entry.province_request.poultry_request.export == True: + province_type = 'فروش به خارج استان' + else: + province_type = 'اتحادیه' + + driver_info = f' - راننده: {driver_name} ({driver_mobile}) پلاک: {driver_pelak} کد حمل: {driver_health_code}' + + new_message_part = f'{m}. کد بار: {order_code} - حجم بار: {main_quantity} قطعه - وزن بار: {real_weight} - میانگین وزن: {weight} - مرغدار: {poultry_name} ({poultry_mobile}) - شهر: {city} - نوع فروش: {province_type} - خریدار: {buyer} ({buyer_mobile}) - شهر خریدار: {buyer_city}{driver_info} - تاریخ بار: ({recive_date_shamsi})\n\n' + m += 1 + + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + except Exception as e: + continue + + if current_message and current_message != base_message: + messages.append(current_message) + + chat_id_eitaa_token = chat_id_eitaa.token + for message in messages: + try: + data = { + 'chat_id': chat_id_eitaa_token, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + except Exception: + pass + + return HttpResponse('پیام‌ها ارسال شد.') + + +def send_all_bar_to_eitaa_cron(): + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + + all_kill_house_requests = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date=date + ).select_related( + 'province_request__poultry_request__poultry__user__city', + 'kill_request__kill_house__kill_house_operator__user', + 'kill_request__kill_house__system_address__city', + 'add_car__driver' + ) + + poultry_ids = all_kill_house_requests.values_list( + 'province_request__poultry_request__poultry__id', + flat=True + ).distinct() + + vet_farms = VetFarm.objects.filter( + trash=False, + poultry__id__in=poultry_ids + ).select_related('vet__user', 'poultry') + + vet_to_poultries = {} + for vet_farm in vet_farms: + vet_mobile = vet_farm.vet.user.mobile + if vet_mobile not in vet_to_poultries: + vet_to_poultries[vet_mobile] = [] + vet_to_poultries[vet_mobile].append(vet_farm.poultry.id) + + if not vet_to_poultries: + return + + for vet_mobile, poultry_list in vet_to_poultries.items(): + chat_id_eitaa = TokenEitaaForEachVet.objects.filter(vet_mobile=vet_mobile).first() + + if not chat_id_eitaa: + continue + + vet_kill_requests = all_kill_house_requests.filter( + province_request__poultry_request__poultry__id__in=poultry_list + ) + + if not vet_kill_requests.exists(): + continue + + date_time_jalali = format_datetime_to_shamsi(date) + date_shamsi = shamsi_date(date).replace('-', '_') + + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_بارها #{date_shamsi}\n\n' + base_message += f'تعداد کل بارها: {vet_kill_requests.count()}\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + m = 1 + + for entry in vet_kill_requests: + try: + main_quantity = entry.accepted_real_quantity + real_weight = entry.accepted_real_weight + poultry_name = entry.province_request.poultry_request.poultry.unit_name + poultry_mobile = entry.province_request.poultry_request.poultry.user.mobile + + city = entry.province_request.poultry_request.poultry.user.city.name + buyer = entry.kill_request.kill_house.name + buyer_city = entry.kill_request.kill_house.system_address.city.name + buyer_mobile = entry.kill_request.kill_house.kill_house_operator.user.mobile + weight = entry.province_request.poultry_request.Index_weight + order_code = entry.bar_code + recive_date = entry.kill_request.recive_date + recive_date_shamsi = shamsi_date(recive_date) if recive_date else '' + main_quantity = "{:,}".format(int(main_quantity)) + real_weight = "{:,}".format(int(real_weight)) + + driver_name = '-' + driver_mobile = '-' + driver_pelak = '-' + driver_health_code = '-' + if entry.add_car and entry.add_car.driver: + driver_name = entry.add_car.driver.driver_name or '-' + driver_mobile = entry.add_car.driver.driver_mobile or '-' + driver_pelak = entry.add_car.driver.pelak or '-' + driver_health_code = entry.add_car.driver.health_code or '-' + + if entry.province_request.poultry_request.direct_buying == True: + province_type = 'خرید مستقیم' + elif entry.province_request.poultry_request.export == True: + province_type = 'فروش به خارج استان' + else: + province_type = 'اتحادیه' + + driver_info = f' - راننده: {driver_name} ({driver_mobile}) پلاک: {driver_pelak} کد حمل: {driver_health_code}' + + new_message_part = f'{m}. کد بار: {order_code} - حجم بار: {main_quantity} قطعه - وزن بار: {real_weight} - میانگین وزن: {weight} - مرغدار: {poultry_name} ({poultry_mobile}) - شهر: {city} - نوع فروش: {province_type} - خریدار: {buyer} ({buyer_mobile}) - شهر خریدار: {buyer_city}{driver_info} - تاریخ بار: ({recive_date_shamsi})\n\n' + m += 1 + + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + except Exception as e: + continue + + if current_message and current_message != base_message: + messages.append(current_message) + + chat_id_eitaa_token = chat_id_eitaa.token + for message in messages: + try: + data = { + 'chat_id': chat_id_eitaa_token, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + except Exception: + pass + + return HttpResponse('پیام‌ها ارسال شد.') + + +def send_single_bar_to_eitaa(kill_house_request): + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.now().date() + + if not kill_house_request: + return + + poultry = kill_house_request.province_request.poultry_request.poultry + + vet_farm = VetFarm.objects.filter( + trash=False, + poultry=poultry + ).select_related('vet__user').first() + + if not vet_farm: + return + + vet_mobile = vet_farm.vet.user.mobile + + chat_id_eitaa = TokenEitaaForEachVet.objects.filter(vet_mobile=vet_mobile).first() + + if not chat_id_eitaa: + return + + date_time_jalali = format_datetime_to_shamsi(date) + date_shamsi = shamsi_date(date).replace('-', '_') + + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f'❗{date_time_jalali}❗\n' + base_message += f' #گزارش_بار_جدید #{date_shamsi}\n\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + try: + main_quantity = kill_house_request.accepted_real_quantity + real_weight = kill_house_request.accepted_real_weight + poultry_name = kill_house_request.province_request.poultry_request.poultry.unit_name + poultry_mobile = kill_house_request.province_request.poultry_request.poultry.user.mobile + + city = kill_house_request.province_request.poultry_request.poultry.user.city.name + buyer = kill_house_request.kill_request.kill_house.name + buyer_city = kill_house_request.kill_request.kill_house.system_address.city.name + buyer_mobile = kill_house_request.kill_request.kill_house.kill_house_operator.user.mobile + weight = kill_house_request.province_request.poultry_request.Index_weight + order_code = kill_house_request.bar_code + main_quantity = "{:,}".format(int(main_quantity)) + real_weight = "{:,}".format(int(real_weight)) + + if kill_house_request.province_request.poultry_request.direct_buying == True: + province_type = 'خرید مستقیم' + elif kill_house_request.province_request.poultry_request.export == True: + province_type = 'فروش به خارج استان' + else: + province_type = 'اتحادیه' + + message = base_message + message += f"🟢 مرغدار : {poultry_name} ({poultry_mobile})\n" + message += f"شهر: {city}\n" + message += f"کد بار: {order_code}\n" + message += f"نوع فروش: {province_type}\n" + message += f" حجم بار :{main_quantity}\n" + message += f" وزن بار :{real_weight}\n" + message += f"میانگین وزن : {weight}\n" + message += f"\n" + message += f"🔴🔴خریدار : {buyer} ({buyer_mobile})\n" + message += f"شهر خریدار: {buyer_city}\n" + message += '\n➖➖➖➖➖➖➖➖➖➖\n' + + chat_id_eitaa_token = chat_id_eitaa.token + data = { + 'chat_id': chat_id_eitaa_token, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + except Exception as e: + pass \ No newline at end of file diff --git a/cancel_bar_and_provice_request.py b/cancel_bar_and_provice_request.py new file mode 100644 index 0000000..23f196f --- /dev/null +++ b/cancel_bar_and_provice_request.py @@ -0,0 +1,12 @@ +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() + +from panel.ReportingPanel.views import archive_kill_house_remain_limitation_weight_cron + + +archive_kill_house_remain_limitation_weight_cron() diff --git a/cron_gid.py b/cron_gid.py new file mode 100644 index 0000000..c459c8f --- /dev/null +++ b/cron_gid.py @@ -0,0 +1,14 @@ +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") +django.setup() +from panel.ReportingPanel.views import cron_find_gid_code +from authentication.register import fix_duplicate_order_code_cron +from panel.excel_processing import test_all_excel_functions_cron + + +cron_find_gid_code() +test_all_excel_functions_cron() +# fix_duplicate_order_code_cron() \ No newline at end of file diff --git a/cron_out_province_request.py b/cron_out_province_request.py new file mode 100644 index 0000000..a871429 --- /dev/null +++ b/cron_out_province_request.py @@ -0,0 +1,15 @@ +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() + +from authentication.register import canceled_out_province_request +from bot_eata import send_all_bar_to_eitaa_cron +from authentication.sms_management import send_daily_slaughter_statistics_sms + +canceled_out_province_request() +# send_all_bar_to_eitaa_cron() +# send_daily_slaughter_statistics_sms() \ No newline at end of file diff --git a/cron_report.py b/cron_report.py new file mode 100644 index 0000000..64a01f2 --- /dev/null +++ b/cron_report.py @@ -0,0 +1,15 @@ +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() +from authentication.sms_management import reporting_sms +from authentication.register import add_to_warehouse, add_free_bar_to_warehouse, \ + add_free_bar_to_warehouse_automatic_type_cron + +reporting_sms() +# add_to_warehouse() +# add_free_bar_to_warehouse() +#add_free_bar_to_warehouse_automatic_type_cron() \ No newline at end of file diff --git a/cron_return_archive.py b/cron_return_archive.py new file mode 100644 index 0000000..51fab6d --- /dev/null +++ b/cron_return_archive.py @@ -0,0 +1,11 @@ +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() + +from authentication.register import return_from_archive_poultry_hatching_with_cron_job + +return_from_archive_poultry_hatching_with_cron_job() \ No newline at end of file diff --git a/cron_send_sms_from_notif.py b/cron_send_sms_from_notif.py new file mode 100644 index 0000000..209ba55 --- /dev/null +++ b/cron_send_sms_from_notif.py @@ -0,0 +1,11 @@ + +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() +from panel.ReportingPanel.views import send_sms_for_poultry_from_age_notification + +send_sms_for_poultry_from_age_notification() \ No newline at end of file diff --git a/cron_seven_am.py b/cron_seven_am.py new file mode 100644 index 0000000..bdf705c --- /dev/null +++ b/cron_seven_am.py @@ -0,0 +1,19 @@ +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() + +from authentication.register import update_chicken_age_from_login, \ + fix_duplicate_order_code_new_cron +from panel.ReportingPanel.views import remove_access_token +from ticket.views import closed_unread_ticket_cron + + +update_chicken_age_from_login() +remove_access_token() +# fix_duplicate_order_code_new_cron() + +# closed_unread_ticket_cron() diff --git a/cron_sms.py b/cron_sms.py new file mode 100644 index 0000000..3d3e8bf --- /dev/null +++ b/cron_sms.py @@ -0,0 +1,16 @@ +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() + +from authentication.sms_management import send_gate_way_sms, send_deactivate_panel_debt_sms,cron_for_update_sms +from authentication.register import accept_bar_difference_request_pending_cron_job + +send_gate_way_sms() +send_deactivate_panel_debt_sms() +cron_for_update_sms() +accept_bar_difference_request_pending_cron_job() + diff --git a/delete_kill_request_cron.py b/delete_kill_request_cron.py new file mode 100644 index 0000000..94ef314 --- /dev/null +++ b/delete_kill_request_cron.py @@ -0,0 +1,12 @@ +import os + +import django + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() + +from panel.ReportingPanel.views import delete_kill_req_cron, delete_steward_allocation_cron + +delete_kill_req_cron() +# delete_steward_allocation_cron() diff --git a/deposit_id.py b/deposit_id.py new file mode 100644 index 0000000..a837214 --- /dev/null +++ b/deposit_id.py @@ -0,0 +1,25 @@ +arta_deposit_id = 1945299661 +company_shaba_id = 'IR200120020000009055694184' +# arta_deposit_id=9700383709 +sha_deposit_id = 1031990414 +ha_deposit_id = 318967648 +ha_shaba_id = 'IR540160000000000318967648' +ar_deposit_id = 101866861 +ma_deposit_id = 656171877 +ma_shaba_id = 'IR580160000000000656171877' +guilds_deposit_id = 1945299661 +test_guild_shaba_id = 'IR200120020000009055694184' +ma_guild_shaba_id = 'IR200120020000009055694184' +ha_guild_shaba_id = 'IR540160000000000318967648' +ha_other_shaba_id = 'IR310700010001106549058001' +ma_other_shaba_id = 'IR740660000000203705208007' +test_other_shaba_id = 'IR740660000000203705208007' +# test_other_shaba_id='IR200120020000009055694184' +wage_counting_type = 'carcass' +out_selling_ignore = True +new_out_selling_count_wage = True +new_out_selling_count_wage_date = '2025-08-07' +before_out_buying_count_wage_amount = 1000 +extra_company_amount = 200 +province_id = '50' +market_code_state = True diff --git a/deposit_percent.py b/deposit_percent.py new file mode 100644 index 0000000..e92d396 --- /dev/null +++ b/deposit_percent.py @@ -0,0 +1,13 @@ +arta_sha_deposit_percent = 25 / 100 +guilds_sha_deposit_percent = 25 / 100 +arta_ha_deposit_percent = 25 / 100 +guilds_ha_deposit_percent = 15 / 100 +arta_ar_deposit_percent = 15 / 100 +arta_ma_deposit_percent = 25 / 100 +guilds_ma_deposit_percent = 25 / 100 +sha_deposit_percent = 50 / 100 +ha_deposit_percent = 60 / 100 +ar_deposit_percent = 85 / 100 +ma_deposit_percent = 50 / 100 +wage_percent=25/100 +carcases_sell=True \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..57fabf6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,7 @@ +services: + web: + build: ./ + volumes: + - .:/app + ports: + - "8000:8000" \ No newline at end of file diff --git a/every_12_hours.py b/every_12_hours.py new file mode 100644 index 0000000..77c9bfb --- /dev/null +++ b/every_12_hours.py @@ -0,0 +1,16 @@ +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() + +from authentication.register import warning_province_kill_request_without_bar_cron, \ + warning_to_warehouse_cron, warning_free_bar_to_warehouse_cron +from panel.ReportingPanel.views import create_update_chicken_commission_prices_cron + +# warning_province_kill_request_without_bar_cron() +# warning_to_warehouse_cron() +# warning_free_bar_to_warehouse_cron() +# create_update_chicken_commission_prices_cron \ No newline at end of file diff --git a/general_urls.py b/general_urls.py new file mode 100644 index 0000000..b3f2455 --- /dev/null +++ b/general_urls.py @@ -0,0 +1,11 @@ +# کلاینت سیکرت برای سیستم ورود و ثبت نام بر اساس توکن +CLIENT_SECRET = "M3pBv8nUjHTH9UlWsHy8gW0fPKqiJhhV1aMqMFjzIgAjphBRApj7yBUB1HWQ6ZPafO6seTzafGU7Z8JPFglaSRwRCxV2GTvVYyWVahXdEu4e0hZxc0gUgLf2DA7e2zmr" +# کلاینت ای دی برای سیستم ورود و ثبت نام بر اساس توکن +CLIENT_ID = "nNgiZ19e9tiH0o6jjPfcTyhVGnPaLa9De4Tztiex" + +BASE_URL = "https://kubackend.rasadyar.com/api/" +base_pos_id = 'ku' +base_user_gate_way_id = 'k' + +base_url_sms = 'ku' +base_url_for_sms_report = 'ku' diff --git a/helper_eata.py b/helper_eata.py new file mode 100644 index 0000000..5f41e17 --- /dev/null +++ b/helper_eata.py @@ -0,0 +1,3 @@ +token = 'bot291669:9298e675-8b3c-4b8f-a69d-5c89a3f0bdde' +chat_id = '10046800' +chat_id_mali = '10046800' \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..5596b44 --- /dev/null +++ b/main.py @@ -0,0 +1,16 @@ +# This is a sample Python script. + +# Press Shift+F10 to execute it or replace it with your code. +# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. + + +def print_hi(name): + # Use a breakpoint in the code line below to debug your script. + print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. + + +# Press the green button in the gutter to run the script. +if __name__ == '__main__': + print_hi('PyCharm') + +# See PyCharm help at https://www.jetbrains.com/help/pycharm/ diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..580656c --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'KuChicken.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/notification/__init__.py b/notification/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/notification/admin.py b/notification/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/notification/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/notification/apps.py b/notification/apps.py new file mode 100644 index 0000000..8757bbe --- /dev/null +++ b/notification/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class NotificationConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'notification' diff --git a/notification/consumers.py b/notification/consumers.py new file mode 100644 index 0000000..5ce2237 --- /dev/null +++ b/notification/consumers.py @@ -0,0 +1,48 @@ +# chat/consumers.py + +from channels.generic.websocket import AsyncWebsocketConsumer +import json + +from core.tools import translate_text + + +class ChatConsumer(AsyncWebsocketConsumer): + async def connect(self): + # print(self.scope["session"]["_auth_user_id"]) + print("here connect method started!") + # user_id = self.scope["session"]["_auth_user_id"] + user_id = self.scope['user'] + if user_id.is_anonymous: + await self.disconnect(0) + else: + print("user_id first is ::::::, ", user_id) + user_id = user_id.id + print("user_id is::::::", user_id) + self.group_name = "{}".format(user_id) + # Join room group + await self.channel_layer.group_add(self.group_name, self.channel_name) + await self.accept() + + async def disconnect(self, close_code): + # Leave room group + await self.channel_layer.group_discard(self.group_name, self.channel_name) + + # Receive message from WebSocket + async def receive(self, text_data=None, bytes_data=None): + + text_data_json = json.loads(text_data) + message = text_data_json["message"] + # print("msg is: ", message) + # message = translate_text(message) + # Send message to room group + await self.channel_layer.group_send( + self.chat_group_name, {"type": "recieve_group_message", "message": message} + ) + + async def recieve_group_message(self, event): + message = event["message"] + # print("msg is: ", message) + + # message = translate_text(message) + # Send message to WebSocket + await self.send(text_data=json.dumps({"message": message})) diff --git a/notification/middleware.py b/notification/middleware.py new file mode 100644 index 0000000..f5ed30a --- /dev/null +++ b/notification/middleware.py @@ -0,0 +1,56 @@ +from urllib.parse import parse_qs + +from django.contrib.auth import get_user_model +from django.contrib.auth.models import AnonymousUser +from django.db import close_old_connections +from channels.auth import AuthMiddleware, AuthMiddlewareStack, UserLazyObject +from channels.db import database_sync_to_async +from channels.sessions import CookieMiddleware, SessionMiddleware +# from rest_framework_simplejwt.tokens import AccessToken +from rest_framework.authtoken.models import Token + + +User = get_user_model() + +"""[summary] +plucks the JWT access token from the query string and retrieves the associated user. + Once the WebSocket connection is opened, all messages can be sent and received without + verifying the user again. Closing the connection and opening it again + requires re-authorization. +for example: +ws://localhost:8000//?token= + +""" + + +@database_sync_to_async +def get_user(scope): + close_old_connections() + query_string = parse_qs(scope['query_string'].decode()) + token = query_string.get('token') + # print("token query is::::", token) + if not token: + return AnonymousUser() + try: + t = Token.objects.get(key=token[0]) + access_token = Token(key=token[0]) + + #access_token = AccessToken(token[0]) + + user = t.user + + # user = User.objects.get(id=access_token['id']) + except Exception as exception: + return AnonymousUser() + if not user.is_active: + return AnonymousUser() + return user + + +class TokenAuthMiddleware(AuthMiddleware): + async def resolve_scope(self, scope): + scope['user']._wrapped = await get_user(scope) + + +def TokenAuthMiddlewareStack(inner): + return CookieMiddleware(SessionMiddleware(TokenAuthMiddleware(inner))) diff --git a/notification/migrations/0001_initial.py b/notification/migrations/0001_initial.py new file mode 100644 index 0000000..2693e25 --- /dev/null +++ b/notification/migrations/0001_initial.py @@ -0,0 +1,115 @@ +# Generated by Django 3.2.13 on 2023-09-18 19:32 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('authentication', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='NotificationActions', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(default='', max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notificationactions_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notificationactions_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='NotificationType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(choices=[('user', 'USER'), ('alluser', 'AllUSER'), ('group', 'GROUP'), ('allgroup', 'AllGROUP'), ('usergroup', 'UserGroup'), ('poultry', 'Poultry'), ('province_accept', 'ProvinceAccept'), ('province_rejected', 'ProvinceRejected'), ('city_operator_accept', 'CityOperatorAccept'), ('city_operator_rejected', 'CityOperatorRejected'), ('assignment_accepted', 'AssignmentAccepted'), ('assignment_rejected', 'AssignmentRejected')], default='', max_length=50, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notificationtype_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notificationtype_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='NotificationToken', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('token', models.CharField(max_length=100)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notificationtoken_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notificationtoken_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_user', to='authentication.userprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='NotificationButton', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('content', models.CharField(default='', max_length=20, null=True)), + ('order', models.IntegerField(default=0, null=True)), + ('action', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='btn_actions', to='notification.notificationactions')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notificationbutton_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notificationbutton_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Notification', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(default='', max_length=200, null=True)), + ('content', models.CharField(default='', max_length=500, null=True)), + ('image', models.CharField(max_length=100, null=True)), + ('icon', models.CharField(max_length=100, null=True)), + ('app_ids', models.CharField(default='', max_length=200, null=True)), + ('device_ids', models.CharField(default='', max_length=200, null=True)), + ('hash_id', models.CharField(default='', max_length=20, null=True)), + ('status', models.CharField(choices=[('read', 'Read'), ('pending', 'Pending'), ('sent', 'Sent'), ('unread', 'Unread'), ('silent', 'Silent')], default='', max_length=10, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_modifiedby', to=settings.AUTH_USER_MODEL)), + ('notif_action', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='notification.notificationactions')), + ('notif_button', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='buttons', to='notification.notificationbutton')), + ('notif_type', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='types', to='notification.notificationtype')), + ('notification_group', models.ManyToManyField(null=True, related_name='group', to='auth.Group')), + ('notification_user', models.ManyToManyField(null=True, related_name='notification_token', to='notification.NotificationToken')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/notification/migrations/0002_auto_20250121_0857.py b/notification/migrations/0002_auto_20250121_0857.py new file mode 100644 index 0000000..4bc41b2 --- /dev/null +++ b/notification/migrations/0002_auto_20250121_0857.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.13 on 2025-01-21 08:57 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('notification', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='notification', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='notificationactions', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='notificationbutton', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='notificationtoken', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='notificationtype', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + ] diff --git a/notification/migrations/0003_dashboardnotification.py b/notification/migrations/0003_dashboardnotification.py new file mode 100644 index 0000000..2a4fc7a --- /dev/null +++ b/notification/migrations/0003_dashboardnotification.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.13 on 2025-06-15 12:44 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('notification', '0002_auto_20250121_0857'), + ] + + operations = [ + migrations.CreateModel( + name='DashboardNotification', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(max_length=250, null=True)), + ('text', models.TextField(null=True)), + ('date', models.DateTimeField(null=True)), + ('status', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dashboardnotification_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dashboardnotification_modifiedby', to=settings.AUTH_USER_MODEL)), + ('role', models.ManyToManyField(null=True, related_name='notification_token', to='auth.Group')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/notification/migrations/0004_alter_dashboardnotification_role.py b/notification/migrations/0004_alter_dashboardnotification_role.py new file mode 100644 index 0000000..1f80b94 --- /dev/null +++ b/notification/migrations/0004_alter_dashboardnotification_role.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2025-06-15 12:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('notification', '0003_dashboardnotification'), + ] + + operations = [ + migrations.AlterField( + model_name='dashboardnotification', + name='role', + field=models.ManyToManyField(null=True, related_name='dashboard_notification', to='auth.Group'), + ), + ] diff --git a/notification/migrations/__init__.py b/notification/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/notification/models.py b/notification/models.py new file mode 100644 index 0000000..90807af --- /dev/null +++ b/notification/models.py @@ -0,0 +1,151 @@ +from django.db import models + +from authentication.models import BaseModel +from authentication.models import UserProfile, Group + + +# from numpy import char + + +# Create your models here. + + +class NotificationActions(BaseModel): + name = models.CharField(max_length=100, default="", null=True) + + def __str__(self) -> str: + return self.name + + def save(self, *args, **kwargs): + super(NotificationActions, self).save(*args, **kwargs) + + pass + + +class NotificationButton(BaseModel): + content = models.CharField(max_length=20, default="", null=True) + order = models.IntegerField(default=0, null=True) + action = models.ForeignKey( + NotificationActions, + on_delete=models.CASCADE, + default=None, + null=True, + related_name="btn_actions", + ) + + def __str__(self) -> str: + return self.content + + def save(self, *args, **kwargs): + super(NotificationButton, self).save(*args, **kwargs) + + pass + + +class NotificationType(BaseModel): + notif_types = ( + ("user", "USER"), + ("alluser", "AllUSER"), + ("group", "GROUP"), + ("allgroup", "AllGROUP"), + ("usergroup", "UserGroup"), + ("poultry", "Poultry"), + ("province_accept", "ProvinceAccept"), + ("province_rejected", "ProvinceRejected"), + ("city_operator_accept", "CityOperatorAccept"), + ("city_operator_rejected", "CityOperatorRejected"), + ("assignment_accepted", "AssignmentAccepted"), + ("assignment_rejected", "AssignmentRejected"), + ) + name = models.CharField(choices=notif_types, max_length=50, default="", null=True) + + def __str__(self) -> str: + return self.name + + def save(self, *args, **kwargs): + super(NotificationType, self).save(*args, **kwargs) + + pass + + +class NotificationToken(BaseModel): + token = models.CharField(max_length=100) + user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name="notification_user", null=True) + + def __str__(self) -> str: + return self.token + + def save(self, *args, **kwargs): + super(NotificationToken, self).save(*args, **kwargs) + + pass + + +class Notification(BaseModel): + s = ( + ("read", "Read"), + ("pending", "Pending"), + ("sent", "Sent"), + ("unread", "Unread"), + ("silent", "Silent"), + ) + notif_type = models.ForeignKey( + NotificationType, + on_delete=models.CASCADE, + null=True, + default=None, + related_name="types", + ) + notif_action = models.ForeignKey( + NotificationActions, + on_delete=models.CASCADE, + null=True, + default=None, + related_name="actions", + ) + notif_button = models.ForeignKey( + NotificationButton, + on_delete=models.CASCADE, + null=True, + default=None, + related_name="buttons", + ) + notification_user = models.ManyToManyField( + NotificationToken, + null=True, + related_name="notification_token" + ) + notification_group = models.ManyToManyField( + Group, + null=True, + related_name="group" + ) + title = models.CharField(max_length=200, default="", null=True) + content = models.CharField(max_length=500, default="", null=True) + image = models.CharField(max_length=100, null=True) + icon = models.CharField(max_length=100, null=True) + app_ids = models.CharField(max_length=200, default="", null=True) + device_ids = models.CharField(max_length=200, default="", null=True) + hash_id = models.CharField(max_length=20, default="", null=True) + status = models.CharField(choices=s, max_length=10, default="", null=True) + + def __str__(self) -> str: + return self.title + + def save(self, *args, **kwargs): + super(Notification, self).save(*args, **kwargs) + + pass + + +class DashboardNotification(BaseModel): + role = models.ManyToManyField(Group, + null=True, + related_name="dashboard_notification") + title = models.CharField(max_length=250, null=True) + text = models.TextField(null=True) + date = models.DateTimeField(null=True) + status = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(DashboardNotification, self).save(*args, **kwargs) \ No newline at end of file diff --git a/notification/najva/__init__.py b/notification/najva/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/notification/najva/get_segments_detail.py b/notification/najva/get_segments_detail.py new file mode 100644 index 0000000..56bcf9f --- /dev/null +++ b/notification/najva/get_segments_detail.py @@ -0,0 +1,17 @@ +from django.http.response import JsonResponse +import requests +import json + + +def get_segments(request): + url = "https://app.najva.com/api/v1/websites/65b3a75a-d634-48c5-824f-c80c703534af/segments/" + + headers = { + 'content-type': "application/json", + 'authorization': "Token 982c17c1d460fec1eef6270c7d6550e3b9b33d2d", + 'cache-control': "no-cache", + } + + response = requests.request('GET', url=url, headers=headers) + resp = json.loads(response.text.encode('utf8')) + return JsonResponse(resp, safe=False) diff --git a/notification/najva/send_notif_to_segments.py b/notification/najva/send_notif_to_segments.py new file mode 100644 index 0000000..671b742 --- /dev/null +++ b/notification/najva/send_notif_to_segments.py @@ -0,0 +1,75 @@ +from django.http.response import JsonResponse +from datetime import datetime, timezone, timedelta +import requests +import json + + +def send_notification_to_all_segments( + title=None, + body=None, + content=None, + icon=None, + image=None, + segments_include=None, + segments_exclude=None, +): + url = "https://app.najva.com/api/v1/notifications/" + + payload = { + "api_key": "65b3a75a-d634-48c5-824f-c80c703534af", + "title": "title", + "body": "body", + "priority": "high", + "onclick_action": "open-link", + "url": "https://imedstores.ir/", + "content": "content", + "icon": "", + "image": "", + # "json": "{"key":"value"}", + "sent_time": datetime.now() + timedelta(minutes=1), + "segments_include": [], + "segments_exclude": [], + "one_signal_enabled": False, + "one_signal_accounts": [] + } + headers = { + 'authorization': "Token 982c17c1d460fec1eef6270c7d6550e3b9b33d2d", + 'content-type': "application/json", + 'cache-control': "no-cache", + } + + response = requests.request("POST", url, data=json.dumps(payload, default=str), headers=headers) + resp = json.loads(response.text.encode('utf-8')) + return resp + + +def send_notification_to_specific_segment( + title="سامانه سبحان طیور", + body="خوش آمدید", + content="سامانه مدیریت درخواست های مرغداران", + icon="https://user-image-gallery.s3.ir-thr-at1.arvanstorage.com/1WGPTMFND3TREWD.jpg", + image="https://user-image-gallery.s3.ir-thr-at1.arvanstorage.com/1WGPTMFND3TREWD.jpg", + subscriber_tokens=None, +): + url = "https://app.najva.com/notification/api/v1/notifications/" + payload = { + "api_key": "65b3a75a-d634-48c5-824f-c80c703534af", + "subscriber_tokens": subscriber_tokens, + "title": title, + "body": body, + "onclick_action": "open-link", + "url": "https://imedstores.ir/", + "content": content, + "icon": icon, + "image": image, + "sent_time": datetime.now() + timedelta(minutes=3), + } + headers = { + 'authorization': "Token 982c17c1d460fec1eef6270c7d6550e3b9b33d2d", + 'content-type': "application/json", + 'cache-control': "no-cache", + } + + response = requests.request("POST", url, data=json.dumps(payload, default=str), headers=headers) + resp = json.loads(response.text.encode('utf-8')) + return resp diff --git a/notification/najva_views.py b/notification/najva_views.py new file mode 100644 index 0000000..bdf2f57 --- /dev/null +++ b/notification/najva_views.py @@ -0,0 +1,159 @@ +import datetime + +from django.http import QueryDict +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from rest_framework.permissions import AllowAny +from ticket.helper import send_image_to_server +from notification.models import ( + Notification, + NotificationToken, + NotificationType, + Group +) +from panel.models import ( + PoultryRequest, + CityOperatorCheckRequest, + ProvinceCheckOperatorRequest, + KillHouseRequest, + FunctionExecutor +) +from notification.serializers import NotificationSerializer +from authentication.filterset import UserProfileFilterSet +from django_filters.rest_framework import DjangoFilterBackend +from authentication.models import UserProfile +from rest_framework.response import Response +from rest_framework import viewsets, status +from django.shortcuts import render +from .najva.send_notif_to_segments import ( + send_notification_to_all_segments, + send_notification_to_specific_segment +) +from .najva.get_segments_detail import ( + get_segments +) +from authentication.views import ( + CLIENT_ID, + CLIENT_SECRET, + CACHE_TTL, + ARVAN_User_Image_URL +) +import random +import string +import os + +ARVAN_NOTIFICATION_GALLERY_URL = "https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/" + + +class NajvaNotificationViewSet(viewsets.ModelViewSet): + queryset = NotificationToken.objects.all() + serializer_class = NotificationSerializer + permission_classes = [AllowAny] + filter_backends = [DjangoFilterBackend] + filterset_class = UserProfileFilterSet + filterset_fields = [ + 'fullname', + 'mobile', + 'breeding_unique_id', + 'address__city', + 'address__province', + 'role__name', + ] + + def list(self, request, *args, **kwargs): + if "key" in request.GET: + add_obj = Notification.objects.get(key__exact=request.GET["key"]) + serializer = self.serializer_class(add_obj) + return Response(serializer.data, status=status.HTTP_200_OK) + if "read_notif" in request.GET: + add_obj = Notification.objects.filter( + user_id=request.user.id, status="read" + ) + query = [x for x in add_obj] + serializer = self.serializer_class(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + if "unread_notif" in request.GET: + add_obj = Notification.objects.filter( + user_id=request.user.id, status="unread" + ) + query = [x for x in add_obj] + serializer = self.serializer_class(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + if "pending_notif" in request.GET: + add_obj = Notification.objects.filter( + user_id=request.user.id, status="pending" + ) + query = [x for x in add_obj] + serializer = self.serializer_class(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + queryset = Notification.objects.all() + serializer = self.serializer_class(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + segments = [] + userprofile = UserProfile.objects.get(user=request.user) + ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15)) + notification = Notification() + if 'image' in request.data.keys(): + image = request.data['image'] + notification_image = send_image_to_server(image) + if 'icon' in request.data.keys(): + icon = request.data['icon'] + notification_icon = send_image_to_server(icon) + if 'request_type' in request.data.keys(): + if request.data['request_type'] == "token": + if not NotificationToken.objects.filter(user=userprofile): + notification = NotificationToken() + notification.token = request.data['token'] + notification.user = userprofile + notification.save() + return Response(status=status.HTTP_200_OK) + else: + return Response({"msg": "user already has token"}, status=status.HTTP_403_FORBIDDEN) + if 'value' in request.data.keys(): + if not request.data['value']: + send_notification = send_notification_to_specific_segment( + # title=request.data['title'], + # body=request.data['body'], + # content=request.data['content'], + # icon=notification_icon, + # image=notification_image, + # segments_include=request.data['segments_include'], + # segments_exclude=request.data['segments_exclude'], + subscriber_tokens=['c22206d3-248a-4c81-b7c2-de2cfe5e5766'] + # subscriber_tokens=['2cc244fc-1340-4942-bf19-2ba9f66f44e6'] + ) + return Response(send_notification) + notification.notif_type = NotificationType.objects.get(name="alluser") + else: + for key in request.data['value']: + if UserProfile.objects.filter(key__exact=key): + notif_user = NotificationToken.objects.get(user__key__exact=key) + segments.append(notif_user.token) + if Group.objects.filter(name__exact=key): + for item in NotificationToken.objects.filter(user__role__name=key): + segments.append(item.token) + send_notification = send_notification_to_specific_segment( + title=request.data['title'], + body=request.data['body'], + content=request.data['content'], + icon=notification_icon, + image=notification_image, + subscriber_tokens=segments + ) + notification.notif_type = NotificationType.objects.get(name=request.data['request_type']) + notification.title = request.data['title'] + notification.content = request.data['content'] + notification.icon = notification_icon + notification.image = notification_image + notification.save() + if 'value' in request.data.keys(): + for key in request.data['value']: + if UserProfile.objects.filter(key__exact=key): + notification.notif_user.add(UserProfile.objects.get(key__exact=key)) + elif Group.objects.filter(name__exact=key): + notification.notif_group.add(Group.objects.get(name__exact=key)) + for item in UserProfile.objects.filter(role=Group.objects.get(name__exact=key)): + notification.notif_user.add(item) + return Response(send_notification) diff --git a/notification/notify.py b/notification/notify.py new file mode 100644 index 0000000..5f5ed10 --- /dev/null +++ b/notification/notify.py @@ -0,0 +1,25 @@ + +from asgiref.sync import async_to_sync +from channels.layers import get_channel_layer + + +@classmethod +def notify_ws_clients(self, message): + """ + Inform client there is a new message. + """ + + notification = { + "type": "recieve_group_message", + "message": "{}".format(message), + } + + channel_layer = get_channel_layer() + print("user.id {}".format(self.user.id)) + print("user.id {}".format(self.recipient.id)) + + async_to_sync(channel_layer.group_send)("{}".format(self.user.id), notification) + async_to_sync(channel_layer.group_send)( + "{}".format(self.recipient.id), notification + ) + diff --git a/notification/pushe/__init__.py b/notification/pushe/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/notification/pushe/constants.py b/notification/pushe/constants.py new file mode 100644 index 0000000..955c863 --- /dev/null +++ b/notification/pushe/constants.py @@ -0,0 +1,3 @@ +# Obtain token -> https://docs.pushe.co/docs/web-api/authentication + +TOKEN = "YOUR_TOKEN" diff --git a/notification/pushe/send_custom_content_notification.py b/notification/pushe/send_custom_content_notification.py new file mode 100644 index 0000000..3ff54de --- /dev/null +++ b/notification/pushe/send_custom_content_notification.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# vim: ts=4 sw=4 et + +import requests +from notification.pushe.constants import TOKEN + + +def send_custom_content_notification(data): + # set header + headers = {"Authorization": "Token " + TOKEN, "Content-Type": "application/json"} + + # Webpush doc -> http://docs.pushe.co/docs/web-api/custom-content-notification/ + + data = { + "app_ids": [ + "YOUR_APP_ID", + ], + "data": { + "title": "Title", + "content": "Content", + }, + "custom_content": {"key1": "value1", "key2": "value2"}, + } + + # send request + response = requests.post( + "https://api.pushe.co/v2/messaging/notifications/web/", + json=data, + headers=headers, + ) + + # get status_code and response + print("status code => ", response.status_code) + print("response => ", response.json()) + print("==========") + + if response.status_code == 201: + print("Success!") + + data = response.json() + + # hashed_id just generated for Non-Free plan + if data["hashed_id"]: + report_url = "https://pushe.co/report?id=%s" % data["hashed_id"] + else: + report_url = "no report url for your plan" + + notif_id = data["wrapper_id"] + print("report_url: %s" % report_url) + print("notification id: %s" % notif_id) + else: + print("failed") + pass diff --git a/notification/pushe/send_filtered_notification.py b/notification/pushe/send_filtered_notification.py new file mode 100644 index 0000000..21a57d9 --- /dev/null +++ b/notification/pushe/send_filtered_notification.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# vim: ts=4 sw=4 et + + +import requests +from notification.pushe.constants import TOKEN + + +def send_filtered_notification(data): + # set header + headers = {"Authorization": "Token " + TOKEN, "Content-Type": "application/json"} + + # Webpush doc -> https://docs.pushe.co/docs/web-api/filtered-notification + + data = { + "app_ids": [ + "YOUR_APP_ID", + ], + "data": { + "title": "This is a filtered push", + "content": "Only users with specified device_id(s) will see this notification.", + }, + "filters": {"device_id": ["DEIVCE_ID_1", "DEVICE_ID_2"]} + # additional keywords -> https://docs.pushe.co/docs/web-api/notification-keys + } + + response = requests.post( + "https://api.pushe.co/v2/messaging/notifications/web/", + json=data, + headers=headers, + ) + + print("status code => ", response.status_code) + print("response => ", response.json()) + print("==========") + + if response.status_code == 201: + print("Success!") + + data = response.json() + + # hashed_id only generated for Non-Free plan + if data["hashed_id"]: + report_url = "https://pushe.co/report?id=%s" % data["hashed_id"] + else: + report_url = "no report url for your plan" + + notif_id = data["wrapper_id"] + print("report_url: %s" % report_url) + print("notification id: %s" % notif_id) + else: + print("failed") + + pass diff --git a/notification/pushe/send_notification_with_action.py b/notification/pushe/send_notification_with_action.py new file mode 100644 index 0000000..d49fbc1 --- /dev/null +++ b/notification/pushe/send_notification_with_action.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +# vim: ts=4 sw=4 et + +import requests +from notification.pushe.constants import TOKEN + + +def send_notification_with_action(data): + # set header + headers = {"Authorization": "Token " + TOKEN, "Content-Type": "application/json"} + + data = { + "app_ids": [ + "YOUR_APP_ID", + ], + "data": { + "title": "Title", + "content": "Content", + # Actions -> https://docs.pushe.co/docs/web-api/notification-actions + "action": { + "action_type": "U", + "url": "https://pushe.co", + }, + "buttons": [ + { + "btn_content": "YOUR_CONTENT", + "btn_action": {"action_type": "U", "url": "https://pushe.co"}, + "btn_order": 0, + }, + { + "btn_content": "YOUR_CONTENT", + "btn_action": {"action_type": "U", "url": "https://pushe.co"}, + "btn_order": 1, + }, + ], + }, + } + + # send request + response = requests.post( + "https://api.pushe.co/v2/messaging/notifications/web/", + json=data, + headers=headers, + ) + + # get status_code and response + print("status code => ", response.status_code) + print("response => ", response.json()) + print("==========") + + if response.status_code == 201: + print("Success!") + + data = response.json() + + # hashed_id only generated for Non-Free plan + if data["hashed_id"]: + report_url = "https://pushe.co/report?id=%s" % data["hashed_id"] + else: + report_url = "no report url for your plan" + + notif_id = data["wrapper_id"] + print("report_url: %s" % report_url) + print("notification id: %s" % notif_id) + else: + print("failed") + pass diff --git a/notification/pushe/send_simple_notification.py b/notification/pushe/send_simple_notification.py new file mode 100644 index 0000000..ee55a86 --- /dev/null +++ b/notification/pushe/send_simple_notification.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +# vim: ts=4 sw=4 et + +import requests +from notification.pushe.constants import TOKEN + +# Webpush doc -> https://docs.pushe.co/docs/web-api/filtered-notification + + +def send_simple_notification(data): + headers = {"Authorization": "Token " + TOKEN, "Content-Type": "application/json"} + + data = { + "app_ids": [ + "YOUR_APP_ID", + ], + "data": { + "title": "This is a filtered push", + "content": "Only users with specified device_id(s) will see this notification.", + }, + "filters": {"device_id": ["DEIVCE_ID_1", "DEVICE_ID_2"]} + # additional keywords -> https://docs.pushe.co/docs/web-api/notification-keys + } + + response = requests.post( + "https://api.pushe.co/v2/messaging/notifications/web/", + json=data, + headers=headers, + ) + + print("status code => ", response.status_code) + print("response => ", response.json()) + print("==========") + + if response.status_code == 201: + print("Success!") + + data = response.json() + + # hashed_id only generated for Non-Free plan + if data["hashed_id"]: + report_url = "https://pushe.co/report?id=%s" % data["hashed_id"] + else: + report_url = "no report url for your plan" + + notif_id = data["wrapper_id"] + print("report_url: %s" % report_url) + print("notification id: %s" % notif_id) + else: + print("failed") + + pass diff --git a/notification/pushe/send_transactional_notification.py b/notification/pushe/send_transactional_notification.py new file mode 100644 index 0000000..f37f509 --- /dev/null +++ b/notification/pushe/send_transactional_notification.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +# vim: ts=4 sw=4 et + +import requests +from notification.pushe.constants import TOKEN + + +def send_transactional_notification(data): + # set header + headers = {"Authorization": "Token " + TOKEN, "Content-Type": "application/json"} + + # Webpush doc -> http://docs.pushe.co/docs/web-api/transactional-notification/ + + data = { + "app_ids": [ + "YOUR_APP_ID", + ], + "data": { + "title": "Title", + "content": "Content", + }, + "custom_content": {"key1": "value1", "key2": "value2"}, + "device_id": [ + "device_id_1", + "device_id_2", + ], + } + + # send request + response = requests.post( + "https://api.pushe.co/v2/messaging/web-rapid/", + json=data, + headers=headers, + ) + + # get status_code and response + print("status code => ", response.status_code) + print("response => ", response.json()) + print("==========") + + if response.status_code == 201: + print("Success!") + + data = response.json() + + # hashed_id just generated for Non-Free plan + if data["hashed_id"]: + report_url = "https://pushe.co/report?id=%s" % data["hashed_id"] + else: + report_url = "no report url for your plan" + + notif_id = data["wrapper_id"] + print("report_url: %s" % report_url) + print("notification id: %s" % notif_id) + else: + print("failed") + pass diff --git a/notification/routing.py b/notification/routing.py new file mode 100644 index 0000000..0583aa3 --- /dev/null +++ b/notification/routing.py @@ -0,0 +1,7 @@ +from core import consumers + +from django.conf.urls import url + +websocket_urlpatterns = [ + url(r'^ws$', consumers.ChatConsumer.as_asgi()), +] diff --git a/notification/serializers.py b/notification/serializers.py new file mode 100644 index 0000000..750c8d1 --- /dev/null +++ b/notification/serializers.py @@ -0,0 +1,27 @@ +from rest_framework import serializers + +from notification.models import Notification, NotificationToken, DashboardNotification +from authentication.serializers import GroupSerializer + + +class NotificationTokenSerializer(serializers.ModelSerializer): + class Meta: + Model = NotificationToken + fields = "__all__" + + +class NotificationSerializer(serializers.ModelSerializer): + notif_user = NotificationTokenSerializer() + notif_group = GroupSerializer() + + class Meta: + Model = Notification + fields = "__all__" + + +class DashboardNotificationSerializer(serializers.ModelSerializer): + role = GroupSerializer(read_only=True,many=True) + + class Meta: + model = DashboardNotification + fields = "__all__" diff --git a/notification/signals.py b/notification/signals.py new file mode 100644 index 0000000..f10cc35 --- /dev/null +++ b/notification/signals.py @@ -0,0 +1,16 @@ +from django.db import models +from django.contrib.auth.models import User +from django.db.models.signals import post_save +from django.dispatch import receiver +from core.models import Profile + + +@receiver(post_save, sender=User) +def create_user_profile(sender, instance, created, **kwargs): + if created: + Profile.objects.create(user=instance) + + +@receiver(post_save, sender=User) +def save_user_profile(sender, instance, **kwargs): + instance.profile.save() diff --git a/notification/tests.py b/notification/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/notification/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/notification/urls.py b/notification/urls.py new file mode 100644 index 0000000..e3fc157 --- /dev/null +++ b/notification/urls.py @@ -0,0 +1,16 @@ +from notification.najva.get_segments_detail import get_segments +from notification.najva.send_notif_to_segments import send_notification_to_all_segments +from rest_framework.routers import DefaultRouter +from django.urls import include, path +from . import najva_views,views + +router = DefaultRouter() +router.register(r'notification-user', najva_views.NajvaNotificationViewSet, basename="notification-user") +router.register(r'dashboard_notification', views.DashboardNotificationViewSet, basename="dashboard-notification") +# router.register(r'get-segments', get_segments(), basename="get-segments") + +urlpatterns = [ + path('', include(router.urls)), + path('get-segments', get_segments), + path('all-segments', send_notification_to_all_segments), +] diff --git a/notification/views.py b/notification/views.py new file mode 100644 index 0000000..16e5025 --- /dev/null +++ b/notification/views.py @@ -0,0 +1,103 @@ +import datetime + +from django.contrib.auth.models import Group +from django.shortcuts import render +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from notification.serializers import NotificationSerializer, DashboardNotificationSerializer +from rest_framework import viewsets, status +from rest_framework.response import Response +from notification.models import Notification, DashboardNotification + + +# Create your views here. +class NotificationViewSet(viewsets.ModelViewSet): + queryset = Notification.objects.all() + serializer_class = NotificationSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + if "key" in request.GET: + add_obj = Notification.objects.get(key__exact=request.GET["key"]) + serializer = self.serializer_class(add_obj) + return Response(serializer.data, status=status.HTTP_200_OK) + if "read_notif" in request.GET: + add_obj = Notification.objects.filter( + user_id=request.user.id, status="read" + ) + query = [x for x in add_obj] + serializer = self.serializer_class(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + if "unread_notif" in request.GET: + add_obj = Notification.objects.filter( + user_id=request.user.id, status="unread" + ) + query = [x for x in add_obj] + serializer = self.serializer_class(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + if "pending_notif" in request.GET: + add_obj = Notification.objects.filter( + user_id=request.user.id, status="pending" + ) + query = [x for x in add_obj] + serializer = self.serializer_class(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + queryset = Notification.objects.all() + serializer = self.serializer_class(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + obj = serializer.create(validated_data=request.data) + obj.save() + + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def retrieve(self, request, pk=None, *args, **kwargs): + queryset = Notification.objects.get(key__exact=request.GET["key"]) + serializer = self.serializer_class(queryset) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + queryset = Notification.objects.get(key__exact=request.GET["key"]) + + queryset.save() + serializer = self.serializer_class(queryset) + serializer.update(instance=queryset, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def partial_update(self, request, pk=None, *args, **kwargs): + pass + + def destroy(self, request, pk=None, *args, **kwargs): + queryset = Notification.objects.get(key__exact=request.GET["key"]) + queryset.trash = True + queryset.save() + return Response(status=status.HTTP_200_OK) + + +class DashboardNotificationViewSet(viewsets.ModelViewSet): + queryset = DashboardNotification.objects.all() + serializer_class = DashboardNotificationSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + role=request.GET.get('role') + query=self.queryset.filter(role__name=role,trash=False).order_by('-date') + ser_data=self.serializer_class(query,many=True).data + return Response(ser_data,status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + grop=Group.objects.filter(name__in=request.data['role']) + request.data.pop('role') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + obj = serializer.create(validated_data=request.data) + obj.date=datetime.datetime.now() + obj.save() + obj.role.set(grop) + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) \ No newline at end of file diff --git a/panel/CityOperator/__init__.py b/panel/CityOperator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/CityOperator/helpers.py b/panel/CityOperator/helpers.py new file mode 100644 index 0000000..9b9ffef --- /dev/null +++ b/panel/CityOperator/helpers.py @@ -0,0 +1,456 @@ +from itertools import chain + +from django.db.models import Sum, Q, F + +from deposit_id import wage_counting_type +from panel.KillHouse.helpers import get_difference_carcasses_weight +from panel.models import KillHouse, ProvinceKillRequest, KillHouseRequest, PoultryHatching, PoultryRequest, WageType, \ + PercentageOfWageType, SubSectorTransactions, SubSectorPercentageOfWageType, Poultry, KillHouseFreeBarInformation, \ + KillHouseFreeSaleBarInformation, BarDifferenceRequest + + +def get_percent_for_city_sub_sector_finance_info(): + poultries = Poultry.objects.filter(trash=False, city_operator__isnull=False).order_by('id') + hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by( + 'poultry') + + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + temporary_trash=False, temporary_deleted=False, + province_request__poultry_request__hatching__in=hatchings) + kill_houses = KillHouse.objects.filter(pk__in=province_kill_requests.values_list('killhouse_user', flat=True)) + + total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, + archive_wage=False, + calculate_status=True, + trash=False) + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + archive_wage=False, + calculate_status=True, + trash=False) + total_out_selling_province_carcasses_weight = \ + kill_house_free_sale_bar_info.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + total_province_carcasses_weight = total_province_live_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 + + internal_percent = ( + total_pure_province_carcasses_weight / total_province_carcasses_weight) * 100 if total_province_carcasses_weight > 0 else 0 + external_percent = 100 - internal_percent + + return {"internal_percent": internal_percent, "external_percent": external_percent} + + +# def get_city_sub_sector_finance_info(poultries,operator): +# total_wage_type = WageType.objects.filter(trash=False) +# province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount +# free_sell_carcesses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount +# out_poultry_request_amount = total_wage_type.filter(en_name='poultry-sell-out-province', trash=False).first().amount +# +# 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 +# union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell', +# share_type__en_name='union').first().percent / 100 +# +# union_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province', +# share_type__en_name='union').first().percent / 100 +# city_percent_province_kill_request= SubSectorPercentageOfWageType.objects.filter(percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100 +# city_percent_carcasse_sell= SubSectorPercentageOfWageType.objects.filter(percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100 +# city_percent_out_poultry_request= SubSectorPercentageOfWageType.objects.filter(percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100 +# union_province_kill_request_final_amount = union_province_kill_request_percent * province_live_wage_amount +# union_carcasse_sell_final_amount = union_free_sell_carcasses_percent * free_sell_carcesses_wage_amount +# union_out_poultry_request_amount = union_out_poultry_request_percent * out_poultry_request_amount +# city_province_kill_request_final_amount = union_province_kill_request_final_amount * city_percent_province_kill_request +# city_carcasse_sell_final_amount = union_carcasse_sell_final_amount * city_percent_carcasse_sell +# city_out_poultry_request_final_amount = union_out_poultry_request_amount * city_percent_out_poultry_request +# +# +# +# hatchings = PoultryHatching.objects.filter(poultry__in=poultries,killed_quantity__gt=0, trash=False).order_by('poultry') +# +# hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[ +# 'total'] or 0 +# poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), +# province_state__in=('pending', 'accepted'), out=True, +# out_province_request_cancel=False, temporary_trash=False, +# temporary_deleted=False, hatching__in=hatchings) +# out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ +# 'total'] or 0 +# out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ +# 'total'] or 0 +# +# +# +# province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, +# archive_wage=False, +# state__in=('pending', 'accepted'), +# temporary_trash=False, temporary_deleted=False, +# # first_car_allocated_quantity=0, +# province_request__poultry_request__hatching__in=hatchings) +# +# total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# total_province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ +# 'total'] or 0 +# total_province_carcasses_weight = total_province_live_weight * 0.75 +# weight_percent = get_percent_for_city_sub_sector_finance_info() +# total_pure_internal_province_carcasses_weight = (weight_percent['internal_percent']/100) * total_province_carcasses_weight +# total_pure_external_province_carcasses_weight = (weight_percent['external_percent']/100) * total_province_carcasses_weight +# total_pure_internal_province_carcasses_amount = total_pure_internal_province_carcasses_weight * city_province_kill_request_final_amount +# total_pure_external_province_carcasses_amount = total_pure_external_province_carcasses_weight * city_carcasse_sell_final_amount +# out_province_poultry_request_amount = out_province_poultry_request_weight * city_out_poultry_request_final_amount +# total_wage_amount = total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount +# total_killed_quantity = total_province_live_quantity + out_province_poultry_request_quantity +# hatching_killing_percent = ((total_killed_quantity / hatching_quantity) if hatching_quantity > 0 else 0) * 100 +# city_operator_deposit = SubSectorTransactions.objects.filter(trash=False,city_operator=operator) +# city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0 +# total_remain_wage_amount = total_wage_amount - city_deposit +# +# result = { +# "poultries": len(poultries), +# "hatchings": len(hatchings), +# "hatchings_quantity": hatching_quantity, +# "total_province_kill_requests_quantity": total_province_live_quantity, +# "total_province_kill_requests_weight": total_province_live_weight, +# "total_province_carcasses_weight": total_province_carcasses_weight, +# "total_pure_internal_province_carcasses_weight": total_pure_internal_province_carcasses_weight, +# "total_pure_external_province_carcasses_weight": total_pure_external_province_carcasses_weight, +# "out_province_poultry_request_quantity": out_province_poultry_request_quantity, +# "out_province_poultry_request_weight": out_province_poultry_request_weight, +# "total_killed_quantity": total_killed_quantity, +# "hatching_killing_percent": hatching_killing_percent, +# "out_province_poultry_request_amount": out_province_poultry_request_amount, +# "total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount, +# "total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount, +# "total_wage_amount": total_wage_amount, +# "number_of_city_deposit": len(city_operator_deposit), +# "city_deposit": city_deposit, +# "total_remain_wage_amount": total_remain_wage_amount, +# } +# return result + + +def get_city_sub_sector_finance_info(poultries, operator,date1,date2): + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', + trash=False).first().amount + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by( + 'poultry') + if date1 is not None: + 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, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).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 + ) + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + has_wage=True, wage_pay=True, + temporary_deleted=False, hatching__in=hatchings, + send_date__date__gte=date1, + send_date__date__lte=date2) + city_operator_deposit = SubSectorTransactions.objects.filter(trash=False, city_operator=operator, + date__date__gte=date1, date__date__lte=date2) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted', acceptor_date__date__gte=date1, + acceptor_date__date__lte=date2) + + else: + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + has_wage=True, wage_pay=True, poultry__in=poultries, + temporary_deleted=False) + 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 + ) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted') + city_operator_deposit = SubSectorTransactions.objects.filter(trash=False, city_operator=operator) + + 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 + 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) if total_province_carcasses_weight > 0 else 0 + + province_kill_requests = total_province_kill_requests.filter( + province_request__poultry_request__hatching__in=hatchings).order_by('id') + kill_house_requests = total_kill_house_requests.filter( + province_request__poultry_request__hatching__in=hatchings).order_by('id') + + + province_kill_requests_kill_houses = KillHouse.objects.filter(pk__in=province_kill_requests.values_list('killhouse_user',flat=True)).order_by('id') + + + hatching_list1 = hatchings.filter( + pk__in=province_kill_requests.values_list('province_request__poultry_request__hatching', flat=True), + poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True) + hatching_list2 = hatchings.filter( + pk__in=kill_house_requests.values_list('province_request__poultry_request__hatching', flat=True), + poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True) + hatching_list3 = hatchings.filter(pk__in=poultry_requests.values_list('hatching', flat=True), poultry__in=poultries, + killed_quantity__gt=0, trash=False).values_list('id', flat=True) + total_hatching_list = chain(hatching_list1, hatching_list2, hatching_list3) + hatchings = hatchings.filter(pk__in=total_hatching_list) + + hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_requests = poultry_requests.filter(hatching__id__in=hatching_list3) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + province_live_quantity += kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + province_live_weight += \ + difference_requests.filter(kill_house__in=province_kill_requests_kill_houses).aggregate(total=Sum('weight'))['total'] or 0 + + province_carcasses_weight = province_live_weight * 0.75 + + internal_total_pure_province_carcasses_weight = province_carcasses_weight * different_percent + external_total_pure_province_carcasses_weight = province_carcasses_weight - internal_total_pure_province_carcasses_weight + + # total_pure_province_carcasses_price = internal_total_pure_province_carcasses_weight * province_live_wage_amount + # total_out_selling_province_carcasses_price = external_total_pure_province_carcasses_weight * free_sell_carcesses_weight_amount + 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 + union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell', + share_type__en_name='union').first().percent / 100 + + union_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province', + share_type__en_name='union').first().percent / 100 + city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100 + city_percent_carcasse_sell = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100 + city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100 + union_province_kill_request_final_amount = union_province_kill_request_percent * province_live_wage_amount + union_carcasse_sell_final_amount = union_free_sell_carcasses_percent * free_sell_carcasses_wage_amount + union_out_poultry_request_amount = union_out_poultry_request_percent * out_poultry_request_wage_amount + city_province_kill_request_final_amount = union_province_kill_request_final_amount * city_percent_province_kill_request + city_carcasse_sell_final_amount = union_carcasse_sell_final_amount * city_percent_carcasse_sell + city_out_poultry_request_final_amount = union_out_poultry_request_amount * city_percent_out_poultry_request + + total_pure_internal_province_carcasses_amount = internal_total_pure_province_carcasses_weight * city_province_kill_request_final_amount + total_pure_external_province_carcasses_amount = external_total_pure_province_carcasses_weight * city_carcasse_sell_final_amount + out_province_poultry_request_amount = out_province_poultry_request_weight * city_out_poultry_request_final_amount + total_wage_amount = total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount + total_killed_quantity = province_live_quantity + out_province_poultry_request_quantity + hatching_killing_percent = ((total_killed_quantity / hatching_quantity) if hatching_quantity > 0 else 0) * 100 + city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0 + total_remain_wage_amount = total_wage_amount - city_deposit + + result = { + "poultries": len(poultries), + "hatchings": len(hatchings), + "hatchings_quantity": hatching_quantity, + "total_province_kill_requests_quantity": province_live_quantity, + "total_province_kill_requests_weight": province_live_weight, + "total_province_carcasses_weight": province_carcasses_weight, + "total_pure_internal_province_carcasses_weight": internal_total_pure_province_carcasses_weight, + "total_pure_external_province_carcasses_weight": external_total_pure_province_carcasses_weight, + "out_province_poultry_request_quantity": out_province_poultry_request_quantity, + "out_province_poultry_request_weight": out_province_poultry_request_weight, + "total_killed_quantity": total_killed_quantity, + "hatching_killing_percent": hatching_killing_percent, + "out_province_poultry_request_amount": out_province_poultry_request_amount, + "total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount, + "total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount, + "total_wage_amount": total_wage_amount, + "number_of_city_deposit": len(city_operator_deposit), + "city_deposit": city_deposit, + "total_remain_wage_amount": total_remain_wage_amount, + } + return result + + +def get_city_sub_sector_finance_info_with_date(poultries, operator,date1,date2): + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', + trash=False).first().amount + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + 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,kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).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 + ) + + 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',acceptor_date__date__gte=date1,acceptor_date__date__lte=date2) + 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) + + different_percent = total_pure_province_carcasses_weight / total_province_carcasses_weight + hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by( + 'poultry') + province_kill_requests = total_province_kill_requests.filter( + province_request__poultry_request__hatching__in=hatchings).order_by('id') + kill_house_requests = total_kill_house_requests.filter( + province_request__poultry_request__hatching__in=hatchings).order_by('id') + + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + has_wage=True, wage_pay=True, + temporary_deleted=False, hatching__in=hatchings,send_date__date__gte=date1, + send_date__date__lte=date2) + province_kill_requests_kill_houses = KillHouse.objects.filter(pk__in=province_kill_requests.values_list('killhouse_user',flat=True)).order_by('id') + + + hatching_list1 = hatchings.filter( + pk__in=province_kill_requests.values_list('province_request__poultry_request__hatching', flat=True), + poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True) + hatching_list2 = hatchings.filter( + pk__in=kill_house_requests.values_list('province_request__poultry_request__hatching', flat=True), + poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True) + hatching_list3 = hatchings.filter(pk__in=poultry_requests.values_list('hatching', flat=True), poultry__in=poultries, + killed_quantity__gt=0, trash=False).values_list('id', flat=True) + total_hatching_list = chain(hatching_list1, hatching_list2, hatching_list3) + hatchings = hatchings.filter(pk__in=total_hatching_list) + + hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_requests = poultry_requests.filter(hatching__id__in=hatching_list3) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + province_live_quantity += kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + province_live_weight += \ + difference_requests.filter(kill_house__in=province_kill_requests_kill_houses).aggregate(total=Sum('weight'))['total'] or 0 + + province_carcasses_weight = province_live_weight * 0.75 + + internal_total_pure_province_carcasses_weight = province_carcasses_weight * different_percent + external_total_pure_province_carcasses_weight = province_carcasses_weight - internal_total_pure_province_carcasses_weight + + # total_pure_province_carcasses_price = internal_total_pure_province_carcasses_weight * province_live_wage_amount + # total_out_selling_province_carcasses_price = external_total_pure_province_carcasses_weight * free_sell_carcesses_weight_amount + 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 + union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell', + share_type__en_name='union').first().percent / 100 + + union_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province', + share_type__en_name='union').first().percent / 100 + city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100 + city_percent_carcasse_sell = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100 + city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100 + union_province_kill_request_final_amount = union_province_kill_request_percent * province_live_wage_amount + union_carcasse_sell_final_amount = union_free_sell_carcasses_percent * free_sell_carcasses_wage_amount + union_out_poultry_request_amount = union_out_poultry_request_percent * out_poultry_request_wage_amount + city_province_kill_request_final_amount = union_province_kill_request_final_amount * city_percent_province_kill_request + city_carcasse_sell_final_amount = union_carcasse_sell_final_amount * city_percent_carcasse_sell + city_out_poultry_request_final_amount = union_out_poultry_request_amount * city_percent_out_poultry_request + + total_pure_internal_province_carcasses_amount = internal_total_pure_province_carcasses_weight * city_province_kill_request_final_amount + total_pure_external_province_carcasses_amount = external_total_pure_province_carcasses_weight * city_carcasse_sell_final_amount + out_province_poultry_request_amount = out_province_poultry_request_weight * city_out_poultry_request_final_amount + total_wage_amount = total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount + total_killed_quantity = province_live_quantity + out_province_poultry_request_quantity + hatching_killing_percent = ((total_killed_quantity / hatching_quantity) if hatching_quantity > 0 else 0) * 100 + city_operator_deposit = SubSectorTransactions.objects.filter(trash=False, city_operator=operator,date__date__gte=date1,date__date__lte=date2) + city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0 + total_remain_wage_amount = total_wage_amount - city_deposit + + result = { + "poultries": len(poultries), + "hatchings": len(hatchings), + "hatchings_quantity": hatching_quantity, + "total_province_kill_requests_quantity": province_live_quantity, + "total_province_kill_requests_weight": province_live_weight, + "total_province_carcasses_weight": province_carcasses_weight, + "total_pure_internal_province_carcasses_weight": internal_total_pure_province_carcasses_weight, + "total_pure_external_province_carcasses_weight": external_total_pure_province_carcasses_weight, + "out_province_poultry_request_quantity": out_province_poultry_request_quantity, + "out_province_poultry_request_weight": out_province_poultry_request_weight, + "total_killed_quantity": total_killed_quantity, + "hatching_killing_percent": hatching_killing_percent, + "out_province_poultry_request_amount": out_province_poultry_request_amount, + "total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount, + "total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount, + "total_wage_amount": total_wage_amount, + "number_of_city_deposit": len(city_operator_deposit), + "city_deposit": city_deposit, + "total_remain_wage_amount": total_remain_wage_amount, + } + return result diff --git a/panel/CityOperator/serializers.py b/panel/CityOperator/serializers.py new file mode 100644 index 0000000..243e09d --- /dev/null +++ b/panel/CityOperator/serializers.py @@ -0,0 +1,138 @@ +import datetime + +from django.db.models import Sum, F +from rest_framework import serializers + +from authentication.serializer.serializer import SystemUserProfileSerializer, BankCardSerializer, \ + SystemUserProfileForGuildSerializer +from authentication.serializers import SystemAddressSerializer +from panel.CityOperator.helpers import get_city_sub_sector_finance_info, get_city_sub_sector_finance_info_with_date +from panel.models import CityOperatorCheckRequest, CityOperator, ProvinceKillRequest, ProvinceCheckOperatorRequest, \ + WageType, PercentageOfWageType, PoultryHatching, Poultry, PoultryRequest, KillHouseFreeBarInformation, \ + KillHouseFreeSaleBarInformation, KillHouse +from panel.poultry.serializers import PoultryRequestSerializer + + +# سریالایزر مربوط به اپراتور شهرستان +class CityOperatorSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(read_only=True, required=False) + + class Meta: + model = CityOperator + exclude = ( + 'id', + 'create_date', + 'modify_date', + # 'trash', + 'created_by', + 'modified_by', + ) + + +class CityOperatorForAllUserSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(read_only=True, required=False) + + class Meta: + model = CityOperator + fields = ['address', 'user_bank_info', 'identity_documents', 'phone', 'unit_name'] + + +class CityOperatorForPoultrySerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = CityOperator + fields = ['key', 'address', 'unit_name'] + + +class CityOperatorForSubSectorTransactionsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = CityOperator + fields = ['key', 'user', 'unit_name'] + + +class CityOperatorForSubSectorSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = CityOperator + fields = ['key', 'user', 'unit_name','wage_info'] + + + def get_wage_info(self, obj): + date1=None + date2=None + if self.context.get('request').GET.get('date1'): + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + poultries = Poultry.objects.filter(city_operator=obj.unit_name,trash=False).order_by('id') + info=get_city_sub_sector_finance_info(poultries,obj,date1,date2) + return info + + + +# سریالایزر مربوط به بررسی درخواست مرغدار توسط شهرستان (تایید یا رد) +class CityOperatorCheckRequestSerializer(serializers.ModelSerializer): + poultry_request = PoultryRequestSerializer(read_only=True) + quantity = serializers.SerializerMethodField('get_quantity') + + # city_operator = CityOperatorSerializer() + + class Meta: + model = CityOperatorCheckRequest + fields = '__all__' + + def get_quantity(self, instance): + allocated_number = 0 + returned_number = 0 + assignable_number = 0 + province_check_req = ProvinceCheckOperatorRequest.objects.filter(city_request_Poultry=instance) + if province_check_req.count() > 0: + province_check_req = province_check_req.last() + assignable_number = province_check_req.quantity + else: + assignable_number = instance.poultry_request.quantity + + province_kill_requests = ProvinceKillRequest.objects.filter(province_request__city_request_Poultry=instance, + trash=False, state__in=('pending', 'accepted')) + if province_kill_requests.count() > 0: + for province_kill_request in province_kill_requests: + if province_kill_request.return_to_province == False: + allocated_number += province_kill_request.main_quantity + else: + returned_number += province_kill_request.main_quantity + + quantity = { + "allocated_number": allocated_number, + "assignable_number": assignable_number, + "returned_number": returned_number, + } + return quantity + + +class CityOperatorForSubSectorSerializerForExcel(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = CityOperator + fields = ['key', 'user', 'unit_name','wage_info'] + + + def get_wage_info(self, obj): + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + + poultries = Poultry.objects.filter(city_operator=obj.unit_name,trash=False).order_by('id') + info=get_city_sub_sector_finance_info_with_date(poultries,obj,date1,date2) + return info \ No newline at end of file diff --git a/panel/CityOperator/views.py b/panel/CityOperator/views.py new file mode 100644 index 0000000..2bbe9b1 --- /dev/null +++ b/panel/CityOperator/views.py @@ -0,0 +1,666 @@ +import threading + +import jdatetime +from rest_framework.pagination import PageNumberPagination + +# . + +from authentication.helper.refresh import refresh +from authentication.sms_management import poultry_request_receive_city_accept_sms, \ + poultry_request_receive_province_accept_sms + +from panel.CityOperator.serializers import ( + CityOperatorCheckRequestSerializer, + CityOperatorSerializer, CityOperatorForPoultrySerializer, CityOperatorForSubSectorSerializer, + CityOperatorForSubSectorTransactionsSerializer +) +from authentication.serializer.serializer import ( + SystemAddressSerializer, + BankCardSerializer +) +from authentication.models import SystemAddress, CityUnit +from panel.poultry.serializers import PoultrySerializer, PoultryRequestSerializer, \ + PoultryRequestForKillingInformationSerializer +from panel.convert_date import convert_to_miladi +from panel.models import ( + CityOperatorCheckRequest, + PoultryRequest, + CityOperator, + PoultryRequestAuction, + ProvinceOperator, + Poultry, PoultryHatching, VetFarm, VetFarmInspection, SmsLicense, ProvinceCheckOperatorRequest, ProvinceKillRequest, + KillHouseCheckRequest, KillRequest +) +from authentication.models import ( + City, + Province +) +from authentication.models import SystemUserProfile +from panel.filterset import UserProfileFilterSet, CityOperatorRequestFilterSet, PoultryRequestFilterSet +from django_filters.rest_framework import DjangoFilterBackend +from authentication.permissions import CityOperator as CityOperatorPermission +from authentication.permissions import ProvinceOperator as provinceOperatorPermission +from authentication.models import UserProfile, UserMessage +from rest_framework.response import Response +from django.contrib.auth.models import User +from rest_framework import viewsets +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, + OAuth2Authentication, +) +from rest_framework import status +from django.http import QueryDict +from datetime import datetime, timedelta +from django.db.models import Q +from panel.helper import remove_null_fields + +class CustomPagination(PageNumberPagination): + page_size = 10 + +class ShowCityOperatorViewSet(viewsets.ModelViewSet): + queryset = CityOperator.objects.all() + serializer_class = CityOperatorSerializer + permission_classes = [TokenHasReadWriteScope] + + # def list(self, request, *args, **kwargs): + # # refresh(request.user.id) + # if 'breeding_uniq_id' in request.GET: + # poultry = Poultry.objects.get(breeding_unique_id=request.GET['breeding_uniq_id']) + # else: + # + # user = SystemUserProfile.objects.get(user=request.user) + # poultry = Poultry.objects.get(user=user) + # # city = City.objects.get(key=poultry.address.city.key) + # + # city_unit = CityUnit.objects.get(name=poultry.address.city.name) + # # city_operator_system = CityOperator.objects.get(address__city=city_unit.city, trash=False) + # operator_list = [] + # opertors = CityOperator.objects.filter(address__city__name__in=(city_unit.city.name, 'فاقد شهرستان'), + # trash=False) + # # poultry_request = PoultryRequest.objects.filter(trash=False, poultry=poultry).select_related( + # # 'city_operator').last() + # + # for opertor in opertors: + # last = True if poultry.city_operator == opertor.unit_name else False + # operator_dict = { + # "key": opertor.key, + # "unit_name": opertor.unit_name, + # "last": last + # } + # operator_list.append(operator_dict) + # + # return Response(operator_list) + + def list(self, request, *args, **kwargs): + operator_list = [] + if 'breeding_uniq_id' in request.GET: + poultry = Poultry.objects.get(breeding_unique_id=request.GET['breeding_uniq_id']) + else: + + user = SystemUserProfile.objects.get(user=request.user) + poultry = Poultry.objects.get(user=user) + opertor = CityOperator.objects.filter(unit_name=poultry.city_operator, + + trash=False).last() + if not opertor: + opertor = CityOperator.objects.filter(unit_name='اتحادیه استان (فاقد تعاونی)', + + trash=False).last() + + operator_dict = { + "key": opertor.key, + "unit_name": opertor.unit_name, + } + operator_list.append(operator_dict) + + return Response(operator_list) + + +# ویوست مربوط به اپراتور شهرستان +class CityOperatorViewSet(viewsets.ModelViewSet): + queryset = CityOperator.objects.all() + serializer_class = CityOperatorSerializer + permission_classes = [TokenHasReadWriteScope] + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + # get city operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + operator = user.city_operator_user.all() + + # send to serializer + serializer = self.serializer_class(operator[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + city_operators = CityOperator.objects.filter(address__province=user.province, trash=False) + serializer = CityOperatorForPoultrySerializer(city_operators, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + + +class CityOperatorForSubSectorViewSet(viewsets.ModelViewSet): + queryset = CityOperator.objects.all() + serializer_class = CityOperatorForSubSectorSerializer + permission_classes = [TokenHasReadWriteScope] + + + def list(self, request, pk=None, *args, **kwargs): + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + city_operators = CityOperator.objects.filter(address__province=user.province, trash=False) + if 'operators' in request.GET: + + serializer = CityOperatorForSubSectorTransactionsSerializer(city_operators, many=True) + else: + serializer = self.serializer_class(city_operators, many=True,context={'request':request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به بررسی درخواست مرغدار +class CityOperatorCheckRequestViewSet(viewsets.ModelViewSet): + queryset = CityOperatorCheckRequest.objects.all() + serializer_class = CityOperatorCheckRequestSerializer + # permission_classes = [TokenHasReadWriteScope, provinceOperatorPermission, CityOperatorPermission] + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = CityOperatorRequestFilterSet + filterset_fields = [ + 'poultry_request__user__mobile', + 'poultry_request__user__fullname', + 'poultry_request__user__first_name', + 'poultry_request__user__last_name', + 'poultry_request__user__address__breeding_unique_id', + 'poultry_request__order_code', + ] + + # تابع برای تایید یا رد درخواست مرغدار توسط شهرستان + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + # refresh(request.user.id) + role = request.data['role'] + request.data.pop('role') + key = request.data['key'] + state = request.data['state'] + poultry_request = PoultryRequest.objects.get(key=key, trash=False) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + if role == 'ProvinceOperator': + province_operator = SystemUserProfile.objects.filter(user=request.user, trash=False) + if province_operator.count() > 0: + province_operator = province_operator.last() + # city_unit = CityUnit.objects.get(name=poultry_request.poultry.address.city.name) + # city_operator_system = CityOperator.objects.get(address__city=city_unit.city, trash=False) + city_operator_system = CityOperator.objects.get(key=poultry_request.city_operator.key, trash=False) + city_operator = SystemUserProfile.objects.get(key=city_operator_system.user.key, trash=False) + + else: + city_operator = SystemUserProfile.objects.get(user=request.user, trash=False) + city_operator_system = CityOperator.objects.get(key=poultry_request.city_operator.key, trash=False) + province = city_operator.province.name + province_operator = SystemUserProfile.objects.filter(role__name='ProvinceOperator', + province__name=province, trash=False).last() + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + city_operator_check_request = serializer.create(validated_data=request.data) + if state == 'accept': + poultry_request.state = { + "city_operator": city_operator.first_name + " " + city_operator.last_name, + "city_state": "accepted", + "city_operator_mobile": city_operator.mobile, + "city_operator_date_time_accepted": str(city_operator_check_request.create_date), + "province_operator": province_operator.first_name + " " + province_operator.last_name, + "provice_operator_mobile": province_operator.mobile, + "province_state": "pending" + } + poultry_request.state_process = 'accepted' + poultry_auctions = PoultryRequestAuction.objects.filter(poultry_request=poultry_request, + trash=False).order_by( + 'auction_date') + if poultry_auctions.count() > 0: + list2 = [] + i = 0 + for poultry_auction in poultry_auctions: + if i == 0: + poultry_auction.auction_date = datetime.now() + timedelta( + hours=int(poultry_auction.hour)) + poultry_auction.state = 'active' + poultry_auction.save() + list2.append(poultry_auction) + else: + poultry_auction.auction_date = list2[0].auction_date + timedelta( + hours=int(poultry_auction.hour)) + poultry_auction.save() + list2.clear() + list2.append(poultry_auction) + + i += 1 + + message = UserMessage( + message="درخواست شما با کد سفارش {0} از طرف کارشناس شهرستان {1} تایید شده است و در حال حاضر در انتظار تایید کارشناس استان {2} میباشد ".format( + poultry_request.order_code, city_operator.fullname, province_operator.fullname), + heading="پیام سیستم ثبت شده در تاریخ {0}".format(datetime.now()), + sender=city_operator + ) + message.save() + message.users.add(poultry_request.poultry.user) + + if state == 'reject': + if poultry_request.kill_house_list != None and len(poultry_request.kill_house_list) > 0: + for item in poultry_request.kill_house_list: + parts = item.split("(") + name = parts[0].strip() + + kill_request = KillRequest.objects.filter(kill_house__name=name, + recive_date__date=poultry_request.send_date.date(), + trash=False, poultry__isnull=True, + province_state='accepted').first() + if kill_request: + kill_request.remain_quantity_for_poultry -= poultry_request.quantity + kill_request.save() + poultry_request.state = { + "city_operator": city_operator.first_name + " " + city_operator.last_name, + "city_state": " rejected", + "city_operator_date_time_rejected": str(city_operator_check_request.create_date), + "province_operator": "", + "province_state": "" + } + # hatching.left_over += (poultry_request.quantity + poultry_request.losses) + hatching.losses -= poultry_request.losses + hatching.state = 'pending' + hatching.allow_hatching = 'pending' + hatching.save() + poultry_request.message = city_operator_check_request.message + poultry_request.state_process = 'rejected' + message = UserMessage( + message="درخواست شما با کد سفارش {0} از طرف کارشناس شهرستان {1} رد شده است ".format( + poultry_request.order_code, city_operator.fullname), + heading="پیام سیستم ثبت شده در تاریخ {0}".format(datetime.now()), + sender=city_operator + ) + message.save() + message.users.add(poultry_request.poultry.user) + city_operator_check_request.city_operator_system = city_operator_system + city_operator_check_request.poultry_request = poultry_request + if poultry_request.auction == True: + city_operator_check_request.show_province = False + poultry_request.save() + if role == 'ProvinceOperator': + city_operator_check_request.province_accept = True + city_operator_check_request.save() + if state == 'accept': + if SmsLicense.objects.filter(city_approval=True).exists(): + poultry_mobile = city_operator_check_request.poultry_request.poultry.user.mobile + order_code = city_operator_check_request.poultry_request.order_code + date_str = str(city_operator_check_request.poultry_request.send_date) + send_date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + sms_poultry_request_receive_city_accept_sms = threading.Thread( + target=poultry_request_receive_city_accept_sms, + args=( + poultry_mobile, + send_date,city_operator_check_request.poultry_request.order_code, + send_date,city_operator_check_request.poultry_request.free_sale_in_province, + + )) + sms_poultry_request_receive_city_accept_sms.start() + + if role == 'ProvinceOperator': + poultry_mobile = city_operator_check_request.poultry_request.poultry.user.mobile + order_code = city_operator_check_request.poultry_request.order_code + + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + + check = ProvinceCheckOperatorRequest( + province_operator_system=province_operator, + poultry_request=city_operator_check_request.poultry_request, + city_request_Poultry=city_operator_check_request, + quantity=poultry_request.quantity, + + state='accept', + ) + check.save() + city_operator_check_request.province_state = 'accept' + city_operator_check_request.save() + poultry_request.province_state = 'accepted' + poultry_request.save() + sms_poultry_request_receive_province_accept_sms_sms = threading.Thread( + target=poultry_request_receive_province_accept_sms, + args=( + poultry_mobile, order_code)) + sms_poultry_request_receive_province_accept_sms_sms.start() + + return Response({"result": "درخواست شما با موفقیت برای استان ارسال شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع برای نمایش درخواست های تایید شده مرغدار توسط شهرستان + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + queryset = [] + + if 'state' in request.GET: + user = SystemUserProfile.objects.get(user=request.user) + + if request.GET['state'] == 'waiting': + if 'date' in request.GET: + date = datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.now().date() + + queryset = [] + queryset = CityOperatorCheckRequest.objects.filter( + show_province=True, city_operator_system__address__province=user.province, + poultry_request__final_state='pending', trash=False, poultry_request__direct_buying=False, + poultry_request__send_date__year=date.year, poultry_request__send_date__month=date.month, + poultry_request__send_date__day=date.day + ).order_by( + '-poultry_request__send_date') + # item_list = CityOperatorCheckRequest.objects.filter( + # show_province=True, city_operator_system__address__province=user.province, + # poultry_request__final_state='pending', trash=False, + # poultry_request__send_date__year=date.year, poultry_request__send_date__month=date.month, + # poultry_request__send_date__day=date.day + # ).order_by( + # '-poultry_request__send_date') + # for req in item_list: + # province_check_req = ProvinceCheckOperatorRequest.objects.filter(city_request_Poultry=req) + # if province_check_req.count() > 0: + # province_check_req = province_check_req.last() + # if province_check_req.quantity > 0 and province_check_req.state == 'accept' or province_check_req.state == 'pending': + # if req in queryset: + # pass + # else: + # queryset.append(req) + # province_kill_reqs = ProvinceKillRequest.objects.filter(province_request=province_check_req) + # if province_kill_reqs.count() > 0: + # counter = 0 + # for province_kill_req in province_kill_reqs: + # if KillHouseCheckRequest.objects.filter( + # province_kill_request=province_kill_req, state='accepted').exists(): + # counter += 1 + # if province_kill_reqs.count() == counter and province_check_req.quantity == 0: + # pass + # else: + # + # if req in queryset: + # pass + # else: + # queryset.append(req) + + elif request.GET['state'] == 'all': + queryset = CityOperatorCheckRequest.objects.filter( + show_province=True, city_operator_system__address__province=user.province, + poultry_request__final_state='pending', trash=False).order_by( + '-poultry_request__send_date') + elif request.GET['state'] == 'new': + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + queryset_list = CityOperatorCheckRequest.objects.filter(state='accept', province_state='pending', + show_province=True, + city_operator_system__address__province=user.province, + trash=False).order_by( + 'poultry_request__send_date') + + queryset = [ + city_check for city_check in queryset_list + if date1 <= city_check.poultry_request.send_date.date() <= date2 + ] + else: + pass + # if 'state' in request.GET: + # if request.GET['state'] == 'CityOperator': + # user = SystemUserProfile.objects.get(user=request.user) + # city_operator = CityOperator.objects.get(user=user) + # queryset = CityOperatorCheckRequest.objects.filter( + # poultry_request__user__address__city=city_operator.address.city).order_by('-create_date') + + if 'type' in request.GET: + if request.GET['type'] == 'filter': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=self.queryset.filter(state__exact="accept", trash=False) + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=self.queryset) + filtered_city_operator = ps.filter() + serializer = self.serializer_class(filtered_city_operator, many=True) + return Response(serializer.data) + return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN) + + serializer = CityOperatorCheckRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + +class CityOperatorCheckRequestNewViewSet(viewsets.ModelViewSet): + queryset = CityOperatorCheckRequest.objects.all() + serializer_class = CityOperatorCheckRequestSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = CityOperatorRequestFilterSet + filterset_fields = [ + 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__user__fullname', + 'poultry_request__poultry__user__first_name', + 'poultry_request__poultry__user__last_name', + 'poultry_request__poultry__user__city__name', + 'poultry_request__order_code', + ] + + # تابع برای نمایش درخواست های تایید شده مرغدار توسط شهرستان + def list(self, request, *args, **kwargs): + queryset = [] + + if 'state' in request.GET: + user = SystemUserProfile.objects.get(user=request.user) + + if request.GET['state'] == 'waiting': + if 'date' in request.GET: + date = datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.now().date() + + queryset = [] + queryset = CityOperatorCheckRequest.objects.filter( + show_province=True, city_operator_system__address__province=user.province, + poultry_request__final_state='pending', trash=False, poultry_request__direct_buying=False, + poultry_request__send_date__year=date.year, poultry_request__send_date__month=date.month, + poultry_request__send_date__day=date.day + ).order_by( + '-poultry_request__send_date') + + + elif request.GET['state'] == 'all': + queryset = CityOperatorCheckRequest.objects.filter( + show_province=True, city_operator_system__address__province=user.province, + poultry_request__final_state='pending', trash=False).order_by( + '-poultry_request__send_date') + elif request.GET['state'] == 'new': + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + queryset = CityOperatorCheckRequest.objects.filter(state='accept', province_state='pending', + show_province=True, + poultry_request__send_date__date__gte=date1, + poultry_request__send_date__date__lte=date2, + city_operator_system__address__province=user.province, + trash=False).order_by( + 'poultry_request__send_date') + + # queryset = [ + # city_check for city_check in queryset_list + # if date1 <= city_check.poultry_request.send_date.date() <= date2 + # ] + else: + pass + + if 'search' in request.GET: + city_check_requests = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=queryset + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=queryset) + city_check_requests = ps.filter() + queryset = [] if len(city_check_requests) == 0 else city_check_requests + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = CityOperatorCheckRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + +class PoultryEditByCityOperatorViewSet(viewsets.ModelViewSet): + queryset = Poultry.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultrySerializer + + def update(self, request, *args, **kwargs): + # refresh(request.user.id) + # get poultry object + poultry_object = self.queryset.get(key=request.data['poultry_key'], trash=False) + request.data.pop('poultry_key') + + # Remove Null Fields From Address Body + request = remove_null_fields(type='item', request=request, item='address') + # Remove Null Fields From User Bank Info Body + request = remove_null_fields(type='item', request=request, item='user_bank_info') + # Remove Null Fields From request Body + request = remove_null_fields(type='req', request=request) + + # update address information + address_data = request.data['address'] + province = None + city = None + if 'province' and 'city' in address_data.keys(): + province = Province.objects.get(key=address_data['province'], trash=False) + address_data.pop('province') + city = City.objects.get(key=address_data['city'], trash=False) + address_data.pop('city') + address_serializer = SystemAddressSerializer(data=address_data) + if address_serializer.is_valid(): + addr_object = address_serializer.update( + instance=poultry_object.address, + validated_data=address_data + ) + if province != None and city != None: + addr_object.province = province + addr_object.city = city + addr_object.save() + request.data.pop('address') + + # update user bank information + if poultry_object.user_bank_info != None: + bank_data = request.data['user_bank_info'] + bank_serializer = BankCardSerializer(data=bank_data) + if bank_serializer.is_valid(): + bank_object = bank_serializer.update( + instance=poultry_object.user_bank_info, + validated_data=bank_data + ) + request.data.pop('user_bank_info') + else: + bank_data = request.data['user_bank_info'] + bank_serializer = BankCardSerializer(data=bank_data) + if bank_serializer.is_valid(): + bank_object = bank_serializer.create( + validated_data=bank_data + ) + request.data.pop('user_bank_info') + + # sending data to serializer & update poultry object + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + obj = serializer.update( + instance=poultry_object, + validated_data=request.data + ) + obj.user_bank_info = bank_object + obj.save() + serializer = self.serializer_class(obj) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class ManagementRequestViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + # filterset_class = PoultryRequestFilterSet + filterset_fields = [ + 'order_code', + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__address__city__name', + + ] + def list(self, request, *args, **kwargs): + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + poultry_requests = [] + user = SystemUserProfile.objects.get(user=request.user) + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + trash=False, state_process__in=('pending', 'accepted'), + province_state='pending', + final_state='pending', out=False, + send_date__date__gte=date1, send_date__date__lte=date2 + ).order_by('-send_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (PoultryRequestFilterSet( + data=query, + queryset=queryset + ) + ).filter(): + ps = PoultryRequestFilterSet(data=query, queryset=queryset) + poultry_requests = ps.filter() + queryset = [] if len(poultry_requests) == 0 else poultry_requests + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = PoultryRequestForKillingInformationSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) diff --git a/panel/KillHouse/__init__.py b/panel/KillHouse/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/KillHouse/excel_processing.py b/panel/KillHouse/excel_processing.py new file mode 100644 index 0000000..e9fc577 --- /dev/null +++ b/panel/KillHouse/excel_processing.py @@ -0,0 +1,19548 @@ +import datetime +import string +from io import BytesIO +from datetime import timedelta +import jdatetime +import openpyxl +from django.contrib.auth.models import Group +from django.db.models import Sum, F, Q, Count +from django.http import QueryDict, HttpResponse +from django.views.decorators.csrf import csrf_exempt +from openpyxl import Workbook +from openpyxl.chart import Reference, BarChart, LineChart +from openpyxl.drawing.image import Image +from openpyxl.styles import PatternFill, Alignment, Font +from openpyxl.utils import get_column_letter +from django.db.models import Value +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import AllowAny + +from authentication.models import SystemUserProfile, City, Province +from general_urls import base_url_sms +from panel.KillHouse.serializers import KillHouseForProvinceWareHouseDashboardSerializer, \ + KillHouseRequestForBarManagementSerializer, TotalKillHouseWarehouseArchiveDashboardSerializer +from panel.ProvinceOperator.serializers import WarehouseArchiveSerializer +from panel.convert_date import convert_to_shamsi +from panel.filterset import KillRequestFilterSet, KillHouseRequestFilterSet, KillHouseFreeBarInformationFilterSet, \ + OutProvinceCarcassesBuyerFilterSet, StewardAllocationFilterSet, DashboardEnterLoadInformationFilterSet, \ + WarehouseArchiveFilterSet, KillHouseFilterSet +from panel.helper import build_query +from panel.helper_excel import shamsi_date, create_header, create_header_freez, \ + excel_description, create_value, Alignment_CELL, blue_fill, cell_color_changer, add_chart, convert_str_to_date +from panel.models import KillRequest, KillHouse, KillHouseVet, KillHousePercentage, ProvinceKillRequest, \ + KillHouseRequest, CityOperator, VetFarm, PoultryRequest, VetCheckRequest, KillHouseAssignmentInformation, Vet, \ + KillHouseFreeBarInformation, KillHouseOperator, Poultry, ChainAllocation, KillHouseWareHouse, StewardAllocation, \ + OutProvinceCarcassesBuyer, KillHouseFreeSaleBarInformation, WageType, RolesProducts, ColdHouse, Guilds, \ + WarehouseArchive +from django.db.models import Sum, F, Case, When, BooleanField + + +def direct_purchase_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + filterset_class = KillRequestFilterSet + filterset_fields = [ + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__unit_name', + ] + kill_requests = KillRequest.objects.filter( + trash=False, + recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + direct_buying_state__in=( + 'accepted', 'rejected', 'deleted', 'pending'), + export_status=False + ).order_by( + Case( + When(direct_buying_state='pending', then=Value(0)), + default=Value(1) + ), + '-recive_date' # مرتب‌سازی بر اساس تاریخ بعد از مرتب‌سازی بر اساس حالت + ) + if request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_requests = kill_requests.filter(kill_house__kill_house_operator__user=user) + else: + kill_requests = kill_requests + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_requests) + kill_requests = ps.filter() + + excel_options = [ + 'ردیف', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'خریدار', + 'تلفن خریدار', + 'محل کشتار', + 'مرغدار', + 'تلفن مرغدار', + 'نژاد', + 'تعداد درخواستی', + 'تعداد تایید شده', + 'میانگین وزنی', + 'وزن کل(کیلوگرم)', + 'کد احراز', + 'حداکثر مهلت تسویه', + 'وضعیت', + ] + header_list = [ + 'تعداد کل خرید', + 'مجموع تعداد درخواستی', + 'مجموع وزن(کیلوگرم)', + 'تعداد درخواست دارای کد احراز', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + create_header_freez(worksheet, excel_options, 1, 4, 5, height=18, width=20.1) + create_header(worksheet, header_list, 4, 2, height=24, width=20.01) + + row = 3 + m = 1 + all_direct_buying_code = 0 + for kill_request in kill_requests: + row += 1 + recive_date = jdatetime.date.fromgregorian( + day=kill_request.recive_date.day, + month=kill_request.recive_date.month, + year=kill_request.recive_date.year + ) if kill_request.recive_date else '-' + create_date = jdatetime.date.fromgregorian( + day=kill_request.create_date.day, + month=kill_request.create_date.month, + year=kill_request.create_date.year + ) if kill_request.create_date else '-' + if kill_request.slaughter_house is not None: + kill_place = kill_request.slaughter_house.name + else: + kill_place = kill_request.kill_house.name + if kill_request.direct_buying_state == 'pending': + state = 'درانتظار تایید' + elif kill_request.direct_buying_state == 'rejected': + state = 'رد شده' + elif kill_request.direct_buying_state == 'deleted': + state = 'حذف شده' + else: + state = 'تایید شده' + cepacity = kill_request.kill_capacity if kill_request.kill_capacity else '-' + if kill_request.input_direct_buying_code: + direct_buying_code = kill_request.input_direct_buying_code + all_direct_buying_code += 1 + else: + direct_buying_code = '-' + list1 = [ + m, + str(create_date), + str(recive_date), + kill_request.kill_house.name, + kill_request.kill_house.kill_house_operator.user.mobile, + kill_place, + kill_request.poultry.unit_name, + kill_request.poultry.user.mobile, + kill_request.chicken_breed, + kill_request.previous_kill_capacity, + cepacity, + kill_request.Index_weight, + kill_request.Index_weight * kill_request.previous_kill_capacity, + direct_buying_code, + str(shamsi_date(kill_request.payment_deadline_date, in_value=True)) if kill_request.payment_deadline_date else '-', + state, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=row + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + m += 1 + total_quantity = kill_requests.aggregate( + total_quantity=Sum('kill_capacity')).get( + 'total_quantity') or 0 + total_wight = kill_requests.aggregate( + total_quantity=Sum(F('Index_weight') * F('previous_kill_capacity'))).get( + 'total_quantity') or 0 + value_list = [ + m - 1, + total_quantity, + total_wight, + all_direct_buying_code, + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=3, column=item + 4, value=value_list[item]) + value = value_list[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + 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 + + +def direct_purchase_archive_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + filterset_class = KillRequestFilterSet + filterset_fields = [ + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__unit_name', + ] + kill_requests = KillRequest.objects.filter( + trash=False, + recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + direct_buying_state__in=( + 'accepted', 'rejected', 'deleted') + ).order_by( + 'recive_date') + if request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_requests = kill_requests.filter(kill_house__kill_house_operator__user=user) + else: + kill_requests = kill_requests + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_requests) + kill_requests = ps.filter() + + excel_options = [ + 'ردیف', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'خریدار', + 'تلفن خریدار', + 'محل کشتار', + 'مرغدار', + 'تلفن مرغدار', + 'نژاد', + 'تعداد درخواستی', + 'تعداد تایید شده', + 'میانگین وزنی', + 'وزن کل(کیلوگرم)', + 'کد احراز', + 'وضعیت', + ] + header_list = [ + 'تعداد کل خرید', + 'مجموع تعداد درخواستی', + 'مجموع وزن(کیلوگرم)', + 'تعداد درخواست دارای کد احراز', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + create_header_freez(worksheet, excel_options, 1, 4, 5, height=18, width=20.1) + create_header(worksheet, header_list, 4, 2, height=24, width=20.01) + + row = 3 + m = 1 + all_direct_buying_code = 0 + for kill_request in kill_requests: + row += 1 + recive_date = jdatetime.date.fromgregorian( + day=kill_request.recive_date.day, + month=kill_request.recive_date.month, + year=kill_request.recive_date.year + ) if kill_request.recive_date else '-' + create_date = jdatetime.date.fromgregorian( + day=kill_request.create_date.day, + month=kill_request.create_date.month, + year=kill_request.create_date.year + ) if kill_request.create_date else '-' + if kill_request.slaughter_house is not None: + kill_place = kill_request.slaughter_house.name + else: + kill_place = kill_request.kill_house.name + if kill_request.direct_buying_state == 'pending': + state = 'درانتظار تایید' + elif kill_request.direct_buying_state == 'rejected': + state = 'رد شده' + else: + state = 'تایید شده' + cepacity = kill_request.kill_capacity if kill_request.kill_capacity else '-' + if kill_request.input_direct_buying_code: + direct_buying_code = kill_request.input_direct_buying_code + all_direct_buying_code += 1 + else: + direct_buying_code = '-' + list1 = [ + m, + str(create_date), + str(recive_date), + kill_request.kill_house.name, + kill_request.kill_house.kill_house_operator.user.mobile, + kill_place, + kill_request.poultry.unit_name, + kill_request.poultry.user.mobile, + kill_request.chicken_breed, + kill_request.previous_kill_capacity, + cepacity, + kill_request.Index_weight, + kill_request.Index_weight * kill_request.previous_kill_capacity, + direct_buying_code, + state, + ] + for item in range(len(list1)): + cell = worksheet.cell(row=row + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + m += 1 + total_quantity = kill_requests.aggregate( + total_quantity=Sum('kill_capacity')).get( + 'total_quantity') or 0 + total_wight = kill_requests.aggregate( + total_quantity=Sum(F('Index_weight') * F('previous_kill_capacity'))).get( + 'total_quantity') or 0 + value_list = [ + m - 1, + total_quantity, + total_wight, + all_direct_buying_code, + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=3, column=item + 4, value=value_list[item]) + value = value_list[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + + 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 + + +def kill_house_assignment_information_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('ware_house_accepted_real_quantity', 'ware_house_accepted_real_weight', + 'weight_loss', 'message', 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', 'killer').values('ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', + ) + if 'key' in request.GET: + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__user__city=user.city) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + filtered_kill_reqs = filtered_kill_request.filter(killhouse_user__kill_house_operator__user=user) + else: + filtered_kill_reqs = filtered_kill_request + else: + filtered_kill_reqs = filtered_kill_request + + else: + filtered_kill_reqs = filtered_kill_request + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های داری سند', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + killer_exclusive = 0 + all_assignment_state_archive_state = 0 + len_weight_loss = 0 + all_state_ware_house_confirmation = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + real_quantity = assignment.get('real_quantity') + + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_quantity += quantity + all_weighte += weight + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + if kill['assignment_state_archive'] == 'True': + all_assignment_state_archive_state += 1 + assignment_state_archive_state = 'وارد شده است' + else: + assignment_state_archive_state = 'وارد نشده است' + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + if weight_loss > 0: + len_weight_loss += 1 + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + all_state_ware_house_confirmation += 1 + + else: + state_ware_house_confirmation = '-' + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if weight_loss1 != 0 else 0 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + state_delete, + assignment_state_archive_state, + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + ware_house_accepted_real_weight, + weight_loss, + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[40] == 'بار حذف شده': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity') or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity', 0) or 0 + all_weight_loss = filtered_kill_reqs.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_weight_loss = round(all_weight_loss / len_weight_loss, 2) + value_header_list = [ + len(filtered_kill_reqs), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0, + all_assignment_state_archive_state, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + all_ware_house_accepted_real_weight, + all_weight_loss + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + all_ware_house_accepted_real_weight, + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if request.GET['role'] == 'KillHouse': + name = filtered_kill_request.first()['killhouse_user__name'] + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای کشتارگاه {name}.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارها.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def kill_house_user_excel(request): + kill_houses = KillHouse.objects.filter(trash=False).select_related('kill_house_operator__user').order_by('id') + excel_options = [ + 'ردیف', + 'ماهیت', + 'نام واحد', + 'نام و نام خانوادگی', + 'تلفن', + 'دامپزشک کشتارگاه', + ' تلفن دامپزشک کشتارگاه', + 'آدرس', + 'محل کشتار', + 'تعداد سفارشات', + 'حجم سفارشات', + 'وزن سفارشات', + 'تعداد بارها', + 'حجم بارها', + 'وزن بارها', + 'میانگین وزنی', + 'تعداد بار ورودی به انبار', + 'حجم ورودی به انبار', + 'وزن ورودی به انبار', + 'درصد افت', + 'لینک پرداخت', + 'تعداد بارهای فاقد قرنطینه تخلیه شده', + 'درصد بارهای فاقد قرنطینه تخلیه شده', + 'تعداد بارهای دارای قرنطینه تخلیه نشده', + 'درصد بارهای دارای قرنطینه تخلیه نشده', + 'تعداد بارهای تخلیه شده', + 'درصد بارهای تخلیه شده', + 'تعداد بارهای ارزیابی شده', + 'درصد بارهای ارزیابی شده', + 'تعداد بارهای تایید شده در سند', + 'درصد بارهای تایید شده در سند', + 'تعداد بارهای مغایرت دارد در سند', + 'درصد بارهای مغایرت دارد در سند', + 'تعداد بارهای فاقد کیفیت در سند', + 'درصد بارهای فاقد کیفیت در سند', + 'تعداد بارهای تایید شده بدون کیفیت در سند', + 'درصد بارهای تایید شده بدون کیفیت در سند', + 'تعداد بارهای دست نویس در سند', + 'درصد بارهای دست نویس در سند', + 'تعداد بارهای باطل شده در سند', + 'درصد بارهای باطل شده در سند', + 'تعداد بارهای تخلیه نشده', + 'درصد بارهای تخلیه نشده', + 'میانگین وزن کشتار روزانه', + 'میانگین حجم کشتار روزانه', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[4].height = 25 + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد خریداران', + 'تعداد کشتارکن', + 'تعداد کشتارکن های عمومی', + 'تعداد کشتارکن های اختصاصی', + 'تعداد کل سفارشات', + 'حجم کل سفارشات', + 'وزن کل سفارشات', + 'تعداد بارها', + 'حجم بارها', + 'وزن بارها', + 'تعداد بار ورودی به انبار', + 'حجم ورودی به انبار', + 'وزن ورودی به انبار', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + worksheet['B1'] = f'مدیریت خریداران از تاریخ {from_date_1} تا {to_date_1}' + else: + worksheet['B1'] = f'مدیریت خریداران' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 4 + m = 1 + killer_type_public = 0 + killer_type_exclusive = 0 + killer = 0 + len_province_kill_request = 0 + all_province_weight = 0 + all_province_quantity = 0 + len_kill_request = 0 + all_kill_request_quantity = 0 + all_kill_request_weight = 0 + all_len_kill_req1 = 0 + all_ware_house_accepted_real_weight = 0 + all_ware_house_accepted_real_quantity = 0 + all_weight_loss = 0 + for kill_house in kill_houses: + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + province_kill_request = ProvinceKillRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False, return_to_province=False, + state__in=('accepted', 'pending'), + killhouse_user=kill_house).select_related( + 'province_request__poultry_request') \ + .only('main_quantity', 'province_request__poultry_request__Index_weight') + + kill_request = KillHouseRequest.objects.filter(Q(killhouse_user=kill_house) | Q(killer=kill_house), + trash=False + , kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).only( + 'accepted_assignment_real_quantity', + 'accepted_assignment_real_weight') + else: + province_kill_request = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('accepted', 'pending'), + killhouse_user=kill_house).select_related( + 'province_request__poultry_request') \ + .only('main_quantity', 'province_request__poultry_request__Index_weight') + + kill_request = KillHouseRequest.objects.filter(Q(killhouse_user=kill_house) | Q(killer=kill_house), + trash=False + ).only('accepted_assignment_real_quantity', + 'accepted_assignment_real_weight') + + percentage = KillHousePercentage.objects.filter(kill_house=kill_house).select_related('kill_house_for_killer', + 'kill_house').first() + if percentage: + if percentage.kill_house_for_killer != None: + place = percentage.kill_house_for_killer.name + else: + place = percentage.kill_house.name + else: + place = kill_house.name + if kill_house.killer == True: + killer += 1 + type = 'کشتارکن' + if kill_house.type == 'public': + killer_type = f'{type} عمومی ' + killer_type_public += 1 + else: + killer_type = f' {type} اختصاصی ({place})' + killer_type_exclusive += 1 + + else: + type = 'کشتارگاه' + killer_type = f'{type} ' + + all_recive_date = set(kill_request.values_list('kill_request__recive_date__date', flat=True)) + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_house).first() + + if kill_house_vet: + vet_fullname = kill_house_vet.vet.user.fullname + vet_mobile = kill_house_vet.vet.user.mobile + else: + vet_fullname = '-' + vet_mobile = '-' + + len_province_kill_request += len(province_kill_request) + len_kill_request += len(kill_request) + province_quantity = province_kill_request.aggregate( + total=Sum('main_quantity'))[ + 'total'] or 0 + province_weight = province_kill_request.aggregate( + total=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight')))[ + 'total'] or 0 + all_province_weight += int(province_weight) + all_province_quantity += province_quantity + kill_request_quantity = kill_request.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight = kill_request.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + kill_req_ware_house_confirmation = kill_request.filter(ware_house_confirmation=True, killhouse_user=kill_house) + ware_house_accepted_real_quantity = kill_req_ware_house_confirmation.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + + ware_house_accepted_real_weight = kill_req_ware_house_confirmation.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity') or 0 + weight_loss1 = kill_req_ware_house_confirmation.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity') or 0 + weight_loss = weight_loss1 / len(kill_req_ware_house_confirmation) if len( + kill_req_ware_house_confirmation) > 0 else 0 + + all_len_kill_req1 += len(kill_req_ware_house_confirmation) + + all_ware_house_accepted_real_weight += ware_house_accepted_real_weight + all_ware_house_accepted_real_quantity += ware_house_accepted_real_quantity + all_weight_loss += int(weight_loss) + + all_kill_request_quantity += kill_request_quantity + all_kill_request_weight += int(kill_request_weight) + link = f'https://{base_url_sms}.rasadyaar.ir/pay/k{kill_house.kill_house_operator.user.user_gate_way_id}' + hasnt_code = len( + kill_request.filter(Q(assignment_state_archive='True') | Q(vet_state='accepted'), + clearance_code__isnull=True)) + percent_hasnt_code = round(hasnt_code * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + has_code = len( + kill_request.filter(vet_state='pending', assignment_state_archive='pending', clearance_code__isnull=False)) + percent_has_code = round(has_code * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + + has_assignment = len( + kill_request.filter(Q(vet_state='accepted') | Q(assignment_state_archive='True'))) + percent_has_assignment = round(has_assignment * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + hasnt_assignment = len( + kill_request.filter(assignment_state_archive='pending', vet_state='pending')) + percent_hasnt_assignment = round(hasnt_assignment * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + evaluated_bar = len( + kill_request.filter(bar_document_status__isnull=False)) + percent_evaluated_bar = round(evaluated_bar * 100 / has_assignment, 2) if has_assignment > 0 else 0 + + accepeted_bar = len( + kill_request.filter(bar_document_status__title='تایید شده')) + percent_accepeted_bar = round(accepeted_bar * 100 / evaluated_bar, 2) if evaluated_bar > 0 else 0 + diffrent_bar = len( + kill_request.filter(bar_document_status__title='مغایرت دارد')) + percent_diffrent_bar = round(diffrent_bar * 100 / evaluated_bar, 2) if evaluated_bar > 0 else 0 + no_quality = len( + kill_request.filter(bar_document_status__title='فاقد کیفیت')) + percent_no_quality = round(no_quality * 100 / evaluated_bar, 2) if evaluated_bar > 0 else 0 + accepted_low_quality = len( + kill_request.filter(bar_document_status__title='تایید شده بدون کیفیت')) + percent_low_quality = round(accepted_low_quality * 100 / evaluated_bar, 2) if evaluated_bar > 0 else 0 + hand_write = len( + kill_request.filter(bar_document_status__title='دست نویس')) + percent_hand_write = round(hand_write * 100 / evaluated_bar, 2) if evaluated_bar > 0 else 0 + cancled = len( + kill_request.filter(bar_document_status__title='باطل شده')) + percent_cancled = round(cancled * 100 / evaluated_bar, 2) if evaluated_bar > 0 else 0 + list1 = [ + m, + killer_type, + kill_house.name, + kill_house.kill_house_operator.user.fullname, + kill_house.kill_house_operator.user.mobile, + vet_fullname, + vet_mobile, + kill_house.kill_house_operator.user.city.name, + place, + len(province_kill_request), + province_quantity, + int(province_weight), + len(kill_request), + kill_request_quantity, + int(kill_request_weight), + round(kill_request_weight / kill_request_quantity, 1) if kill_request_weight > 0 else 0, + len(kill_req_ware_house_confirmation), + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f"{int(weight_loss)}%", + link, + hasnt_code, + f'%{percent_hasnt_code}', + has_code, + f'%{percent_has_code}', + has_assignment, + f'%{percent_has_assignment}', + evaluated_bar, + f'%{percent_evaluated_bar}', + + accepeted_bar, + f'%{percent_accepeted_bar}', + diffrent_bar, + f'%{percent_diffrent_bar}', + no_quality, + f'%{percent_no_quality}', + accepted_low_quality, + f'%{percent_low_quality}', + hand_write, + f'%{percent_hand_write}', + cancled, + f'%{percent_cancled}', + hasnt_assignment, + f'%{percent_hasnt_assignment}', + (int(kill_request_weight / len(all_recive_date)) if len(all_recive_date) > 0 else 0), + (int(kill_request_quantity / len(all_recive_date)) if len(all_recive_date) > 0 else 0), + + ] + m += 1 + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + worksheet.column_dimensions[get_column_letter(item + 1)].width = 17.01 + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + l += 1 + + # last_age=sorted(reversed(all_age)) + + value_header_list2 = [ + len(kill_houses), + killer, + killer_type_public, + killer_type_exclusive, + len_province_kill_request, + all_province_quantity, + all_province_weight, + len_kill_request, + all_kill_request_quantity, + all_kill_request_weight, + all_len_kill_req1, + all_ware_house_accepted_real_quantity, + all_ware_house_accepted_real_weight, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + + 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 + + +def bar_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() if 'start' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() if 'end' in request.GET else now + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'province_kill_request__kill_house_price', + 'price', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'province_kill_request__kill_house_price', + 'price', + 'bar_document_status__title' + ) + + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(key=request.GET['key']) + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(key=request.GET['key']) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__address__city=user.city) + elif request.GET['role'] == 'VetFarm': + user = SystemUserProfile.objects.get(key=request.GET['key']) + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(key=request.GET['key']) + filtered_kill_reqs = filtered_kill_request.filter(killhouse_user__kill_house_operator__user=user) + else: + filtered_kill_reqs = filtered_kill_request + + if request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + kill_house = kill_house_vets.values_list('kill_house', flat=True).distinct() + + else: + kill_house = KillHouse.objects.filter(out_province=False, trash=False) + + if 'state' in request.GET: + if request.GET['state'] == 'completed': + filtered_kill_reqs = filtered_kill_reqs.filter(assignment_state_archive='True') + elif request.GET['state'] == 'bar_pending': + filtered_kill_reqs = filtered_kill_reqs.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), assignment_state_archive='pending') + else: + filtered_kill_reqs = filtered_kill_reqs + else: + filtered_kill_reqs = filtered_kill_reqs + if 'search' in request.GET: + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + filtered_kill_reqs = filtered_kill_reqs.filter( + build_query(DashboardEnterLoadInformationFilterSet, value) + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + 'قیمت پیشنهادی کشتارگاه(ریال)', + 'قیمت تعاونی(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + 'کشور مقصد', + 'اختلاف مجوز', + + ] + + from_date_1 = shamsi_date(date1) + + to_date_1 = shamsi_date(date2) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'حجم بارهای ایجاد شده', + 'وزن بارهای ایجاد شده', + 'میانگین وزن بارهای ایجاد شده', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'حجم بارها', + 'وزن بارها', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + header_list3 = [ + 'درصد بارهای دارای کد قرنطینه', + 'درصد تعداد بارهای احراز شده از قرنطینه', + 'درصد تعداد بارهای تکمیل شده کشتارگاه', + 'درصد وزن نهایی در کشتارگاه نسبت به وزن کل', + 'درصد بارهای فاقد کد قرنطینه', + 'درصد بارهای اختلاف دار در قرنطینه و رصدیار', + 'درصد تعداد بارهای ورودی به انبار', + 'درصد وزن لاشه ها در انبار نسبت به وزن کل', + 'درصد وزن لاشه در انبار نسبت به وزن نهایی در کشتارگاه', + + ] + create_header(worksheet, header_list, 9, 2, height=21.8) + + create_header(worksheet, header_list2, 6, 2, height=21.8, color='green') + + create_header(worksheet, header_list3, 6, 5, height=43, color='orange', text_color='0D0D0D') + create_header_freez(worksheet, excel_options, 1, 8, 9, height=21, len_with=True) + + excel_description(worksheet, 'B1', 'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی', color='red', row2='D1') + + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + excel_description(worksheet, 'B2', f'استان {name}', color='red', row2='D2') + excel_description(worksheet, 'B3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='D3') + + l = 8 + m = 1 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + if kill['assignment_state_archive'] == 'True' or kill['ware_house_confirmation'] == True: + net_weighte = kill['accepted_real_weight'] + real_quantity = kill['accepted_real_quantity'] + else: + net_weighte = 0 + real_quantity = 0 + net_weighte2, real_quantity2, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if weight_loss1 != 0 else 0 + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + + kill.get('province_kill_request__kill_house_price') if kill.get( + 'province_kill_request__kill_house_price') else '-', + + kill.get('price') if kill.get( + 'price') else '-', + + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + round(kill['accepted_real_weight'], 1), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + export_country, + kill['accepted_real_quantity'] - quarantine_quantity if kill[ + 'quarantine_quantity'] != None else quarantine_quantity + + ] + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=40, different_value='بار حذف شده') + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs['total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs['total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, 2) if all_weight_loss > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + + province_kill_request = ProvinceKillRequest.objects.filter( + pk__in=filtered_kill_reqs.values( + 'province_kill_request')).aggregate( + total_quantity_melak=Sum('total_killed_quantity'), + total_weight_melak=Sum('total_killed_weight'), + ) + + # province_kill_request = filtered_kill_reqs.values_list( + # 'province_kill_request',flat=True).distinct().aggregate( + # total_quantity_melak=Sum('total_killed_quantity'), + # total_weight_melak=Sum('total_killed_weight'), + # ) + accepted_real_quantity_melak = province_kill_request['total_quantity_melak'] or 0 + + accepted_real_wight_melak = province_kill_request['total_weight_melak'] or 0 + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity_melak, + accepted_real_wight_melak, + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 3, 6) + value_header_list2 = [ + f'%{round((has_code * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((has_qarantine * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((len(bar_complete) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_net_weighte) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((len(hasnt_code1) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((difference_bar * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((all_state_ware_house_confirmation * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_net_weighte), 2) if int(all_net_weighte) > 0 else 0}' + ] + create_value(worksheet, value_header_list2, 6, 6) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + '', + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if request.GET['role'] == 'KillHouse': + name = filtered_kill_reqs.first()['killhouse_user__name'] + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای کشتارگاه {name}.xlsx"'.encode( + 'utf-8') + elif 'state' in request.GET: + if request.GET['state'] == 'bar_pending': + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای تکمیل نشده.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای تکمیل شده.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارها.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def bar_excel_trash_true(request): + filterset_class = KillHouseRequestFilterSet + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + filtered_kill_request = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=True, temporary_trash=False, temporary_deleted=False).select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', 'traffic_code', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', 'message', + 'bar_remover', 'province_request__poultry_request__freezing', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', ).values('province_kill_request__kill_house_price', + 'killhouse_user', + 'province_request__poultry_request__freezing', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'message', + 'bar_remover', + 'traffic_code', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', + + ) + if 'key' in request.GET: + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__address__city=user.city) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + filtered_kill_reqs = filtered_kill_request.filter(killhouse_user__kill_house_operator__user=user) + else: + filtered_kill_reqs = filtered_kill_request + else: + filtered_kill_reqs = filtered_kill_request + else: + filtered_kill_reqs = filtered_kill_request + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد وارد شده در قرنطینه', + 'تاریخ حذف', + 'حذف کننده', + 'دلیل حذف', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[4].height = 19 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارحذف شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه حذف شده', + 'مجموع وزن بار حذف شده', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'مدیریت بارهای حذف شده' + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + + l = 3 + m = 1 + all_quantity = 0 + all_weighte = 0 + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + killer_exclusive = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + + l += 1 + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = kill['quarantine_quantity'] if kill['quarantine_quantity'] != None else '-' + if kill['bar_remover'] is not None: + date_remover = kill['bar_remover']['date'].split('-') + bar_remover_date = jdatetime.date.fromgregorian( + day=int(date_remover[2]), + month=int(date_remover[1]), + year=int(date_remover[0]) + ) if date_remover else '-' + else: + bar_remover_date = '-' + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + str(bar_remover_date), + kill['bar_remover']['full_name'] if kill['bar_remover'] != None else '-', + kill['message'] if kill['message'] != None else '-', + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + value_header_list = [ + len(filtered_kill_reqs), + killer_exclusive, + all_quantity, + all_weighte, + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if request.GET['role'] == 'KillHouse': + name = filtered_kill_request.first()['killhouse_user__name'] + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای حذف شده کشتارگاه {name}.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="بارهای حذف شده.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def kill_house_total_wage_excel(request): + kill_house = KillHouse.objects.filter(trash=False) + sheet_names2 = [ + 'اطلاعات کلی', + 'بارهای روزانه', + 'تخصیص روزانه', + 'مرغ زنده', + 'لاشه', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_house, + + archive_wage=False, + trash=False).order_by('id') + + filtered_kill_reqs = KillHouseRequest.objects.filter( + trash=False, + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('document_status', 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', 'killer').values('document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', + ) + + province_kill_request = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + first_car_allocated_quantity=0, + trash=False).order_by( + 'kill_request__recive_date') + + for name in sheet_names2: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + if sheet_name == 'بارهای روزانه': + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + filtered_kill_reqs = filtered_kill_reqs.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2) + else: + filtered_kill_reqs = filtered_kill_reqs + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت', + + ] + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + killer_exclusive = 0 + all_assignment_state_archive_state = 0 + len_weight_loss = 0 + all_state_ware_house_confirmation = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + date_of_poultry_request = '-' + send_date = kill.get('province_request__poultry_request__send_date') + if send_date: + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = int(assignment.get('net_weight')) + real_quantity = assignment.get('real_quantity') + + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + weight = 0 + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + if kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight'): + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = '-' + if kill.get('province_request__poultry_request__send_date') and kill.get( + 'province_request__poultry_request__hatching__date'): + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_quantity += quantity + all_weighte += weight + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + if weight_loss > 0: + len_weight_loss += 1 + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + all_state_ware_house_confirmation += 1 + + else: + state_ware_house_confirmation = '-' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['document_status'] if kill['document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{weight_loss}', + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[40] == 'بار حذف شده': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity') or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity') or 0 + all_weight_loss = filtered_kill_reqs.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity') or 0 + all_weight_loss = round(int(all_weight_loss) / len_weight_loss, 2) if len_weight_loss > 0 else 0 + value_header_list = [ + len(filtered_kill_reqs), + killer_exclusive, + all_quantity, + int(all_weighte), + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'تخصیص روزانه': + worksheet['H3'] = 'در این قسمت تخصیصات فاقد بار نمایش داده میشود' + merge_range1 = 'H3:K3' + worksheet.merge_cells(merge_range1) + worksheet['H3'].font = Font(color="C00000", bold=True) + worksheet['H3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + province_kill_request = province_kill_request.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ).order_by( + 'kill_request__recive_date') + else: + province_kill_request = province_kill_request + + header_list = [ + 'تعداد سفارشات', + 'تعداد کل', + 'وزن کل', + 'جمع کل سهم', + ] + for col_num, option in enumerate(header_list, 3): + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[3].height = 20.8 + + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'تعرفه اتحادیه(ریال)', + 'سهم شما(ریال)', + + ] + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 6 + m = 1 + for province_kill in province_kill_request: + + kill_date = jdatetime.date.fromgregorian( + year=province_kill.province_request.poultry_request.send_date.year, + month=province_kill.province_request.poultry_request.send_date.month, + day=province_kill.province_request.poultry_request.send_date.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(kill_date.split("-")) + separate = "-" + kill_date_1 = separate.join(reversed_date1) + + if province_kill.kill_request.slaughter_house is not None: + kill_place = province_kill.kill_request.slaughter_house.name + else: + kill_place = province_kill.kill_request.kill_house.name + + total_amount = province_kill.total_wage_amount + + list1 = [ + m, + province_kill.province_request.poultry_request.order_code, + province_kill.province_request.poultry_request.poultry.unit_name, + province_kill.province_request.poultry_request.poultry.user.mobile, + province_kill.province_request.poultry_request.poultry.address.city.name, + str(kill_date_1), + kill_place, + province_kill.province_request.poultry_request.hatching.chicken_breed, + province_kill.total_killed_quantity, + province_kill.total_killed_weight, + province_kill.province_request.poultry_request.Index_weight, + province_kill.wage, + total_amount, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + m += 1 + total_weight = \ + province_kill_request.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_killed_quantity = \ + province_kill_request.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_wage_amount = \ + province_kill_request.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + value_list = [ + m - 1, + total_killed_quantity, + total_weight, + total_wage_amount, + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=4, column=item + 3, value=value_list[item]) + value = value_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + elif sheet_name == 'مرغ زنده': + # type = request.GET['type'] + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + kill_house_free_bar_info = kill_house_free_bar_info.filter(date__date__gte=date1, + date__date__lte=date2, buy_type='live', ) + else: + kill_house_free_bar_info = kill_house_free_bar_info.filter(buy_type='live') + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + header_list = [ + 'تعداد خریداران', + 'تعداد کل', + 'وزن کل', + 'مبلغ کل', + ] + excel_options = [ + 'ردیف', + 'نام خریدار', + 'تلفن خریدار', + 'نام فروشنده', + 'تلفن فروشنده', + 'شهر', + 'تعداد', + 'وزن', + 'تعرفه', + 'مبلغ کل', + ] + for col_num, option in enumerate(header_list, 4): + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[3].height = 20.8 + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 6 + m = 1 + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + + list1 = [ + m, + kill.kill_house.name, + kill.kill_house.kill_house_operator.user.mobile, + kill.poultry_name, + kill.poultry_mobile, + kill.city, + kill.quantity, + kill.live_weight, + kill.wage, + kill.total_wage_amount, + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + m += 1 + total_quantity = \ + kill_house_free_bar_info.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight = \ + kill_house_free_bar_info.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + total_wage_amount = \ + kill_house_free_bar_info.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + value_list = [ + m - 1, + total_quantity, + total_weight, + total_wage_amount, + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=4, column=item + 4, value=value_list[item]) + value = value_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + elif sheet_name == 'لاشه': + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + kill_house_free_bar_info2 = kill_house_free_bar_info.filter(date__date__gte=date1, + date__date__lte=date2, buy_type='carcass') + else: + kill_house_free_bar_info2 = kill_house_free_bar_info.filter(buy_type='carcass') + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + header_list = [ + 'تعداد خریداران', + 'تعداد کل', + 'وزن کل', + 'مبلغ کل', + ] + excel_options = [ + 'ردیف', + 'نام خریدار', + 'تلفن خریدار', + 'نام فروشنده', + 'تلفن فروشنده', + 'شهر', + 'تعداد', + 'وزن', + 'تعرفه', + 'مبلغ کل', + ] + for col_num, option in enumerate(header_list, 4): + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[3].height = 20.8 + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 6 + m = 1 + if kill_house_free_bar_info2: + for kill in kill_house_free_bar_info2: + + list1 = [ + m, + kill.kill_house.name, + kill.kill_house.kill_house_operator.user.mobile, + kill.poultry_name, + kill.poultry_mobile, + kill.city, + kill.quantity, + kill.live_weight, + kill.wage, + kill.total_wage_amount, + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + m += 1 + total_quantity = \ + kill_house_free_bar_info2.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight = \ + kill_house_free_bar_info2.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + total_wage_amount = \ + kill_house_free_bar_info2.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + value_list = [ + m - 1, + total_quantity, + total_weight, + total_wage_amount, + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=4, column=item + 4, value=value_list[item]) + value = value_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + 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 + + +def slaughterhouse_export_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if "date1" in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if "date2" in request.GET else now + if 'key' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + transactions = KillHouseRequest.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + kill_house_user=user, + status='failed', + transaction_type='wage-gateway', + trash=False).order_by('id') + else: + transactions = KillHouseRequest.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='failed', + transaction_type='wage-gateway', + trash=False).order_by('id') + + excel_options = [ + 'ردیف', + 'تاریخ و زمان', + 'پرداخت کننده', + 'تعداد سفارشات', + 'تعداد کل(قطعه)', + 'وزن کل(کیلوگرم)', + 'شماره درخواست', + 'شماره پیگیری', + 'کد سفارش', + 'شماره کارت', + 'قیمت(ریال)', + 'متن خطا', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + for transaction in transactions: + total_weight = 0 + total_quantity = 0 + total_request = 0 + wage_payment = KillRequest.objects.filter( + Q(orderId=transaction.orderId) | Q(tracking_code=transaction.saleReferenceId), + trash=False).first() + if wage_payment.province_kill_request != None: + total_request = len(wage_payment.province_kill_request) + for province_kill_req in wage_payment.province_kill_request: + province_kill = ProvinceKillRequest.objects.get(key=province_kill_req, trash=False) + total_weight += province_kill.total_killed_weight + total_quantity += province_kill.total_killed_quantity + date = transaction.date + date_create = convert_to_shamsi(datetime=date) + message = transaction.message + if message == 'ﻛﺎرﺑﺮ_از_اﻧﺠﺎم_ﺗﺮاﻛﻨﺶ_ﻣﻨﺼﺮف_ﺷﺪه_اﺳﺖ': + message = 'ﻛﺎرﺑﺮ از اﻧﺠﺎم ﺗﺮاﻛﻨﺶ ﻣﻨﺼﺮف ﺷﺪه اﺳﺖ' + + list1 = [ + m, + str(date_create), + transaction.payer, + total_request, + total_quantity, + total_weight, + str(transaction.refId) if transaction.refId != None else '-', + str(transaction.saleReferenceId) if transaction.saleReferenceId != None else '-', + str(transaction.orderId) if transaction.orderId != None else '-', + str(transaction.cardHolderPan) if transaction.cardHolderPan != None else '-', + transaction.amount, + message + ] + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 29 + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + 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 + + +def export_kill_house_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + if request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + + querysets = KillRequest.objects.filter(kill_house__in=kill_house, recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + export_status=True, + ).order_by( + 'recive_date') + else: + querysets = KillRequest.objects.filter(kill_house__system_address__province=user.province, + recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + export_status=True, + + ).order_by( + 'recive_date') + + excel_options = [ + 'ردیف', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'خریدار', + 'تلفن خریدار', + 'محل کشتار', + 'کشور مقصد', + 'مرغدار', + 'تلفن مرغدار', + 'تعداد درخواست (قطعه)', + 'میانگین وزنی (کیلوگرم)', + 'وزن کل (کیلوگرم)', + 'کد احراز', + 'وضعیت', + 'تاریخ تایید/رد', + 'دلیل رد', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد درخواست های تایید شده', + 'مجموع تعداد درخواست های تایید شده (قطعه)', + 'مجموع وزن کل تایید شده (کیلوگرم)', + + 'تعداد درخواست های رد شده', + 'مجموع تعداد درخواست های رد شده (قطعه)', + 'مجموع وزن کل رد شده (کیلوگرم)', + + 'تعداد درخواست های حذف شده', + 'مجموع تعداد درخواست های حذف شده (قطعه)', + 'مجموع وزن کل حذف شده (کیلوگرم)', + + ] + + for col_num, option in enumerate(header_list, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + # worksheet['A1'] = f' وضعیت پرونده ها' + worksheet['B2'] = f'گزارش صادرات از تاریخ {from_date_1} تا {to_date_1}' + + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + # merge_range2 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range2) + worksheet['B2'].font = red_font + + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + all_accepted = 0 + all_rejected = 0 + all_deleted = 0 + all_weight = 0 + accepted_weight = 0 + deleted_weight = 0 + rejected_weight = 0 + for kill in querysets: + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=kill.create_date.day, + month=kill.create_date.month, + year=kill.create_date.year + ) + kill_date = jdatetime.date.fromgregorian( + day=kill.recive_date.day, + month=kill.recive_date.month, + year=kill.recive_date.year + ) + if kill.accept_reject_date is not None: + del_accept_date = jdatetime.date.fromgregorian( + day=kill.accept_reject_date.day, + month=kill.accept_reject_date.month, + year=kill.accept_reject_date.year + ) + else: + del_accept_date = '-' + + if kill.slaughter_house is not None: + kill_place = kill.slaughter_house.name + else: + kill_place = kill.kill_house.name + Index_weight = round(kill.Index_weight, 1) + + if kill.export_state == 'accepted': + type = 'تایید شده' + all_accepted += 1 + accepted_weight += int(kill.kill_capacity * Index_weight) + elif kill.export_state == 'rejected': + type = 'رد شده' + all_rejected += 1 + rejected_weight += int(kill.kill_capacity * Index_weight) + elif kill.export_state == 'deleted': + type = 'حذف شده' + all_deleted += 1 + deleted_weight += int(kill.kill_capacity * Index_weight) + else: + type = 'در انتظار تایید' + all_weight += int(kill.kill_capacity * Index_weight) + list1 = [ + m, + str(create_date), + str(kill_date), + kill.kill_house.name, + kill.kill_house.kill_house_operator.user.mobile, + kill_place, + kill.export_country, + kill.poultry.unit_name, + kill.poultry.user.mobile, + kill.kill_capacity, + Index_weight, + int(kill.kill_capacity * Index_weight), + kill.direct_buying_code if kill.direct_buying_code else '-', + type, + str(del_accept_date), + kill.direct_buying_message if kill.direct_buying_message else '-' + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[13] == 'رد شده': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + if list1[13] == 'حذف شده': + cell.fill = PatternFill(start_color="F7A49B", fill_type="solid") + + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + cell.alignment = Alignment(horizontal='center') + + export_quantity = querysets.aggregate( + total_quantity=Sum('kill_capacity')).get( + 'total_quantity') or 0 + + export_accepted_quantity = querysets.filter(export_state='accepted').aggregate( + total_quantity=Sum('kill_capacity')).get( + 'total_quantity') or 0 + export_rejected_quantity = querysets.filter(export_state='rejected').aggregate( + total_quantity=Sum('kill_capacity')).get( + 'total_quantity') or 0 + export_deleted_quantity = querysets.filter(export_state='deleted').aggregate( + total_quantity=Sum('kill_capacity')).get( + 'total_quantity') or 0 + + value_header_list = [ + all_accepted, + export_accepted_quantity, + accepted_weight, + + all_rejected, + export_rejected_quantity, + rejected_weight, + + all_deleted, + export_deleted_quantity, + deleted_weight + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + export_quantity, + '', + all_weight, + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def monitor_loads_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + 'قیمت پیشنهادی کشتارگاه(ریال)', + 'قیمت تعاونی(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت', + 'کشور مقصد', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه', + + ] + + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + + excel_options1 = { + 'آمار کلی': [], + 'مدیریت بارها': [], + 'بارهای حذف شده': [], + 'فروش به خارج از استان': [], + 'بارهای زنجیره': [], + 'خرید زنده خارج از استان': [], + 'خرید لاشه خارج از استان': [], + + } + + output = BytesIO() + workbook = Workbook() + for name, options in excel_options1.items(): + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + + if sheet_name == 'آمار کلی': + filtered_kill_request = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__kill_house_price', + 'price', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer').values( + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'province_kill_request__kill_house_price', + 'price', + 'killer', + 'province_request__poultry_request__Index_weight', + ) + + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__user__city=user.city) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + filtered_kill_reqs = filtered_kill_request.filter(killhouse_user__kill_house_operator__user=user) + else: + filtered_kill_reqs = filtered_kill_request + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + kill_house = kill_house_vets.values_list('kill_house', flat=True).distinct() + + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + + if 'state' in request.GET: + if request.GET['state'] == 'completed': + filtered_kill_reqs = filtered_kill_reqs.filter(assignment_state_archive='True') + elif request.GET['state'] == 'bar_pending': + filtered_kill_reqs = filtered_kill_reqs.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), assignment_state_archive='pending') + else: + filtered_kill_reqs = filtered_kill_reqs + else: + filtered_kill_reqs = filtered_kill_reqs + worksheet['H1'] = f'اطلاعات کل بارها' + worksheet['H1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['H1'].font = Font(color='FF0000', size=11) + merge_range1 = 'H1:L1' + worksheet.merge_cells(merge_range1) + + worksheet['H6'] = f'گزارش بارهای حذف شده' + merge_range1 = 'H6:L6' + worksheet.merge_cells(merge_range1) + worksheet['H6'].font = Font(color='FF0000', size=11) + worksheet['H6'].alignment = Alignment(horizontal='center', vertical='center') + + worksheet['H11'] = f'گزارش فروش به خارج از استان' + worksheet['H11'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['H11'].font = Font(color='FF0000', size=11) + merge_range1 = 'H11:L11' + worksheet.merge_cells(merge_range1) + + worksheet['H16'] = f'گزارش کشتار شرکت های زنجیره ای' + worksheet['H16'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['H16'].font = Font(color='FF0000', size=11) + merge_range1 = 'H16:L16' + worksheet.merge_cells(merge_range1) + + worksheet['H21'] = f'گزارش خرید زنده خارج از استان' + worksheet['H21'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['H21'].font = Font(color='FF0000', size=11) + merge_range1 = 'H21:L21' + worksheet.merge_cells(merge_range1) + + worksheet['H26'] = f'گزارش خرید لاشه خارج از استان' + worksheet['H26'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['H26'].font = Font(color='FF0000', size=11) + merge_range1 = 'H26:L26' + worksheet.merge_cells(merge_range1) + + for col_num, option in enumerate(header_list, 9): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet.column_dimensions[col_letter].width = 13 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list2, 6): + col_letter = get_column_letter(col_num) + + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet.column_dimensions[col_letter].width = 13 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list, 9): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=7, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[7].height = 20.8 + worksheet.column_dimensions[col_letter].width = 13 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list2, 6): + col_letter = get_column_letter(col_num) + + cell = worksheet.cell(row=7, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[7].height = 20.8 + worksheet.column_dimensions[col_letter].width = 13 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + filtered_kill_reqs1 = filtered_kill_reqs.filter(trash=False) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs1.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + all_age = [] + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_weighte1 = 0 + all_vet_state_accepted = len( + filtered_kill_reqs1.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs1.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs1.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight = filtered_kill_reqs1.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + all_quantity = filtered_kill_reqs1.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_quantity = filtered_kill_reqs1.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_weight = filtered_kill_reqs1.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + killer_exclusive = 0 + len_weight_loss = 0 + all_state_ware_house_confirmation = filtered_kill_reqs1.aggregate( + total_quantity=Count('id', filter=Q(ware_house_confirmation=True))).get( + 'total_quantity') or 0 + if filtered_kill_reqs1: + for kill in filtered_kill_reqs1: + if kill.get('killer') != None: + killer_exclusive += 1 + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + weight = kill.get('quantity') * kill.get( + 'province_request__poultry_request__Index_weight') + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = int(assignment.get('net_weight')) + real_quantity = assignment.get('real_quantity') + + all_weighte += weight + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + all_weighte1 += weight + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs1.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs1.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity') or 0 + has_qarantine = len(filtered_kill_reqs1.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = filtered_kill_reqs1.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity', filter=Q(ware_house_confirmation=True))).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs1.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight', filter=Q(ware_house_confirmation=True))).get( + 'total_quantity', 0) or 0 + all_weight_loss = filtered_kill_reqs1.aggregate( + total_quantity=Sum('weight_loss', filter=Q(ware_house_confirmation=True))).get( + 'total_quantity', 0) or 0 + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + 2) if all_state_ware_house_confirmation > 0 else 0 + has_code1 = filtered_kill_reqs1.filter(clearance_code__isnull=False) + all_quarantine_quantity_has_code = has_code1.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + hasnt_code = filtered_kill_reqs1.filter(clearance_code__isnull=True) + all_quarantine_quantity_hasnt_code = hasnt_code.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + difference_bar = len(filtered_kill_reqs1.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + + header_list = [ + 'تعداد بارهای تایید شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 8): + cell = worksheet.cell(row=12, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[12].height = 20.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + value_header_list = [ + len(filtered_kill_reqs1), + killer_exclusive, + all_quantity, + int(all_weighte1), + round(all_weighte1 / all_quantity, 1) if all_weighte1 > 0 and all_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + filtered_kill_reqs2 = filtered_kill_reqs.filter(trash=True) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs2.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + all_age = [] + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs2.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs2.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs2.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight = filtered_kill_reqs2.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + all_quantity = filtered_kill_reqs2.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_quantity = filtered_kill_reqs2.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_weight = filtered_kill_reqs2.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + killer_exclusive = 0 + len_weight_loss = 0 + all_state_ware_house_confirmation = 0 + if filtered_kill_reqs2: + for kill in filtered_kill_reqs2: + if kill.get('killer') != None: + killer_exclusive += 1 + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = int(assignment.get('net_weight')) + real_quantity = assignment.get('real_quantity') + + all_weighte += weight + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs2.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs2.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity') or 0 + has_qarantine = len(filtered_kill_reqs2.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = filtered_kill_reqs2.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs2.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity', 0) or 0 + all_weight_loss = filtered_kill_reqs2.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_weight_loss = round(int(all_weight_loss) / len_weight_loss, 2) if len_weight_loss > 0 else 0 + has_code1 = filtered_kill_reqs2.filter(clearance_code__isnull=False) + all_quarantine_quantity_has_code = has_code1.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + hasnt_code = filtered_kill_reqs2.filter(clearance_code__isnull=True) + all_quarantine_quantity_hasnt_code = hasnt_code.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + difference_bar = len(filtered_kill_reqs2.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + value_header_list = [ + len(filtered_kill_reqs2), + killer_exclusive, + all_quantity, + int(all_weighte), + round(all_weighte / all_quantity, 1) if all_weighte > 0 and all_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=8, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=8, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + state = 'accepted' + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + poultry_requests_accepted = poultry_requests.filter(province_state='accepted') + + all_chicken_quantity = 0 + all_age = [] + all_quantity = poultry_requests_accepted.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + all_weighte = poultry_requests_accepted.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] + + has_code = 0 + if poultry_requests: + for poultry_request in poultry_requests: + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, + state='accepted').exists(): + age = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + else: + age = (datetime.datetime.now() - poultry_request.hatching.date).days + 1 + all_age.append(age) + all_chicken_quantity += poultry_request.hatching.quantity + + if poultry_request.quarantine_code: + has_code += 1 + + all_age = sorted(all_age) + value_header_list2 = [ + len(poultry_requests_accepted), + all_quantity if all_quantity != None else 0, + all_weighte if all_weighte != None else 0, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=13, column=item + 8, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + ).order_by('id') + if request.GET['role'] == "ChainCompany": + chain_allocations = chain_allocations.filter(chain_company__user=user, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + chain_allocations = chain_allocations.filter(poultry_hatching__poultry__address__city=user.city, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] == "CityOperator": + city_operator = CityOperator.objects.get(user=user, trash=False) + chain_allocations = chain_allocations.filter( + poultry_hatching__poultry__city_operator=city_operator.unit_name, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] == "VetFarm": + vet = Vet.objects.get(user=user, trash=False) + poultry_ids = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry').only( + 'poultry').values_list('poultry', flat=True).distinct() + poultry = Poultry.objects.filter(id__in=poultry_ids) + chain_allocations = chain_allocations.filter(poultry_hatching__poultry__in=poultry, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + else: + chain_allocations = chain_allocations.filter(state__in=('accepted', 'pending'), + trash=False).order_by('-id') + + header_list = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 8): + cell = worksheet.cell(row=17, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[17].height = 20.8 + + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + all_age = [] + + all_quantity = chain_allocations.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_weighte = chain_allocations.aggregate( + total=Sum('weight'))[ + 'total'] or 0 + has_code = 0 + if chain_allocations: + for chain_allocation in chain_allocations: + age = (chain_allocation.poultry_hatching.chicken_age) + all_age.append(age) + + if chain_allocation.quarantine_code: + has_code += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(chain_allocations), + all_quantity, + all_weighte, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=18, column=item + 8, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + header_list2 = [ + 'تعداد بارها', + ' تعداد بار های درانتظار تایید', + 'مجموع قطعه زنده در انتظار تایید', + 'مجموع وزن زنده (کیلوگرم) درانتظار تایید', + 'مجموع تعداد لاشه درانتظار تایید', + 'مجموع وزن لاشه (کیلوگرم) درانتظار تایید', + + ' تعداد بار های رد شده', + 'مجموع قطعه زنده رد شده', + 'مجموع وزن زنده (کیلوگرم) رد شده', + 'مجموع تعداد لاشه رد شده', + 'مجموع وزن لاشه (کیلوگرم) رد شده', + + ' تعداد بار های تایید شده', + 'مجموع قطعه زنده تایید شده', + 'مجموع وزن زنده (کیلوگرم) تایید شده', + 'مجموع تعداد لاشه تایید شده', + 'مجموع وزن لاشه (کیلوگرم) تایید شده', + 'حجم تایید شده دامپزشک', + 'وزن تایید شده دامپزشک', + + ] + + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=22, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type='live', + trash=False).order_by('-date') + + bar_pending = kill_house_free_bar_info.filter(kill_house_vet_state='pending') + bar_pending_quantity = bar_pending.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_pending_live_weight = bar_pending.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_pending_number_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_pending_weight_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_rejected = kill_house_free_bar_info.filter(kill_house_vet_state='rejected') + bar_rejected_quantity = bar_rejected.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_rejected_live_weight = bar_rejected.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_rejected_number_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_rejected_weight_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_accepted = kill_house_free_bar_info.filter(kill_house_vet_state='accepted') + bar_accepted_quantity = bar_accepted.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_accepted_live_weight = bar_accepted.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_accepted_number_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_weight_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_quantity = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_weight = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(kill_house_free_bar_info), + len(bar_pending), + int(bar_pending_quantity), + int(bar_pending_live_weight), + int(bar_pending_number_of_carcasses), + int(bar_pending_weight_of_carcasses), + + len(bar_rejected), + int(bar_rejected_quantity), + int(bar_rejected_live_weight), + int(bar_rejected_number_of_carcasses), + int(bar_rejected_weight_of_carcasses), + + len(bar_accepted), + int(bar_accepted_quantity), + int(bar_accepted_live_weight), + int(bar_accepted_number_of_carcasses), + int(bar_accepted_weight_of_carcasses), + int(bar_accepted_kill_house_vet_quantity), + int(bar_accepted_kill_house_vet_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=23, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=27, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type='carcass', + trash=False).order_by('-date') + + bar_pending = kill_house_free_bar_info.filter(kill_house_vet_state='pending') + bar_pending_quantity = bar_pending.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_pending_live_weight = bar_pending.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_pending_number_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_pending_weight_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_rejected = kill_house_free_bar_info.filter(kill_house_vet_state='rejected') + bar_rejected_quantity = bar_rejected.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_rejected_live_weight = bar_rejected.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_rejected_number_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_rejected_weight_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_accepted = kill_house_free_bar_info.filter(kill_house_vet_state='accepted') + bar_accepted_quantity = bar_accepted.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_accepted_live_weight = bar_accepted.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_accepted_number_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_weight_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_quantity = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_weight = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(kill_house_free_bar_info), + len(bar_pending), + int(bar_pending_quantity), + int(bar_pending_live_weight), + int(bar_pending_number_of_carcasses), + int(bar_pending_weight_of_carcasses), + + len(bar_rejected), + int(bar_rejected_quantity), + int(bar_rejected_live_weight), + int(bar_rejected_number_of_carcasses), + int(bar_rejected_weight_of_carcasses), + + len(bar_accepted), + int(bar_accepted_quantity), + int(bar_accepted_live_weight), + int(bar_accepted_number_of_carcasses), + int(bar_accepted_weight_of_carcasses), + int(bar_accepted_kill_house_vet_quantity), + int(bar_accepted_kill_house_vet_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=28, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + elif sheet_name == 'مدیریت بارها': + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + 'قیمت پیشنهادی کشتارگاه(ریال)', + 'قیمت تعاونی(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + + 'تعداد قطعه وارد شده در قرنطینه', + 'عملیات', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت سند', + 'وضعیت بار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت', + 'کشور مقصد', + 'اختلاف مجوز', + + ] + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه', + + ] + + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + create_header(worksheet, header_list, 9, 2, border_style='thin') + create_header(worksheet, header_list2, 6, 2, border_style='thin') + filtered_kill_request = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'province_kill_request__kill_house_price', + 'price', + 'killhouse_user__type', 'killer', 'entered_message', + 'bar_document_status__title').values( + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'province_kill_request__kill_house_price', + 'price', + 'killer', 'entered_message', 'bar_document_status__title' + ) + + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__user__city=user.city) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + filtered_kill_reqs = filtered_kill_request.filter(killhouse_user__kill_house_operator__user=user) + else: + filtered_kill_reqs = filtered_kill_request + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + kill_house = kill_house_vets.values_list('kill_house', flat=True).distinct() + + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + + if 'state' in request.GET: + if request.GET['state'] == 'completed': + filtered_kill_reqs = filtered_kill_reqs.filter(assignment_state_archive='True') + elif request.GET['state'] == 'bar_pending': + filtered_kill_reqs = filtered_kill_reqs.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), assignment_state_archive='pending') + else: + filtered_kill_reqs = filtered_kill_reqs + else: + filtered_kill_reqs = filtered_kill_reqs + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + worksheet['B1'] = f'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_age = [] + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + killer_exclusive = 0 + all_assignment_state_archive_state = 0 + len_weight_loss = 0 + all_state_ware_house_confirmation = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = int(assignment.get('net_weight')) + real_quantity = assignment.get('real_quantity') + + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_quantity += quantity + all_weighte += weight + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + if weight_loss > 0: + len_weight_loss += 1 + if kill['ware_house_confirmation'] == True: + if kill['entered_message'] is not None and kill[ + 'entered_message'] == 'ورود به انبار توسط سیستم': + state_ware_house_confirmation = 'ورود به انبار(سیستمی)' + else: + state_ware_house_confirmation = 'ورود به انبار(دستی)' + all_state_ware_house_confirmation += 1 + + else: + state_ware_house_confirmation = 'در انتظار ورود به انبار' + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + + kill.get('province_kill_request__kill_house_price') if kill.get( + 'province_kill_request__kill_house_price') else '-', + + kill.get('price') if kill.get( + 'price') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + kill['bar_document_status__title'] if kill['bar_document_status__title'] != None else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{weight_loss}', + export_country, + kill['accepted_real_quantity'] - quarantine_quantity if kill[ + 'quarantine_quantity'] != None else quarantine_quantity + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[40] == 'بار حذف شده': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity') or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity', 0) or 0 + all_weight_loss = filtered_kill_reqs.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_weight_loss = round(int(all_weight_loss) / len_weight_loss, 2) if len_weight_loss > 0 else 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False) + all_quarantine_quantity_has_code = has_code1.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + hasnt_code = filtered_kill_reqs.filter(clearance_code__isnull=True) + all_quarantine_quantity_hasnt_code = hasnt_code.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + + value_header_list = [ + len(filtered_kill_reqs), + killer_exclusive, + all_quantity, + int(all_weighte), + round(all_weighte / all_quantity, 1) if all_weighte > 0 and all_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'بارهای حذف شده': + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + 'قیمت پیشنهادی کشتارگاه(ریال)', + 'قیمت تعاونی(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت', + 'کشور مقصد', + + ] + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه', + + ] + + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + filtered_kill_request = KillHouseRequest.objects.filter(trash=True, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'province_kill_request__kill_house_price', + 'price', + 'killhouse_user__type', 'killer').values( + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'province_kill_request__kill_house_price', + 'price', + 'killer', + ) + + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__user__city=user.city) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + filtered_kill_reqs = filtered_kill_request.filter(killhouse_user__kill_house_operator__user=user) + else: + filtered_kill_reqs = filtered_kill_request + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + kill_house = kill_house_vets.values_list('kill_house', flat=True).distinct() + + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + + if 'state' in request.GET: + if request.GET['state'] == 'completed': + filtered_kill_reqs = filtered_kill_request.filter(assignment_state_archive='True') + elif request.GET['state'] == 'bar_pending': + filtered_kill_reqs = filtered_kill_request.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), assignment_state_archive='pending') + else: + filtered_kill_reqs = filtered_kill_request + else: + filtered_kill_reqs = filtered_kill_request + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + worksheet['B1'] = f'گزارش بارهای حذف شده در فرآیند کشتار مرغ گوشتی' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_age = [] + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + killer_exclusive = 0 + all_assignment_state_archive_state = 0 + len_weight_loss = 0 + all_state_ware_house_confirmation = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = int(assignment.get('net_weight')) + real_quantity = assignment.get('real_quantity') + + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_quantity += quantity + all_weighte += weight + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + if weight_loss > 0: + len_weight_loss += 1 + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + all_state_ware_house_confirmation += 1 + + else: + state_ware_house_confirmation = '-' + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + + kill.get('province_kill_request__kill_house_price') if kill.get( + 'province_kill_request__kill_house_price') else '-', + + kill.get('price') if kill.get( + 'price') else '-', + + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['document_status'] if kill['document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{weight_loss}', + export_country, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[40] == 'بار حذف شده': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity') or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity', 0) or 0 + all_weight_loss = filtered_kill_reqs.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_weight_loss = round(int(all_weight_loss) / len_weight_loss, 2) if len_weight_loss > 0 else 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False) + all_quarantine_quantity_has_code = has_code1.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + hasnt_code = filtered_kill_reqs.filter(clearance_code__isnull=True) + all_quarantine_quantity_hasnt_code = hasnt_code.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + value_header_list = [ + len(filtered_kill_reqs), + killer_exclusive, + all_quantity, + int(all_weighte), + round(all_weighte / all_quantity, 1) if all_weighte > 0 and all_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'فروش به خارج از استان': + + state = 'accepted' + user = SystemUserProfile.objects.get(key=request.GET['key']) + name_bar = '' + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False).order_by('-send_date') + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + if state == 'pending': + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'جدید' + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'تایید شده' + else: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + + name_bar = 'حذف/رد شده' + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'جدید' + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'تایید شده' + else: + name_bar = 'حذف/رد شده' + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + + + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']: + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'جدید' + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'تایید شده' + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + trash=False).order_by('-send_date') + name_bar = 'رد شده' + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + poultry_requests_accepted = poultry_requests.filter(province_state='accepted') + + excel_options = [ + 'ردیف', + 'وضعیت', + 'پرداخت کننده', + 'کدسفارش مرغدار', + ' تاریخ ثبت درخواست', + ' تاریخ کشتار', + ' کشتار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' استان مرغدار', + 'سن مرغ', + ' نژاد', + 'تعداد درخواست', + 'میانگین وزنی', + 'وزن درخواست', + 'مانده در سالن', + 'جوجه ریزی اولیه', + + ' ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + ' شهر خریدار', + 'استان خریدار', + 'محل کشتار', + 'کد یکتای کشتارگاه', + 'شهر محل کشتار', + + 'نوع خودرو', + 'پلاک', + + 'نام راننده', + 'موبایل راننده', + 'کد بهداشتی حمل و نقل', + + 'کد رهگیری سامانه قرنطینه', + 'ثبت کننده کد قرنطینه', + 'تاریخ ثبت کد قرنطینه', + 'سازنده', + + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تایید شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای {name_bar} خارج از استان' + if poultry_requests.exists(): + name = poultry_requests.first().poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_weighte = 0 + all_chicken_quantity = 0 + all_age = [] + all_quantity = poultry_requests_accepted.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + all_weighte = poultry_requests_accepted.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] + + has_code = 0 + if poultry_requests: + for poultry_request in poultry_requests: + age = poultry_request.hatching.chicken_age + all_age.append(age) + all_chicken_quantity += poultry_request.hatching.quantity + create_date_of_poultry_request = jdatetime.date.fromgregorian( + day=poultry_request.create_date.day, + month=poultry_request.create_date.month, + year=poultry_request.create_date.year + ) + date_of_kill_request = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + if poultry_request.quarantine_code_registrar is not None: + date_code = poultry_request.quarantine_code_registrar['date'].split('-') + + date_of_create_code = jdatetime.date.fromgregorian( + day=int(date_code[2]), + month=int(date_code[1]), + year=int(date_code[0]) + ) + full_name = poultry_request.quarantine_code_registrar['fullname'] + mobile = poultry_request.quarantine_code_registrar['mobile'] + else: + date_of_create_code = '-' + full_name = '-' + mobile = '-' + + killing_place = '-' + killing_place_city = '-' + uniq_id = '-' + if poultry_request.out_province_poultry_request_buyer: + if poultry_request.out_province_poultry_request_buyer.type == 'killhouse': + is_killer = 'کشتارگاه' + uniq_id = poultry_request.out_province_poultry_request_buyer.kill_house_unique_id if poultry_request.out_province_poultry_request_buyer.kill_house_unique_id else '-' + + else: + is_killer = 'کشتارکن' + killing_place = poultry_request.killer_kill_house_unit_name \ + if poultry_request.killer_kill_house_unit_name is not None \ + else '-' + killing_place_city = poultry_request.killer_kill_house_province \ + + '(' + poultry_request.killer_kill_house_city \ + + ')' if poultry_request.killer_kill_house_province \ + and poultry_request.killer_kill_house_city is not None \ + else '-' + uniq_id = poultry_request.kill_house_unique_id if poultry_request.kill_house_unique_id else '-' + else: + is_killer = 'کشتارگاه' if poultry_request.buyer is not None and poultry_request.buyer[ + 'buyerType'] == 'killhouse' else 'کشتارکن' + if poultry_request.quarantine_code: + code = poultry_request.quarantine_code + has_code += 1 + else: + code = '-' + + freez_state = 'منجمد' if poultry_request.freezing == True else 'عادی' + + if poultry_request.out_province_poultry_request_buyer is not None: + full_name_buyer = poultry_request.out_province_poultry_request_buyer.fullname + mobile_buyer = poultry_request.out_province_poultry_request_buyer.user.mobile + city_buyer = poultry_request.out_province_poultry_request_buyer.user.city.name + province_buyer = poultry_request.out_province_poultry_request_buyer.user.province.name + + else: + full_name_buyer = poultry_request.buyer['firstName'] + mobile_buyer = poultry_request.buyer['mobile'] + city_buyer = poultry_request.buyer['city'] + province_buyer = poultry_request.buyer['province'] + + if poultry_request.province_state == 'rejected': + state1 = 'رد شده' + elif poultry_request.province_state == 'pending' and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار تایید' + + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار پرداخت' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == False and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'تایید شده' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == True and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'پرداخت شده' + else: + state1 = 'لغو شده' + + list1 = [ + m, + state1, + poultry_request.payer_fullname if poultry_request.payer_fullname else '-', + str(poultry_request.order_code), + str(create_date_of_poultry_request), + str(date_of_kill_request), + freez_state, + poultry_request.poultry.user.fullname, + poultry_request.poultry.user.mobile, + poultry_request.poultry.user.city.name, + poultry_request.poultry.user.province.name, + age, + poultry_request.hatching.chicken_breed, + poultry_request.quantity, + poultry_request.Index_weight, + int(poultry_request.quantity * poultry_request.Index_weight), + poultry_request.hatching.left_over, + poultry_request.hatching.quantity, + is_killer, + full_name_buyer, + mobile_buyer, + city_buyer, + province_buyer, + killing_place, + uniq_id, + killing_place_city, + poultry_request.out_province_driver_info[ + 'driverCar'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverPelak'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverName'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverMobile'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverhealthCode'] if poultry_request.out_province_driver_info != None else '-', + code, + full_name + '(' + mobile + ')', + str(date_of_create_code), + poultry_request.registrar['fullname'] if poultry_request.registrar else '-' + ] + + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(poultry_requests_accepted), + all_quantity if all_quantity != None else 0, + all_weighte if all_weighte != None else 0, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity if all_quantity != None else 0, + '', + all_weighte, + '', + all_chicken_quantity, + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'بارهای زنجیره': + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + ).order_by('id') + if request.GET['role'] == "ChainCompany": + user = SystemUserProfile.objects.get(key=request.GET['key']) + chain_allocations = chain_allocations.filter(chain_company__user=user, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(key=request.GET['key']) + chain_allocations = chain_allocations.filter(poultry_hatching__poultry__address__city=user.city, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] == "CityOperator": + user = SystemUserProfile.objects.get(key=request.GET['key']) + city_operator = CityOperator.objects.get(user=user, trash=False) + chain_allocations = chain_allocations.filter( + poultry_hatching__poultry__city_operator=city_operator.unit_name, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] == "VetFarm": + user = SystemUserProfile.objects.get(key=request.GET['key']) + vet = Vet.objects.get(user=user, trash=False) + poultry_ids = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry').only( + 'poultry').values_list('poultry', flat=True).distinct() + poultry = Poultry.objects.filter(id__in=poultry_ids) + chain_allocations = chain_allocations.filter(poultry_hatching__poultry__in=poultry, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + else: + chain_allocations = chain_allocations.filter(state__in=('accepted', 'pending'), + trash=False).order_by('-id') + state1 = 'تایید شده' + + excel_options = [ + 'ردیف', + 'وضعیت', + ' تاریخ سفارش', + 'نوع فروش', + 'ثبت کننده سفارش', + 'تلفن ثبت کننده سفارش', + 'خریدار', + 'تلفن خریدار', + 'مرغداری', + 'تلفن مرغداری', + 'شرکت زنجیره', + ' تلفن شرکت زنجیره', + 'کد بهداشتی', + 'کد قرنطینه', + 'راننده ', + 'تلفن راننده ', + 'خودرو', + 'پلاک', + 'حجم', + 'میانگین وزن', + 'وزن', + 'سن', + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if state1 == 'تایید شده': + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + else: + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای {state1} شرکت زنجیره' + if chain_allocations.exists(): + name = chain_allocations.first().poultry_hatching.poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_age = [] + + all_quantity = chain_allocations.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_weighte = chain_allocations.aggregate( + total=Sum('weight'))[ + 'total'] or 0 + has_code = 0 + if chain_allocations: + for chain_allocation in chain_allocations: + age = chain_allocation.poultry_hatching.chicken_age + all_age.append(age) + chain_date = jdatetime.date.fromgregorian( + day=chain_allocation.date.day, + month=chain_allocation.date.month, + year=chain_allocation.date.year + ) + + if chain_allocation.quarantine_code: + has_code += 1 + + remover_fullname = '-' + remover_mobile = '-' + if chain_allocation.state == 'accepted': + state = 'تایید شده' + elif chain_allocation.state == 'rejected': + state = 'رد شده' + remover_fullname = chain_allocation.seconder['fullname'] if chain_allocation.seconder else None + remover_mobile = chain_allocation.seconder['mobile'] if chain_allocation.seconder else None + elif chain_allocation.state == 'pending': + state = 'در انتظار تایید' + else: + state = 'حذف شده' + remover_fullname = chain_allocation.remover['fullname'] if chain_allocation.remover else None + remover_mobile = chain_allocation.remover['mobile'] if chain_allocation.remover else None + out_province = 'خارج استان' if chain_allocation.out_province == True else 'داخل استان' + + full_name_registerer = chain_allocation.registerer[ + 'fullname'] if chain_allocation.registerer else '-' + mobile_registerer = chain_allocation.registerer['mobile'] if chain_allocation.registerer else '-' + + if chain_allocation.kill_house is not None: + buyer_fullname = chain_allocation.kill_house.name + buyer_mobile = chain_allocation.kill_house.kill_house_operator.user.mobile + else: + buyer_fullname = chain_allocation.buyer_name + buyer_mobile = chain_allocation.buyer_mobile + + list1 = [ + m, + state, + str(chain_date), + out_province, + full_name_registerer, + mobile_registerer, + buyer_fullname, + buyer_mobile, + chain_allocation.poultry_hatching.poultry.unit_name, + chain_allocation.poultry_hatching.poultry.user.mobile, + chain_allocation.company_name, + chain_allocation.company_user_mobile, + chain_allocation.health_code if chain_allocation.health_code else '-', + chain_allocation.quarantine_code if chain_allocation.quarantine_code else '-', + chain_allocation.driver_name if chain_allocation.driver_name else '-', + chain_allocation.driver_mobile if chain_allocation.driver_mobile else '-', + chain_allocation.type_car if chain_allocation.type_car else '-', + chain_allocation.pelak if chain_allocation.pelak else '-', + chain_allocation.quantity, + chain_allocation.index_weight, + chain_allocation.weight, + age, + ] + m += 1 + if state1 == 'تایید شده': + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + else: + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(chain_allocations), + all_quantity, + all_weighte, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + '', + all_weighte, + '', + '', + '', + + ] + if state1 == 'تایید شده': + for item in range(len(list2) - 2): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + else: + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'خرید زنده خارج از استان': + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = 'live' + if request.GET['role'] in ['KillHouse', 'KillHouseVet']: + if request.GET['role'] == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + trash=False).order_by('-date') + else: + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + trash=False).order_by('-date') + + excel_options = [ + 'ردیف', + 'کدسفارش', + 'تاریخ ثبت در سامانه', + 'تاریخ خرید', + 'ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + 'فروشنده', + 'تلفن فروشنده', + 'نوع خرید', + 'استان/شهر', + 'ماشین', + 'راننده', + 'تلفن راننده', + 'کدقرنطینه', + 'تعداد قطعه زنده', + 'وزن زنده (کیلوگرم)', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + 'وضعیت', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list2 = [ + ' تعداد بار های درانتظار تایید', + 'مجموع قطعه زنده ', + 'مجموع وزن زنده (کیلوگرم)', + 'مجموع وزن لاشه (کیلوگرم)', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + type = 'زنده' if type == 'live' else 'لاشه' + worksheet['B1'] = f'گزارش بار {type} خرید از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.ware_house == True: + if kill.register_type == 'automatic': + state = 'ورود به انبار (سیستمی)' + else: + state = 'ورود به انبار (دستی)' + else: + if kill.register_type == 'automatic': + state = 'در انتظار ورود به انبار (سیستمی)' + else: + state = ' در انتظار ورود به انبار (دستی)' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + if kill.exclusive_killer: + killer_type = f'کشتارکن اختصاصی {kill.kill_house.name}' + kill_house_name = kill.exclusive_killer.name + kill_house_mobile = kill.exclusive_killer.kill_house_operator.user.mobile + + elif kill.kill_house.killer == True and kill.kill_house.type == 'public': + killer_type = 'کشتارکن عمومی' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + + else: + killer_type = 'کشتارگاه' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + bar_code = str(kill.bar_code) if kill.bar_code else '-' + list1 = [ + m, + bar_code, + str(shamsi_date(kill.register_date, in_value=True)) if kill.register_date else '-', + str(date_of_buy), + killer_type, + kill_house_name, + kill_house_mobile, + kill.poultry_name, + kill.poultry_mobile, + buy_type, + f'{kill.province} / {kill.city}', + kill.car, + kill.driver_name, + kill.driver_mobile, + kill.bar_clearance_code, + kill.quantity, + kill.live_weight, + kill.number_of_carcasses, + kill.weight_of_carcasses, + state, + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + bar_pending = kill_house_free_bar_info + bar_pending_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_pending_live_weight = bar_pending.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + + bar_pending_weight_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_rejected = kill_house_free_bar_info.filter(kill_house_vet_state='rejected') + + bar_accepted = kill_house_free_bar_info.filter(kill_house_vet_state='accepted') + + bar_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + + bar_kill_house_vet_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(kill_house_free_bar_info), + int(bar_pending_quantity), + int(bar_pending_live_weight), + int(bar_pending_weight_of_carcasses), + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + bar_quantity, + bar_live_weight, + bar_pending_quantity, + bar_pending_weight_of_carcasses, + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'خرید لاشه خارج از استان': + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = 'carcass' + if request.GET['role'] in ['KillHouse', 'KillHouseVet']: + if request.GET['role'] == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + trash=False).order_by('-date') + else: + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + trash=False).order_by('-date') + + excel_options = [ + 'ردیف', + 'وضعیت دامپزشک', + 'کشتارگاه', + 'فروشنده', + 'نوع خرید', + 'استان/شهر', + 'تاریخ خرید', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'ماشین', + 'راننده', + 'تلفن راننده', + 'کدقرنطینه', + 'تعداد قطعه زنده', + 'وزن زنده (کیلوگرم)', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + 'حجم تایید شده', + 'وزن تایید شده', + 'تایید/رد کننده', + 'تاریخ تایید/ رد', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list2 = [ + 'تعداد بارها', + ' تعداد بار های درانتظار تایید', + 'مجموع قطعه زنده در انتظار تایید', + 'مجموع وزن زنده (کیلوگرم) درانتظار تایید', + 'مجموع تعداد لاشه درانتظار تایید', + 'مجموع وزن لاشه (کیلوگرم) درانتظار تایید', + + ' تعداد بار های رد شده', + 'مجموع قطعه زنده رد شده', + 'مجموع وزن زنده (کیلوگرم) رد شده', + 'مجموع تعداد لاشه رد شده', + 'مجموع وزن لاشه (کیلوگرم) رد شده', + + ' تعداد بار های تایید شده', + 'مجموع قطعه زنده تایید شده', + 'مجموع وزن زنده (کیلوگرم) تایید شده', + 'مجموع تعداد لاشه تایید شده', + 'مجموع وزن لاشه (کیلوگرم) تایید شده', + 'حجم تایید شده دامپزشک', + 'وزن تایید شده دامپزشک', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + type = 'زنده' if type == 'live' else 'لاشه' + worksheet['B1'] = f'گزارش بار {type} خرید از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.kill_house_vet_state == 'accepted': + state = 'تایید شده' + elif kill.kill_house_vet_state == 'pending': + state = 'درانتظار تایید' + else: + state = 'رد شده' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + + list1 = [ + m, + state, + kill.kill_house.name, + kill.poultry_name, + buy_type, + f'{kill.province} / {kill.city}', + str(date_of_buy), + kill.vet_farm_name, + kill.vet_farm_mobile, + kill.car, + kill.driver_name, + kill.driver_mobile, + kill.bar_clearance_code, + kill.quantity, + kill.live_weight, + kill.number_of_carcasses, + kill.weight_of_carcasses, + kill.kill_house_vet_quantity, + kill.kill_house_vet_weight, + kill.acceptor_rejector, + str(date_of_reject_accepted) + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + bar_pending = kill_house_free_bar_info.filter(kill_house_vet_state='pending') + bar_pending_quantity = bar_pending.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_pending_live_weight = bar_pending.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_pending_number_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_pending_weight_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_rejected = kill_house_free_bar_info.filter(kill_house_vet_state='rejected') + bar_rejected_quantity = bar_rejected.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_rejected_live_weight = bar_rejected.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_rejected_number_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_rejected_weight_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_accepted = kill_house_free_bar_info.filter(kill_house_vet_state='accepted') + bar_accepted_quantity = bar_accepted.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_accepted_live_weight = bar_accepted.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_accepted_number_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_weight_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_quantity = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_weight = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + bar_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_kill_house_vet_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_kill_house_vet_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + m - 1, + len(bar_pending), + int(bar_pending_quantity), + int(bar_pending_live_weight), + int(bar_pending_number_of_carcasses), + int(bar_pending_weight_of_carcasses), + + len(bar_rejected), + int(bar_rejected_quantity), + int(bar_rejected_live_weight), + int(bar_rejected_number_of_carcasses), + int(bar_rejected_weight_of_carcasses), + + len(bar_accepted), + int(bar_accepted_quantity), + int(bar_accepted_live_weight), + int(bar_accepted_number_of_carcasses), + int(bar_accepted_weight_of_carcasses), + int(bar_accepted_kill_house_vet_quantity), + int(bar_accepted_kill_house_vet_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + bar_quantity, + bar_live_weight, + int(bar_number_of_carcasses), + int(bar_weight_of_carcasses), + int(bar_kill_house_vet_quantity), + bar_kill_house_vet_weight, + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + 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 + + +def kill_house_free_bar_excel(request): + filterset_class = KillHouseFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house__name', + 'poultry_name', + 'poultry_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'clearance_code', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + + ] + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = request.GET.get('type') + date_type = request.GET.get('date_type') + bar_state = request.GET.get('bar_state') + kill_house_free_bar_info_list = [] + role = request.GET.get('role') + kill_houses = None + order_by_type = 'create_date' + + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if date_type == 'buy': + + filters = { + 'register_date__date__gte': date1, + 'register_date__date__lte': date2, + 'trash': False, + 'temporary_trash': False, + 'temporary_deleted': False, + 'calculate_status': True + } + else: + order_by_type = '-date' + filters = { + 'date__date__gte': date1, + 'date__date__lte': date2, + 'trash': False, + 'temporary_trash': False, + 'temporary_deleted': False, + 'calculate_status': True + } + + else: + filters = { + 'trash': False, + 'temporary_trash': False, + 'temporary_deleted': False, + 'calculate_status': True + } + + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + + if type: + filters['buy_type'] = type + if type == 'live': + if bar_state: + if bar_state == 'entered': + filters['weight_of_carcasses__gt'] = 0 + else: + filters['weight_of_carcasses'] = 0 + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by( + order_by_type) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_house_free_bar_info + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_house_free_bar_info) + kill_house_free_bar_info_list = ps.filter() + kill_house_free_bar_info = [] if len( + kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_list + excel_options = [ + 'ردیف', + 'کدسفارش', + 'تاریخ ثبت در سامانه', + 'تاریخ خرید', + 'ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + 'کشتارکن', + 'فروشنده', + 'تلفن فروشنده', + 'نوع خرید', + 'استان/شهر', + 'ماشین', + 'راننده', + 'تلفن راننده', + 'کدقرنطینه', + 'تعداد قطعه زنده', + 'وزن زنده (کیلوگرم)', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + 'وضعیت', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list2 = [ + ' تعداد بار های درانتظار تایید', + 'مجموع قطعه زنده ', + 'مجموع وزن زنده (کیلوگرم)', + 'مجموع وزن لاشه (کیلوگرم)', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + type = 'زنده' if request.GET['type'] == 'live' else 'لاشه' + worksheet['B1'] = f'گزارش بار {type} خرید از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name \ + if kill_house_free_bar_info.first() else '' + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.ware_house == True: + if kill.register_type == 'automatic': + state = 'ورود به انبار (سیستمی)' + else: + state = 'ورود به انبار (دستی)' + else: + if kill.register_type == 'automatic': + state = 'در انتظار ورود به انبار (سیستمی)' + else: + state = ' در انتظار ورود به انبار (دستی)' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + # date_of_buy = jdatetime.date.fromgregorian( + # day=kill.date.day, + # month=kill.date.month, + # year=kill.date.year + # ) + date_of_buy = jdatetime.date.fromgregorian( + day=kill.create_date.day, + month=kill.create_date.month, + year=kill.create_date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + if kill.exclusive_killer: + killer_type = f'کشتارکن اختصاصی {kill.kill_house.name}' + kill_house_name = kill.exclusive_killer.name + kill_house_mobile = kill.exclusive_killer.kill_house_operator.user.mobile + + elif kill.kill_house.killer == True and kill.kill_house.type == 'public': + killer_type = 'کشتارکن عمومی' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + + else: + killer_type = 'کشتارگاه' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + bar_code = str(kill.bar_code) if kill.bar_code else '-' + if kill.exclusive_killer: + exclusive_killer = f'{kill.exclusive_killer.name}({kill.exclusive_killer.kill_house_operator.user.mobile})' + else: + exclusive_killer = '-' + list1 = [ + m, + bar_code, + str(shamsi_date(kill.register_date, in_value=True)) if kill.register_date else '-', + str(date_of_buy), + killer_type, + kill_house_name, + kill_house_mobile, + exclusive_killer, + kill.poultry_name, + kill.poultry_mobile, + buy_type, + f'{kill.province} / {kill.city}', + kill.car, + kill.driver_name, + kill.driver_mobile, + kill.bar_clearance_code, + kill.quantity, + kill.live_weight, + kill.number_of_carcasses, + kill.weight_of_carcasses, + state, + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + bar_pending = kill_house_free_bar_info.filter(kill_house_vet_state='pending') + bar_pending_quantity = bar_pending.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_pending_live_weight = bar_pending.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_pending_number_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_pending_weight_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_rejected = kill_house_free_bar_info.filter(kill_house_vet_state='rejected') + bar_rejected_quantity = bar_rejected.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_rejected_live_weight = bar_rejected.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_rejected_number_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_rejected_weight_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_accepted = kill_house_free_bar_info.filter(kill_house_vet_state='accepted') + bar_accepted_quantity = bar_accepted.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_accepted_live_weight = bar_accepted.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_accepted_number_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_weight_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_quantity = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_weight = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + bar_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_kill_house_vet_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_kill_house_vet_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(kill_house_free_bar_info), + int(bar_pending_quantity), + int(bar_pending_live_weight), + int(bar_pending_weight_of_carcasses), + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + bar_quantity, + bar_live_weight, + bar_pending_quantity, + bar_pending_weight_of_carcasses, + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if request.GET['role'] == 'KillHouse': + name = kill_house_free_bar_info.first().kill_house.name + response[ + 'Content-Disposition'] = f'attachment; filename=" مدیریت بار {type} کشتارگاه {name} خرید از استان.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بار {type} خرید از استان.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def comprehensive_report_of_the_slaughterhouse_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date2' in request.GET else now + + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + img = Image('assets/img/img-min.png') + img.width = 180 + img.height = 160 + worksheet.add_image(img, 'M1') + + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + abc_list = [] + for letter in string.ascii_uppercase: + abc_list.append(letter) + a = ['AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH'] + abc_list.extend(a) + for abc in abc_list[8:18]: + worksheet[f'{abc}14'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'ware_house_accepted_real_weight', 'ware_house_accepted_real_quantity') + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first().killhouse_user.kill_house_operator.user.province.name + worksheet[ + 'E13'] = f'گزارش جامع خریداران در فرآیند کشتار مرغ گوشتی استان {name} از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + else: + worksheet[ + 'E13'] = f'گزارش جامع خریداران در فرآیند کشتار مرغ گوشتی از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['I14'] = 'حجم کل بارهای ایجاد شده ( زنده)' + worksheet['K14'] = 'حجم کل بارهای تحویلی کشتارگاه( زنده)' + worksheet['M14'] = 'وزن نهایی با افت 25%' + worksheet['N14'] = 'ورودی به انبار کشتارگاه(لاشه)' + worksheet['P14'] = 'درصد لاشه ورودی به انبار کشتارگاه نسبت به بار تحویلی کشتارگاه(با افت 25 %)' + worksheet['R14'] = 'درصد بار تحویلی نسبت به بار ایجاد شده' + worksheet['M10'] = 'سامانه رصدیار' + if filtered_kill_reqs: + first = filtered_kill_reqs.first().killhouse_user.kill_house_operator.user.province.name + worksheet['M11'] = f'استان {first}' + merge_range111 = 'M11:O11' + worksheet.merge_cells(merge_range111) + + worksheet.row_dimensions[14].height = 42 + + worksheet['E13'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['I14'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['K14'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['M14'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['N14'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['P14'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['R14'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['M11'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['M10'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range1 = 'E13:X13' + merge_range2 = 'I14:J15' + merge_range3 = 'K14:L15' + merge_range4 = 'M14:M16' + merge_range5 = 'N14:O15' + merge_range6 = 'P14:Q15' + merge_range7 = 'R14:S15' + merge_range8 = 'M10:O10' + + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + + worksheet['E13'].font = Font(size=18, bold=True) + worksheet['P14'].font = Font(size=9, bold=True) + worksheet['M10'].font = Font(size=12, bold=True) + + worksheet['I14'].fill = PatternFill(start_color="FFFF00", fill_type="solid") + worksheet['K14'].fill = PatternFill(start_color="FFFF00", fill_type="solid") + worksheet['N14'].fill = PatternFill(start_color="FFFF00", fill_type="solid") + worksheet['M14'].fill = PatternFill(start_color="FCE4D6", fill_type="solid") + worksheet['P14'].fill = PatternFill(start_color="F8CBAD", fill_type="solid") + worksheet['R14'].fill = PatternFill(start_color="F8CBAD", fill_type="solid") + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + for item in range(4): + cell = worksheet.cell(row=16, column=item + 9, value=list1[item]) + worksheet.row_dimensions[16].height = 24 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + for item in range(6): + cell = worksheet.cell(row=16, column=item + 14, value=list1[item]) + worksheet.row_dimensions[16].height = 24 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + all_kill_req_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity' or 0) + + weight = filtered_kill_reqs.aggregate( + total_quantity=Sum( + F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[ + 'total_quantity'] + + all_kill_req_quantity_reciver = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity' or 0) + all_kill_req_weight_reciver = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity' or 0) + all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity' or 0) + all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity' or 0) + if all_kill_req_quantity: + list_1 = [ + all_kill_req_quantity, + weight, + all_kill_req_quantity_reciver, + all_kill_req_weight_reciver, + (int(all_kill_req_weight_reciver) * 75) / 100, + all_ware_house_accepted_real_quantity, + all_ware_house_accepted_real_weight, + f'{int(all_ware_house_accepted_real_quantity * 100 / all_kill_req_quantity_reciver)}%', + f"{int(all_ware_house_accepted_real_weight * 100 / all_kill_req_weight_reciver)}%", + f"{int(all_kill_req_quantity_reciver * 100 / all_kill_req_quantity)}%", + f'{int((all_kill_req_weight_reciver * 100) / weight)}%' + ] + for item in range(len(list_1)): + cell = worksheet.cell(row=17, column=item + 9, value=list_1[item]) + value = list_1[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' + else: + cell.value = value + + cell.alignment = Alignment(horizontal='center', vertical='center', ) + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + tomorrow_date1 = date1 + timedelta(days=1) + tomorrow_date2 = date2 + timedelta(days=1) + from_date = jdatetime.date.fromgregorian( + year=tomorrow_date1.year, + month=tomorrow_date1.month, + day=tomorrow_date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + tommorow_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=tomorrow_date2.year, + month=tomorrow_date2.month, + day=tomorrow_date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + tomorrow_date_2 = separate.join(reversed_date) + + worksheet.row_dimensions[21].height = 36 + for abc in abc_list[5:21]: + worksheet[f'{abc}20'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + worksheet['F19'] = f'اطلاعات کلی توزیع و پخش مرغ گرم از تاریخ {tommorow_date_1} تا {tomorrow_date_2}' + worksheet['F20'] = f'تعداد خریداران' + worksheet['G20'] = f'کشتار داخل استان' + worksheet['I20'] = f'خرید خارج از استان' + worksheet['K20'] = f'جمع کل انبار' + worksheet['M20'] = f'توزیع شده' + worksheet['O20'] = f'توزیع / تحویل شده' + worksheet['Q20'] = f'مانده انبار' + worksheet['S20'] = f'درصد توزیع نسبت به وردی به انبار' + worksheet['T20'] = f'تعداد مباشر تخصیص داده شده' + worksheet['U20'] = f'تعداد صنف تخصیص داده شده' + + worksheet['F19'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['F20'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['G20'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['I20'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['K20'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['M20'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['O20'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['Q20'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['S20'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['T20'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['U20'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range = 'F19:U19' + merge_range1 = 'F20:F22' + merge_range2 = 'G20:H21' + merge_range3 = 'I20:J21' + merge_range4 = 'K20:L21' + merge_range5 = 'M20:N21' + merge_range6 = 'O20:P21' + merge_range7 = 'Q20:R21' + merge_range8 = 'S20:S22' + merge_range9 = 'T20:T22' + merge_range10 = 'U20:U22' + + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet.merge_cells(merge_range9) + worksheet.merge_cells(merge_range10) + + worksheet['F19'].font = Font(size=18, bold=True, color='FF0000') + worksheet['F20'].font = Font(size=9) + + worksheet['F20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + worksheet['G20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + worksheet['I20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + worksheet['K20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + worksheet['M20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + worksheet['O20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + worksheet['Q20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + worksheet['S20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + worksheet['T20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + worksheet['U20'].fill = PatternFill(start_color="DDEBF7", fill_type="solid") + for item in range(12): + cell = worksheet.cell(row=22, column=item + 7, value=list1[item]) + worksheet.row_dimensions[22].height = 24 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + filtered_kill_reqs_tommorow = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'ware_house_accepted_real_weight', 'ware_house_accepted_real_quantity', + 'killhouse_user__kill_house_operator__user__city__name') + + number_of_kill_house_tommorow = filtered_kill_reqs_tommorow.values( + 'killhouse_user').distinct().count() if filtered_kill_reqs_tommorow else 0 + + kill_free_info_tommorow = KillHouseFreeBarInformation.objects.filter(trash=False, date__date__gte=tomorrow_date1, + date__date__lte=tomorrow_date2).only( + 'weight_of_carcasses', 'number_of_carcasses') + all_quantity_out_false_tommorow = filtered_kill_reqs_tommorow.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity' or 0) + + weight_tommorow = filtered_kill_reqs_tommorow.aggregate( + total_quantity=Sum( + F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[ + 'total_quantity'] + all_quantity_out_true_tommorow = kill_free_info_tommorow.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity' or 0) + all_weight_out_true_tomorow = kill_free_info_tommorow.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + kill_house_ware_houses_tommorow = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=tomorrow_date1, + date__date__lte=tomorrow_date2, trash=False) + final_total_number_of_carcasses_tommorow = \ + kill_house_ware_houses_tommorow.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + kill_house_ware_houses_tommorow.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + steward_allocations_tommorow = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses_tommorow, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + total_allocated_quantity = \ + steward_allocations_tommorow.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations_tommorow.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations_tommorow.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations_tommorow.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + kill_house_ware_houses_tommorow.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + kill_house_ware_houses_tommorow.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + kill_house_ware_houses_tommorow.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + steward_allocations_for_number_of_steward = steward_allocations_tommorow.filter(steward__isnull=False, + trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + guild_allocations_tommorow = steward_allocations_tommorow.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations_tommorow.values( + 'guilds').distinct().count() if guild_allocations_tommorow else 0 + if filtered_kill_reqs_tommorow: + list_1 = [ + number_of_kill_house_tommorow, + all_quantity_out_false_tommorow if all_quantity_out_false_tommorow != None else 0, + weight_tommorow, + all_quantity_out_true_tommorow if all_quantity_out_true_tommorow != None else 0, + all_weight_out_true_tomorow, + final_total_number_of_carcasses_tommorow if final_total_number_of_carcasses_tommorow != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight, + total_accepted_allocated_quantity, + total_accepted_allocated_weight, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + f"{int((total_allocated_quantity * 100) / final_total_number_of_carcasses) if total_allocated_quantity and final_total_number_of_carcasses != None else 0}%", + number_of_steward, + number_of_guild, + + ] + for item in range(len(list_1)): + cell = worksheet.cell(row=23, column=item + 6, value=list_1[item]) + value = list_1[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' + else: + cell.value = value + + cell.alignment = Alignment(horizontal='center', vertical='center', ) + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + for abc in abc_list: + worksheet[f'{abc}27'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + worksheet.row_dimensions[27].height = 42 + for item in range(4): + cell = worksheet.cell(row=29, column=item + 4, value=list1[item]) + worksheet.row_dimensions[29].height = 24 + + cell.fill = PatternFill(start_color="92D050", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + for item in range(4): + cell = worksheet.cell(row=29, column=item + 10, value=list1[item]) + worksheet.row_dimensions[29].height = 24 + + cell.fill = PatternFill(start_color="92D050", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + for item in range(10): + cell = worksheet.cell(row=29, column=item + 14, value=list1[item]) + worksheet.row_dimensions[29].height = 24 + + cell.fill = PatternFill(start_color="9BC2E6", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + for item in range(2): + cell = worksheet.cell(row=29, column=item + 27, value=list1[item]) + worksheet.row_dimensions[29].height = 24 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + for item in range(5): + cell = worksheet.cell(row=29, column=item + 28, value=list1[item]) + worksheet.row_dimensions[29].height = 24 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + worksheet['I26'] = 'اطلاعات کلی بارها و توزیع خریداران ' + worksheet['A27'] = 'ردیف' + worksheet['B27'] = 'خریدار' + worksheet['C27'] = 'شهرستان' + worksheet['D27'] = 'حجم کل بارهای ایجاد شده توسط کشتارگاه ( زنده)' + worksheet['F27'] = 'حجم کل بارهای تحویلی توسط کشتارگاه( زنده)' + worksheet['H27'] = 'وزن تحویلی با افت 25%' + worksheet['I27'] = 'درصد تعداد قطعه بار ایجاد شده به تحویلی' + worksheet['J27'] = 'ورودی به انبار کشتارگاه(لاشه)' + worksheet['L27'] = 'درصد لاشه ورودی به انبار کشتارگاه نسبت به بارتحویلی کشتارگاه(با افت 25 %)' + worksheet['N27'] = 'خرید خارج از استان' + worksheet['P27'] = 'جمع کل انبار' + worksheet['R27'] = 'توزیع شده' + worksheet['T27'] = 'توزیع/تحویل شده' + worksheet['V27'] = 'مانده انبار' + worksheet['X27'] = 'درصد وزن مانده در انبار به ورودی انبار' + worksheet['Y27'] = 'تعداد مباشر/ صنف ' + worksheet['Z27'] = 'بارهای تخلیه شده و عدم تکمیل(تحویل)' + worksheet['Z29'] = 'تعداد بار' + worksheet['AC27'] = 'ورودی به انبار' + worksheet['AC29'] = 'تعداد بار' + worksheet['AD29'] = 'حجم بار' + worksheet['AE29'] = 'وزن بار' + worksheet['AF29'] = 'درصد افت' + worksheet['AG27'] = 'بارهای فاقد قرنطینه و تخلیه شده' + worksheet['AG29'] = 'تعداد بار' + worksheet['AH29'] = 'درصد' + worksheet['I27'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A27'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B27'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['C27'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['D27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['F27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['H27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['I27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['J27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['L27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['N27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['P27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['R27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['T27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['V27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['X27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['Y27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['Z27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['Z29'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['AF29'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['AE29'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['AD29'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['AC29'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['AC27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['AG27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['AG29'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['AH29'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range = 'A27:A29' + merge_range1 = 'B27:B29' + merge_range2 = 'C27:C29' + merge_range3 = 'D27:E28' + merge_range4 = 'F27:G28' + merge_range5 = 'H27:H29' + merge_range6 = 'I27:I29' + merge_range7 = 'J27:K28' + merge_range8 = 'L27:M28' + merge_range9 = 'N27:O28' + merge_range10 = 'P27:Q28' + merge_range11 = 'R27:S28' + merge_range12 = 'T27:U28' + merge_range13 = 'V27:W28' + merge_range14 = 'I26:R26' + merge_range15 = 'X27:X29' + merge_range16 = 'Y27:Y29' + merge_range17 = 'Z27:AB28' + merge_range18 = 'M1:O9' + merge_range19 = 'AC27:AF28' + merge_range20 = 'AG27:AH28' + + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet.merge_cells(merge_range9) + worksheet.merge_cells(merge_range10) + worksheet.merge_cells(merge_range11) + worksheet.merge_cells(merge_range12) + worksheet.merge_cells(merge_range13) + worksheet.merge_cells(merge_range14) + worksheet.merge_cells(merge_range15) + worksheet.merge_cells(merge_range16) + worksheet.merge_cells(merge_range17) + worksheet.merge_cells(merge_range18) + worksheet.merge_cells(merge_range19) + worksheet.merge_cells(merge_range20) + + worksheet['A27'].fill = PatternFill(start_color="8EA9DB", fill_type="solid") + worksheet['B27'].fill = PatternFill(start_color="8EA9DB", fill_type="solid") + worksheet['C27'].fill = PatternFill(start_color="8EA9DB", fill_type="solid") + worksheet['D27'].fill = PatternFill(start_color="FFE699", fill_type="solid") + worksheet['F27'].fill = PatternFill(start_color="FFE699", fill_type="solid") + worksheet['H27'].fill = PatternFill(start_color="FFE699", fill_type="solid") + worksheet['I27'].fill = PatternFill(start_color="FFE699", fill_type="solid") + worksheet['J27'].fill = PatternFill(start_color="FFE699", fill_type="solid") + worksheet['L27'].fill = PatternFill(start_color="FFE699", fill_type="solid") + worksheet['N27'].fill = PatternFill(start_color="C9C9C9", fill_type="solid") + worksheet['P27'].fill = PatternFill(start_color="C9C9C9", fill_type="solid") + worksheet['R27'].fill = PatternFill(start_color="C9C9C9", fill_type="solid") + worksheet['T27'].fill = PatternFill(start_color="C9C9C9", fill_type="solid") + worksheet['V27'].fill = PatternFill(start_color="C9C9C9", fill_type="solid") + worksheet['X27'].fill = PatternFill(start_color="F8CBAD", fill_type="solid") + worksheet['Y27'].fill = PatternFill(start_color="F8CBAD", fill_type="solid") + worksheet['Z27'].fill = PatternFill(start_color="FFFF00", fill_type="solid") + worksheet['Z29'].fill = PatternFill(start_color="FFD966", fill_type="solid") + worksheet['AC29'].fill = PatternFill(start_color="FFD966", fill_type="solid") + worksheet['AD29'].fill = PatternFill(start_color="FFD966", fill_type="solid") + worksheet['AE29'].fill = PatternFill(start_color="FFD966", fill_type="solid") + worksheet['AF29'].fill = PatternFill(start_color="FFD966", fill_type="solid") + worksheet['AC27'].fill = PatternFill(start_color="92CDDC", fill_type="solid") + worksheet['AG27'].fill = PatternFill(start_color="00B050", fill_type="solid") + worksheet['AH29'].fill = PatternFill(start_color="FFD966", fill_type="solid") + worksheet['AG29'].fill = PatternFill(start_color="FFD966", fill_type="solid") + + worksheet['L27'].font = Font(size=8) + worksheet['X27'].font = Font(size=9) + worksheet['I26'].font = Font(size=17) + + l = 30 + m = 1 + all_all_kill_req_quantity = 0 + all_weight = 0 + all_all_kill_req_quantity_reciver = 0 + all_all_kill_req_weight_reciver = 0 + all_twenty_five_percent = 0 + all_reciver_percent = 0 + all_final_total_number_of_carcasses = 0 + all_final_total_weight_of_carcasses = 0 + all_lashe_25_percent = 0 + all_weight_lashe_25_percent = 0 + all_all_quantity_out_true = 0 + all_all_weight_out_true = 0 + all_total_allocated_quantity = 0 + all_total_allocated_weight = 0 + all_total_accepted_allocated_quantity = 0 + all_total_accepted_allocated_weight = 0 + all_total_remain_quantity = 0 + all_total_remain_weight = 0 + all_all_num = 0 + all_remain_percent = 0 + all_len_tomorrow_kill_request_not_assigment = 0 + all_all_kill_req_quantity_not_assigment = 0 + all_all_kill_req_weight_not_assigment = 0 + all_all_ware_house_accepted_real_quantity = 0 + all_len_kill_req1 = 0 + all_ware_house_accepted_real_weight = 0 + all_ware_house_accepted_real_quantity = 0 + all_weight_loss = 0 + all_hasnt_code = 0 + all_percent_hasnt_code = 0 + kill_houses = KillHouse.objects.filter(trash=False).select_related('kill_house_operator__user__city').exclude( + out_province=True) + for kill_house in kill_houses: + kill_free_information = kill_free_info_tommorow.filter(kill_house=kill_house) + tomorrow_kill_request = filtered_kill_reqs_tommorow.filter(killhouse_user=kill_house) + if tomorrow_kill_request: + tomorrow_kill_request_not_assigment = tomorrow_kill_request.filter(assignment_state_archive='pending', + vet_state='accepted') + all_kill_req_quantity = tomorrow_kill_request.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity' or 0) + all_len_tomorrow_kill_request_not_assigment += len(tomorrow_kill_request_not_assigment) + all_all_kill_req_quantity += all_kill_req_quantity + + all_kill_req_quantity_reciver = tomorrow_kill_request.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity' or 0) + all_all_kill_req_quantity_reciver += all_kill_req_quantity_reciver + all_kill_req_weight_reciver = tomorrow_kill_request.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity' or 0) + all_all_kill_req_weight_reciver += all_kill_req_weight_reciver + all_ware_house_accepted_real_quantity = tomorrow_kill_request.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity' or 0) + weight = tomorrow_kill_request.aggregate( + total_quantity=Sum( + F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[ + 'total_quantity'] + all_weight += weight + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=tomorrow_date1, + date__date__lte=tomorrow_date2, kill_house=kill_house, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + all_total_allocated_quantity += total_allocated_quantity if total_allocated_quantity != None else 0 + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + all_total_allocated_weight += total_allocated_weight if total_allocated_weight != None else 0 + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + all_total_accepted_allocated_quantity += total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0 + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + all_total_accepted_allocated_weight += total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0 + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + all_total_remain_quantity += total_remain_quantity if total_remain_quantity != None else 0 + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + all_total_remain_weight += total_remain_weight if total_remain_weight != None else 0 + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] or 0 + all_final_total_number_of_carcasses += final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0 + + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] or 0 + all_final_total_weight_of_carcasses += final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0 + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, + trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + all_kill_req_quantity_not_assigment = tomorrow_kill_request_not_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + all_all_kill_req_quantity_not_assigment += all_kill_req_quantity_not_assigment if all_kill_req_quantity_not_assigment != None else 0 + all_kill_req_weight_not_assigment = tomorrow_kill_request_not_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + all_all_kill_req_weight_not_assigment += all_kill_req_weight_not_assigment if all_kill_req_weight_not_assigment != None else 0 + all_quantity_out_true = kill_free_information.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + all_all_quantity_out_true += all_quantity_out_true if all_quantity_out_true != None else 0 + all_weight_out_true = kill_free_information.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity' or 0) + all_all_weight_out_true += all_weight_out_true if all_weight_out_true != None else 0 + twenty_five_percent = (int(all_kill_req_weight_reciver) * 75) / 100 + all_twenty_five_percent += twenty_five_percent if twenty_five_percent > 0 else 0 + reciver_percent = ( + int(all_kill_req_quantity_reciver) * 100) / all_kill_req_quantity if all_kill_req_quantity_reciver != None else 0 + all_reciver_percent += reciver_percent if reciver_percent > 0 else 0 + lashe_25_percent = int( + final_total_number_of_carcasses * 100 / all_kill_req_quantity_reciver) if final_total_number_of_carcasses != None else 0 + all_lashe_25_percent += lashe_25_percent if lashe_25_percent > 0 else 0 + weight_lashe_25_percent = int( + final_total_weight_of_carcasses * 100 / all_kill_req_weight_reciver) if final_total_weight_of_carcasses != None else 0 + all_weight_lashe_25_percent += weight_lashe_25_percent if weight_lashe_25_percent > 0 else 0 + remain_percent = int(( + total_remain_quantity * 100) / all_ware_house_accepted_real_quantity) if total_remain_quantity != None and all_ware_house_accepted_real_quantity > 0 else 0 + all_remain_percent += remain_percent if remain_percent > 0 else 0 + all_num = number_of_steward + number_of_guild + all_all_num += all_num if all_num > 0 else 0 + + kill_req = filtered_kill_reqs_tommorow.filter(ware_house_confirmation=True, + killhouse_user=kill_house) + all_len_kill_req1 += len(kill_req) + ware_house_accepted_real_quantity = kill_req.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + + ware_house_accepted_real_weight = kill_req.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity') or 0 + weight_loss1 = kill_req.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity') or 0 + weight_loss = weight_loss1 / len(kill_req) if len(kill_req) > 0 else 0 + all_ware_house_accepted_real_weight += ware_house_accepted_real_weight + all_ware_house_accepted_real_quantity += ware_house_accepted_real_quantity + all_weight_loss += int(weight_loss1) + all_all_ware_house_accepted_real_quantity += ware_house_accepted_real_quantity + hasnt_code = len(tomorrow_kill_request.filter(assignment_state_archive='True', clearance_code__isnull=True)) + percent_hasnt_code = round(hasnt_code * 100 / len(tomorrow_kill_request)) if len( + tomorrow_kill_request) > 0 else 0 + + all_hasnt_code += hasnt_code + all_percent_hasnt_code += percent_hasnt_code + list_1 = [ + m, + kill_house.name, + kill_house.city_name, + all_kill_req_quantity, + weight, + all_kill_req_quantity_reciver, + all_kill_req_weight_reciver, + twenty_five_percent, + f'{int(reciver_percent)}%', + final_total_number_of_carcasses, + final_total_weight_of_carcasses, + f'{lashe_25_percent}%', + f"{weight_lashe_25_percent}%", + all_quantity_out_true, + all_weight_out_true, + final_total_number_of_carcasses, + final_total_weight_of_carcasses, + total_allocated_quantity, + total_allocated_weight, + total_accepted_allocated_quantity, + total_accepted_allocated_weight, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + f'{remain_percent}%', + all_num, + len(tomorrow_kill_request_not_assigment), + all_kill_req_quantity_not_assigment, + all_kill_req_weight_not_assigment, + len(kill_req), + ware_house_accepted_real_quantity, + ware_house_accepted_real_weight, + f"{int(weight_loss)}%", + hasnt_code, + f"{percent_hasnt_code}%", + + ] + for item in range(len(list_1)): + cell = worksheet.cell(row=l, column=item + 1, value=list_1[item]) + value = list_1[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' + else: + cell.value = value + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + l += 1 + m += 1 + + for abc in abc_list[:1]: + worksheet[f'{abc}{l}'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + worksheet.row_dimensions[int(f'{l}')].height = 24 + + worksheet[f'A{l}'] = 'جمع کل' + + worksheet[f'A{l}'].alignment = Alignment(horizontal='center', vertical='center') + merge_range = f'A{l}:C{l}' + worksheet[f'A{l}'].fill = PatternFill(start_color="FFFF00", fill_type="solid") + all_reciver_percent2 = ( + int(all_all_kill_req_quantity_reciver) * 100) / all_all_kill_req_quantity if all_all_kill_req_quantity_reciver and all_all_kill_req_quantity > 0 else 0 + all_all_lashe_25_percent = int( + all_final_total_number_of_carcasses * 100 / all_all_kill_req_quantity_reciver) if all_final_total_number_of_carcasses > 0 else 0 + all_all_weight_lashe_25_percent = int( + all_final_total_weight_of_carcasses * 100 / all_all_kill_req_weight_reciver) if all_final_total_weight_of_carcasses > 0 else 0 + all_all_all_remain_percent = int(( + all_total_remain_quantity * 100) / all_all_ware_house_accepted_real_quantity) if all_total_remain_quantity > 0 and all_all_ware_house_accepted_real_quantity > 0 else 0 + worksheet.merge_cells(merge_range) + list2 = [ + all_all_kill_req_quantity, + all_weight, + all_all_kill_req_quantity_reciver, + all_all_kill_req_weight_reciver, + all_twenty_five_percent, + f'{int(all_reciver_percent2)}%', + all_final_total_number_of_carcasses, + all_final_total_weight_of_carcasses, + f'{all_all_lashe_25_percent}%', + f'{all_all_weight_lashe_25_percent}%', + all_all_quantity_out_true, + all_all_weight_out_true, + all_final_total_number_of_carcasses, + all_final_total_weight_of_carcasses, + all_total_allocated_quantity, + all_total_allocated_weight, + all_total_accepted_allocated_quantity, + all_total_accepted_allocated_weight, + all_total_remain_quantity, + all_total_remain_weight, + f'{all_all_all_remain_percent}%', + all_all_num, + all_len_tomorrow_kill_request_not_assigment, + all_all_kill_req_quantity_not_assigment, + all_all_kill_req_weight_not_assigment, + all_len_kill_req1, + all_all_ware_house_accepted_real_quantity, + all_ware_house_accepted_real_weight, + f"{int(all_weight_loss / all_len_kill_req1 if all_len_kill_req1 > 0 else 0)}%", + all_hasnt_code, + f"{int(all_hasnt_code / all_len_kill_req1 if all_len_kill_req1 > 0 else 0)}%", + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l, column=item + 4, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="FFFF00", fill_type="solid") + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + 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 + + +def out_province_carcasses_buyer_kill_house_excel(request): + filterset_class = OutProvinceCarcassesBuyerFilterSet + filterset_fields = [ + 'mobile', + 'first_name', + 'last_name', + 'fullname', + 'unit_name', + + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + buyers = OutProvinceCarcassesBuyer.objects.filter(trash=False, Kill_house=kill_house).order_by('id') + + value = request.GET.get('value') + search = request.GET.get('filter') + if value and search == 'search': + if value != 'undefined' and value.strip(): + buyers = buyers.filter( + build_query(filterset_class, value) + ) + + excel_options = [ + 'ردیف', + 'خریدار', + 'تلفن خریدار', + 'نام واحد', + 'استان', + 'شهر', + 'تعداد درخواست ها', + 'حجم درخواست ها', + 'وزن درخواست ها', + + ] + + header_list = [ + 'تعداد خریداران', + 'تعداد کل درخواست ها', + 'حجم کل درخواست ها', + 'وزن کل درخواست ها', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + create_header(worksheet, header_list, 3, 2, height=21, width=16.01) + + excel_description(worksheet, 'A1', f' خریداران لاشه خارج استان کشتارگاه {kill_house.name}', color='red', row2='B1') + + if kill_house: + province = kill_house.kill_house_operator.user.province.name + excel_description(worksheet, 'A2', f'استان {province}', color='red', row2='B2') + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=19, width=21.01) + + l = 5 + m = 1 + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, buyer__in=buyers) + + for buyer in buyers: + free_sale = free_sales.filter(buyer=buyer) + + total_quantity = free_sale.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sale.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + list1 = [ + m, + buyer.fullname, + buyer.mobile, + buyer.unit_name, + buyer.province, + buyer.city, + len(free_sale), + total_quantity, + total_weight + + ] + create_value(worksheet, list1, l + 1, 1) + + m += 1 + l += 1 + + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, buyer__in=buyers) + + total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + value_list = [ + len(buyers), + len(free_sales), + total_quantity, + total_weight, + ] + create_value(worksheet, value_list, 3, 3) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + len(free_sales), + total_quantity, + total_weight, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename=" خریداران لاشه خارج استان کشتارگاه {kill_house.name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def kill_house_free_sale_bar_information_for_excel_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date2' in request.GET else now + filterset_class = OutProvinceCarcassesBuyerFilterSet + filterset_fields = [ + 'mobile', + 'first_name', + 'last_name', + 'fullname', + 'unit_name', + + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + buyers = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date') + len_buyers = [] + sheet_names2 = [ + 'فروش لاشه خارج استان', + 'خریداران', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + for name in sheet_names2: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + if sheet_name == 'فروش لاشه خارج استان': + value = request.GET.get('value') + search = request.GET.get('filter') + if value and search == 'search': + if value != 'undefined' and value.strip(): + buyers = buyers.filter( + build_query(filterset_class, value) + ) + + excel_options = [ + 'ردیف', + 'نام کشتارگاه', + 'موبایل کشتارگاه', + 'تاریخ', + 'خریدار', + 'تلفن خریدار', + 'نام واحد', + 'استان', + 'شهر', + 'حجم لاشه(تقریبی)', + 'وزن لاشه(کیلوگرم)', + + ] + + header_list = [ + 'تعداد کل فروش', + 'تعداد خریداران', + 'حجم لاشه(تقریبی)', + 'وزن لاشه(کیلوگرم)', + + ] + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + create_header(worksheet, header_list, 3, 2, height=21, width=16.01) + + excel_description(worksheet, 'A1', f'فروش لاشه خارج استان کشتارگاه {kill_house.name}', color='red', + row2='B1') + from_date1 = shamsi_date(date1) + from_date2 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ {from_date1} تا {from_date2}', color='red', row2='B3') + + if kill_house: + province = kill_house.kill_house_operator.user.province.name + excel_description(worksheet, 'A2', f'استان {province}', color='red', row2='B2') + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=19, width=21.01) + + l = 5 + m = 1 + + for buyer in buyers: + date = jdatetime.date.fromgregorian( + day=buyer.date.day, + month=buyer.date.month, + year=buyer.date.year + ) + if buyer.buyer_name not in len_buyers: + len_buyers.append(buyer.buyer_name) + list1 = [ + m, + buyer.kill_house.name, + buyer.kill_house.kill_house_operator.user.mobile, + str(date), + buyer.buyer_name, + buyer.buyer_mobile, + buyer.buyer_name, + buyer.province, + buyer.city, + buyer.number_of_carcasses, + buyer.weight_of_carcasses, + + ] + create_value(worksheet, list1, l + 1, 1) + + m += 1 + l += 1 + + total_quantity = buyers.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = buyers.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + value_list = [ + len(buyers), + len(len_buyers), + total_quantity, + total_weight, + ] + create_value(worksheet, value_list, 3, 3) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + total_quantity, + total_weight, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + else: + out_buyers = OutProvinceCarcassesBuyer.objects.filter(Kill_house=kill_house, trash=False).order_by('id') + excel_options = [ + 'ردیف', + 'نام خریدار', + 'موبایل خریدار', + 'نام واحد', + 'استان', + 'شهر', + 'تعداد درخواست ها', + 'حجم تقریبی(قطعه)', + 'وزن(کلوگرم)', + + ] + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + excel_description(worksheet, 'A1', f'خریداران کشتارگاه {kill_house.name}', color='red', + row2='B1') + + if kill_house: + province = kill_house.kill_house_operator.user.province.name + excel_description(worksheet, 'A2', f'استان {province}', color='red', row2='B2') + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=19, width=21.01) + + l = 5 + m = 1 + + for buyer in out_buyers: + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, buyer=buyer) + + total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + list1 = [ + m, + buyer.buyer.fullname, + buyer.buyer.mobile, + buyer.buyer.unit_name, + buyer.buyer.province, + + buyer.buyer.city, + len(free_sales), + total_quantity, + total_weight, + + ] + create_value(worksheet, list1, l + 1, 1) + + m += 1 + l += 1 + + # total_quantity = buyers.aggregate(total=Sum('number_of_carcasses'))[ + # 'total'] or 0 + # total_weight = buyers.aggregate(total=Sum('weight_of_carcasses'))[ + # 'total'] or 0 + + # list2 = [ + # 'مجموع==>', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # total_quantity, + # total_weight, + # + # ] + # create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="فروش لاشه خارج استان کشتارگاه {kill_house.name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def kill_house_free_sale_bar_information_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date2' in request.GET else now + filterset_class = OutProvinceCarcassesBuyerFilterSet + filterset_fields = [ + 'mobile', + 'first_name', + 'last_name', + 'fullname', + 'unit_name', + + ] + # user = SystemUserProfile.objects.get(key=request.GET['key'],trash=False) + # kill_house = KillHouse.objects.filter(kill_house_operator__user=user,trash=False).first() + buyers = KillHouseFreeSaleBarInformation.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date') + + value = request.GET.get('value') + search = request.GET.get('filter') + if value and search == 'search': + if value != 'undefined' and value.strip(): + buyers = buyers.filter( + build_query(filterset_class, value) + ) + + excel_options = [ + 'ردیف', + 'نام کشتارگاه', + 'موبایل کشتارگاه', + 'تاریخ', + 'خریدار', + 'تلفن خریدار', + 'نام واحد', + 'استان', + 'شهر', + 'حجم لاشه', + 'وزن لاشه', + + ] + + header_list = [ + 'تعداد کل لاشه', + 'حجم کل لاشه', + 'وزن کل لاشه', + + ] + + kill_houses = buyers.values_list('kill_house__name', flat=True).distinct() + sheet_name = 'اطلاعات کلی' + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + worksheet = workbook.create_sheet(sheet_name) + kill_houses = set(kill_houses) + date_1 = shamsi_date(date1) + date_2 = shamsi_date(date2) + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + province = buyers.first().kill_house.kill_house_operator.user.province.name + excel_description(worksheet, 'F2', + f'اطلاعات کلی فروش لاشه به خارج استان {province} از تاریخ {date_1} تا {date_2}', color='red', + row2='K2') + excel_description(worksheet, 'E5', f'اطلاعات کلی', color='red', row2='F5') + create_header(worksheet, header_list, 7, 5, height=21, width=16.01) + total_quantity = buyers.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = buyers.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + general_list = [ + len(buyers), + total_quantity, + total_weight + ] + create_value(worksheet, general_list, 6, 7, border_style='thin') + l = 10 + for kill_house in list(kill_houses): + excel_description(worksheet, f'E{l}', f'کشتار گاه {kill_house}', color='red', row2=f'F{l}') + create_header(worksheet, header_list, 7, l, height=21, width=16.01) + free_sales = buyers.filter(trash=False, kill_house__name=kill_house) + total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + general_list = [ + len(free_sales), + total_quantity, + total_weight + ] + create_value(worksheet, general_list, l + 1, 7, border_style='thin') + l += 4 + + for kill_house in list(kill_houses): + sheet_name = kill_house + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + create_header(worksheet, header_list, 3, 2, height=21, width=16.01) + + excel_description(worksheet, 'A1', f' فروش لاشه خارج استان کشتارگاه {kill_house} ', color='red', row2='B1') + excel_description(worksheet, 'A3', f'از تاریخ {date_1} تا {date_2}', color='red', row2='B3') + create_header_freez(worksheet, excel_options, 1, 5, 6, height=19, width=21.01) + + l = 5 + m = 1 + free_sales = buyers.filter(trash=False, kill_house__name=kill_house) + + for buyer in free_sales: + date = jdatetime.date.fromgregorian( + day=buyer.date.day, + month=buyer.date.month, + year=buyer.date.year + ) + list1 = [ + m, + buyer.kill_house.name, + buyer.kill_house.kill_house_operator.user.mobile, + str(date), + buyer.buyer_name, + buyer.buyer_mobile, + buyer.buyer_name, + buyer.province, + buyer.city, + buyer.number_of_carcasses, + buyer.weight_of_carcasses, + + ] + create_value(worksheet, list1, l + 1, 1) + + m += 1 + l += 1 + + total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + value_list = [ + len(free_sales), + total_quantity, + total_weight, + ] + create_value(worksheet, value_list, 3, 3) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + total_quantity, + total_weight, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def notentered_bars_for_kill_house_excel(request): + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + else: + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + + if 'search' in request.GET: + filtered_kill_reqs = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + filtered_kill_reqs = [] if len(filtered_kill_reqs) == 0 else filtered_kill_reqs + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + 'کشور مقصد', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + + # برای بالای هدر + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + create_header(worksheet, header_list2, 6, 4, height=21.8, color='green') + + create_header(worksheet, header_list, 9, 4, height=21.8) + + header_list2 = [ + 'ردیف', + 'نام محصول', + 'وزن خریدهای دولتی داخل استان(کیلوگرم)', + 'وزن خریدهای آزاد داخل استان(کیلوگرم)', + 'وزن خریدهای خارج استان(کیلوگرم)', + 'کل ورودی به انبار(کیلوگرم)', + 'کل فروش(کیلوگرم)', + 'مانده انبار(کیلوگرم)', + + ] + create_header(worksheet, header_list2, 6, 1, height=21.8, color='FF0000') + products = RolesProducts.objects.filter(kill_house=kill_house, trash=False) + q = 2 + w = 1 + for product in products: + value_header_list = [ + w, + product.name, + product.province_governmental_carcasses_weight, + product.province_free_carcasses_weight, + product.free_buying_carcasses_weight, + product.total_carcasses_weight, + product.real_allocated_weight, + product.total_remain_weight, + + ] + create_value(worksheet, value_header_list, q, 6) + q += 1 + w += 1 + + kill_house_name = '' + if filtered_kill_reqs.exists(): + kill_house_name = filtered_kill_reqs.first()['killhouse_user__name'] + excel_description(worksheet, 'A1', f'بارهای {kill_house_name} در انتظار ورود به انبار (کشتار داخل استان)', size=11, + color='red', row2='E1') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='C3') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 7, 8, 20) + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + l = 7 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if weight_loss1 != 0 else 0 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + export_country, + + ] + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=40, different_value='بار حذف شده') + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs['total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs['total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, 2) if all_weight_loss > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 5, 6) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 + + +def entered_bars_for_kill_house_excel(request): + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + else: + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + + if 'search' in request.GET: + filtered_kill_reqs = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + filtered_kill_reqs = [] if len(filtered_kill_reqs) == 0 else filtered_kill_reqs + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + 'کشور مقصد', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + + # برای بالای هدر + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + create_header(worksheet, header_list2, 6, 4, height=21.8, color='green') + + create_header(worksheet, header_list, 9, 4, height=21.8) + + header_list2 = [ + 'ردیف', + 'نام محصول', + 'وزن خریدهای دولتی داخل استان(کیلوگرم)', + 'وزن خریدهای آزاد داخل استان(کیلوگرم)', + 'وزن خریدهای خارج استان(کیلوگرم)', + 'کل ورودی به انبار(کیلوگرم)', + 'کل فروش(کیلوگرم)', + 'مانده انبار(کیلوگرم)', + + ] + create_header(worksheet, header_list2, 6, 1, height=21.8, color='FF0000') + products = RolesProducts.objects.filter(kill_house=kill_house, trash=False) + q = 2 + w = 1 + for product in products: + value_header_list = [ + w, + product.name, + product.province_governmental_carcasses_weight, + product.province_free_carcasses_weight, + product.free_buying_carcasses_weight, + product.total_carcasses_weight, + product.real_allocated_weight, + product.total_remain_weight, + + ] + create_value(worksheet, value_header_list, q, 6) + q += 1 + w += 1 + + kill_house_name = '' + if filtered_kill_reqs.exists(): + kill_house_name = filtered_kill_reqs.first()['killhouse_user__name'] + excel_description(worksheet, 'A1', f'بارهای {kill_house_name} وارد شده به انبار (کشتار داخل استان)', size=11, + color='red', row2='E1') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='C3') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 7, 8, 20) + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + l = 7 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if weight_loss1 != 0 else 0 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + export_country, + + ] + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=40, different_value='بار حذف شده') + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs['total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs['total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, 2) if all_weight_loss > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 5, 6) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 + + +def kill_house_free_bar_entered_for_warehouse_excel(request): + filterset_class = KillHouseFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house__name', + 'poultry_name', + 'poultry_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'clearance_code', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + + ] + + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = request.GET.get('type') + date_type = request.GET.get('date_type') + bar_state = request.GET.get('bar_state') + kill_house_free_bar_info_list = [] + role = request.GET.get('role') + kill_houses = None + order_by_type = '-create_date' + + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if date_type: + if date_type == 'buy': + + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + order_by_type = '-date' + filters = { + 'date__date__gte': date1, + 'date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False + } + + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + + if type: + filters['buy_type'] = type + if type == 'live': + if bar_state: + if bar_state == 'entered': + filters['weight_of_carcasses__gt'] = 0 + else: + filters['weight_of_carcasses'] = 0 + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_house_free_bar_info + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_house_free_bar_info) + kill_house_free_bar_info_list = ps.filter() + kill_house_free_bar_info = [] if len( + kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_list + + excel_options = [ + 'ردیف', + 'کشتارگاه', + 'فروشنده', + 'نوع خرید', + 'استان/شهر', + 'تاریخ خرید', + 'کدقرنطینه', + 'تعداد قطعه زنده', + 'وزن زنده (کیلوگرم)', + 'تاریخ ورود به انبار', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + 'درصد افت', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد کل بار زنده', + 'حجم کل بار زنده', + 'وزن کل بار زنده', + 'تعداد کل بارهای وارد شده به انبار', + 'حجم کل بارهای زنده وارد شده به انبار', + 'وزن کل بارهای زنده وارد شده به انبار', + 'وزن لاشه وارد شده به انبار', + 'کل بار وارد نشده به انبار', + 'حجم کل بار وارد نشده به انبار', + 'وزن کل بار وارد نشده به انبار', + + ] + + for col_num, option in enumerate(header_list2, 4): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + type = 'زنده' if request.GET['type'] == 'live' else 'لاشه' + worksheet['B1'] = f'گزارش بار {type} خرید خارج از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name + worksheet['A2'] = f'استان {name}' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['A3'].font = Font(size=11) + worksheet['A2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.kill_house_vet_state == 'accepted': + state = 'تایید شده' + elif kill.kill_house_vet_state == 'pending': + state = 'درانتظار تایید' + else: + state = 'رد شده' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.create_date.day, + month=kill.create_date.month, + year=kill.create_date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + date_of_enter = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + list1 = [ + m, + kill.kill_house.name, + kill.poultry_name, + buy_type, + f'{kill.province} / {kill.city}', + str(date_of_buy), + kill.bar_clearance_code, + kill.quantity, + kill.live_weight, + str(date_of_enter), + kill.number_of_carcasses, + int(kill.weight_of_carcasses), + + kill.weight_loss, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + # if type == 'live': + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0) + + entered_quantity = entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + entered_live_weight = entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + entered_number_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + entered_weight_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0) + + not_entered_quantity = not_entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + not_entered_live_weight = not_entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + not_entered_number_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + not_entered_weight_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(kill_house_free_bar_info), + quantity, + live_weight, + + len(entered_bars), + + entered_quantity, + entered_live_weight, + weight_of_carcasses, + len(not_entered_bars), + not_entered_quantity, + not_entered_live_weight, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 4, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + quantity, + live_weight, + '', + number_of_carcasses, + weight_of_carcasses, + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if kill_house_free_bar_info.exists(): + if request.GET['role'] == 'KillHouse': + name = kill_house_free_bar_info.first().kill_house.name + response[ + 'Content-Disposition'] = f'attachment; filename=" مدیریت بار {type} کشتارگاه {name} خرید از استان.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بار {type} خرید از استان.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def kill_house_free_bar_carcasses_for_warehouse_excel(request): + filterset_class = KillHouseFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house__name', + 'poultry_name', + 'poultry_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'clearance_code', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + + ] + + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = request.GET.get('type') + date_type = request.GET.get('date_type') + bar_state = request.GET.get('bar_state') + kill_house_free_bar_info_list = [] + role = request.GET.get('role') + kill_houses = None + order_by_type = '-create_date' + + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if date_type: + if date_type == 'buy': + + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + order_by_type = '-date' + filters = { + 'date__date__gte': date1, + 'date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False + } + + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + + if type: + filters['buy_type'] = type + if type == 'live': + if bar_state: + if bar_state == 'entered': + filters['weight_of_carcasses__gt'] = 0 + else: + filters['weight_of_carcasses'] = 0 + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_house_free_bar_info + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_house_free_bar_info) + kill_house_free_bar_info_list = ps.filter() + kill_house_free_bar_info = [] if len( + kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_list + + excel_options = [ + 'ردیف', + 'کشتارگاه', + 'فروشنده', + 'نوع خرید', + 'استان/شهر', + 'تاریخ خرید', + 'کدقرنطینه', + + 'تاریخ ورود به انبار', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد کل بار', + 'حجم لاشه', + 'وزن لاشه', + + ] + + for col_num, option in enumerate(header_list2, 4): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + type = 'زنده' if request.GET['type'] == 'live' else 'لاشه' + worksheet['B1'] = f'گزارش بار {type} خرید خارج از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name + worksheet['A2'] = f'استان {name}' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['A3'].font = Font(size=11) + worksheet['A2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.kill_house_vet_state == 'accepted': + state = 'تایید شده' + elif kill.kill_house_vet_state == 'pending': + state = 'درانتظار تایید' + else: + state = 'رد شده' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.create_date.day, + month=kill.create_date.month, + year=kill.create_date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + date_of_enter = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + list1 = [ + m, + kill.kill_house.name, + kill.poultry_name, + buy_type, + f'{kill.province} / {kill.city}', + str(date_of_buy), + kill.bar_clearance_code, + str(date_of_enter), + kill.number_of_carcasses, + int(kill.weight_of_carcasses), + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + # if type == 'live': + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0) + + entered_quantity = entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + entered_live_weight = entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + entered_number_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + entered_weight_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0) + + not_entered_quantity = not_entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + not_entered_live_weight = not_entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + not_entered_number_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + not_entered_weight_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(kill_house_free_bar_info), + number_of_carcasses, + weight_of_carcasses, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 4, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + number_of_carcasses, + weight_of_carcasses, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if kill_house_free_bar_info.exists(): + if request.GET['role'] == 'KillHouse': + name = kill_house_free_bar_info.first().kill_house.name + response[ + 'Content-Disposition'] = f'attachment; filename=" مدیریت بار {type} کشتارگاه {name} خرید از استان.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بار {type} خرید از استان.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def steward_allocation_for_warehouse_excel(request): + filterset_class = StewardAllocationFilterSet + filterset_fields = [ + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'to_guilds__user__first_name', + 'to_guilds__user__last_name', + 'to_guilds__user__fullname', + 'to_guilds__user__mobile', + 'to_steward__user__first_name', + 'to_steward__user__last_name', + 'to_steward__user__fullname', + 'to_steward__user__mobile', + 'to_kill_house__kill_house_operator__user__first_name', + 'to_kill_house__kill_house_operator__user__last_name', + 'to_kill_house__kill_house_operator__user__fullname', + 'to_kill_house__kill_house_operator__user__mobile', + 'to_kill_house__name', + ] + + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter(Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('id') + else: + allocations = StewardAllocation.objects.filter(Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=allocations + ) + ).filter(): + ps = filterset_class(data=query, queryset=allocations) + allocations = ps.filter() + allocations = [] if len( + allocations) == 0 else allocations + + excel_options = [ + 'ردیف', + 'تاریخ ثبت', + 'نوع تخصیص', + 'خریدار', + 'تلفن خریدار', + 'نوع فروش', + 'قیمت هر کیلو(ریال)', + 'قیمت کل', + 'حجم تخصیصی', + 'وزن تخصیصی', + 'حجم تایید شده', + 'وزن تایید شده', + 'کد احراز', + 'وضعیت کد احراز', + 'وضعیت', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد تخصیصات', + 'قیمت کل', + 'حجم تخصیصی', + 'وزن تخصیصی', + 'حجم تایید شده', + 'وزن تایید شده', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + kill_house_name = '' + if allocations.exists(): + kill_house_name = allocations.first().kill_house.name + excel_description(worksheet, 'A1', f'تخصیصات داخل استان کشتارگاه {kill_house_name}', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if allocations: + for allocation in allocations: + l += 1 + + if allocation.allocation_type == 'killhouse_steward': + allocation_type = 'کشتارگاه به مباشر' + buyer_name = allocation.to_steward.guilds_name + buyer_mobile = allocation.to_steward.user.mobile + elif allocation.allocation_type == 'killhouse_guild': + allocation_type = 'کشتارگاه به صنف' + buyer_name = allocation.to_guilds.guilds_name + buyer_mobile = allocation.to_guilds.user.mobile + else: + allocation_type = '' + buyer_name = '' + buyer_mobile = '' + + if allocation.sell_type == 'exclusive': + sell_type = 'اختصاصی' + else: + sell_type = '' + system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + list1 = [ + m, + str(shamsi_date((allocation.date))), + allocation_type, + buyer_name, + buyer_mobile, + sell_type, + allocation.amount, + allocation.total_amount, + allocation.number_of_carcasses, + allocation.weight_of_carcasses, + allocation.receiver_real_number_of_carcasses, + allocation.receiver_real_weight_of_carcasses, + allocation.registration_code, + system_registration_code, + state, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + total_amount_allocations = allocations.aggregate( + total_quantity=Sum('total_amount')).get( + 'total_quantity') or 0 + number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_number_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(allocations), + total_amount_allocations, + number_of_carcasses_allocations, + weight_of_carcasses_allocations, + receiver_real_number_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + total_amount_allocations, + number_of_carcasses_allocations, + weight_of_carcasses_allocations, + receiver_real_number_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + + response[ + 'Content-Disposition'] = f'attachment; filename="تخصیصات صورت گرفته داخل استان کشتارگاه {kill_house_name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def kill_house_inventory_data(request): + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + sheet_names2 = [ + 'اطلاعات کلی', + 'بارهای در انتظار ورود به انبار', + 'بارهای وارد شده به انبار', + 'فروش به داخل استان', + 'فروش به خارج استان', + 'خریداران(خارج استان)', + 'بار زنده (خرید خارج استان)', + 'بار لاشه (خرید خارج استان)', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + for name in sheet_names2: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + if sheet_name == 'اطلاعات کلی': + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from1 = shamsi_date(date1) + from2 = shamsi_date(date2) + excel_description(worksheet, 'A7', + f'گزارش جامع انبار کشتارگاه {kill_house.name} از تاریخ {from1} تا تاریخ {from2}', + size=11, color='red', row2='C9') + else: + excel_description(worksheet, 'A7', f'گزارش جامع انبار کشتارگاه {kill_house.name}', + size=11, color='red', row2='C8') + excel_description(worksheet, 'D2', f'مدیریت انبار', + size=11, color='red', row2='G2') + header_list2 = [ + 'ردیف', + 'نام محصول', + 'وزن خریدهای دولتی داخل استان(کیلوگرم)', + 'وزن خریدهای آزاد داخل استان(کیلوگرم)', + 'وزن خریدهای خارج استان(کیلوگرم)', + 'کل ورودی به انبار(کیلوگرم)', + 'کل فروش(کیلوگرم)', + 'مانده انبار(کیلوگرم)', + + ] + create_header(worksheet, header_list2, 3, 3, height=21.8, width=20, color='FF0000', border_style='thin') + products = RolesProducts.objects.filter(kill_house=kill_house, trash=False) + q = 4 + w = 1 + for product in products: + value_header_list = [ + w, + product.name, + product.province_governmental_carcasses_weight, + product.province_free_carcasses_weight, + product.free_buying_carcasses_weight, + product.total_carcasses_weight, + product.real_allocated_weight, + product.total_remain_weight, + + ] + create_value(worksheet, value_header_list, q, 3, border_style='thin') + q += 1 + w += 1 + + excel_description(worksheet, 'D6', f'اطلاعات پخش', + size=11, color='red', row2='G6') + header_list2 = [ + 'فروش و توزیع داخل استان(کیلوگرم)', + 'فروش و توزیع خارج استان(کیلوگرم)', + + ] + create_header(worksheet, header_list2, 5, 7, height=21.8, width=20, color='C00000', border_style='thin') + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + steward_allocations = StewardAllocation.objects.filter(kill_house=kill_house, + receiver_state__in=('pending', 'accepted'), + calculate_status=True, trash=False) + steward_allocations_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + free_sales = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, + calculate_status=True) + free_sales_weight = free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + value_header_list = [ + steward_allocations_weight, + free_sales_weight, + + ] + create_value(worksheet, value_header_list, 8, 5, border_style='thin') + + excel_description(worksheet, 'D11', f'بارهای در انتظار ورود به انبار', + size=11, color='red', row2='G11') + header_list = [ + 'تعداد بار', + 'حجم بار', + 'وزن بار', + 'میانگین وزن ', + + 'تعداد بارهای تکمیل شده', + + ] + + # برای بالای هدر + # header_list2 = [ + # 'تعداد درخواست مرغداران', + # ' مجموع تعداد قطعه درخواست مرغداران', + # ' مجموع وزن درخواست مرغداران', + # + # ] + # create_header(worksheet, header_list2, 1, 12, height=21.8, color='green',border_style='thin') + + create_header(worksheet, header_list, 3, 12, height=21.8, border_style='thin') + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + else: + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + key = kill.get('key') + net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + all_weighte += weight + + value_header_list = [ + + len(filtered_kill_reqs), + + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, + 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + + len(bar_complete), + + ] + create_value(worksheet, value_header_list, 13, 3, border_style='thin') + + excel_description(worksheet, 'D15', f'بارهای وارد شده به انبار', + size=11, color='red', row2='G15') + header_list = [ + 'تعداد بارهای ایجاد شده', + + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + + ' افت در لحظه', + ' افت لاشه ورود به انبار', + + ] + + # برای بالای هدر + # header_list2 = [ + # 'تعداد درخواست مرغداران', + # ' مجموع تعداد قطعه درخواست مرغداران', + # ' مجموع وزن درخواست مرغداران', + # + # ] + # create_header(worksheet, header_list2, 1, 16, height=21.8, color='green', border_style='thin') + + create_header(worksheet, header_list, 3, 16, height=21.8, border_style='thin') + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + else: + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + 2) if all_state_ware_house_confirmation > 0 else 0 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + all_total_weight_loss = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + key = kill.get('key') + net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + all_weighte += weight + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if kill[ + 'accepted_real_weight'] != 0 else 0 + all_total_weight_loss += total_weight_loss + all_total_weight_loss = all_total_weight_loss / len(filtered_kill_reqs) if len( + filtered_kill_reqs) > 0 else 0 + value_header_list = [ + len(filtered_kill_reqs), + + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, + 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + + f'%{int(all_total_weight_loss)}', + f'%{all_weight_loss}', + + ] + create_value(worksheet, value_header_list, 17, 3, border_style='thin') + + excel_description(worksheet, 'D19', f'فروش به داخل استان', + size=11, color='red', row2='G19') + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter(Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('id') + else: + allocations = StewardAllocation.objects.filter(Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False).order_by('id') + + header_list2 = [ + 'تعداد تخصیصات', + 'قیمت کل', + 'حجم تخصیصی', + 'وزن تخصیصی', + 'حجم تایید شده', + 'وزن تایید شده', + + ] + create_header(worksheet, header_list2, 4, 20, height=21, width=16.01, border_style='thin') + total_amount_allocations = allocations.aggregate( + total_quantity=Sum('total_amount')).get( + 'total_quantity') or 0 + number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_number_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(allocations), + total_amount_allocations, + number_of_carcasses_allocations, + weight_of_carcasses_allocations, + receiver_real_number_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + + ] + create_value(worksheet, value_header_list2, 21, 4, border_style='thin') + + excel_description(worksheet, 'D23', f'فروش به خارج استان', + size=11, color='red', row2='G23') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() + buyers = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, + date__date__gte=date1, + date__date__lte=date2).order_by('-date') + else: + buyers = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, + ).order_by('-date') + + header_list = [ + 'تعداد کل فروش', + 'تعداد خریداران', + 'حجم لاشه(تقریبی)', + 'وزن لاشه(کیلوگرم)', + + ] + + create_header(worksheet, header_list, 4, 24, height=21, width=16.01, border_style='thin') + + total_quantity = buyers.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = buyers.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + len_buyers = [] + for buyer in buyers: + + if buyer.buyer_name not in len_buyers: + len_buyers.append(buyer.buyer_name) + value_list = [ + len(buyers), + len(len_buyers), + total_quantity, + total_weight, + ] + create_value(worksheet, value_list, 25, 4, border_style='thin') + + excel_description(worksheet, 'D27', f'بار زنده (خرید خارج استان)', + size=11, color='red', row2='G27') + + type = 'live' + kill_houses = None + + role = request.GET.get('role') + order_by_type = '-create_date' + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False + } + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + filters['buy_type'] = type + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters, calculate_status=True, + temporary_trash=False, + temporary_deleted=False).order_by( + order_by_type) + header_list2 = [ + 'تعداد کل بار زنده', + 'حجم کل بار زنده', + 'وزن کل بار زنده', + 'تعداد کل بارهای وارد شده به انبار', + 'حجم کل بارهای زنده وارد شده به انبار', + 'وزن کل بارهای زنده وارد شده به انبار', + 'وزن لاشه وارد شده به انبار', + 'کل بار وارد نشده به انبار', + 'حجم کل بار وارد نشده به انبار', + 'وزن کل بار وارد نشده به انبار', + + ] + create_header(worksheet, header_list2, 2, 28, height=21, width=16.01, border_style='thin') + + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0) + + entered_quantity = entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + entered_live_weight = entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + + not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0) + + not_entered_quantity = not_entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + not_entered_live_weight = not_entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(kill_house_free_bar_info), + quantity, + live_weight, + + len(entered_bars), + + entered_quantity, + entered_live_weight, + weight_of_carcasses, + len(not_entered_bars), + not_entered_quantity, + not_entered_live_weight, + + ] + create_value(worksheet, value_header_list2, 29, 2, border_style='thin') + + excel_description(worksheet, 'D31', f'بار لاشه (خرید خارج استان)', + size=11, color='red', row2='G31') + type = 'carcasses' + bar_state = 'entered' + kill_house_free_bar_info_list = [] + role = request.GET.get('role') + kill_houses = None + order_by_type = '-create_date' + + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False + } + + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + + if type: + filters['buy_type'] = type + if type == 'live': + if bar_state: + if bar_state == 'entered': + filters['weight_of_carcasses__gt'] = 0 + else: + filters['weight_of_carcasses'] = 0 + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters, calculate_status=True, + temporary_trash=False, + temporary_deleted=False).order_by( + order_by_type) + header_list2 = [ + 'تعداد کل بار', + 'حجم لاشه', + 'وزن لاشه', + + ] + create_header(worksheet, header_list2, 5, 32, height=21, width=16.01, border_style='thin') + + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0) + + value_header_list2 = [ + len(kill_house_free_bar_info), + number_of_carcasses, + weight_of_carcasses, + + ] + create_value(worksheet, value_header_list2, 33, 5, border_style='thin') + elif sheet_name == 'بارهای در انتظار ورود به انبار': + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + else: + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + + if 'search' in request.GET: + filtered_kill_reqs = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + filtered_kill_reqs = [] if len(filtered_kill_reqs) == 0 else filtered_kill_reqs + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + 'کشور مقصد', + + ] + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + + # برای بالای هدر + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + create_header(worksheet, header_list2, 6, 4, height=21.8, color='green') + + create_header(worksheet, header_list, 9, 4, height=21.8) + + header_list2 = [ + 'ردیف', + 'نام محصول', + 'وزن خریدهای دولتی داخل استان(کیلوگرم)', + 'وزن خریدهای آزاد داخل استان(کیلوگرم)', + 'وزن خریدهای خارج استان(کیلوگرم)', + 'کل ورودی به انبار(کیلوگرم)', + 'کل فروش(کیلوگرم)', + 'مانده انبار(کیلوگرم)', + + ] + create_header(worksheet, header_list2, 6, 1, height=21.8, color='FF0000') + products = RolesProducts.objects.filter(kill_house=kill_house, trash=False) + q = 2 + w = 1 + for product in products: + value_header_list = [ + w, + product.name, + product.province_governmental_carcasses_weight, + product.province_free_carcasses_weight, + product.free_buying_carcasses_weight, + product.total_carcasses_weight, + product.real_allocated_weight, + product.total_remain_weight, + + ] + create_value(worksheet, value_header_list, q, 6) + q += 1 + w += 1 + + kill_house_name = '' + if filtered_kill_reqs.exists(): + kill_house_name = filtered_kill_reqs.first()['killhouse_user__name'] + excel_description(worksheet, 'A1', f'بارهای {kill_house_name} در انتظار ورود به انبار (کشتار داخل استان)', + size=11, color='red', row2='E1') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='C3') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 7, 8, 20) + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + l = 7 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, + day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if weight_loss1 != 0 else 0 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + export_country, + + ] + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=40, different_value='بار حذف شده') + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + 2) if all_weight_loss > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, + 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 5, 6) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_name == 'بارهای وارد شده به انبار': + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + else: + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + + if 'search' in request.GET: + filtered_kill_reqs = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + filtered_kill_reqs = [] if len(filtered_kill_reqs) == 0 else filtered_kill_reqs + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + 'کشور مقصد', + + ] + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + + # برای بالای هدر + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + create_header(worksheet, header_list2, 6, 4, height=21.8, color='green') + + create_header(worksheet, header_list, 9, 4, height=21.8) + + header_list2 = [ + 'ردیف', + 'نام محصول', + 'وزن خریدهای دولتی داخل استان(کیلوگرم)', + 'وزن خریدهای آزاد داخل استان(کیلوگرم)', + 'وزن خریدهای خارج استان(کیلوگرم)', + 'کل ورودی به انبار(کیلوگرم)', + 'کل فروش(کیلوگرم)', + 'مانده انبار(کیلوگرم)', + + ] + create_header(worksheet, header_list2, 6, 1, height=21.8, color='FF0000') + products = RolesProducts.objects.filter(kill_house=kill_house, trash=False) + q = 2 + w = 1 + for product in products: + value_header_list = [ + w, + product.name, + product.province_governmental_carcasses_weight, + product.province_free_carcasses_weight, + product.free_buying_carcasses_weight, + product.total_carcasses_weight, + product.real_allocated_weight, + product.total_remain_weight, + + ] + create_value(worksheet, value_header_list, q, 6) + q += 1 + w += 1 + + kill_house_name = '' + if filtered_kill_reqs.exists(): + kill_house_name = filtered_kill_reqs.first()['killhouse_user__name'] + excel_description(worksheet, 'A1', f'بارهای {kill_house_name} وارد شده به انبار (کشتار داخل استان)', + size=11, color='red', row2='E1') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='C3') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 7, 8, 20) + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + l = 7 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, + day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if kill[ + 'accepted_real_weight'] != 0 else 0 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + export_country, + + ] + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=40, different_value='بار حذف شده') + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + 2) if all_state_ware_house_confirmation > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, + 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 5, 6) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_name == 'فروش به داخل استان': + filterset_class = StewardAllocationFilterSet + filterset_fields = [ + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'to_guilds__user__first_name', + 'to_guilds__user__last_name', + 'to_guilds__user__fullname', + 'to_guilds__user__mobile', + 'to_steward__user__first_name', + 'to_steward__user__last_name', + 'to_steward__user__fullname', + 'to_steward__user__mobile', + 'to_kill_house__kill_house_operator__user__first_name', + 'to_kill_house__kill_house_operator__user__last_name', + 'to_kill_house__kill_house_operator__user__fullname', + 'to_kill_house__kill_house_operator__user__mobile', + 'to_kill_house__name', + ] + + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter(Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('id') + else: + allocations = StewardAllocation.objects.filter(Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=allocations + ) + ).filter(): + ps = filterset_class(data=query, queryset=allocations) + allocations = ps.filter() + allocations = [] if len( + allocations) == 0 else allocations + + excel_options = [ + 'ردیف', + 'تاریخ ثبت', + 'نوع تخصیص', + 'خریدار', + 'تلفن خریدار', + 'شماره واسط خریدار', + 'نوع فروش', + 'قیمت هر کیلو(ریال)', + 'قیمت کل', + 'حجم تخصیصی', + 'وزن تخصیصی', + 'حجم تایید شده', + 'وزن تایید شده', + 'کد احراز', + 'وضعیت کد احراز', + 'سهمیه', + 'نوع فروش', + 'وضعیت', + + ] + + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد تخصیصات', + 'قیمت کل', + 'حجم تخصیصی', + 'وزن تخصیصی', + 'حجم تایید شده', + 'وزن تایید شده', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + kill_house_name = '' + if allocations.exists(): + kill_house_name = allocations.first().kill_house.name + excel_description(worksheet, 'A1', f'تخصیصات داخل استان کشتارگاه {kill_house_name}', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if allocations: + for allocation in allocations: + l += 1 + + if allocation.allocation_type == 'killhouse_steward': + allocation_type = 'کشتارگاه به مباشر' + buyer_name = allocation.to_steward.guilds_name if allocation.to_steward else '-' + buyer_mobile = allocation.to_steward.user.mobile if allocation.to_steward else '-' + elif allocation.allocation_type == 'killhouse_guild': + allocation_type = 'کشتارگاه به صنف' + buyer_name = allocation.to_guilds.guilds_name if allocation.to_guilds else '-' + buyer_mobile = allocation.to_guilds.user.mobile if allocation.to_guilds else '-' + else: + allocation_type = '' + buyer_name = '' + buyer_mobile = '' + + if allocation.sell_type == 'exclusive': + sell_type = 'اختصاصی' + else: + sell_type = '' + system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + list1 = [ + m, + str(shamsi_date(allocation.date, in_value=True)), + allocation_type, + buyer_name, + buyer_mobile, + allocation.interface_number or '-', + sell_type, + allocation.amount, + allocation.total_amount, + allocation.number_of_carcasses, + allocation.weight_of_carcasses, + allocation.receiver_real_number_of_carcasses, + allocation.receiver_real_weight_of_carcasses, + str(allocation.logged_registration_code or '-'), + system_registration_code, + "دولتی" if allocation.quota == 'governmental' else 'آزاد', + "دولتی" if allocation.approved_price_status == True else 'آزاد', + state, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + total_amount_allocations = allocations.aggregate( + total_quantity=Sum('total_amount')).get( + 'total_quantity') or 0 + number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_number_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(allocations), + total_amount_allocations, + number_of_carcasses_allocations, + weight_of_carcasses_allocations, + receiver_real_number_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_amount_allocations, + number_of_carcasses_allocations, + weight_of_carcasses_allocations, + receiver_real_number_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'فروش به خارج استان': + + filterset_class = OutProvinceCarcassesBuyerFilterSet + filterset_fields = [ + 'mobile', + 'first_name', + 'last_name', + 'fullname', + 'unit_name', + + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() + buyers = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, + date__date__gte=date1, + date__date__lte=date2).order_by('-date') + else: + buyers = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, + ).order_by('-date') + len_buyers = [] + + value = request.GET.get('value') + search = request.GET.get('filter') + if value and search == 'search': + if value != 'undefined' and value.strip(): + buyers = buyers.filter( + build_query(filterset_class, value) + ) + + excel_options = [ + 'ردیف', + 'نام کشتارگاه', + 'موبایل کشتارگاه', + 'تاریخ', + 'خریدار', + 'تلفن خریدار', + 'نام واحد', + 'استان', + 'شهر', + 'حجم لاشه(تقریبی)', + 'وزن لاشه(کیلوگرم)', + + ] + + header_list = [ + 'تعداد کل فروش', + 'تعداد خریداران', + 'حجم لاشه(تقریبی)', + 'وزن لاشه(کیلوگرم)', + + ] + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + create_header(worksheet, header_list, 3, 2, height=21, width=16.01) + + excel_description(worksheet, 'A1', f'فروش لاشه خارج استان کشتارگاه {kill_house.name}', color='red', + row2='B1') + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + from_date2 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ {from_date1} تا {from_date2}', color='red', row2='B3') + + if kill_house: + province = kill_house.kill_house_operator.user.province.name + excel_description(worksheet, 'A2', f'استان {province}', color='red', row2='B2') + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=19, width=21.01) + + l = 5 + m = 1 + + for buyer in buyers: + date = jdatetime.date.fromgregorian( + day=buyer.date.day, + month=buyer.date.month, + year=buyer.date.year + ) + if buyer.buyer_name not in len_buyers: + len_buyers.append(buyer.buyer_name) + list1 = [ + m, + buyer.kill_house.name, + buyer.kill_house.kill_house_operator.user.mobile, + str(date), + buyer.buyer_name, + buyer.buyer_mobile, + buyer.buyer_name, + buyer.province, + buyer.city, + buyer.number_of_carcasses, + buyer.weight_of_carcasses, + + ] + create_value(worksheet, list1, l + 1, 1) + + m += 1 + l += 1 + + total_quantity = buyers.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = buyers.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + value_list = [ + len(buyers), + len(len_buyers), + total_quantity, + total_weight, + ] + create_value(worksheet, value_list, 3, 3) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + total_quantity, + total_weight, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_name == 'خریداران(خارج استان)': + out_buyers = OutProvinceCarcassesBuyer.objects.filter(Kill_house=kill_house, trash=False).order_by( + 'id') + excel_options = [ + 'ردیف', + 'نام خریدار', + 'موبایل خریدار', + 'نام واحد', + 'استان', + 'شهر', + 'تعداد درخواست ها', + 'حجم تقریبی(قطعه)', + 'وزن(کلوگرم)', + + ] + + excel_description(worksheet, 'A1', f'خریداران کشتارگاه {kill_house.name}', color='red', + row2='B1') + + if kill_house: + province = kill_house.kill_house_operator.user.province.name + excel_description(worksheet, 'A2', f'استان {province}', color='red', row2='B2') + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=19, width=21.01) + + l = 5 + m = 1 + + for buyer in out_buyers: + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, buyer=buyer) + + total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + list1 = [ + m, + buyer.buyer.fullname, + buyer.buyer.mobile, + buyer.buyer.unit_name, + buyer.buyer.province, + + buyer.buyer.city, + len(free_sales), + total_quantity, + total_weight, + + ] + create_value(worksheet, list1, l + 1, 1) + + m += 1 + l += 1 + elif sheet_name == 'بار زنده (خرید خارج استان)': + filterset_class = KillHouseFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house__name', + 'poultry_name', + 'poultry_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'clearance_code', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + + ] + + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = 'live' + kill_houses = None + + role = request.GET.get('role') + order_by_type = '-create_date' + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False + } + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + filters['buy_type'] = type + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters, calculate_status=True, + temporary_trash=False, + temporary_deleted=False).order_by( + order_by_type) + + excel_options = [ + 'ردیف', + 'وضعیت', + 'کشتارگاه', + 'فروشنده', + 'نوع خرید', + 'استان/شهر', + 'تاریخ خرید', + 'کدقرنطینه', + 'تعداد قطعه زنده', + 'وزن زنده (کیلوگرم)', + 'تاریخ ورود به انبار', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + 'درصد افت', + + ] + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد کل بار زنده', + 'حجم کل بار زنده', + 'وزن کل بار زنده', + 'تعداد کل بارهای وارد شده به انبار', + 'حجم کل بارهای زنده وارد شده به انبار', + 'وزن کل بارهای زنده وارد شده به انبار', + 'وزن لاشه وارد شده به انبار', + 'کل بار وارد نشده به انبار', + 'حجم کل بار وارد نشده به انبار', + 'وزن کل بار وارد نشده به انبار', + + ] + + for col_num, option in enumerate(header_list2, 4): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + worksheet['B1'] = f'گزارش بار زنده خرید خارج از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name + worksheet['A2'] = f'استان {name}' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['A3'].font = Font(size=11) + worksheet['A2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.weight_of_carcasses > 0: + state = 'ورود به انبار' + else: + state = 'در انظار ورود به انبار' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.create_date.day, + month=kill.create_date.month, + year=kill.create_date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + date_of_enter = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + list1 = [ + m, + state, + kill.kill_house.name, + kill.poultry_name, + buy_type, + f'{kill.province} / {kill.city}', + str(date_of_buy), + kill.bar_clearance_code, + kill.quantity, + kill.live_weight, + str(date_of_enter), + kill.number_of_carcasses, + int(kill.weight_of_carcasses), + + kill.weight_loss, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + # if type == 'live': + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0) + + entered_quantity = entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + entered_live_weight = entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + entered_number_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + entered_weight_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0) + + not_entered_quantity = not_entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + not_entered_live_weight = not_entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + not_entered_number_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + not_entered_weight_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(kill_house_free_bar_info), + quantity, + live_weight, + + len(entered_bars), + + entered_quantity, + entered_live_weight, + weight_of_carcasses, + len(not_entered_bars), + not_entered_quantity, + not_entered_live_weight, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 4, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + quantity, + live_weight, + '', + number_of_carcasses, + weight_of_carcasses, + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'بار لاشه (خرید خارج استان)': + filterset_class = KillHouseFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house__name', + 'poultry_name', + 'poultry_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'clearance_code', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + + ] + + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = 'carcasses' + bar_state = 'entered' + kill_house_free_bar_info_list = [] + role = request.GET.get('role') + kill_houses = None + order_by_type = '-create_date' + + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False + } + + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + + if type: + filters['buy_type'] = type + if type == 'live': + if bar_state: + if bar_state == 'entered': + filters['weight_of_carcasses__gt'] = 0 + else: + filters['weight_of_carcasses'] = 0 + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters, calculate_status=True, + temporary_trash=False, + temporary_deleted=False).order_by( + order_by_type) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_house_free_bar_info + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_house_free_bar_info) + kill_house_free_bar_info_list = ps.filter() + kill_house_free_bar_info = [] if len( + kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_list + + excel_options = [ + 'ردیف', + 'کشتارگاه', + 'فروشنده', + 'نوع خرید', + 'استان/شهر', + 'تاریخ خرید', + 'کدقرنطینه', + + 'تاریخ ورود به انبار', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + + ] + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد کل بار', + 'حجم لاشه', + 'وزن لاشه', + + ] + + for col_num, option in enumerate(header_list2, 4): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + worksheet['B1'] = f'گزارش بار لاشه خرید خارج از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name + worksheet['A2'] = f'استان {name}' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['A3'].font = Font(size=11) + worksheet['A2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.kill_house_vet_state == 'accepted': + state = 'تایید شده' + elif kill.kill_house_vet_state == 'pending': + state = 'درانتظار تایید' + else: + state = 'رد شده' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.create_date.day, + month=kill.create_date.month, + year=kill.create_date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + date_of_enter = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + list1 = [ + m, + kill.kill_house.name, + kill.poultry_name, + buy_type, + f'{kill.province} / {kill.city}', + str(date_of_buy), + kill.bar_clearance_code, + str(date_of_enter), + kill.number_of_carcasses, + int(kill.weight_of_carcasses), + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + # if type == 'live': + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0) + + entered_quantity = entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + entered_live_weight = entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + entered_number_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + entered_weight_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0) + + not_entered_quantity = not_entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + not_entered_live_weight = not_entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + not_entered_number_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + not_entered_weight_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(kill_house_free_bar_info), + number_of_carcasses, + weight_of_carcasses, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 4, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + number_of_carcasses, + weight_of_carcasses, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="گزارش انبار کشتارگاه {kill_house.name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def all_kill_house_inventory_data(request): + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id').annotate( + allocation_count=Count( + 'kill_house_steward_allocation', + filter=Q(kill_house_steward_allocation__receiver_state__in=['pending', 'accepted']) + ) + ).order_by( + '-allocation_count' + ) + sheet_name = 'اطلاعات کلی' + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + worksheet = workbook.create_sheet(sheet_name) + if sheet_name == 'اطلاعات کلی': + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + # + + serializer = KillHouseForProvinceWareHouseDashboardSerializer(kill_houses, many=True, + context={'request': request}).data + header_list2 = [ + 'ردیف', + 'خریدار', + 'تلفن خریدار', + 'ماهیت', + 'شهر', + 'مانده انبار فعلی', + 'کل وزن ورودی به انبار', + 'کل وزن فروش رفته', + 'حجم تخصیصات بدون ماشین', + 'تعداد بار درون استان', + 'حجم بار درون استان', + 'وزن بار درون استان', + 'تعداد بار زنده خارج استان', + 'حجم بار زنده خارج استان', + 'وزن بار زنده خارج استان', + 'تعداد بار لاشه خارج استان', + 'حجم بار لاشه خارج استان', + 'وزن بار لاشه خارج استان', + 'تعداد کل بارها', + 'حجم کل بارها', + 'وزن کل بارها', + 'تعداد بار وارد شده به انبار', + 'تعداد بار وارد نشده به انبار', + 'حجم بار وارد نشده به انبار', + 'وزن بار وارد نشده به انبار', + 'وزن فروش داخل استان', + 'وزن فروش خارج استان', + + ] + create_header(worksheet, header_list2, 1, 12, height=21.8, width=20, border_style='thin') + excel_description(worksheet, 'A2', f'اطلاعات جامع انبار', + size=11, color='red', row2='B4') + if serializer: + l = 13 + m = 1 + + for data in serializer: + list1 = [ + m, + data.get('name', ''), + data.get('kill_house_operator', {}).get('user', {}).get('mobile', ''), + 'کشتارگاه' if not data.get('killer', False) else 'کشتارکن', + data.get('kill_house_operator', {}).get('user', {}).get('city', {}).get('name', ''), + data.get('ware_house_info', {}).get('product_remain_weight', 0), + data.get('ware_house_info', {}).get('warehouse_total_entered_carcasses_weight', 0), + data.get('ware_house_info', {}).get('total_sell', 0), + data.get('ware_house_info', {}).get('province_kill_requests_quantity', 0), + data.get('ware_house_info', {}).get('total_province_bars', 0), + data.get('ware_house_info', {}).get('total_province_bars_quantity', 0), + data.get('ware_house_info', {}).get('total_province_bars_weight', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_bar', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_live_bar_quantity', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_live_bar_weight', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_carcasses_bar', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_bar_carcasses', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_bar_carcasses_weight', 0), + data.get('ware_house_info', {}).get('total_bars', 0), + data.get('ware_house_info', {}).get('warehouse_total_quantity', 0), + data.get('ware_house_info', {}).get('warehouse_total_weight', 0), + int(data.get('ware_house_info', {}).get('warehouse_total_entered_bars', 0)), + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars', 0), + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_quantity', 0), + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_weight', 0), + data.get('ware_house_info', {}).get('total_kill_house_allocations_weight', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_sale__bar_carcasses_weight', 0), + + ] + + create_value(worksheet, list1, l, 1, border_style='thin', m=m) + m += 1 + l += 1 + header_list2 = [ + 'حجم کل بارها', + 'وزن کل بارها', + 'وزن وارد شده به انبار', + 'وزن توزیع شده داخل استان', + 'وزن توزیع شده خارج استان', + 'مانده انبار', + + ] + create_header(worksheet, header_list2, 3, 3, height=21.8, width=20, color='C00000', border_style='thin') + products = RolesProducts.objects.filter(kill_house__in=kill_houses, trash=False) + product_remain_weight = products.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + shamsi_date1 = shamsi_date(date1) + shamsi_date2 = shamsi_date(date2) + excel_description(worksheet, 'A2', + f' اطلاعات جامع انبار از تاریخ {shamsi_date1} تا تاریخ {shamsi_date2}', + size=11, color='red', row2='B4') + + else: + excel_description(worksheet, 'A2', f'اطلاعات جامع انبار', + size=11, color='red', row2='B4') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False, + trash=False, calculate_status=True) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(Q(date__date__gte=date1, + date__date__lte=date2, + buy_type='carcass') | Q( + create_date__date__gte=date1, create_date__date__lte=date2, buy_type='live'), + kill_house__in=kill_houses, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + date__date__gte=date1, + date__date__lte=date2, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, trash=False, + receiver_state__in=('pending', 'accepted'), + date__date__gte=date1, + date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True) + else: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses), + temporary_trash=False, + temporary_deleted=False, + trash=False, calculate_status=True) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter( + kill_house__in=kill_houses, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, trash=False, + receiver_state__in=('pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True) + total_kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + total_kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + total_entered_kill_house_requests_carcasses_weight = \ + kill_house_requests.filter(ware_house_confirmation=True).aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + kill_house_free_bar_informations_live = kill_house_free_bar_informations.filter(buy_type='live') + kill_house_free_bar_informations_carcasses = kill_house_free_bar_informations.filter(buy_type='carcass') + total_kill_house_free_bar_quantity = \ + kill_house_free_bar_informations_live.aggregate(total=Sum('quantity'))['total'] or 0 + total_kill_house_free_bar_weight = \ + kill_house_free_bar_informations_live.aggregate(total=Sum('live_weight'))['total'] or 0 + total_kill_house_free_bar_carcasses = \ + kill_house_free_bar_informations_carcasses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_kill_house_free_bar_carcasses_weight = \ + kill_house_free_bar_informations_carcasses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_entered_kill_house_free_bar_carcasses_weight = \ + kill_house_free_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_free_sale__bar_carcasses_weight = \ + kill_house_free_Sale_bar_informations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_allocations_weight = \ + kill_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + warehouse_total_weight = total_kill_house_requests_weight + total_kill_house_free_bar_weight + total_kill_house_free_bar_carcasses_weight + warehouse_total_entered_carcasses_weight = total_entered_kill_house_requests_carcasses_weight + total_entered_kill_house_free_bar_carcasses_weight + + result = { + "product_remain_weight": int(warehouse_total_entered_carcasses_weight - ( + total_kill_house_allocations_weight + total_kill_house_free_sale__bar_carcasses_weight)), + "warehouse_total_quantity": int( + total_kill_house_requests_quantity + total_kill_house_free_bar_quantity + total_kill_house_free_bar_carcasses), + "warehouse_total_weight": int(warehouse_total_weight), + "warehouse_total_entered_carcasses_weight": int(warehouse_total_entered_carcasses_weight), + "total_kill_house_allocations_weight": int(total_kill_house_allocations_weight), + "total_kill_house_free_sale_bar_carcasses_weight": int( + total_kill_house_free_sale__bar_carcasses_weight), + + } + + value_header_list = [ + result['warehouse_total_quantity'], # حجم کل بارها + result['warehouse_total_weight'], # وزن کل بارها + result['warehouse_total_entered_carcasses_weight'], # وزن وارد شده به انبار + result['total_kill_house_allocations_weight'], # وزن توزیع شده داخل استان + result['total_kill_house_free_sale_bar_carcasses_weight'], + result['product_remain_weight'] # مانده انبار + ] + create_value(worksheet, value_header_list, 4, 3, border_style='thin') + + # محاسبه مجموع هر یک از فیلدها + sum_product_remain_weight = sum( + data.get('ware_house_info', {}).get('product_remain_weight', 0) for data in serializer) + sum_previous_product_remain_weight = sum( + data.get('ware_house_info', {}).get('previous_product_remain_weight', 0) for data in serializer) + sum_province_kill_requests_quantity = sum( + data.get('ware_house_info', {}).get('province_kill_requests_quantity', 0) for data in serializer) + sum_total_province_bars = sum( + data.get('ware_house_info', {}).get('total_province_bars', 0) for data in serializer) + sum_total_province_bars_quantity = sum( + data.get('ware_house_info', {}).get('total_province_bars_quantity', 0) for data in serializer) + sum_total_province_bars_weight = sum( + data.get('ware_house_info', {}).get('total_province_bars_weight', 0) for data in serializer) + sum_total_kill_house_free_bar = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_bar', 0) for data in serializer) + sum_total_kill_house_free_live_bar_quantity = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_live_bar_quantity', 0) for data in + serializer) + sum_total_kill_house_free_live_bar_weight = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_live_bar_weight', 0) for data in serializer) + sum_total_kill_house_free_carcasses_bar = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_carcasses_bar', 0) for data in serializer) + sum_total_kill_house_free_bar_carcasses = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_bar_carcasses', 0) for data in serializer) + sum_total_kill_house_free_bar_carcasses_weight = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_bar_carcasses_weight', 0) for data in + serializer) + sum_total_bars = sum(data.get('ware_house_info', {}).get('total_bars', 0) for data in serializer) + sum_warehouse_total_quantity = sum( + data.get('ware_house_info', {}).get('warehouse_total_quantity', 0) for data in serializer) + sum_warehouse_total_weight = sum( + data.get('ware_house_info', {}).get('warehouse_total_weight', 0) for data in serializer) + sum_warehouse_total_entered_bars = sum( + int(data.get('ware_house_info', {}).get('warehouse_total_entered_bars', 0)) for data in serializer) + sum_warehouse_total_entered_carcasses_weight = sum( + data.get('ware_house_info', {}).get('warehouse_total_entered_carcasses_weight', 0) for data in + serializer) + sum_warehouse_total_not_entered_bars = sum( + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars', 0) for data in serializer) + sum_warehouse_total_not_entered_bars_quantity = sum( + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_quantity', 0) for data in + serializer) + sum_warehouse_total_not_entered_bars_weight = sum( + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_weight', 0) for data in + serializer) + sum_total_kill_house_allocations_weight = sum( + data.get('ware_house_info', {}).get('total_kill_house_allocations_weight', 0) for data in serializer) + sum_total_kill_house_free_sale__bar_carcasses_weight = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_sale__bar_carcasses_weight', 0) for data in + serializer) + sum_total_sell = sum( + data.get('ware_house_info', {}).get('total_sell', 0) for data in + serializer) + sum_warehouse_total_entered_bars = sum( + data.get('ware_house_info', {}).get('warehouse_total_entered_bars', 0) for data in + serializer) + + # ایجاد لیست نهایی برای ردیف مجموع + summary_list = [ + 'جمع کل==>', + '', + '', + '', + '', + sum_product_remain_weight, + sum_warehouse_total_entered_bars, + sum_total_sell, + sum_province_kill_requests_quantity, + sum_total_province_bars, + sum_total_province_bars_quantity, + sum_total_province_bars_weight, + sum_total_kill_house_free_bar, + sum_total_kill_house_free_live_bar_quantity, + sum_total_kill_house_free_live_bar_weight, + sum_total_kill_house_free_carcasses_bar, + sum_total_kill_house_free_bar_carcasses, + sum_total_kill_house_free_bar_carcasses_weight, + sum_total_bars, + sum_warehouse_total_quantity, + sum_warehouse_total_weight, + sum_warehouse_total_entered_bars, + sum_warehouse_total_not_entered_bars, + sum_warehouse_total_not_entered_bars_quantity, + sum_warehouse_total_not_entered_bars_weight, + sum_total_kill_house_allocations_weight, + sum_total_kill_house_free_sale__bar_carcasses_weight + ] + + # اضافه کردن ردیف مجموع به اکسل + create_value(worksheet, summary_list, l + 1, 1, color='green') + + # for kill_house in kill_houses: + # sheet_name = kill_house.name + # worksheet = workbook.create_sheet(sheet_name) + # worksheet.sheet_view.rightToLeft = True + # worksheet.insert_rows(1) + # + # + # if 'date1' in request.GET: + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # from1 = shamsi_date(date1) + # from2 = shamsi_date(date2) + # excel_description(worksheet, 'A7', + # f'گزارش جامع انبار کشتارگاه {kill_house.name} از تاریخ {from1} تا تاریخ {from2}', + # size=11, color='red', row2='C9') + # else: + # excel_description(worksheet, 'A7', f'گزارش جامع انبار کشتارگاه {kill_house.name}', + # size=11, color='red', row2='C8') + # + # excel_description(worksheet, 'D2', f'مدیریت انبار', + # size=11, color='red', row2='G2') + # header_list2 = [ + # 'ردیف', + # 'نام محصول', + # 'وزن خریدهای دولتی داخل استان(کیلوگرم)', + # 'وزن خریدهای آزاد داخل استان(کیلوگرم)', + # 'وزن خریدهای خارج استان(کیلوگرم)', + # 'کل ورودی به انبار(کیلوگرم)', + # 'کل فروش(کیلوگرم)', + # 'مانده انبار(کیلوگرم)', + # + # ] + # create_header(worksheet, header_list2, 3, 3, height=21.8, width=20, color='FF0000', border_style='thin') + # products = RolesProducts.objects.filter(kill_house=kill_house, trash=False) + # q = 4 + # w = 1 + # for product in products: + # value_header_list = [ + # w, + # product.name, + # product.province_governmental_carcasses_weight, + # product.province_free_carcasses_weight, + # product.free_buying_carcasses_weight, + # product.total_carcasses_weight, + # product.real_allocated_weight, + # product.total_remain_weight, + # + # ] + # create_value(worksheet, value_header_list, q, 3, border_style='thin') + # q += 1 + # w += 1 + # + # excel_description(worksheet, 'D6', f'اطلاعات پخش', + # size=11, color='red', row2='G6') + # header_list2 = [ + # 'فروش و توزیع داخل استان(کیلوگرم)', + # 'فروش و توزیع خارج استان(کیلوگرم)', + # + # ] + # create_header(worksheet, header_list2, 5, 7, height=21.8, width=20, color='C00000', border_style='thin') + # + # steward_allocations = StewardAllocation.objects.filter(kill_house=kill_house, + # receiver_state__in=('pending', 'accepted'), + # calculate_status=True, trash=False) + # steward_allocations_weight = \ + # steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + # + # free_sales = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, + # temporary_trash=False, + # temporary_deleted=False, + # calculate_status=True) + # free_sales_weight = free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + # value_header_list = [ + # steward_allocations_weight, + # free_sales_weight, + # + # ] + # create_value(worksheet, value_header_list, 8, 5, border_style='thin') + # + # excel_description(worksheet, 'D11', f'بارهای در انتظار ورود به انبار', + # size=11, color='red', row2='G11') + # data = KillHouseForProvinceWareHouseDashboardSerializer(kill_house, context={'request': request}).data + # + # header_list = [ + # 'تعداد بار', + # 'حجم بار', + # 'وزن بار', + # 'میانگین وزن ', + # + # ] + # + # # برای بالای هدر + # # header_list2 = [ + # # 'تعداد درخواست مرغداران', + # # ' مجموع تعداد قطعه درخواست مرغداران', + # # ' مجموع وزن درخواست مرغداران', + # # + # # ] + # # create_header(worksheet, header_list2, 1, 12, height=21.8, color='green',border_style='thin') + # + # create_header(worksheet, header_list, 3, 12, height=21.8, border_style='thin') + # if 'date1' in request.GET and request.GET['date1']: + # + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # + # filtered_kill_reqs = KillHouseRequest.objects.filter( + # Q(killhouse_user=kill_house) | Q(killer=kill_house), + # kill_request__recive_date__date__gte=date1, + # kill_request__recive_date__date__lte=date2, + # ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + # '-kill_request__recive_date').order_by( + # '-create_date').select_related( + # 'killhouse_user', 'province_request__poultry_request__poultry__user', + # 'province_request__poultry_request', + # 'province_request__poultry_request__poultry', 'add_car__driver', + # 'killhouse_user__system_address__city', + # 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + # 'kill_request__export_country', + # 'province_request__poultry_request__direct_buying', + # 'province_request__poultry_request__export', + # 'province_request__poultry_request__freezing', + # 'document_status', + # 'ware_house_accepted_real_quantity', + # 'ware_house_accepted_real_weight', 'weight_loss', 'message', + # 'province_request__poultry_request__freezing', + # 'province_request__poultry_request', 'traffic_code', + # 'assignment_state_archive', + # 'province_request__poultry_request__hatching__chicken_age', + # 'killhouse_user__kill_house_operator__user__province__name', + # 'killhouse_user', + # 'killhouse_user__name', + # 'province_request__poultry_request__amount', + # 'killhouse_user__kill_house_operator__user__mobile', + # 'killhouse_user__system_address__city__name', + # 'killhouse_user__killer', + # 'kill_request__slaughter_house', + # 'kill_request__slaughter_house__name', + # 'province_request__poultry_request__poultry', + # 'province_request__poultry_request__order_code', + # 'province_request__poultry_request__chicken_breed', + # 'province_request__poultry_request__poultry__user__city__name', + # 'province_request__poultry_request__poultry__unit_name', + # 'province_request__poultry_request__poultry__user__mobile', + # 'province_request__poultry_request__poultry__user__fullname', + # 'province_request__poultry_request__send_date', + # 'province_kill_request__province_request__poultry_request__Index_weight', + # 'add_car__driver__driver_name', + # 'add_car__driver__driver_mobile', + # 'add_car__driver__type_car', + # 'add_car__driver__health_code', + # 'key', + # 'clearance_code', + # 'quantity', + # 'bar_code', + # 'accepted_real_weight', + # 'accepted_real_quantity', + # 'vet_state', 'vet_accepted_real_quantity', + # 'vet_accepted_real_weight', 'quarantine_quantity', + # 'province_kill_request__province_request__poultry_request__free_sale_in_province', + # 'province_kill_request__province_request__poultry_request__union', + # 'province_kill_request__province_request__poultry_request__direct_buying', + # 'quarantine_code_state', + # 'province_request__poultry_request__send_date', + # 'province_request__poultry_request__hatching__date', + # 'killer__kill_house_operator__user__mobile', + # 'province_kill_request__province_request__poultry_request__out', + # 'killer__name', + # 'killhouse_user__type', 'killer', 'bar_document_status', + # 'bar_document_status__title').values( + # 'province_request__poultry_request__poultry__user__fullname', + # 'province_kill_request__kill_house_price', + # 'kill_request__export_country', + # 'province_request__poultry_request__direct_buying', + # 'province_request__poultry_request__export', + # 'province_request__poultry_request__freezing', + # 'document_status', + # 'ware_house_confirmation', + # 'ware_house_accepted_real_quantity', + # 'ware_house_accepted_real_weight', + # 'weight_loss', 'message', + # 'province_request__poultry_request__freezing', + # 'province_request__poultry_request', + # 'killhouse_user', + # 'killhouse_user__name', + # 'killhouse_user__kill_house_operator__user__mobile', + # 'killhouse_user__system_address__city__name', + # 'killhouse_user__killer', + # 'kill_request__slaughter_house', + # 'kill_request__slaughter_house__name', + # 'province_request__poultry_request__poultry', + # 'province_request__poultry_request__order_code', + # 'province_request__poultry_request__chicken_breed', + # 'province_request__poultry_request__poultry__user__city__name', + # 'province_request__poultry_request__poultry__unit_name', + # 'province_request__poultry_request__poultry__user__mobile', + # 'province_request__poultry_request__send_date', + # 'add_car__driver__driver_name', + # 'add_car__driver__driver_mobile', + # 'add_car__driver__type_car', + # 'add_car__driver__health_code', + # 'key', + # 'province_kill_request__province_request__poultry_request__Index_weight', + # 'clearance_code', + # 'quantity', + # 'bar_code', + # 'accepted_real_weight', + # 'accepted_real_quantity', + # 'vet_state', + # 'vet_accepted_real_quantity', + # 'vet_accepted_real_weight', + # 'quarantine_quantity', + # 'killhouse_user__kill_house_operator__user__province__name', + # 'province_request__poultry_request__hatching__chicken_age', + # 'province_request__poultry_request__amount', + # 'assignment_state_archive', + # 'traffic_code', + # 'province_kill_request__province_request__poultry_request__free_sale_in_province', + # 'province_kill_request__province_request__poultry_request__union', + # 'province_kill_request__province_request__poultry_request__direct_buying', + # 'province_kill_request__province_request__poultry_request__out', + # 'quarantine_code_state', + # 'province_request__poultry_request__send_date', + # 'province_request__poultry_request__hatching__date', + # 'killer__kill_house_operator__user__mobile', + # 'killer__name', + # 'killhouse_user__type', + # 'killer', 'bar_document_status', + # 'bar_document_status__title' + # ) + # else: + # filtered_kill_reqs = KillHouseRequest.objects.filter( + # Q(killhouse_user=kill_house) | Q(killer=kill_house), + # ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + # '-kill_request__recive_date').order_by( + # '-create_date').select_related( + # 'killhouse_user', 'province_request__poultry_request__poultry__user', + # 'province_request__poultry_request', + # 'province_request__poultry_request__poultry', 'add_car__driver', + # 'killhouse_user__system_address__city', + # 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + # 'kill_request__export_country', + # 'province_request__poultry_request__direct_buying', + # 'province_request__poultry_request__export', + # 'province_request__poultry_request__freezing', + # 'document_status', + # 'ware_house_accepted_real_quantity', + # 'ware_house_accepted_real_weight', 'weight_loss', 'message', + # 'province_request__poultry_request__freezing', + # 'province_request__poultry_request', 'traffic_code', + # 'assignment_state_archive', + # 'province_request__poultry_request__hatching__chicken_age', + # 'killhouse_user__kill_house_operator__user__province__name', + # 'killhouse_user', + # 'killhouse_user__name', + # 'province_request__poultry_request__amount', + # 'killhouse_user__kill_house_operator__user__mobile', + # 'killhouse_user__system_address__city__name', + # 'killhouse_user__killer', + # 'kill_request__slaughter_house', + # 'kill_request__slaughter_house__name', + # 'province_request__poultry_request__poultry', + # 'province_request__poultry_request__order_code', + # 'province_request__poultry_request__chicken_breed', + # 'province_request__poultry_request__poultry__user__city__name', + # 'province_request__poultry_request__poultry__unit_name', + # 'province_request__poultry_request__poultry__user__mobile', + # 'province_request__poultry_request__poultry__user__fullname', + # 'province_request__poultry_request__send_date', + # 'province_kill_request__province_request__poultry_request__Index_weight', + # 'add_car__driver__driver_name', + # 'add_car__driver__driver_mobile', + # 'add_car__driver__type_car', + # 'add_car__driver__health_code', + # 'key', + # 'clearance_code', + # 'quantity', + # 'bar_code', + # 'accepted_real_weight', + # 'accepted_real_quantity', + # 'vet_state', 'vet_accepted_real_quantity', + # 'vet_accepted_real_weight', 'quarantine_quantity', + # 'province_kill_request__province_request__poultry_request__free_sale_in_province', + # 'province_kill_request__province_request__poultry_request__union', + # 'province_kill_request__province_request__poultry_request__direct_buying', + # 'quarantine_code_state', + # 'province_request__poultry_request__send_date', + # 'province_request__poultry_request__hatching__date', + # 'killer__kill_house_operator__user__mobile', + # 'province_kill_request__province_request__poultry_request__out', + # 'killer__name', + # 'killhouse_user__type', 'killer', 'bar_document_status', + # 'bar_document_status__title').values( + # 'province_request__poultry_request__poultry__user__fullname', + # 'province_kill_request__kill_house_price', + # 'kill_request__export_country', + # 'province_request__poultry_request__direct_buying', + # 'province_request__poultry_request__export', + # 'province_request__poultry_request__freezing', + # 'document_status', + # 'ware_house_confirmation', + # 'ware_house_accepted_real_quantity', + # 'ware_house_accepted_real_weight', + # 'weight_loss', 'message', + # 'province_request__poultry_request__freezing', + # 'province_request__poultry_request', + # 'killhouse_user', + # 'killhouse_user__name', + # 'killhouse_user__kill_house_operator__user__mobile', + # 'killhouse_user__system_address__city__name', + # 'killhouse_user__killer', + # 'kill_request__slaughter_house', + # 'kill_request__slaughter_house__name', + # 'province_request__poultry_request__poultry', + # 'province_request__poultry_request__order_code', + # 'province_request__poultry_request__chicken_breed', + # 'province_request__poultry_request__poultry__user__city__name', + # 'province_request__poultry_request__poultry__unit_name', + # 'province_request__poultry_request__poultry__user__mobile', + # 'province_request__poultry_request__send_date', + # 'add_car__driver__driver_name', + # 'add_car__driver__driver_mobile', + # 'add_car__driver__type_car', + # 'add_car__driver__health_code', + # 'key', + # 'province_kill_request__province_request__poultry_request__Index_weight', + # 'clearance_code', + # 'quantity', + # 'bar_code', + # 'accepted_real_weight', + # 'accepted_real_quantity', + # 'vet_state', + # 'vet_accepted_real_quantity', + # 'vet_accepted_real_weight', + # 'quarantine_quantity', + # 'killhouse_user__kill_house_operator__user__province__name', + # 'province_request__poultry_request__hatching__chicken_age', + # 'province_request__poultry_request__amount', + # 'assignment_state_archive', + # 'traffic_code', + # 'province_kill_request__province_request__poultry_request__free_sale_in_province', + # 'province_kill_request__province_request__poultry_request__union', + # 'province_kill_request__province_request__poultry_request__direct_buying', + # 'province_kill_request__province_request__poultry_request__out', + # 'quarantine_code_state', + # 'province_request__poultry_request__send_date', + # 'province_request__poultry_request__hatching__date', + # 'killer__kill_house_operator__user__mobile', + # 'killer__name', + # 'killhouse_user__type', + # 'killer', 'bar_document_status', + # 'bar_document_status__title' + # ) + # + # + # + # + # + # all_age = [] + # + # all_real_quantity = 0 + # all_net_weighte = 0 + # all_weighte = 0 + # kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + # assignments = KillHouseAssignmentInformation.objects.filter( + # kill_house_request__key__in=kill_keys, trash=False + # ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + # assignment_mapping = { + # assignment.kill_house_request.key: ( + # int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + # for assignment in assignments + # } + # + # if filtered_kill_reqs: + # for kill in filtered_kill_reqs: + # age = (kill.get('province_request__poultry_request__send_date').date() - + # kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + # if age not in all_age: + # all_age.append(age) + # + # key = kill.get('key') + # net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + # all_real_quantity += real_quantity if real_quantity != '-' else 0 + # all_net_weighte += net_weighte if net_weighte != '-' else 0 + # + # weight = int(kill.get('quantity') * kill.get( + # 'province_kill_request__province_request__poultry_request__Index_weight')) + # + # if kill['message'] is not None: + # state_delete = 'بار حذف شده' + # else: + # all_weighte += weight + # + # value_header_list = [ + # + # data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars', 0), + # data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_quantity', 0), + # data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_weight', 0), + # round(data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_weight', 0) / data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_quantity', 0), + # 1) if data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_weight', 0) > 0 and data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_quantity', 0) > 0 else 0, + # + # ] + # create_value(worksheet, value_header_list, 13, 3, border_style='thin') + # + # excel_description(worksheet, 'D15', f'بارهای وارد شده به انبار', + # size=11, color='red', row2='G15') + # header_list = [ + # 'تعداد بارهای ایجاد شده', + # + # 'مجموع حجم بارها', + # 'مجموع وزن بارها', + # 'میانگین وزن ', + # + # ' افت در لحظه', + # ' افت لاشه ورود به انبار', + # + # ] + # + # # برای بالای هدر + # # header_list2 = [ + # # 'تعداد درخواست مرغداران', + # # ' مجموع تعداد قطعه درخواست مرغداران', + # # ' مجموع وزن درخواست مرغداران', + # # + # # ] + # # create_header(worksheet, header_list2, 1, 16, height=21.8, color='green', border_style='thin') + # + # create_header(worksheet, header_list, 3, 16, height=21.8, border_style='thin') + # if 'date1' in request.GET and request.GET['date1']: + # + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # + # filtered_kill_reqs = KillHouseRequest.objects.filter( + # Q(killhouse_user=kill_house) | Q(killer=kill_house), + # kill_request__recive_date__date__gte=date1, + # kill_request__recive_date__date__lte=date2, + # ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + # '-kill_request__recive_date').select_related( + # 'killhouse_user', 'province_request__poultry_request__poultry__user', + # 'province_request__poultry_request', + # 'province_request__poultry_request__poultry', 'add_car__driver', + # 'killhouse_user__system_address__city', + # 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + # 'kill_request__export_country', + # 'province_request__poultry_request__direct_buying', + # 'province_request__poultry_request__export', + # 'province_request__poultry_request__freezing', + # 'document_status', + # 'ware_house_accepted_real_quantity', + # 'ware_house_accepted_real_weight', 'weight_loss', 'message', + # 'province_request__poultry_request__freezing', + # 'province_request__poultry_request', 'traffic_code', + # 'assignment_state_archive', + # 'province_request__poultry_request__hatching__chicken_age', + # 'killhouse_user__kill_house_operator__user__province__name', + # 'killhouse_user', + # 'killhouse_user__name', + # 'province_request__poultry_request__amount', + # 'killhouse_user__kill_house_operator__user__mobile', + # 'killhouse_user__system_address__city__name', + # 'killhouse_user__killer', + # 'kill_request__slaughter_house', + # 'kill_request__slaughter_house__name', + # 'province_request__poultry_request__poultry', + # 'province_request__poultry_request__order_code', + # 'province_request__poultry_request__chicken_breed', + # 'province_request__poultry_request__poultry__user__city__name', + # 'province_request__poultry_request__poultry__unit_name', + # 'province_request__poultry_request__poultry__user__mobile', + # 'province_request__poultry_request__poultry__user__fullname', + # 'province_request__poultry_request__send_date', + # 'province_kill_request__province_request__poultry_request__Index_weight', + # 'add_car__driver__driver_name', + # 'add_car__driver__driver_mobile', + # 'add_car__driver__type_car', + # 'add_car__driver__health_code', + # 'key', + # 'clearance_code', + # 'quantity', + # 'bar_code', + # 'accepted_real_weight', + # 'accepted_real_quantity', + # 'vet_state', 'vet_accepted_real_quantity', + # 'vet_accepted_real_weight', 'quarantine_quantity', + # 'province_kill_request__province_request__poultry_request__free_sale_in_province', + # 'province_kill_request__province_request__poultry_request__union', + # 'province_kill_request__province_request__poultry_request__direct_buying', + # 'quarantine_code_state', + # 'province_request__poultry_request__send_date', + # 'province_request__poultry_request__hatching__date', + # 'killer__kill_house_operator__user__mobile', + # 'province_kill_request__province_request__poultry_request__out', + # 'killer__name', + # 'killhouse_user__type', 'killer', 'bar_document_status', + # 'bar_document_status__title').values( + # 'province_request__poultry_request__poultry__user__fullname', + # 'province_kill_request__kill_house_price', + # 'kill_request__export_country', + # 'province_request__poultry_request__direct_buying', + # 'province_request__poultry_request__export', + # 'province_request__poultry_request__freezing', + # 'document_status', + # 'ware_house_confirmation', + # 'ware_house_accepted_real_quantity', + # 'ware_house_accepted_real_weight', + # 'weight_loss', 'message', + # 'province_request__poultry_request__freezing', + # 'province_request__poultry_request', + # 'killhouse_user', + # 'killhouse_user__name', + # 'killhouse_user__kill_house_operator__user__mobile', + # 'killhouse_user__system_address__city__name', + # 'killhouse_user__killer', + # 'kill_request__slaughter_house', + # 'kill_request__slaughter_house__name', + # 'province_request__poultry_request__poultry', + # 'province_request__poultry_request__order_code', + # 'province_request__poultry_request__chicken_breed', + # 'province_request__poultry_request__poultry__user__city__name', + # 'province_request__poultry_request__poultry__unit_name', + # 'province_request__poultry_request__poultry__user__mobile', + # 'province_request__poultry_request__send_date', + # 'add_car__driver__driver_name', + # 'add_car__driver__driver_mobile', + # 'add_car__driver__type_car', + # 'add_car__driver__health_code', + # 'key', + # 'province_kill_request__province_request__poultry_request__Index_weight', + # 'clearance_code', + # 'quantity', + # 'bar_code', + # 'accepted_real_weight', + # 'accepted_real_quantity', + # 'vet_state', + # 'vet_accepted_real_quantity', + # 'vet_accepted_real_weight', + # 'quarantine_quantity', + # 'killhouse_user__kill_house_operator__user__province__name', + # 'province_request__poultry_request__hatching__chicken_age', + # 'province_request__poultry_request__amount', + # 'assignment_state_archive', + # 'traffic_code', + # 'province_kill_request__province_request__poultry_request__free_sale_in_province', + # 'province_kill_request__province_request__poultry_request__union', + # 'province_kill_request__province_request__poultry_request__direct_buying', + # 'province_kill_request__province_request__poultry_request__out', + # 'quarantine_code_state', + # 'province_request__poultry_request__send_date', + # 'province_request__poultry_request__hatching__date', + # 'killer__kill_house_operator__user__mobile', + # 'killer__name', + # 'killhouse_user__type', + # 'killer', 'bar_document_status', + # 'bar_document_status__title' + # ) + # else: + # filtered_kill_reqs = KillHouseRequest.objects.filter( + # Q(killhouse_user=kill_house) | Q(killer=kill_house), + # ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + # '-kill_request__recive_date').select_related( + # 'killhouse_user', 'province_request__poultry_request__poultry__user', + # 'province_request__poultry_request', + # 'province_request__poultry_request__poultry', 'add_car__driver', + # 'killhouse_user__system_address__city', + # 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + # 'kill_request__export_country', + # 'province_request__poultry_request__direct_buying', + # 'province_request__poultry_request__export', + # 'province_request__poultry_request__freezing', + # 'document_status', + # 'ware_house_accepted_real_quantity', + # 'ware_house_accepted_real_weight', 'weight_loss', 'message', + # 'province_request__poultry_request__freezing', + # 'province_request__poultry_request', 'traffic_code', + # 'assignment_state_archive', + # 'province_request__poultry_request__hatching__chicken_age', + # 'killhouse_user__kill_house_operator__user__province__name', + # 'killhouse_user', + # 'killhouse_user__name', + # 'province_request__poultry_request__amount', + # 'killhouse_user__kill_house_operator__user__mobile', + # 'killhouse_user__system_address__city__name', + # 'killhouse_user__killer', + # 'kill_request__slaughter_house', + # 'kill_request__slaughter_house__name', + # 'province_request__poultry_request__poultry', + # 'province_request__poultry_request__order_code', + # 'province_request__poultry_request__chicken_breed', + # 'province_request__poultry_request__poultry__user__city__name', + # 'province_request__poultry_request__poultry__unit_name', + # 'province_request__poultry_request__poultry__user__mobile', + # 'province_request__poultry_request__poultry__user__fullname', + # 'province_request__poultry_request__send_date', + # 'province_kill_request__province_request__poultry_request__Index_weight', + # 'add_car__driver__driver_name', + # 'add_car__driver__driver_mobile', + # 'add_car__driver__type_car', + # 'add_car__driver__health_code', + # 'key', + # 'clearance_code', + # 'quantity', + # 'bar_code', + # 'accepted_real_weight', + # 'accepted_real_quantity', + # 'vet_state', 'vet_accepted_real_quantity', + # 'vet_accepted_real_weight', 'quarantine_quantity', + # 'province_kill_request__province_request__poultry_request__free_sale_in_province', + # 'province_kill_request__province_request__poultry_request__union', + # 'province_kill_request__province_request__poultry_request__direct_buying', + # 'quarantine_code_state', + # 'province_request__poultry_request__send_date', + # 'province_request__poultry_request__hatching__date', + # 'killer__kill_house_operator__user__mobile', + # 'province_kill_request__province_request__poultry_request__out', + # 'killer__name', + # 'killhouse_user__type', 'killer', 'bar_document_status', + # 'bar_document_status__title').values( + # 'province_request__poultry_request__poultry__user__fullname', + # 'province_kill_request__kill_house_price', + # 'kill_request__export_country', + # 'province_request__poultry_request__direct_buying', + # 'province_request__poultry_request__export', + # 'province_request__poultry_request__freezing', + # 'document_status', + # 'ware_house_confirmation', + # 'ware_house_accepted_real_quantity', + # 'ware_house_accepted_real_weight', + # 'weight_loss', 'message', + # 'province_request__poultry_request__freezing', + # 'province_request__poultry_request', + # 'killhouse_user', + # 'killhouse_user__name', + # 'killhouse_user__kill_house_operator__user__mobile', + # 'killhouse_user__system_address__city__name', + # 'killhouse_user__killer', + # 'kill_request__slaughter_house', + # 'kill_request__slaughter_house__name', + # 'province_request__poultry_request__poultry', + # 'province_request__poultry_request__order_code', + # 'province_request__poultry_request__chicken_breed', + # 'province_request__poultry_request__poultry__user__city__name', + # 'province_request__poultry_request__poultry__unit_name', + # 'province_request__poultry_request__poultry__user__mobile', + # 'province_request__poultry_request__send_date', + # 'add_car__driver__driver_name', + # 'add_car__driver__driver_mobile', + # 'add_car__driver__type_car', + # 'add_car__driver__health_code', + # 'key', + # 'province_kill_request__province_request__poultry_request__Index_weight', + # 'clearance_code', + # 'quantity', + # 'bar_code', + # 'accepted_real_weight', + # 'accepted_real_quantity', + # 'vet_state', + # 'vet_accepted_real_quantity', + # 'vet_accepted_real_weight', + # 'quarantine_quantity', + # 'killhouse_user__kill_house_operator__user__province__name', + # 'province_request__poultry_request__hatching__chicken_age', + # 'province_request__poultry_request__amount', + # 'assignment_state_archive', + # 'traffic_code', + # 'province_kill_request__province_request__poultry_request__free_sale_in_province', + # 'province_kill_request__province_request__poultry_request__union', + # 'province_kill_request__province_request__poultry_request__direct_buying', + # 'province_kill_request__province_request__poultry_request__out', + # 'quarantine_code_state', + # 'province_request__poultry_request__send_date', + # 'province_request__poultry_request__hatching__date', + # 'killer__kill_house_operator__user__mobile', + # 'killer__name', + # 'killhouse_user__type', + # 'killer', 'bar_document_status', + # 'bar_document_status__title' + # ) + # + # all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + # + # aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + # total_accepted_real_quantity=Sum('accepted_real_quantity'), + # total_accepted_real_weight=Sum('accepted_real_weight'), + # total_quantity=Sum('quantity'), + # total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + # total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + # total_quarantine_quantity=Sum('quarantine_quantity'), + # total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + # total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + # total_weight_loss=Sum('weight_loss'), + # + # ) + # + # all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + # + # all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + # + # all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + # 2) if all_weight_loss > 0 else 0 + # all_age = [] + # + # all_real_quantity = 0 + # all_net_weighte = 0 + # all_weighte = 0 + # kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + # assignments = KillHouseAssignmentInformation.objects.filter( + # kill_house_request__key__in=kill_keys, trash=False + # ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + # assignment_mapping = { + # assignment.kill_house_request.key: ( + # int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + # for assignment in assignments + # } + # all_total_weight_loss = 0 + # if filtered_kill_reqs: + # for kill in filtered_kill_reqs: + # age = (kill.get('province_request__poultry_request__send_date').date() - + # kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + # if age not in all_age: + # all_age.append(age) + # + # key = kill.get('key') + # net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + # all_real_quantity += real_quantity if real_quantity != '-' else 0 + # all_net_weighte += net_weighte if net_weighte != '-' else 0 + # + # weight = int(kill.get('quantity') * kill.get( + # 'province_kill_request__province_request__poultry_request__Index_weight')) + # + # if kill['message'] is not None: + # state_delete = 'بار حذف شده' + # else: + # all_weighte += weight + # weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + # + # if kill['ware_house_confirmation'] == True: + # state_ware_house_confirmation = 'ورود به انبار' + # + # else: + # state_ware_house_confirmation = '-' + # + # weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + # 'ware_house_accepted_real_weight'] > 0 else 0 + # if weight_loss1 < 0: + # weight_loss1 = weight_loss1 * -1 + # total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if kill['accepted_real_weight'] > 0 else 0 + # all_total_weight_loss += total_weight_loss + # all_total_weight_loss = all_total_weight_loss / len(filtered_kill_reqs) if len(filtered_kill_reqs) > 0 else 0 + # value_header_list = [ + # data.get('ware_house_info', {}).get('total_bars', 0), + # data.get('ware_house_info', {}).get('warehouse_total_quantity', 0), + # data.get('ware_house_info', {}).get('warehouse_total_weight', 0), + # round(data.get('ware_house_info', {}).get('warehouse_total_weight', 0) / data.get('ware_house_info', {}).get('warehouse_total_quantity', 0), + # 1) if data.get('ware_house_info', {}).get('warehouse_total_weight', 0) > 0 and data.get('ware_house_info', {}).get('warehouse_total_quantity', 0) > 0 else 0, + # + # f'%{int(all_total_weight_loss)}', + # f'%{all_weight_loss}', + # + # ] + # create_value(worksheet, value_header_list, 17, 3, border_style='thin') + # + # excel_description(worksheet, 'D19', f'فروش به داخل استان', + # size=11, color='red', row2='G19') + # if 'date1' in request.GET and request.GET['date1']: + # + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # + # allocations = StewardAllocation.objects.filter(Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + # trash=False, date__date__gte=date1, + # date__date__lte=date2).order_by('id') + # else: + # allocations = StewardAllocation.objects.filter(Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + # trash=False).order_by('id') + # + # header_list2 = [ + # 'تعداد تخصیصات', + # 'قیمت کل', + # 'حجم تخصیصی', + # 'وزن تخصیصی', + # 'حجم تایید شده', + # 'وزن تایید شده', + # + # ] + # create_header(worksheet, header_list2, 4, 20, height=21, width=16.01, border_style='thin') + # total_amount_allocations = allocations.aggregate( + # total_quantity=Sum('total_amount')).get( + # 'total_quantity') or 0 + # number_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('number_of_carcasses')).get( + # 'total_quantity') or 0 + # weight_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('weight_of_carcasses')).get( + # 'total_quantity') or 0 + # receiver_real_number_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('receiver_real_number_of_carcasses')).get( + # 'total_quantity') or 0 + # receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + # 'total_quantity') or 0 + # + # value_header_list2 = [ + # len(allocations), + # total_amount_allocations, + # number_of_carcasses_allocations, + # weight_of_carcasses_allocations, + # receiver_real_number_of_carcasses_allocations, + # receiver_real_weight_of_carcasses_allocations, + # + # ] + # create_value(worksheet, value_header_list2, 21, 4, border_style='thin') + # + # excel_description(worksheet, 'D23', f'فروش به خارج استان', + # size=11, color='red', row2='G23') + # if 'date1' in request.GET: + # date1 = datetime.datetime.strptime(str(request.GET['date1']), + # '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['date2']), + # '%Y-%m-%d').date() + # buyers = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, + # date__date__gte=date1, + # date__date__lte=date2).order_by('-date') + # else: + # buyers = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, + # ).order_by('-date') + # + # header_list = [ + # 'تعداد کل فروش', + # 'تعداد خریداران', + # 'حجم لاشه(تقریبی)', + # 'وزن لاشه(کیلوگرم)', + # + # ] + # + # create_header(worksheet, header_list, 4, 24, height=21, width=16.01, border_style='thin') + # + # total_quantity = buyers.aggregate(total=Sum('number_of_carcasses'))[ + # 'total'] or 0 + # total_weight = buyers.aggregate(total=Sum('weight_of_carcasses'))[ + # 'total'] or 0 + # len_buyers = [] + # for buyer in buyers: + # + # if buyer.buyer_name not in len_buyers: + # len_buyers.append(buyer.buyer_name) + # value_list = [ + # len(buyers), + # len(len_buyers), + # total_quantity, + # total_weight, + # ] + # create_value(worksheet, value_list, 25, 4, border_style='thin') + # + # excel_description(worksheet, 'D27', f'بار زنده (خرید خارج استان)', + # size=11, color='red', row2='G27') + # + # type = 'live' + # + # role = request.GET.get('role') + # order_by_type = '-create_date' + # + # if 'date1' in request.GET: + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # + # filters = { + # 'create_date__date__gte': date1, + # 'create_date__date__lte': date2, + # 'trash': False, + # } + # else: + # filters = { + # 'trash': False + # } + # + # filters['buy_type'] = type + # + # kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type) + # header_list2 = [ + # 'تعداد کل بار زنده', + # 'حجم کل بار زنده', + # 'وزن کل بار زنده', + # 'تعداد کل بارهای وارد شده به انبار', + # 'حجم کل بارهای زنده وارد شده به انبار', + # 'وزن کل بارهای زنده وارد شده به انبار', + # 'وزن لاشه وارد شده به انبار', + # 'کل بار وارد نشده به انبار', + # 'حجم کل بار وارد نشده به انبار', + # 'وزن کل بار وارد نشده به انبار', + # + # ] + # create_header(worksheet, header_list2, 2, 28, height=21, width=16.01, border_style='thin') + # + # quantity = kill_house_free_bar_info.aggregate( + # total_quantity=Sum('quantity')).get( + # 'total_quantity') or 0 + # live_weight = kill_house_free_bar_info.aggregate( + # total_quantity=Sum('live_weight')).get( + # 'total_quantity') or 0 + # + # weight_of_carcasses = kill_house_free_bar_info.aggregate( + # total_quantity=Sum('weight_of_carcasses')).get( + # 'total_quantity') or 0 + # + # entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0) + # + # entered_quantity = entered_bars.aggregate( + # total_quantity=Sum('quantity')).get( + # 'total_quantity') or 0 + # entered_live_weight = entered_bars.aggregate( + # total_quantity=Sum('live_weight')).get( + # 'total_quantity') or 0 + # + # not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0) + # + # not_entered_quantity = not_entered_bars.aggregate( + # total_quantity=Sum('quantity')).get( + # 'total_quantity') or 0 + # not_entered_live_weight = not_entered_bars.aggregate( + # total_quantity=Sum('live_weight')).get( + # 'total_quantity') or 0 + # + # value_header_list2 = [ + # len(kill_house_free_bar_info), + # quantity, + # live_weight, + # + # len(entered_bars), + # + # entered_quantity, + # entered_live_weight, + # weight_of_carcasses, + # len(not_entered_bars), + # not_entered_quantity, + # not_entered_live_weight, + # + # ] + # create_value(worksheet, value_header_list2, 29, 2, border_style='thin') + # + # excel_description(worksheet, 'D31', f'بار لاشه (خرید خارج استان)', + # size=11, color='red', row2='G31') + # type = 'carcasses' + # bar_state = 'entered' + # + # kill_houses = None + # order_by_type = '-create_date' + # + # if 'date1' in request.GET: + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # + # filters = { + # 'create_date__date__gte': date1, + # 'create_date__date__lte': date2, + # 'trash': False, + # } + # else: + # filters = { + # 'trash': False + # } + # + # if kill_houses is not None: + # filters['kill_house__in'] = kill_houses + # + # if type: + # filters['buy_type'] = type + # if type == 'live': + # if bar_state: + # if bar_state == 'entered': + # filters['weight_of_carcasses__gt'] = 0 + # else: + # filters['weight_of_carcasses'] = 0 + # + # kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type) + # header_list2 = [ + # 'تعداد کل بار', + # 'حجم لاشه', + # 'وزن لاشه', + # + # ] + # create_header(worksheet, header_list2, 5, 32, height=21, width=16.01, border_style='thin') + # + # number_of_carcasses = kill_house_free_bar_info.aggregate( + # total_quantity=Sum('number_of_carcasses')).get( + # 'total_quantity') or 0 + # weight_of_carcasses = kill_house_free_bar_info.aggregate( + # total_quantity=Sum('weight_of_carcasses')).get( + # 'total_quantity') or 0 + # + # value_header_list2 = [ + # len(kill_house_free_bar_info), + # number_of_carcasses, + # weight_of_carcasses, + # + # ] + # create_value(worksheet, value_header_list2, 33, 5, border_style='thin') + + 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 + + +def cold_house_excel(request): + filterset_class = StewardAllocationFilterSet + filterset_fields = [ + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'to_guilds__user__first_name', + 'to_guilds__user__last_name', + 'to_guilds__user__fullname', + 'to_guilds__user__mobile', + 'to_steward__user__first_name', + 'to_steward__user__last_name', + 'to_steward__user__fullname', + 'to_steward__user__mobile', + 'to_kill_house__kill_house_operator__user__first_name', + 'to_kill_house__kill_house_operator__user__last_name', + 'to_kill_house__kill_house_operator__user__fullname', + 'to_kill_house__kill_house_operator__user__mobile', + 'to_kill_house__name', + ] + + if request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + cold_house = ColdHouse.objects.filter(key=request.GET['cold_house_key'], trash=False).first() + + else: + cold_house = ColdHouse.objects.filter(live_stock_support__isnull=False, trash=False).first() + + if request.GET['type'] == 'output': + type = 'بارهای خارج شده' + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'cold_house' in request.GET: + cold_house = ColdHouse.objects.get(kill_house=kill_house, trash=False) + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date') + + else: + allocations = StewardAllocation.objects.filter( + Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('id') + else: + if 'cold_house' in request.GET: + cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + trash=False).order_by('-date') + + else: + allocations = StewardAllocation.objects.filter( + Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False).order_by('id') + else: + type = 'بارهای وارد شده' + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'cold_house' in request.GET: + cold_house = ColdHouse.objects.filter(kill_house=kill_house, trash=False).first() + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date') + + else: + allocations = StewardAllocation.objects.filter( + Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('id') + else: + if 'cold_house' in request.GET: + cold_house = ColdHouse.objects.filter(key=request.GET['cold_house_key'], trash=False).first() + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + trash=False).order_by('-date') + + else: + allocations = StewardAllocation.objects.filter( + Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False).order_by('id') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=allocations + ) + ).filter(): + ps = filterset_class(data=query, queryset=allocations) + allocations = ps.filter() + allocations = [] if len( + allocations) == 0 else allocations + + excel_options = [ + 'ردیف', + 'تاریخ ثبت', + 'نوع تخصیص', + 'خریدار', + 'تلفن خریدار', + 'نوع فروش', + 'قیمت هر کیلو(ریال)', + 'قیمت کل', + 'حجم تخصیصی', + 'وزن تخصیصی', + 'حجم تایید شده', + 'وزن تایید شده', + # 'کد احراز', + # 'وضعیت کد احراز', + 'وضعیت', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['A3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + excel_description(worksheet, 'A5', type, color='red', row2='C5') + header_list2 = [ + 'وزن کل', + 'وزن خارج شده', + 'وزن باقیمانده', + 'تعداد کل بار وارد شده', + 'وزن کل بار وارد شده', + 'تعداد کل بار خارج شده', + 'وزن کل بار خارج شده', + + ] + + create_header(worksheet, header_list2, 5, 2, height=20.8, border_style='thin') + cell_color_changer(worksheet, 2, 5, 8, 'FF0000') + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + kill_house_name = '' + if allocations.exists(): + kill_house_name = allocations.first().kill_house.name + excel_description(worksheet, 'A1', f'سردخانه {kill_house_name}', size=11, color='red', + row2='D1') + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'A3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['A3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if allocations: + for allocation in allocations: + l += 1 + + if allocation.allocation_type == 'killhouse_steward': + allocation_type = 'کشتارگاه به مباشر' + buyer_name = allocation.to_steward.guilds_name + buyer_mobile = allocation.to_steward.user.mobile + elif allocation.allocation_type == 'killhouse_guild': + allocation_type = 'کشتارگاه به صنف' + buyer_name = allocation.to_guilds.guilds_name + buyer_mobile = allocation.to_guilds.user.mobile + elif allocation.allocation_type == 'ColdHouse': + allocation_type = 'کشتارگاه به سردخانه' + if allocation.to_cold_house.kill_house: + buyer_name = allocation.to_cold_house.kill_house.name + buyer_mobile = allocation.to_cold_house.kill_house.kill_house_operator.user.mobile + else: + buyer_name = allocation.to_cold_house.live_stock_support.user.name + buyer_mobile = allocation.to_cold_house.live_stock_support.user.mobile + elif allocation.allocation_type == 'killhouse_killhouse': + allocation_type = 'کشتارگاه به کشتارگاه' + buyer_name = allocation.to_kill_house.kill_house.name + buyer_mobile = allocation.to_kill_house.kill_house_operator.user.mobile + else: + allocation_type = '-' + buyer_name = '-' + buyer_mobile = '-' + + if allocation.sell_type == 'exclusive': + sell_type = 'اختصاصی' + else: + sell_type = 'آزاد' + system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + list1 = [ + m, + str(shamsi_date((allocation.date))), + allocation_type, + buyer_name, + buyer_mobile, + sell_type, + allocation.amount, + allocation.total_amount, + allocation.number_of_carcasses, + allocation.weight_of_carcasses, + allocation.receiver_real_number_of_carcasses, + allocation.receiver_real_weight_of_carcasses, + # allocation.registration_code, + # system_registration_code, + state, + + ] + m += 1 + + create_value(worksheet, list1, l + 1, 1) + total_input_bars_weight = allocations.aggregate( + total=Sum('real_weight_of_carcasses'))['total'] or 0 + total_number_of_carcasses = allocations.aggregate( + total=Sum('number_of_carcasses'))['total'] or 0 + total_weight_of_carcasses = allocations.aggregate( + total=Sum('weight_of_carcasses'))['total'] or 0 + total_receiver_real_number_of_carcasses = allocations.aggregate( + total=Sum('receiver_real_number_of_carcasses'))['total'] or 0 + total_receiver_real_weight_of_carcasses = allocations.aggregate( + total=Sum('receiver_real_weight_of_carcasses'))['total'] or 0 + + value_header_list2 = [ + cold_house.total_input_weight, + cold_house.total_allocated_weight, + cold_house.total_remain_weight, + len(allocations), + total_input_bars_weight, + 0, + 0, + + ] + + create_value(worksheet, value_header_list2, 3, 5, border_style='thin') + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_number_of_carcasses, + total_weight_of_carcasses, + total_receiver_real_number_of_carcasses, + total_receiver_real_weight_of_carcasses, + # '', + # '', + '', + + ] + # for item in range(len(list2)): + # cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + # value = list2[item] + # if isinstance(value, (int, float)): + # cell.number_format = '#,###' # Apply general number format + # else: + # cell.value = value # Keep as text for other values + # + # cell.alignment = Alignment(horizontal='center') + # cell.font = Font(size=10, bold=True) + # cell.font = Font(bold=True) + # cell.fill = PatternFill(start_color="00B050", fill_type="solid") + create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + + response[ + 'Content-Disposition'] = f'attachment; filename="سردخانه {kill_house_name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def management_cold_house_excel(request): + filterset_class = StewardAllocationFilterSet + filterset_fields = [ + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'to_guilds__user__first_name', + 'to_guilds__user__last_name', + 'to_guilds__user__fullname', + 'to_guilds__user__mobile', + 'to_steward__user__first_name', + 'to_steward__user__last_name', + 'to_steward__user__fullname', + 'to_steward__user__mobile', + 'to_kill_house__kill_house_operator__user__first_name', + 'to_kill_house__kill_house_operator__user__last_name', + 'to_kill_house__kill_house_operator__user__fullname', + 'to_kill_house__kill_house_operator__user__mobile', + 'to_kill_house__name', + ] + + excel_options = [ + 'ردیف', + 'نام سردخانه', + 'شهر', + 'آدرس', + 'وزن کل', + 'وزن خارج شده', + 'وزن باقیمانده', + 'وضعیت', + 'اجازه پخش', + 'اجازه جابه جایی', + 'ظرفیت', + + ] + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + sheet_name = 'اطلاعات کلی' + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + worksheet = workbook.create_sheet(sheet_name) + + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + header_list2 = [ + 'ردیف', + 'نام کشتارگاه', + 'نام مالک', + 'موبایل', + 'شهر', + 'تعداد سرد خانه ها', + 'وزن وارد شده', + 'وزن خارج شده', + 'وزن باقیمانده', + + ] + + create_header(worksheet, header_list2, 3, 8, height=25.8, border_style='thin', width=15) + + header_list3 = [ + 'تعداد کل سردخانه', + 'تعداد کل سردخانه کشتارگاه', + 'تعداد کل سردخانه مباشرین', + 'کل وزن وارد شده', + 'کل وزن خارج شده', + 'کل وزن باقیمانده', + + ] + create_header(worksheet, header_list3, 5, 3, height=25.8, border_style='thin', width=15, color='FF0000') + cold_houses = ColdHouse.objects.filter(trash=False) + kill_house_cold_houses = cold_houses.filter(kill_house__isnull=False) + steward_cold_houses = cold_houses.filter(steward__isnull=False) + total_input_weight = cold_houses.aggregate( + total=Sum('total_input_weight'))['total'] or 0 + + total_allocated_weight = cold_houses.aggregate( + total=Sum('total_allocated_weight'))['total'] or 0 + + total_remain_weight = cold_houses.aggregate( + total=Sum('total_remain_weight'))['total'] or 0 + + result = { + "total_cold_houses": len(cold_houses), + "total_kill_house_cold_house": len(kill_house_cold_houses), + "total_steward_cold_house": len(steward_cold_houses), + "total_input_weight": total_input_weight, + "total_allocated_weight": total_allocated_weight, + "total_remain_weight": total_remain_weight, + } + + list1 = [ + len(cold_houses), + len(kill_house_cold_houses), + len(steward_cold_houses), + total_input_weight, + total_allocated_weight, + total_remain_weight, + + ] + create_header(worksheet, list1, 5, 4, height=25.8, border_style='thin', color='D9D9D9', text_color='000000') + + excel_description(worksheet, 'A3', f'مدیریت سرد خانه ها', color='red', row2='C4') + + l = 8 + m = 1 + for kill_house in kill_houses: + cold_houses = ColdHouse.objects.filter(kill_house=kill_house, trash=False) + if cold_houses: + total_input_weight = cold_houses.aggregate(total=Sum('total_input_weight'))[ + 'total'] or 0 + total_allocated_weight = cold_houses.aggregate(total=Sum('total_allocated_weight'))[ + 'total'] or 0 + total_remain_weight = cold_houses.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + list1 = [ + m, + kill_house.name, + kill_house.kill_house_operator.user.fullname, + kill_house.kill_house_operator.user.mobile, + kill_house.kill_house_operator.user.city.name, + len(cold_houses), + total_input_weight, + total_allocated_weight, + total_remain_weight, + + ] + m += 1 + l += 1 + create_header(worksheet, list1, 3, l, height=25.8, border_style='thin', color='B8CCE4', + text_color='000000') + + for kill_house in kill_houses: + cold_houses = ColdHouse.objects.filter(kill_house=kill_house, trash=False) + if cold_houses: + sheet_name = kill_house.name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list2 = [ + 'تعداد سرد خانه', + 'وزن وارد شده', + 'وزن خارج شده', + 'وزن باقیمانده', + + ] + + create_header(worksheet, header_list2, 5, 2, height=20.8, border_style='thin') + + total_input_weight = cold_houses.aggregate(total=Sum('total_input_weight'))[ + 'total'] or 0 + total_allocated_weight = cold_houses.aggregate(total=Sum('total_allocated_weight'))[ + 'total'] or 0 + total_remain_weight = cold_houses.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + + value_header_list2 = [ + len(cold_houses), + total_input_weight, + total_allocated_weight, + total_remain_weight, + + ] + + create_value(worksheet, value_header_list2, 3, 5, border_style='thin') + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + excel_description(worksheet, 'A5', f'سردخانه های {kill_house.name}', color='red', row2='C5') + l = 5 + m = 1 + for cold_house in cold_houses: + l += 1 + + status = 'فعال' if cold_house.active == True else 'غیر فعال' + broadcast = 'دارد' if cold_house.broadcast == True else 'ندارد' + relocate = 'دارد' if cold_house.relocate == True else 'ندارد' + + list1 = [ + m, + cold_house.name, + cold_house.city, + cold_house.address, + cold_house.total_input_weight, + cold_house.total_allocated_weight, + cold_house.total_remain_weight, + status, + broadcast, + relocate, + cold_house.capacity + + ] + m += 1 + + create_value(worksheet, list1, l + 1, 1) + total_input_weight = cold_houses.aggregate( + total=Sum('total_input_weight'))['total'] or 0 + total_allocated_weight = cold_houses.aggregate( + total=Sum('total_allocated_weight'))['total'] or 0 + total_remain_weight = cold_houses.aggregate( + total=Sum('total_remain_weight'))['total'] or 0 + capacity = cold_houses.aggregate( + total=Sum('capacity'))['total'] or 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + total_input_weight, + total_allocated_weight, + total_remain_weight, + '', + '', + '', + capacity + + ] + + create_value(worksheet, list2, l + 3, 1, color='yellow') + + # blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + # red_font = Font(color="C00000", bold=True) + # if 'date1' in request.GET: + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # from_date_1 = shamsi_date(date1) + # to_date_1 = shamsi_date(date2) + # worksheet['A3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + # header_list2 = [ + # 'وزن کل', + # 'وزن خارج شده', + # 'وزن باقیمانده', + # 'تعداد کل بار وارد شده', + # 'وزن کل بار وارد شده', + # 'تعداد کل بار خارج شده', + # 'وزن کل بار خارج شده', + # + # ] + # + # create_header(worksheet, header_list2, 5, 2, height=20.8, border_style='thin') + # cell_color_changer(worksheet, 2, 5, 8, 'FF0000') + # create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + # + # kill_house_name = '' + # if allocations.exists(): + # kill_house_name = allocations.first().kill_house.name + # excel_description(worksheet, 'A1', f'سردخانه {kill_house_name}', size=11, color='red', + # row2='D1') + # + # worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + # merge_range1 = 'B1:D1' + # merge_range2 = 'B2:D2' + # merge_range = 'A3:D3' + # worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range) + # worksheet.merge_cells(merge_range2) + # worksheet['B1'].font = red_font + # worksheet['A3'].font = Font(size=11) + # worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + # + # l = 5 + # m = 1 + # + # if allocations: + # for allocation in allocations: + # l += 1 + # + # if allocation.allocation_type == 'killhouse_steward': + # allocation_type = 'کشتارگاه به مباشر' + # buyer_name = allocation.to_steward.guilds_name + # buyer_mobile = allocation.to_steward.user.mobile + # elif allocation.allocation_type == 'killhouse_guild': + # allocation_type = 'کشتارگاه به صنف' + # buyer_name = allocation.to_guilds.guilds_name + # buyer_mobile = allocation.to_guilds.user.mobile + # elif allocation.allocation_type == 'ColdHouse': + # allocation_type = 'کشتارگاه به سردخانه' + # if allocation.to_cold_house.kill_house: + # buyer_name = allocation.to_cold_house.kill_house.name + # buyer_mobile = allocation.to_cold_house.kill_house.kill_house_operator.user.mobile + # else: + # buyer_name = allocation.to_cold_house.live_stock_support.user.name + # buyer_mobile = allocation.to_cold_house.live_stock_support.user.mobile + # elif allocation.allocation_type == 'killhouse_killhouse': + # allocation_type = 'کشتارگاه به کشتارگاه' + # buyer_name = allocation.to_kill_house.kill_house.name + # buyer_mobile = allocation.to_kill_house.kill_house_operator.user.mobile + # else: + # allocation_type = '-' + # buyer_name = '-' + # buyer_mobile = '-' + # + # if allocation.sell_type == 'exclusive': + # sell_type = 'اختصاصی' + # else: + # sell_type = 'آزاد' + # system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + # state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + # list1 = [ + # m, + # str(shamsi_date((allocation.date))), + # allocation_type, + # buyer_name, + # buyer_mobile, + # sell_type, + # allocation.amount, + # allocation.total_amount, + # allocation.number_of_carcasses, + # allocation.weight_of_carcasses, + # allocation.receiver_real_number_of_carcasses, + # allocation.receiver_real_weight_of_carcasses, + # # allocation.registration_code, + # # system_registration_code, + # state, + # + # ] + # m += 1 + # + # create_value(worksheet, list1, l + 1, 1) + # total_input_bars_weight = allocations.aggregate( + # total=Sum('real_weight_of_carcasses'))['total'] or 0 + # total_number_of_carcasses = allocations.aggregate( + # total=Sum('number_of_carcasses'))['total'] or 0 + # total_weight_of_carcasses = allocations.aggregate( + # total=Sum('weight_of_carcasses'))['total'] or 0 + # total_receiver_real_number_of_carcasses = allocations.aggregate( + # total=Sum('receiver_real_number_of_carcasses'))['total'] or 0 + # total_receiver_real_weight_of_carcasses = allocations.aggregate( + # total=Sum('receiver_real_weight_of_carcasses'))['total'] or 0 + # + # value_header_list2 = [ + # cold_house.total_input_weight, + # cold_house.total_allocated_weight, + # cold_house.total_remain_weight, + # len(allocations), + # total_input_bars_weight, + # 0, + # 0, + # + # ] + # + # create_value(worksheet, value_header_list2, 3, 5, border_style='thin') + # list2 = [ + # 'مجموع==>', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # total_number_of_carcasses, + # total_weight_of_carcasses, + # total_receiver_real_number_of_carcasses, + # total_receiver_real_weight_of_carcasses, + # # '', + # # '', + # '', + # + # ] + # + # create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def create_guilds_or_stewards_from_excel(request): + pass + # file = request.FILES['file'].read() + # read = openpyxl.load_workbook(BytesIO(file), data_only=True) + # sheet = read.active + # group = Group.objects.get(name__exact="Guilds") + # steward_role = Group.objects.get(name__exact="Steward") + # password = '123456' + # result_list=[] + # yesterday= datetime.datetime.now().date() + # birth_day=convert_to_shamsi(day=yesterday.day, + # month=yesterday.month, + # year=yesterday.year).replace('-','/') + # for i, row in enumerate(sheet.iter_rows(values_only=True)): + # if i <= 1: + # continue + # kill_house_name = row[1] + # first_name = row[2] + # last_name = row[3] + # national_id = row[4] + # mobile = row[5] + # city_name = row[6] + # postal_code = row[7] + # address = row[8] + # guild_name = row[9] + # type_activity = row[10] + # area_activity = row[11] + # guilds_id = row[12] + # license_number = row[13] + # is_steward = row[14] + # + # + # is_steward = True if is_steward == 'مباشر' else 'صنف' + # mobile = str(mobile) + # + # if len(mobile) < 10: + # continue + # if len(mobile) == 10: + # mobile = '0' + mobile + # + # try: + # city = City.objects.get(name=city_name) + # province = Province.objects.get(key=city.province.key) + # + # system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last() + # if system_profile: + # if not Guilds.objects.filter(user=system_profile, trash=False).exists(): + # hashed_password = hashlib.sha256(str(password).encode()).hexdigest() + # data = { + # "username": mobile, + # "first_name": first_name, + # "last_name": last_name, + # "password": hashed_password, + # "national_code": national_id, + # "role": "Rancher", + # "api_key": PROJECT_API_KEY + # } + # req = requests.post( + # url=ARTA_REGISTER, + # data=data, + # verify=False + # ) + # + # if req.status_code == 200: + # province = Province.objects.filter(trash=False).first() + # user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password) + # user.save() + # base_id = SystemUserProfile.objects.all() + # if base_id.count() > 0: + # base_id = int(base_id.last().base_order) + 1 + # else: + # base_id = 1000 + # city_id = City.objects.filter(trash=False, name=city).first() + # + # system_profile = SystemUserProfile( + # mobile=mobile, + # first_name=first_name, + # last_name=last_name, + # fullname=first_name+' ' + last_name, + # user=user, + # base_order=base_id, + # password=password, + # birthday=datetime.datetime.now().date(), + # city=city_id, + # province=province + # ) + # system_profile.save() + # system_profile.role.add(group) + # address = SystemAddress( + # province=province, + # city=city_id, + # address='', + # + # ) + # address.save() + # + # cooperative = Cooperative.objects.filter(trash=False, address__city=city_id).first() + # rancher = Rancher( + # user=system_profile, + # address=address, + # cooperative=cooperative, + # name=rancher_name, + # mobile=mobile, + # fullname=first_name + ' ' + last_name, + # city=city, + # herd_name=rancher_name, + # postal_code=postal_code, + # epidemiological_code=epidemiological_code, + # herd_code=herd_code, + # national_id=national_id, + # type='rural' if type_rancher == 'روستایی' else 'industrial' + # + # + # ) + # rancher.save() + # + # for _i in range(range_live_stock): + # live_stock = LiveStock( + # herd_code=herd_code, + # type=type_live_stock, + # birth_day=birth_day, + # birth_day_gh=yesterday, + # gender=gender, + # + # ) + # live_stock.save() + # except: + # result_list.append(rancher_name) + # + # return Response(result_list) + + +def non_receipt_request_excel(request): + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + user = SystemUserProfile.objects.get(key=request.GET['key']) + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house = [] + kill_house_requests_list = [] + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + for kill_house_vet in kill_house_vets: + kill_house.append(kill_house_vet.kill_house) + + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + + if request.GET['role'] in ['CityOperator', 'CityJahad', 'CityPoultry']: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + main_non_receipt=True, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + + ).order_by('-kill_request__recive_date') + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + main_non_receipt=True, + province_request__poultry_request__poultry__address__city=user.city + + ).order_by('-kill_request__recive_date') + + else: + + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + main_non_receipt=True + + ).order_by('-kill_request__recive_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_house_requests) + kill_house_requests_list = ps.filter() + kill_house_requests = [] if len(kill_house_requests_list) == 0 else kill_house_requests_list + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True).data + excel_options = [ + "ردیف", + "کدبار", + "کد بهداشتی حمل و نقل", + "تاریخ کشتار", + "خریدار", + " تلفن خریدار", + "کشتارکن اختصاصی", + "تلفن کشتارکن اختصاصی", + "مرغدار", + "تلفن مرغدار", + "تعداد اولیه", + "وزن اولیه بار (کیلوگرم)", + "قیمت مرغدار", + "قیمت کشتارگاه", + "ماشین", + "راننده", + "تحویلی دامپزشک (قطعه)", + "وزن تحویلی دامپزشک (کیلوگرم)", + "کدسفارش کشتار", + "نوع کشتار", + "وضعیت عدم وصول", + "پیغام عدم وصول", + "بررسی کننده", + "تاریخ تایید/رد", + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['A3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + "تعداد اولیه", + "وزن اولیه بار (کیلوگرم)", + "تحویلی دامپزشک (قطعه)", + "وزن تحویلی دامپزشک (کیلوگرم)", + + ] + + create_header(worksheet, header_list2, 5, 2, height=20.8, border_style='thin') + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'عدم وصول', size=11, color='red', + row2='D1') + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'A3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['A3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if serializer: + for data in serializer: + l += 1 + non_receipt_state_type = 'رد شده' + non_receipt_state = data.get('non_receipt_state') + if non_receipt_state: + if non_receipt_state == 'pending': + non_receipt_state_type = 'در انتظار تایید' + if non_receipt_state == 'accepted': + non_receipt_state_type = 'تایید شده' + non_receipt_check_date = data.get('non_receipt_check_date') + if non_receipt_check_date: + try: + non_receipt_check_date = datetime.datetime.strptime(str(non_receipt_check_date), + '%Y-%m-%dT%H:%M:%S.%f').date() + except ValueError: + non_receipt_check_date = datetime.datetime.strptime(str(non_receipt_check_date), + '%Y-%m-%dT%H:%M:%S').date() + non_receipt_check_date = shamsi_date(non_receipt_check_date, in_value=True) + else: + non_receipt_check_date = '-' + recive_date = data.get('kill_request', {}).get('recive_date') + if recive_date: + try: + recive_date = datetime.datetime.strptime(str(recive_date), '%Y-%m-%dT%H:%M:%S.%f').date() + except ValueError: + recive_date = datetime.datetime.strptime(str(recive_date), '%Y-%m-%dT%H:%M:%S').date() + recive_date = shamsi_date(recive_date, in_value=True) + else: + recive_date = '-' + + if data.get('poultry_request', {}).get('export') == False: + export_type = 'عادی' + else: + export_type = 'صادرات' + list1 = [ + m, + str(data.get('bar_code')) or "-", + data.get('traffic_code') or "-", + str(recive_date), + data.get('killhouse_user', {}).get('name') if data.get( + 'killhouse_user') else "-", + data.get('killhouse_user', {}).get('kill_house_operator', {}).get('user', {}).get('mobile') if data.get( + 'killhouse_user') else "-", + data.get('killer', {}).get('name') if data.get( + 'killer') else "-", + data.get('killer', {}).get('kill_house_operator', {}).get('user', {}).get('mobile') if data.get( + 'killer') else "-", + data.get('poultry_request', {}).get('poultry', {}).get('unit_name') if data.get( + 'poultry_request') else "-", + data.get('poultry_request', {}).get('poultry', {}).get('user', {}).get('mobile') if data.get( + 'poultry_request') else "-", + data.get('quantity') or "-", + data.get('weight_info', {}).get('weight') if data.get('weight_info') else "-", + data.get('price') or 0, + data.get('weight_info', {}).get('kill_house_price') if data.get('weight_info') else 0, + data.get('car', {}).get('type_car') if data.get('car') else "-", + data.get('car', {}).get('driver_name') if data.get('car') else "-", + data.get('vet_accepted_real_quantity') or 0, + data.get('vet_accepted_real_weight') or 0, + str(data.get('poultry_request', {}).get('order_code')) if data.get('poultry_request') else "-", + export_type, + non_receipt_state_type, + data.get('message') or "-", + data.get('non_receipt_checker') or "-", + str(non_receipt_check_date), + ] + m += 1 + + create_value(worksheet, list1, l + 1, 1) + total_quantity = sum( + data.get('quantity', 0) if data.get('quantity') != "-" else 0 + for data in serializer + ) + + total_weight = sum( + data.get('weight_info', {}).get('weight', 0) if data.get('weight_info') and data.get('weight_info', {}).get( + 'weight') != "-" else 0 + for data in serializer + ) + + total_price = sum( + data.get('price', 0) + for data in serializer + ) + + total_vet_accepted_real_quantity = sum( + data.get('vet_accepted_real_quantity', 0) + for data in serializer + ) + + total_vet_accepted_real_weight = sum( + data.get('vet_accepted_real_weight', 0) + for data in serializer + ) + + value_header_list2 = [ + total_quantity, + total_weight, + total_vet_accepted_real_quantity, + total_vet_accepted_real_weight + + ] + # + create_value(worksheet, value_header_list2, 3, 5, border_style='thin') + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_quantity, + total_weight, + '', + '', + '', + '', + total_vet_accepted_real_quantity, + total_vet_accepted_real_weight, + '', + '', + '', + '', + '', + '', + + ] + + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def return_kill_house_request_excel(request): + serializer_class = KillHouseRequestForBarManagementSerializer + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'KillHouse': + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2) + + else: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True)) + + else: + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house_requests = KillHouseRequest.objects.filter( + Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2) + + else: + kill_house_requests = KillHouseRequest.objects.filter( + Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True)) + + if 'search' in request.GET: + kill_house_request_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_house_requests) + kill_house_request_list = ps.filter() + kill_house_requests = [] if len(kill_house_request_list) == 0 else kill_house_request_list + + serializer = serializer_class(kill_house_requests, many=True).data + + header_list2 = [ + "ردیف", + "کد بار", + "کدسفارش", + "نوع درخواست", + "نوع کشتار", + "نام فارم", + "نام مرغدار", + "شهر مرغدار", + "تاریخ درخواست کشتار", + "تعداد بار", + "تاریخ ثبت بار", + "نام کشتارگاه", + "شهر کشتارگاه", + "وزن", + "میانگین وزنی", + "تعداد نهایی", + "وزن نهایی", + "قیمت مرغدار", + "قیمت کشتارگاه", + "وضعیت تایید", + "پلاک خودرو", + "نام راننده", + "عدم دریافت", + "پیام عدم دریافت", + "نوع برگشت" + ] + create_header(worksheet, header_list2, 1, 12, height=21.8, width=20, border_style='thin') + excel_description(worksheet, 'A2', f'بارهای بازگشتی', + size=11, color='red', row2='B4') + if serializer: + l = 13 + m = 1 + + for item in serializer: + state = "" + if item.get('state') == "pending": + state = "در انتظار تایید" + elif item.get('state') == "accepted": + state = "تایید شده" + elif item.get('state') == "rejected": + state = "رد شده" + + request_type = "" + if item.get('poultry_request', {}).get('market'): + request_type = "پنل معاملات" + elif item.get('poultry_request', {}).get('direct_buying'): + request_type = "خرید مستقیم" + elif item.get('warehouse'): + request_type = "انبار" + else: + request_type = "اتحادیه" + + kill_type = "" + if item.get('poultry_request', {}).get('freezing'): + kill_type = "انجماد" + elif item.get('poultry_request', {}).get('export'): + kill_type = "صادرات" + else: + kill_type = "عادی" + + list1 = [ + m, + str(item.get('bar_code') or "-"), + str(item.get('poultry_request', {}).get('order_code')) or "-", + request_type, + kill_type, + item.get('poultry_request', {}).get('poultry', {}).get('unit_name') or "-", + f"{item.get('poultry_request', {}).get('poultry', {}).get('user', {}).get('fullname') or '-'} ({item.get('poultry_request', {}).get('poultry', {}).get('user', {}).get('mobile') or '-'})", + item.get('poultry_request', {}).get('poultry', {}).get('address', {}).get('city', {}).get( + 'name') or "-", + str(shamsi_date(convert_str_to_date(item.get('kill_request', {}).get('recive_date')), in_value=True)), + item.get('quantity', 0), + str(shamsi_date(convert_str_to_date(item.get('create_date')), in_value=True)), + item.get('killhouse_user', {}).get('name') or item.get('killer', {}).get('name') or "-", + item.get('killhouse_user', {}).get('kill_house_operator', {}).get('user', {}).get('city', {}).get( + 'name') or item.get('killer', {}).get('kill_house_operator', {}).get('user', {}).get('city', + {}).get( + 'name') or "-", + item.get('weight_info', {}).get('weight', 0) if item.get('weight_info', {}).get( + 'weight') else "-", + item.get('weight_info', {}).get('index_weight', 0) if item.get('weight_info', {}).get( + 'index_weight') else "-", + item.get('accepted_real_quantity', 0), + item.get('accepted_real_weight', 0), + item.get('poultry_request', {}).get('amount', 0) if item.get('poultry_request', {}).get( + 'amount') else "-", + item.get('weight_info', {}).get('kill_house_price', 0) if item.get('weight_info', {}).get( + 'kill_house_price') else "-", + state, + item.get('car', {}).get('pelak') or "-", + item.get('car', {}).get('driver_name') or "-", + "دارد" if item.get('non_receipt') else "ندارد", + item.get('non_receipt_message') or "-", + ("کاربر" if item.get('non_receipt') and item.get('main_non_receipt') else "سیستم") + " " + str( + shamsi_date(convert_str_to_date(item.get('modify_date')))) + ] + + create_value(worksheet, list1, l, 1, border_style='thin', m=m) + m += 1 + l += 1 + header_list2 = [ + "تعداد کل تخصیصات", + "تعداد تخصیصات بازگشتی کاربر", + "تعداد تخصیصات بازگشتی سیستم", + "حجم کل تخصیصات", + "حجم تخصیصات بازگشتی کاربر", + "حجم تخصیصات بازگشتی سیستم", + "وزن کل تخصیصات", + "وزن بازگشتی کاربر", + "وزن بازگشتی سیستم", + "تعداد کل بارها", + "تعداد بارهای عدم وصول", + "تعداد بارهای بازگشتی سیستمی", + "حجم کل بارها", + "حجم بارهای عدم وصول", + "حجم بارهای بازگشتی سیستمی", + "وزن کل بارها", + "وزن بارهای عدم وصول", + "وزن بارهای بازگشتی سیستمی", + "وزن خریدهای بازگشتی با کارمزد", + "کارمزد خریدهای بازگشتی" + ] + create_header(worksheet, header_list2, 3, 3, height=21.8, width=20, color='C00000', border_style='thin') + + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_type = total_wage_type.filter(en_name='province-kill-request', trash=False).first() + province_live_wage_type_amount = province_live_wage_type.amount if province_live_wage_type.status == True else 0 + + province_kill_request_filters = { + 'archive_wage': False, + 'state__in': ('pending', 'accepted'), + 'first_car_allocated_quantity': 0 + } + + kill_house_request_filters = {} + if 'date1' in request.GET: + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + province_kill_request_filters['kill_request__recive_date__date__gte'] = date1 + province_kill_request_filters['kill_request__recive_date__date__lte'] = date2 + kill_house_request_filters['kill_request__recive_date__date__gte'] = date1 + kill_house_request_filters['kill_request__recive_date__date__lte'] = date2 + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + province_kill_request_filters['killhouse_user'] = kill_house + return_kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + Q(non_receipt=True, main_non_receipt=True, non_receipt_state__in=('pending', 'accepted')) | Q( + trash=True, return_trash=True), + **kill_house_request_filters) + else: + return_kill_house_requests = KillHouseRequest.objects.filter( + Q(non_receipt=True, main_non_receipt=True, non_receipt_state__in=('pending', 'accepted')) | Q( + trash=True, return_trash=True), + **kill_house_request_filters) + + return_province_kill_requests = ProvinceKillRequest.objects.filter( + Q(trash=False, return_to_province=True) | Q(trash=True, return_trash=True), + **province_kill_request_filters).order_by('id') + + return_province_kill_requests_aggregates = return_province_kill_requests.aggregate( + total_count=Count('id'), + total_operator_return_count=Count('id', filter=Q(trash=False, return_to_province=True)), + total_system_return_count=Count('id', filter=Q(trash=True, return_trash=True)), + total_quantity=Sum('total_killed_quantity'), + total_operator_return_quantity=Sum('main_quantity', filter=Q(trash=False, return_to_province=True)), + total_system_return_quantity=Sum('total_killed_quantity', filter=Q(trash=True, return_trash=True)), + total_weight=Sum('total_killed_weight'), + total_operator_return_weight=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight'), + filter=Q(trash=False, return_to_province=True)), + total_system_return_weight=Sum('total_killed_weight', filter=Q(trash=True, return_trash=True)), + + ) + return_kill_house_requests_aggregates = return_kill_house_requests.aggregate( + total_count=Count('id'), + total_non_receipt_count=Count('id', filter=Q(non_receipt=True, main_non_receipt=True)), + total_system_return_count=Count('id', filter=Q(trash=True, return_trash=True)), + total_quantity=Sum('accepted_real_quantity'), + total_non_receipt_quantity=Sum('accepted_real_quantity', filter=Q(non_receipt=True, main_non_receipt=True)), + total_system_return_quantity=Sum('accepted_real_quantity', filter=Q(trash=True, return_trash=True)), + total_weight=Sum('accepted_real_weight'), + total_non_receipt_weight=Sum('accepted_real_weight', filter=Q(non_receipt=True, main_non_receipt=True)), + total_system_return_weight=Sum('accepted_real_weight', filter=Q(trash=True, return_trash=True)), + ) + province_kill_request_total_operator_return_quantity = return_province_kill_requests_aggregates[ + 'total_operator_return_quantity'] or 0 + province_kill_request_total_system_return_quantity = return_province_kill_requests_aggregates[ + 'total_system_return_quantity'] or 0 + province_kill_request_total_quantity = province_kill_request_total_operator_return_quantity + province_kill_request_total_system_return_quantity + province_kill_request_total_operator_return_weight = return_province_kill_requests_aggregates[ + 'total_operator_return_weight'] or 0 + province_kill_request_total_system_return_weight = return_province_kill_requests_aggregates[ + 'total_system_return_weight'] or 0 + province_kill_request_total_weight = province_kill_request_total_operator_return_weight + province_kill_request_total_system_return_weight + kill_house_request_total_system_return_weight = return_kill_house_requests_aggregates[ + 'total_system_return_weight'] or 0 + total_return_weight_with_wage = province_kill_request_total_system_return_weight + kill_house_request_total_system_return_weight + result = { + "province_kill_request_total_count": return_province_kill_requests_aggregates['total_count'] or 0, + "province_kill_request_total_operator_return_count": return_province_kill_requests_aggregates[ + 'total_operator_return_count'] or 0, + "province_kill_request_total_system_return_count": return_province_kill_requests_aggregates[ + 'total_system_return_count'] or 0, + "province_kill_request_total_quantity": province_kill_request_total_quantity, + "province_kill_request_total_operator_return_quantity": province_kill_request_total_operator_return_quantity, + "province_kill_request_total_system_return_quantity": province_kill_request_total_system_return_quantity, + "province_kill_request_total_weight": province_kill_request_total_weight, + "province_kill_request_total_operator_return_weight": province_kill_request_total_operator_return_weight, + "province_kill_request_total_system_return_weight": province_kill_request_total_system_return_weight, + "kill_house_request_total_count": return_kill_house_requests_aggregates['total_count'] or 0, + "kill_house_request_total_non_receipt_count": return_kill_house_requests_aggregates[ + 'total_non_receipt_count'] or 0, + "kill_house_request_total_system_return_count": return_kill_house_requests_aggregates[ + 'total_system_return_count'] or 0, + "kill_house_request_total_quantity": return_kill_house_requests_aggregates['total_quantity'] or 0, + "kill_house_request_total_non_receipt_quantity": return_kill_house_requests_aggregates[ + 'total_non_receipt_quantity'] or 0, + "kill_house_request_total_system_return_quantity": return_kill_house_requests_aggregates[ + 'total_system_return_quantity'] or 0, + "kill_house_request_total_weight": return_kill_house_requests_aggregates['total_weight'] or 0, + "kill_house_request_total_non_receipt_weight": return_kill_house_requests_aggregates[ + 'total_non_receipt_weight'] or 0, + "kill_house_request_total_system_return_weight": kill_house_request_total_system_return_weight, + "total_return_weight_with_wage": total_return_weight_with_wage, + "total_return_wage": total_return_weight_with_wage * province_live_wage_type_amount, + } + value_header_list = [ + result.get('province_kill_request_total_count') or 0, + result.get('province_kill_request_total_operator_return_count') or 0, + result.get('province_kill_request_total_system_return_count') or 0, + result.get('province_kill_request_total_quantity') or 0, + result.get('province_kill_request_total_operator_return_quantity') or 0, + result.get('province_kill_request_total_system_return_quantity') or 0, + result.get('province_kill_request_total_weight') or 0, + result.get('province_kill_request_total_operator_return_weight') or 0, + result.get('province_kill_request_total_system_return_weight') or 0, + result.get('kill_house_request_total_count') or 0, + result.get('kill_house_request_total_non_receipt_count') or 0, + result.get('kill_house_request_total_system_return_count') or 0, + result.get('kill_house_request_total_quantity') or 0, + result.get('kill_house_request_total_non_receipt_quantity') or 0, + result.get('kill_house_request_total_system_return_quantity') or 0, + result.get('kill_house_request_total_weight') or 0, + result.get('kill_house_request_total_non_receipt_weight') or 0, + result.get('kill_house_request_total_system_return_weight') or 0, + result.get('total_return_weight_with_wage') or 0, + result.get('total_return_wage') or 0, + + ] + create_value(worksheet, value_header_list, 4, 3, border_style='thin') + + summary_list = [ + 'جمع کل==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + + create_value(worksheet, summary_list, l + 1, 1, color='green') + + 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 + + +def warehouse_archive_combined_excel(request): + # Filters for list + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + + list_filters = {"trash": False} + if date1: + list_filters['date__date__gte'] = date1 + list_filters['date__date__lte'] = date2 + + archives = WarehouseArchive.objects.filter(**list_filters).order_by('-create_date') + list_data = WarehouseArchiveSerializer(archives, many=True).data + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and str(value).strip(): + archives = archives.filter( + build_query(WarehouseArchiveFilterSet.Meta.fields, value) + ) + + # Build dashboard queryset like TotalKillHouseWarehouseArchiveDashboardViewSet + dash_filters = {"trash": False, "kill_house__isnull": False} + if date1: + dash_filters['create_date__date__gte'] = date1 + dash_filters['create_date__date__lte'] = date2 + dash_archives = WarehouseArchive.objects.filter(**dash_filters) + kill_houses = KillHouse.objects.filter(id__in=dash_archives.values_list('kill_house__id', flat=True), trash=False) + + if search == 'filter' and value not in ("", None, 'undefined'): + kh_list = [] + for item in [ + 'name', + 'kill_house_operator__user__mobile', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name', + ]: + query = QueryDict('{0}__contains={1}'.format(item, value)) + ps = KillHouseFilterSet(data=query, queryset=kill_houses) + if ps.filter().exists(): + kh_list = ps.filter() + kill_houses = kh_list if kh_list else kill_houses.none() + + dash_data = TotalKillHouseWarehouseArchiveDashboardSerializer( + kill_houses, many=True, context={'date1': date1, 'date2': date2} + ).data + + # Headers + excel_options = [ + 'ردیف', + 'تاریخ بایگانی', + 'تاریخ انبار', + 'نام کشتارگاه', + 'شهر', + 'وزن (کیلوگرم)', + 'نوع سهمیه', + 'ثبت کننده', + 'شماره تماس', + 'توضیحات', + ] + + header_list2 = [ + 'ردیف', + 'نام کشتارگاه', + 'تعداد کل', + 'تعداد دولتی', + 'تعداد آزاد', + 'وزن کل (کیلوگرم)', + 'وزن دولتی (کیلوگرم)', + 'وزن آزاد (کیلوگرم)', + ] + + # Workbook setup (single sheet) + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + # Title and date range (like sample) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if date1 and date2: + try: + d1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + d2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + from_date_1 = shamsi_date(d1) + to_date_1 = shamsi_date(d2) + worksheet['A3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + except Exception: + pass + + # Render dashboard header (to the top area, columns start at 5 like sample) + create_header(worksheet, header_list2, 5, 2, height=20.8, border_style='thin') + + # Compute where the list should start based on dashboard rows + dash_count = len(dash_data) if dash_data else 0 + list_header_row = 6 + dash_count + + # Render list header with freeze and filter below dashboard block + create_header_freez(worksheet, excel_options, 1, list_header_row, list_header_row + 1, 20) + + excel_description(worksheet, 'A1', f'مانده انبار کشتارگاه', size=11, color='red', row2='D1') + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'A3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['A3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + # Fill dashboard rows under header_list2 + # header_list2 is at row 5, so start values at row 6 + dash_row = 3 + for i, item in enumerate(dash_data, start=1): + vals = [ + i, + item.get('name', '-'), + (item.get('info') or {}).get('total_count', 0) or 0, + (item.get('info') or {}).get('total_governmental_count', 0) or 0, + (item.get('info') or {}).get('total_free_count', 0) or 0, + (item.get('info') or {}).get('total_weight', 0) or 0, + (item.get('info') or {}).get('total_governmental_weight', 0) or 0, + (item.get('info') or {}).get('total_free_weight', 0) or 0, + ] + create_value(worksheet, vals, dash_row, 5, border_style='thin') + dash_row += 1 + + # Fill list rows starting from computed list header (data starts at header_row + 1) + l = list_header_row + total_count = 0 + total_weight = 0 + governmental_count = 0 + governmental_weight = 0 + free_count = 0 + free_weight = 0 + + for idx, arc in enumerate(list_data, start=1): + l += 1 + cd = convert_str_to_date(arc.get('create_date')) + create_date_sh = str(shamsi_date(cd, in_value=True)) if cd else '-' + d = convert_str_to_date(arc.get('date')) + date_sh = str(shamsi_date(d, in_value=True)) if d else '-' + kh = arc.get('kill_house') or {} + kh_name = kh.get('name', '-') + city = kh.get('city', '-') + quota_val = arc.get('quota') + quota = 'آزاد' if quota_val == 'free' else ('دولتی' if quota_val == 'governmental' else (quota_val or '-')) + weight_val = arc.get('weight') or 0 + + # accumulate totals + total_count += 1 + total_weight += weight_val or 0 + if quota_val == 'governmental': + governmental_count += 1 + governmental_weight += weight_val or 0 + if quota_val == 'free': + free_count += 1 + free_weight += weight_val or 0 + + row_vals = [ + idx, + create_date_sh, + date_sh, + kh_name, + city, + weight_val, + quota, + arc.get('registerer') or '-', + arc.get('registerer_mobile') or '-', + arc.get('description') or '-', + ] + create_value(worksheet, row_vals, l, 1, border_style='thin') + + # summary row after list + summary_list = [ + 'جمع کل==>', + '', + '', + '', + '', + total_weight, + '', + '', + '', + '', + ] + + create_value(worksheet, summary_list, l + 1, 1, color='green') + + 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 + diff --git a/panel/KillHouse/helpers.py b/panel/KillHouse/helpers.py new file mode 100644 index 0000000..5d93938 --- /dev/null +++ b/panel/KillHouse/helpers.py @@ -0,0 +1,2034 @@ +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_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) + } + bars = requests.post('https://rsibackend.rasadyar.com/app/get_bar_info/', data=kill_house_list) + for bar in bars.json(): + kill_house = KillHouse.objects.filter(trash=False, unique_identifier=bar['jihadi_destination']).first() + if kill_house: + if not KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=bar['tracking']): + product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() + date = bar['date'] + + kill_house_free_bar_info = KillHouseFreeBarInformation( + kill_house=kill_house, + product=product, + ) + kill_house_free_bar_info.driver_name = 'سیستمی' + kill_house_free_bar_info.input_warehouse = kill_house + kill_house_free_bar_info.driver_mobile = '0' + kill_house_free_bar_info.poultry_name = bar['hatching']['poultry']['UnitName'] + kill_house_free_bar_info.poultry_mobile = bar['hatching']['poultry']['Mobile'] + kill_house_free_bar_info.province = bar['hatching']['poultry']['Province'] + kill_house_free_bar_info.city = bar['hatching']['poultry']['City'] + kill_house_free_bar_info.bar_clearance_code = bar['tracking'] + kill_house_free_bar_info.bar_clearance_code = bar['tracking'] + kill_house_free_bar_info.quantity = bar['quantity'] + kill_house_free_bar_info.live_weight = int(int(bar['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.status == 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 == 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() + 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) + } + bars = requests.post('https://rsibackend.rasadyar.com/app/get_bar_info/', data=kill_house_list) + for bar in bars.json(): + kill_house = KillHouse.objects.filter(trash=False, unique_identifier=bar['DesPartIdCode']).first() + if kill_house: + if not KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=bar['TrackingCode']): + product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() + + formatted_str = str(bar['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['hatching']['poultry']['UnitName'] + kill_house_free_bar_info.poultry_mobile = bar['hatching']['poultry']['Mobile'] + kill_house_free_bar_info.province = bar['hatching']['poultry']['Province'] + kill_house_free_bar_info.city = bar['hatching']['poultry']['City'] + kill_house_free_bar_info.bar_clearance_code = bar['TrackingCode'] + kill_house_free_bar_info.bar_clearance_code = bar['TrackingCode'] + kill_house_free_bar_info.quantity = bar['GoodAmount'] + kill_house_free_bar_info.live_weight = int(int(bar['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.status == 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 == 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() + + +def create_kill_house_free_barss(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) + } + bars = requests.post('https://rsibackend.rasadyar.com/app/get_bar_info/', data=kill_house_list) + for bar in bars.json(): + kill_house = KillHouse.objects.filter(trash=False, unique_identifier=bar['DesPartIdCode']).first() + if kill_house: + mm = KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=bar['TrackingCode']).first() + if mm: + mm.province = bar['hatching']['poultry']['Province'] + mm.city = bar['hatching']['poultry']['City'] + + mm.save() + + return HttpResponse('ok') + + +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 diff --git a/panel/KillHouse/serializers.py b/panel/KillHouse/serializers.py new file mode 100644 index 0000000..7e1a79f --- /dev/null +++ b/panel/KillHouse/serializers.py @@ -0,0 +1,6036 @@ +import datetime +from datetime import timedelta +from django.db.models import Sum, Q, F, Count +from rest_framework import serializers + +# import panel.KillHouse.serializers +from authentication.models import SystemUserProfile +from authentication.serializer.serializer import SystemUserProfileSerializer, BankCardSerializer, \ + SystemUserProfileForAutoAllocationSerializer, SystemUserProfileForGuildSerializer, \ + SystemUserProfileForPoultryLocSerializer, SystemUserProfileForInspectionSerializer +from authentication.serializers import UserProfileSerializer, SystemAddressSerializer +from deposit_id import wage_counting_type, new_out_selling_count_wage, before_out_buying_count_wage_amount +from deposit_percent import wage_percent, carcases_sell +from panel.KillHouse.helpers import get_finance_info, get_kill_house_finance_info, get_difference_carcasses_weight, \ + get_difference_carcasses_weight_kill, market_kill_request_share_quantity +from panel.models import \ + KillHouse, \ + KillHouseRequest, \ + KillRequest, \ + KillHouseCheckRequest, KillHouseAssignmentInformation, PoultryAssignmentInformation, \ + ProvinceCheckOperatorRequest, KillHouseADDCAR, Vet, VetCheckRequest, ProvinceKillRequest, KillHouseRequestExchange, \ + KillHouseRequestExchangeReserve, KillHouseRequestExchangeAddCar, PoultryRequestExchangeAccept, KillHouseDriver, \ + KillHouseOperator, KillHouseRequestAction, KillHouseRequestActionWinner, DriverRequestCancel, KillHouseVet, \ + KillHouseComplaint, CheckKillHouseComplaint, CheckUnusualCasualties, KillHouseAssignmentImages, KillRequestFactor, \ + KillRequestFactorPayment, AutomaticKillRequest, VetFarm, KillHouseCreditors, KillHouseAllowVet, Poultry, \ + ProvinceAllowKillHouseRegisterCar, KillHousePercentage, KillHouseDailyQuota, KillHouseFactorToProvince, \ + KillHouseWareHouse, KillHouseFreeBarInformation, PoultryRequest, ShareOfAllocation, \ + ProvinceAllowKillHouseDirectBuying, Pricing, KillHousePurchaseRequest, StewardAllocation, ProvinceOperator, \ + CityOperatorCheckRequest, CityOperator, StewardWareHouse, Steward, PoultryHatching, KillHouseFreeSaleBarInformation, \ + PaymentGatewayPercentage, SlaughterHouseTransaction, InternalTransaction, BarDocumentStatus, \ + KillHouseStewardGuildRelation, OutProvinceCarcassesBuyer, TypeActivity, WageType, RolesProducts, ColdHouse, \ + BarDifferenceRequest, PercentageOfWageType, PoultryRequestQuarantineCode, DirectBuyingPayment, PosSegmentation, \ + ProductsTransactions, WarehouseArchive + +from panel.poultry.serializers import PoultryRequestExchangeSerializer, PoultryRequestSerializer, \ + PoultryRequestForBarMangementSerializer, PoultrySerializer, PoultryForBarManagementSerializer, \ + PoultryForPoultryRequestLetterSerializer, OutProvincePoultryRequestBuyerSerializer, PoultryHatchingSerializer, \ + PoultryHatchingForBarDifferenceRequestSerializer, PoultryForPredictionSerializer, PoultryRequestForMarketSerializer, \ + PoultryHatchingForLocSerializer + + +class BarDocumentStatusSerializer(serializers.ModelSerializer): + class Meta: + model = BarDocumentStatus + fields = ['id', 'key', 'title', 'sms', 'is_error', 'priority_id'] + + +class KillHouseOperatorForAutoAllocationsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = KillHouseOperator + fields = ['user'] + + +class KillHouseOperatorForColdHouseSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + + class Meta: + model = KillHouseOperator + fields = ['user'] + + +# سریالایزر مربوط به اپراتور شهرستان +class KillHouseOperatorSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = KillHouseOperator + fields = '__all__' + + +class KillHouseOperatorForKillHouseDriverSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = KillHouseOperator + fields = ['user'] + + +class KillHouseOperatorForAllUserSerializer(serializers.ModelSerializer): + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = KillHouseOperator + fields = ['user_bank_info'] + + +class KillHouseForKillHouseDriverSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForKillHouseDriverSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['kill_house_operator', 'killer'] + + +class VetForKillHouseVetSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = Vet + fields = ['user'] + + +class KillHouseVetForKillHouseSerializer(serializers.ModelSerializer): + vet = VetForKillHouseVetSerializer(read_only=True) + + class Meta: + model = KillHouseVet + fields = ['vet'] + + +class KillHouseForKillHouseVetKillHouseSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForKillHouseDriverSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['kill_house_operator', 'name'] + + +class KillHouseForAllUserSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAllUserSerializer(read_only=True) + system_address = SystemAddressSerializer(read_only=True) + killers = serializers.SerializerMethodField('get_killers') + kill_house_vet = serializers.SerializerMethodField('get_kill_house_vet') + + class Meta: + model = KillHouse + exclude = ( + 'id', + 'trash', + 'created_by', + 'modified_by', + 'address', + 'car', + 'create_date', + 'modify_date', + 'killing_race', + 'phone', + 'shift_work_from', + 'shift_work_to', + 'user', + 'userprofile', + ) + + def get_killers(self, obj): + killers = KillHousePercentage.objects.filter(kill_house_for_killer__exact=obj) + return KillHousePercentageForKillerKillHousseSerializer(killers, many=True).data + + def get_kill_house_vet(self, obj): + kill_house_vet = KillHouseVet.objects.filter(kill_house__exact=obj, trash=False) + return KillHouseVetForKillHouseSerializer(kill_house_vet, many=True).data + + +class KillHouseForAutoAllocationSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['kill_house_operator', 'name', 'killer', 'key', 'maximum_load_volume_increase', + 'maximum_load_volume_reduction'] + + +class KillHouseForKillHouseGuildRelationSerializer(serializers.ModelSerializer): + # kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + city = serializers.CharField(source='kill_house_operator.user.city.name', read_only=True) + fullname = serializers.CharField(source='kill_house_operator.user.fullname', read_only=True) + mobile = serializers.CharField(source='kill_house_operator.user.mobile', read_only=True) + allocation_limit = serializers.SerializerMethodField('get_allocation_limit') + + class Meta: + model = KillHouse + fields = ['name', 'city', 'fullname', 'mobile', 'killer', 'key', 'allocation_limit'] + + def get_allocation_limit(self, obj): + guild = self.context.get('guild') + if guild: + relation = KillHouseStewardGuildRelation.objects.filter(kill_house=obj, guild=guild).first() + if relation: + return { + "allocation_limit": relation.allocation_limit, + "allocation_type": relation.allocation_type + } + return None + + +class KillHouseForKillHouseStewardRelationSerializer(serializers.ModelSerializer): + # kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + city = serializers.CharField(source='kill_house_operator.user.city.name', read_only=True) + fullname = serializers.CharField(source='kill_house_operator.user.fullname', read_only=True) + mobile = serializers.CharField(source='kill_house_operator.user.mobile', read_only=True) + allocation_limit = serializers.SerializerMethodField('get_allocation_limit') + + class Meta: + model = KillHouse + fields = ['name', 'city', 'fullname', 'mobile', 'killer', 'key', 'allocation_limit'] + + def get_allocation_limit(self, obj): + guild = self.context.get('guild') + if guild: + relation = KillHouseStewardGuildRelation.objects.filter(kill_house=obj, steward=guild).first() + if relation: + return { + "allocation_limit": relation.allocation_limit, + "allocation_type": relation.allocation_type + } + return None + + +class KillHouseForCommonlyUsedSerializer(serializers.ModelSerializer): + city = serializers.CharField(source='kill_house_operator.user.city.name', read_only=True) + fullname = serializers.CharField(source='kill_house_operator.user.fullname', read_only=True) + mobile = serializers.CharField(source='kill_house_operator.user.mobile', read_only=True) + + class Meta: + model = KillHouse + fields = ['name', 'city', 'fullname', 'mobile', 'killer', 'key', 'market_capacity_percent', + 'market_light_capacity', 'market_light_capacity_percent', 'market_buying', 'market_buying_limitation', + 'total_kill_capacity', 'total_kill_capacity_percent', 'max_kill_limit', + 'market_buying_capacity_percent_status', + 'governmental_selling_permission', 'free_selling_permission', + 'in_province_governmental_selling_percent', + 'out_province_governmental_selling_percent', 'segmentation_governmental_percent', + 'in_province_free_selling_percent', 'out_province_free_selling_percent', + 'segmentation_free_selling_percent', + 'cold_house_governmental_percent', + 'cold_house_free_percent', + 'free_sale_form_governmental_quota', + 'out_province_free_buying_commitment_percent', + 'free_sale_from_free_quota_in_province', + ] + + +class KillHouseForReturnBuyingSerializer(serializers.ModelSerializer): + city = serializers.CharField(source='kill_house_operator.user.city.name', read_only=True) + fullname = serializers.CharField(source='kill_house_operator.user.fullname', read_only=True) + mobile = serializers.CharField(source='kill_house_operator.user.mobile', read_only=True) + + class Meta: + model = KillHouse + fields = ['name', 'city', 'fullname', 'mobile', 'killer', 'key'] + + +class KillHouseForColdHouseAllocationSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'info'] + + def get_info(self, obj): + date1 = self.context.get('date1') + date2 = self.context.get('date2') + if date1: + + cold_house_allocations = StewardAllocation.objects.filter( + kill_house=obj, + date__date__gte=date1, + date__date__lte=date2, + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False) + + else: + cold_house_allocations = StewardAllocation.objects.filter( + kill_house=obj, + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False) + + self_allocations = cold_house_allocations.filter(kill_house=obj, to_cold_house__kill_house=obj) + other_allocations = cold_house_allocations.filter(kill_house=obj).exclude(to_cold_house__kill_house=obj) + + cold_house_allocations_weight = \ + cold_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + self_allocations_weight = \ + self_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + other_allocations_weight = \ + other_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + result = { + "total_allocations_count": cold_house_allocations.count(), + "total_allocations_weight": cold_house_allocations_weight, + "total_self_allocations_count": self_allocations.count(), + "total_self_allocations_weight": self_allocations_weight, + "total_other_allocations_count": other_allocations.count(), + "total_other_allocations_weight": other_allocations_weight, + + } + return result + + +class KillHouseForSegmentationSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'info'] + + def get_info(self, obj): + date1 = self.context.get('date1') + date2 = self.context.get('date2') + if date1: + + segmentations = PosSegmentation.objects.filter(kill_house=obj, trash=False, date__date__gte=date1, + date__date__lte=date2) + + else: + segmentations = PosSegmentation.objects.filter(kill_house=obj, trash=False) + + segmentations_aggregates = segmentations.aggregate( + total_count=Count('id'), + total_self_count=Count('id', filter=Q(to_guild__isnull=True)), + total_other_count=Count('id', filter=Q(to_guild__isnull=False)), + total_weight=Sum('weight'), + total_self_weight=Sum('weight', filter=Q(to_guild__isnull=True)), + total_other_weight=Sum('weight', filter=Q(to_guild__isnull=False)), + + ) + + result = { + "total_count": segmentations_aggregates['total_count'] or 0, + "total_weight": segmentations_aggregates['total_weight'] or 0, + "total_self_count": segmentations_aggregates['total_self_count'] or 0, + "total_self_weight": segmentations_aggregates['total_self_weight'] or 0, + "total_other_count": segmentations_aggregates['total_other_count'] or 0, + "total_other_weight": segmentations_aggregates['total_other_weight'] or 0 + + } + return result + + +# class TotalKillHouseRemainWeightViewSetSerializer(serializers.ModelSerializer): +# info = serializers.SerializerMethodField('get_info') +# +# class Meta: +# model = KillHouse +# fields = ['key', 'name', 'info'] +# +# def get_info(self, obj): +# product = RolesProducts.objects.filter(kill_house=obj, trash=False, name='مرغ گرم').first() +# archives = WarehouseArchive.objects.filter(kill_house=obj, trash=False,warehouse=True) +# today = datetime.datetime.now().date() +# yesterday = today - timedelta(days=1) +# two_days_ago = yesterday - timedelta(days=1) +# date_list=[two_days_ago,yesterday,two_days_ago] +# +# all_dates = set() +# +# all_dates.update( +# KillHouseRequest.objects.filter( +# input_warehouse=obj, +# ware_house_confirmation=True, trash=False, calculate_status=True, warehouse=True +# ).values_list('kill_request__recive_date__date', flat=True) +# ) +# +# all_dates.update( +# KillHouseFreeBarInformation.objects.filter( +# input_warehouse=obj, trash=False, calculate_status=True, warehouse=True +# ).exclude(entered_message='ورود به انبار مجازی') +# .values_list('date__date', flat=True) +# ) +# +# all_dates.update( +# StewardAllocation.objects.filter( +# kill_house=obj, trash=False, calculate_status=True, warehouse=True, +# receiver_state__in=('pending', 'accepted') +# ).values_list('production_date__date', flat=True) +# ) +# +# all_dates.update( +# KillHouseFreeSaleBarInformation.objects.filter( +# kill_house=obj, trash=False, calculate_status=True, warehouse=True +# ).values_list('production_date__date', flat=True) +# ) +# +# all_dates.update( +# PosSegmentation.objects.filter( +# kill_house=obj, trash=False, warehouse=True +# ).values_list('production_date__date', flat=True) +# ) +# +# all_dates.update( +# ProductsTransactions.objects.filter( +# product=product, transaction__paid=True, trash=False, warehouse=True +# ).values_list('transaction__date__date', flat=True) +# ) +# +# days = sorted([d for d in all_dates if d is not None]) +# +# if not days: +# return None +# +# kill_house_requests = KillHouseRequest.objects.filter( +# input_warehouse=obj, +# ware_house_confirmation=True, trash=False, calculate_status=True, warehouse=True +# ) +# +# kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter( +# input_warehouse=obj, trash=False, calculate_status=True, warehouse=True +# ).exclude(entered_message='ورود به انبار مجازی') +# +# kill_house_allocations = StewardAllocation.objects.filter( +# kill_house=obj, trash=False, calculate_status=True, warehouse=True, +# receiver_state__in=('pending', 'accepted') +# ) +# +# kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( +# kill_house=obj, trash=False, calculate_status=True, warehouse=True +# ) +# +# segmentations = PosSegmentation.objects.filter( +# kill_house=obj, trash=False, warehouse=True +# ) +# +# transactions = ProductsTransactions.objects.filter( +# product=product, transaction__paid=True, trash=False, warehouse=True +# ) +# +# governmental_list = [] +# free_list = [] +# +# for day in days: +# kill_house_requests_info = kill_house_requests.aggregate( +# total_kill_house_request_governmental_weight=Sum( +# 'ware_house_accepted_real_weight', +# filter=Q( +# province_request__poultry_request__free_sale_in_province=False, +# kill_request__recive_date__date=day +# ) +# ), +# total_kill_house_request_free_weight=Sum( +# 'ware_house_accepted_real_weight', +# filter=Q( +# province_request__poultry_request__free_sale_in_province=True, +# kill_request__recive_date__date=day +# ) +# ), +# ) +# +# kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate( +# total_kill_house_free_buying_bars_weight=Sum('weight_of_carcasses', filter=Q(date__date=day)) +# ) +# +# kill_house_allocations_info = kill_house_allocations.aggregate( +# total_kill_house_allocations_governmental_weight=Sum( +# 'real_weight_of_carcasses', filter=Q(quota='governmental', production_date__date=day) +# ), +# total_kill_house_allocations_free_weight=Sum( +# 'real_weight_of_carcasses', filter=Q(quota='free', production_date__date=day) +# ), +# ) +# +# kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate( +# total_kill_house_free_sale_bars_governmental_weight=Sum( +# 'real_weight_of_carcasses', filter=Q(quota='governmental', production_date__date=day) +# ), +# total_kill_house_free_sale_bars_free_weight=Sum( +# 'real_weight_of_carcasses', filter=Q(quota='free', production_date__date=day) +# ), +# ) +# +# segmentations_info = segmentations.aggregate( +# segmentations_governmental_weight=Sum('weight', +# filter=Q(quota='governmental', production_date__date=day)), +# segmentations_free_weight=Sum('weight', filter=Q(quota='free', production_date__date=day)), +# ) +# +# pos_allocated_weight_info = transactions.aggregate( +# pos_governmental_allocated_weight=Sum('cur_weight', +# filter=Q(price_approved=True, transaction__date__date=day)), +# pos_free_allocated_weight=Sum('cur_weight', +# filter=Q(price_approved=False, transaction__date__date=day)), +# ) +# archives_info = archives.aggregate( +# total_archive_governmental_weight=Sum('weight', filter=Q(date__date=day, quota='governmental')), +# total_archive_free_weight=Sum('weight', filter=Q(date__date=day, quota='free')), +# ) +# +# total_kill_house_request_governmental_weight = kill_house_requests_info[ +# 'total_kill_house_request_governmental_weight'] or 0 +# total_kill_house_request_free_weight = kill_house_requests_info['total_kill_house_request_free_weight'] or 0 +# total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info[ +# 'total_kill_house_free_buying_bars_weight'] or 0 +# total_kill_house_allocations_governmental_weight = kill_house_allocations_info[ +# 'total_kill_house_allocations_governmental_weight'] or 0 +# total_kill_house_allocations_free_weight = kill_house_allocations_info[ +# 'total_kill_house_allocations_free_weight'] or 0 +# total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info[ +# 'total_kill_house_free_sale_bars_governmental_weight'] or 0 +# total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info[ +# 'total_kill_house_free_sale_bars_free_weight'] or 0 +# segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 +# segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 +# pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 +# pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 +# total_archive_governmental_weight = archives_info['total_archive_governmental_weight'] or 0 +# total_archive_free_weight = archives_info['total_archive_free_weight'] or 0 +# +# total_governmental_input = total_kill_house_request_governmental_weight +# total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight +# total_governmental_output = ( +# total_kill_house_allocations_governmental_weight + +# total_kill_house_free_sale_bars_governmental_weight + +# segmentations_governmental_weight + +# int(pos_governmental_allocated_weight / 1000) +# ) +# total_free_output = ( +# total_kill_house_allocations_free_weight + +# total_kill_house_free_sale_bars_free_weight + +# segmentations_free_weight + +# int(pos_free_allocated_weight / 1000) +# ) +# governmental_amount = ( +# total_governmental_input - total_governmental_output) - total_archive_governmental_weight +# free_amount = (total_free_input - total_free_output) - total_archive_free_weight +# governmental_data = { +# 'day': day, +# 'amount': governmental_amount, +# } +# free_data = { +# 'day': day, +# 'amount': free_amount, +# } +# if day not in date_list: +# +# if governmental_amount > 0: +# governmental_list.append(governmental_data) +# if free_amount > 0: +# free_list.append(free_data) +# +# final_dict = { +# 'governmental': governmental_list, +# 'free': free_list +# } +# return final_dict +class TotalKillHouseRemainWeightViewSetSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'info'] + + def get_info(self, obj): + product = RolesProducts.objects.filter(kill_house=obj, trash=False, name='مرغ گرم').first() + archives = WarehouseArchive.objects.filter(kill_house=obj, trash=False,warehouse=True) + today = datetime.datetime.now().date() + yesterday = today - timedelta(days=1) + two_days_ago = yesterday - timedelta(days=1) + date_list=[two_days_ago,yesterday,two_days_ago] + + all_dates = set() + + all_dates.update( + KillHouseRequest.objects.filter( + input_warehouse=obj, + ware_house_confirmation=True, trash=False, calculate_status=True, warehouse=True + ).values_list('kill_request__recive_date__date', flat=True) + ) + + all_dates.update( + KillHouseFreeBarInformation.objects.filter( + input_warehouse=obj, trash=False, calculate_status=True, warehouse=True + ).exclude(entered_message='ورود به انبار مجازی') + .values_list('date__date', flat=True) + ) + + all_dates.update( + StewardAllocation.objects.filter( + kill_house=obj, trash=False, calculate_status=True, warehouse=True, + receiver_state__in=('pending', 'accepted') + ).values_list('production_date__date', flat=True) + ) + + all_dates.update( + KillHouseFreeSaleBarInformation.objects.filter( + kill_house=obj, trash=False, calculate_status=True, warehouse=True + ).values_list('production_date__date', flat=True) + ) + + all_dates.update( + PosSegmentation.objects.filter( + kill_house=obj, trash=False, warehouse=True + ).values_list('production_date__date', flat=True) + ) + + all_dates.update( + ProductsTransactions.objects.filter( + product=product, transaction__paid=True, trash=False, warehouse=True + ).values_list('transaction__date__date', flat=True) + ) + + days = sorted([d for d in all_dates if d is not None]) + + if not days: + return None + + kill_house_requests = KillHouseRequest.objects.filter( + input_warehouse=obj, + ware_house_confirmation=True, trash=False, calculate_status=True, warehouse=True + ) + + kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter( + input_warehouse=obj, trash=False, calculate_status=True, warehouse=True + ).exclude(entered_message='ورود به انبار مجازی') + + kill_house_allocations = StewardAllocation.objects.filter( + kill_house=obj, trash=False, calculate_status=True, warehouse=True, + receiver_state__in=('pending', 'accepted') + ) + + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=obj, trash=False, calculate_status=True, warehouse=True + ) + + segmentations = PosSegmentation.objects.filter( + kill_house=obj, trash=False, warehouse=True + ) + + transactions = ProductsTransactions.objects.filter( + product=product, transaction__paid=True, trash=False, warehouse=True + ) + + governmental_list = [] + free_list = [] + + for day in days: + kill_house_requests_info = kill_house_requests.aggregate( + total_kill_house_request_governmental_weight=Sum( + 'ware_house_accepted_real_weight', + filter=Q( + province_request__poultry_request__free_sale_in_province=False, + kill_request__recive_date__date=day + ) + ), + total_kill_house_request_free_weight=Sum( + 'ware_house_accepted_real_weight', + filter=Q( + province_request__poultry_request__free_sale_in_province=True, + kill_request__recive_date__date=day + ) + ), + ) + + kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate( + total_kill_house_free_buying_bars_weight=Sum('weight_of_carcasses', filter=Q(date__date=day)) + ) + + kill_house_allocations_info = kill_house_allocations.aggregate( + total_kill_house_allocations_governmental_weight=Sum( + 'real_weight_of_carcasses', filter=Q(quota='governmental', production_date__date=day) + ), + total_kill_house_allocations_free_weight=Sum( + 'real_weight_of_carcasses', filter=Q(quota='free', production_date__date=day) + ), + ) + + kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate( + total_kill_house_free_sale_bars_governmental_weight=Sum( + 'real_weight_of_carcasses', filter=Q(quota='governmental', production_date__date=day) + ), + total_kill_house_free_sale_bars_free_weight=Sum( + 'real_weight_of_carcasses', filter=Q(quota='free', production_date__date=day) + ), + ) + + segmentations_info = segmentations.aggregate( + segmentations_governmental_weight=Sum('weight', + filter=Q(quota='governmental', production_date__date=day)), + segmentations_free_weight=Sum('weight', filter=Q(quota='free', production_date__date=day)), + ) + + pos_allocated_weight_info = transactions.aggregate( + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True, transaction__date__date=day)), + pos_free_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=False, transaction__date__date=day)), + ) + archives_info = archives.aggregate( + total_archive_governmental_weight=Sum('weight', filter=Q(date__date=day, quota='governmental')), + total_archive_free_weight=Sum('weight', filter=Q(date__date=day, quota='free')), + ) + + total_kill_house_request_governmental_weight = kill_house_requests_info[ + 'total_kill_house_request_governmental_weight'] or 0 + total_kill_house_request_free_weight = kill_house_requests_info['total_kill_house_request_free_weight'] or 0 + total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info[ + 'total_kill_house_free_buying_bars_weight'] or 0 + total_kill_house_allocations_governmental_weight = kill_house_allocations_info[ + 'total_kill_house_allocations_governmental_weight'] or 0 + total_kill_house_allocations_free_weight = kill_house_allocations_info[ + 'total_kill_house_allocations_free_weight'] or 0 + total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info[ + 'total_kill_house_free_sale_bars_governmental_weight'] or 0 + total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info[ + 'total_kill_house_free_sale_bars_free_weight'] or 0 + segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 + segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + total_archive_governmental_weight = archives_info['total_archive_governmental_weight'] or 0 + total_archive_free_weight = archives_info['total_archive_free_weight'] or 0 + + total_governmental_input = total_kill_house_request_governmental_weight + total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight + total_governmental_output = ( + total_kill_house_allocations_governmental_weight + + total_kill_house_free_sale_bars_governmental_weight + + segmentations_governmental_weight + + int(pos_governmental_allocated_weight / 1000) + ) + total_free_output = ( + total_kill_house_allocations_free_weight + + total_kill_house_free_sale_bars_free_weight + + segmentations_free_weight + + int(pos_free_allocated_weight / 1000) + ) + governmental_amount = ( + total_governmental_input - total_governmental_output) - total_archive_governmental_weight + free_amount = (total_free_input - total_free_output) - total_archive_free_weight + governmental_data = { + 'day': day, + 'amount': governmental_amount, + } + free_data = { + 'day': day, + 'amount': free_amount, + } + if day not in date_list: + + if governmental_amount > 0: + governmental_list.append(governmental_data) + if free_amount > 0: + free_list.append(free_data) + + final_dict = { + 'governmental': governmental_list, + 'free': free_list + } + return final_dict + +class TotalKillHouseWarehouseArchiveDashboardSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'info'] + + def get_info(self, obj): + date1 = self.context.get('date1') + date2 = self.context.get('date2') + if date1: + archives = WarehouseArchive.objects.filter(trash=False, kill_house=obj, create_date__date__gte=date1, + create_date__date__lte=date2) + + else: + archives = WarehouseArchive.objects.filter(trash=False, kill_house=obj) + + archives_info = archives.aggregate( + total_count=Count('id'), + total_governmental_count=Count('id', filter=Q(quota='governmental')), + total_free_count=Count('id', filter=Q(quota='free')), + total_weight=Sum('weight'), + total_governmental_weight=Sum('weight', filter=Q(quota='governmental')), + total_free_weight=Sum('weight', filter=Q(quota='free')), + ) + + total_count = archives_info['total_count'] or 0 + total_governmental_count = archives_info['total_governmental_count'] or 0 + total_free_count = archives_info['total_free_count'] or 0 + total_weight = archives_info['total_weight'] or 0 + total_governmental_weight = archives_info['total_governmental_weight'] or 0 + total_free_weight = archives_info['total_free_weight'] or 0 + + result = { + 'total_count': total_count, + 'total_governmental_count': total_governmental_count, + 'total_free_count': total_free_count, + 'total_weight': total_weight, + 'total_governmental_weight': total_governmental_weight, + 'total_free_weight': total_free_weight, + } + return result + + +class KillHouseComparativeInformationSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_ware_house_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'info'] + + def _calculate_info(self, obj, date1=None, date2=None): + product = RolesProducts.objects.filter(kill_house=obj, trash=False, name='مرغ گرم').first() + + if date1: + bars_date1 = date1 + bars_date2 = date2 + # bars_date1 = date1 - timedelta(days=1) + # bars_date2 = date2 - timedelta(days=1) + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, archive_wage=False, + return_to_province=False, + state__in=('pending', 'accepted'), + trash=False, + temporary_trash=False, + temporary_deleted=False, + kill_request__recive_date__date__gte=bars_date1, + kill_request__recive_date__date__lte=bars_date2) + + kill_house_requests = KillHouseRequest.objects.filter( + killhouse_user=obj, + non_receipt=False, + trash=False, calculate_status=True, kill_request__recive_date__date__gte=bars_date1, + kill_request__recive_date__date__lte=bars_date2 + ) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(Q(date__date__gte=date1, + date__date__lte=date2, + buy_type='carcass') | Q( + create_date__date__gte=date1, create_date__date__lte=date2, buy_type='live'), kill_house=obj, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter(kill_house=obj, + date__date__gte=date1, + date__date__lte=date2, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + + kill_house_allocations = StewardAllocation.objects.filter(kill_house=obj, trash=False, + receiver_state__in=('pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True, date__date__gte=date1, + date__date__lte=date2) + segmentations = PosSegmentation.objects.filter(kill_house=obj, trash=False, date__date__gte=date1, + date__date__lte=date2) + cold_house_allocations = StewardAllocation.objects.filter( + kill_house=obj, + date__date__gte=date1, + date__date__lte=date2, + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, + transaction__date__date__gte=date1, + transaction__date__date__lte=date2, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(kill_house=obj,date__date__gte=date1,date__date__lte=date2, trash=False) + + + else: + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, archive_wage=False, + return_to_province=False, + state__in=('pending', 'accepted'), + trash=False, + temporary_trash=False, + temporary_deleted=False) + + kill_house_requests = KillHouseRequest.objects.filter(killhouse_user=obj, + trash=False, + non_receipt=False, + calculate_status=True) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(kill_house=obj, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter(kill_house=obj, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + + kill_house_allocations = StewardAllocation.objects.filter(kill_house=obj, trash=False, + receiver_state__in=('pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True) + segmentations = PosSegmentation.objects.filter(kill_house=obj, trash=False) + cold_house_allocations = StewardAllocation.objects.filter( + kill_house=obj, + + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(kill_house=obj, trash=False) + + + province_kill_request_info = province_kill_requests.aggregate( + total_province_kill_request_count=Count('id'), + total_province_kill_request_quantity=Sum('total_killed_quantity'), + total_province_kill_request_weight=Sum('total_killed_weight'), + + ) + kill_house_request_info = kill_house_requests.aggregate( + total_kill_house_request_quantity=Sum('accepted_real_quantity'), + total_kill_house_request_governmental_quantity=Sum('accepted_real_quantity', + filter=Q( + province_request__poultry_request__free_sale_in_province=False)), + total_kill_house_request_free_quantity=Sum('accepted_real_quantity', + filter=Q( + province_request__poultry_request__free_sale_in_province=True)), + total_kill_house_request_warehouse_entered_quantity=Sum('accepted_real_quantity', + filter=Q(ware_house_confirmation=True)), + total_kill_house_request_warehouse_entered_weight=Sum('accepted_real_weight', + filter=Q(ware_house_confirmation=True)), + total_kill_house_request_warehouse_cacasses_entered_weight=Sum('ware_house_accepted_real_weight', + filter=Q(ware_house_confirmation=True)), + + total_kill_house_request_warehouse_entered_governmental_weight=Sum('ware_house_accepted_real_weight', + filter=Q(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=False)), + total_kill_house_request_warehouse_entered_free_weight=Sum('ware_house_accepted_real_weight', + filter=Q(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=True)), + ) + kill_house_free_bar_info = kill_house_free_bar_informations.aggregate( + total_kill_house_free_bar_carcass_total_weight=Sum('weight_of_carcasses'), + total_kill_house_free_bar_live_total_quantity=Sum('quantity', filter=Q(buy_type='live')), + total_kill_house_entered_free_bar_live_total_weight=Sum('live_weight', + filter=Q(buy_type='live', ware_house=True)), + total_kill_house_entered_free_bar_live_carcasses_total_weight=Sum('weight_of_carcasses', + filter=Q(buy_type='live', + ware_house=True)), + total_kill_house_entered_free_bar_live_total_quantity=Sum('quantity', + filter=Q(buy_type='live', ware_house=True)), + ) + + kill_house_free_Sale_bar_info = kill_house_free_Sale_bar_informations.aggregate( + total_kill_house_free_Sale_bar_weight=Sum('real_weight_of_carcasses'), + total_kill_house_free_Sale_bar_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental')), + total_kill_house_free_Sale_bar_free_weight=Sum('real_weight_of_carcasses', filter=Q(quota='free')), + ) + + kill_house_allocations_info = kill_house_allocations.aggregate( + total_kill_house_allocations_weight=Sum('real_weight_of_carcasses'), + total_kill_house_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental')), + total_kill_house_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free')), + ) + + segmentations_aggregates_info = segmentations.aggregate( + total_segmentations_weight=Sum('weight'), + total_segmentations_governmental_weight=Sum('weight', filter=Q(quota='governmental')), + total_segmentations_free_weight=Sum('weight', filter=Q(quota='free')), + ) + cold_house_allocations_info = cold_house_allocations.aggregate( + total_cold_house_allocations_weight=Sum('real_weight_of_carcasses'), + total_cold_house_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental')), + total_cold_house_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free')), + ) + pos_allocated_weight_info = transactions.aggregate( + pos_allocated_weight=Sum('cur_weight'), + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + archives_info = archives.aggregate( + total_archive_governmental_weight=Sum('weight', filter=Q(quota='governmental')), + total_archive_free_weight=Sum('weight', filter=Q(quota='free')), + ) + + return {**province_kill_request_info, **kill_house_request_info, **kill_house_free_bar_info, + **kill_house_free_Sale_bar_info, **kill_house_allocations_info, **segmentations_aggregates_info,**pos_allocated_weight_info, + **cold_house_allocations_info,**archives_info} + + def get_ware_house_info(self, obj): + product_remain_weight = RolesProducts.objects.filter(kill_house=obj, trash=False).only( + 'total_remain_weight').first() + product_remain_weight = product_remain_weight.total_remain_weight if product_remain_weight else 0 + date1 = self.context.get('date1') + date2 = self.context.get('date2') + rsi_data = self.context.get('rsi_data') + kill_house_rsi_info = next( + (obj_info for obj_info in rsi_data if obj_info["PartIdCode"] == obj.unique_identifier), None) + if date1 and date2: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + + total_info = self._calculate_info(obj, date1, date2) if date1 else self._calculate_info(obj) + + total_province_kill_requests_quantity = total_info['total_province_kill_request_quantity'] or 0 + total_kill_house_request_governmental_quantity = total_info[ + 'total_kill_house_request_governmental_quantity'] or 0 + total_kill_house_request_free_quantity = total_info['total_kill_house_request_free_quantity'] or 0 + total_kill_house_free_bar_live_total_quantity = total_info['total_kill_house_free_bar_live_total_quantity'] or 0 + total_live_bars_quantity = total_kill_house_request_governmental_quantity + total_kill_house_request_free_quantity + total_kill_house_free_bar_live_total_quantity + total_kill_house_request_warehouse_entered_quantity = total_info[ + 'total_kill_house_request_warehouse_entered_quantity'] or 0 + total_kill_house_entered_free_bar_live_total_quantity = total_info[ + 'total_kill_house_entered_free_bar_live_total_quantity'] or 0 + total_entered_warehouse_bars_quantity = total_kill_house_request_warehouse_entered_quantity + total_kill_house_entered_free_bar_live_total_quantity + total_kill_house_request_warehouse_entered_weight = total_info[ + 'total_kill_house_request_warehouse_entered_weight'] or 0 + total_kill_house_entered_free_bar_live_total_weight = total_info[ + 'total_kill_house_entered_free_bar_live_total_weight'] or 0 + total_entered_warehouse_bars_weight = total_kill_house_request_warehouse_entered_weight + total_kill_house_entered_free_bar_live_total_weight + total_kill_house_request_warehouse_cacasses_entered_weight = total_info[ + 'total_kill_house_request_warehouse_cacasses_entered_weight'] or 0 + total_kill_house_entered_free_bar_live_carcasses_total_weight = total_info[ + 'total_kill_house_entered_free_bar_live_carcasses_total_weight'] or 0 + total_kill_house_free_bar_carcass_total_weight = total_info[ + 'total_kill_house_free_bar_carcass_total_weight'] or 0 + total_kill_house_request_warehouse_entered_governmental_weight = total_info[ + 'total_kill_house_request_warehouse_entered_governmental_weight'] or 0 + total_kill_house_request_warehouse_entered_free_weight = total_info[ + 'total_kill_house_request_warehouse_entered_free_weight'] or 0 + total_kill_house_warehouse_cacasses_entered_weight = total_kill_house_request_warehouse_cacasses_entered_weight + total_kill_house_free_bar_carcass_total_weight + total_kill_house_warehouse_govermental_cacasses_entered_weight = total_kill_house_request_warehouse_entered_governmental_weight + total_kill_house_warehouse_free_cacasses_entered_weight = total_kill_house_request_warehouse_entered_free_weight + total_kill_house_entered_free_bar_live_carcasses_total_weight + total_kill_house_free_Sale_bar_weight = total_info['total_kill_house_free_Sale_bar_weight'] or 0 + total_kill_house_free_Sale_bar_governmental_weight = total_info[ + 'total_kill_house_free_Sale_bar_governmental_weight'] or 0 + total_kill_house_free_Sale_bar_free_weight = total_info['total_kill_house_free_Sale_bar_free_weight'] or 0 + total_kill_house_allocations_weight = total_info['total_kill_house_allocations_weight'] or 0 + total_kill_house_allocations_governmental_weight = total_info[ + 'total_kill_house_allocations_governmental_weight'] or 0 + total_kill_house_allocations_free_weight = total_info['total_kill_house_allocations_free_weight'] or 0 + total_segmentations_weight = total_info['total_segmentations_weight'] or 0 + total_segmentations_governmental_weight = total_info['total_segmentations_governmental_weight'] or 0 + total_segmentations_free_weight = total_info['total_segmentations_free_weight'] or 0 + total_cold_house_allocations_weight = total_info['total_cold_house_allocations_weight'] or 0 + total_cold_house_allocations_governmental_weight = total_info[ + 'total_cold_house_allocations_governmental_weight'] or 0 + total_cold_house_allocations_free_weight = total_info['total_cold_house_allocations_free_weight'] or 0 + pos_allocated_weight = total_info['pos_allocated_weight'] or 0 + pos_governmental_allocated_weight = total_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = total_info['pos_free_allocated_weight'] or 0 + total_archive_governmental_weight = total_info['total_archive_governmental_weight'] or 0 + total_archive_free_weight = total_info['total_archive_free_weight'] or 0 + total_input_weight = total_kill_house_warehouse_cacasses_entered_weight + total_governmental_input_weight = total_kill_house_request_warehouse_entered_governmental_weight + total_free_input_weight = total_kill_house_request_warehouse_entered_free_weight + total_kill_house_free_bar_carcass_total_weight + total_output_weight = total_kill_house_free_Sale_bar_weight + total_kill_house_allocations_weight + total_segmentations_weight + total_cold_house_allocations_weight + total_output_governmental_weight = total_kill_house_free_Sale_bar_governmental_weight + total_kill_house_allocations_governmental_weight + total_segmentations_governmental_weight + total_cold_house_allocations_governmental_weight + int(pos_governmental_allocated_weight / 1000) + total_output_free_weight = total_kill_house_free_Sale_bar_free_weight + total_kill_house_allocations_free_weight + total_segmentations_free_weight + total_cold_house_allocations_free_weight + int(pos_free_allocated_weight / 1000) + # total_remain_weight = total_input_weight - total_output_weight + total_remain_governmental_weight = (total_governmental_input_weight - total_output_governmental_weight) - total_archive_governmental_weight if ( + total_governmental_input_weight - total_output_governmental_weight) - total_archive_governmental_weight> 0 else 0 + last_total_remain_governmental_weight = ( + (total_governmental_input_weight - total_output_governmental_weight) - total_archive_governmental_weight) * -1 if ( + total_governmental_input_weight - total_output_governmental_weight) - total_archive_governmental_weight < 0 else 0 + total_remain_free_weight = (total_free_input_weight - total_output_free_weight) - total_archive_free_weight if ( + total_free_input_weight - total_output_free_weight) - total_archive_free_weight > 0 else 0 + last_total_remain_free_weight = ((total_free_input_weight - total_output_free_weight) - total_archive_free_weight) * -1 if ( + total_free_input_weight - total_output_free_weight) - total_archive_free_weight < 0 else 0 + total_remain_weight = total_remain_governmental_weight + total_remain_free_weight + last_total_remain_weight = last_total_remain_governmental_weight + last_total_remain_free_weight + + return { + "kill_house_rsi_info": kill_house_rsi_info, + "total_killing_quantity": total_province_kill_requests_quantity + total_kill_house_free_bar_live_total_quantity, + "total_kill_house_request_governmental_quantity": total_kill_house_request_governmental_quantity, + "total_kill_house_request_free_quantity": total_kill_house_request_free_quantity, + "total_kill_house_free_bar_live_total_quantity": total_kill_house_free_bar_live_total_quantity, + "total_live_bars_quantity": total_live_bars_quantity, + "total_entered_warehouse_bars_quantity": total_entered_warehouse_bars_quantity, + "total_entered_warehouse_bars_weight": total_entered_warehouse_bars_weight, + "total_kill_house_request_warehouse_entered_quantity": total_kill_house_request_warehouse_entered_quantity, + "total_kill_house_request_warehouse_entered_weight": total_kill_house_request_warehouse_entered_weight, + "total_kill_house_warehouse_cacasses_entered_weight": total_kill_house_warehouse_cacasses_entered_weight, + "total_kill_house_warehouse_govermental_cacasses_entered_weight": total_kill_house_warehouse_govermental_cacasses_entered_weight, + "total_kill_house_warehouse_free_cacasses_entered_weight": total_kill_house_warehouse_free_cacasses_entered_weight, + "total_kill_house_request_warehouse_entered_governmental_weight": total_kill_house_request_warehouse_entered_governmental_weight, + "total_kill_house_request_warehouse_entered_free_weight": total_kill_house_request_warehouse_entered_free_weight, + "total_output_weight": total_output_weight, + "total_kill_house_allocations_weight": total_kill_house_allocations_weight, + "total_kill_house_free_Sale_bar_weight": total_kill_house_free_Sale_bar_weight, + "total_other_output_weight": total_segmentations_weight + total_cold_house_allocations_weight, + "total_remain_weight": total_remain_weight, + "total_remain_governmental_weight": total_remain_governmental_weight, + "total_remain_free_weight": total_remain_free_weight, + "last_total_remain_governmental_weight": last_total_remain_governmental_weight, + "last_total_remain_free_weight": last_total_remain_free_weight, + "last_total_remain_weight": last_total_remain_weight, + "pos_allocated_weight": int(pos_allocated_weight / 1000), + "pos_governmental_allocated_weight": int(pos_governmental_allocated_weight / 1000), + "pos_free_allocated_weight": int(pos_free_allocated_weight / 1000), + "total_archive_governmental_weight": total_archive_governmental_weight, + "total_archive_free_weight": total_archive_free_weight, + + } + + +class KillHouseMarketInfoSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'info'] + + def get_info(self, obj): + date1 = self.context.get('date1') + date2 = self.context.get('date2') + kill_houses = self.context.get('kill_houses') + if date1: + kill_house_info = market_kill_request_share_quantity(obj, date1, date2, total_kill_houses=kill_houses) + else: + kill_house_info = market_kill_request_share_quantity(obj, total_kill_houses=kill_houses) + + result = { + "total_poultry_requests_quantity": kill_house_info['total_poultry_requests_quantity'], + "kill_house_today_share": kill_house_info['kill_house_today_share'], + "market_light_share": kill_house_info['market_light_share'], + "kill_house_market_kill_requests_quantity": kill_house_info['kill_house_market_kill_requests_quantity'], + "kill_house_market_kill_requests_quantity_first": kill_house_info[ + 'kill_house_market_kill_requests_quantity_first'], + "kill_house_market_kill_requests_quantity_final": kill_house_info[ + 'kill_house_market_kill_requests_quantity_final'], + "kill_house_today_left_share": kill_house_info['kill_house_today_left_share'], + "kill_house_market_kill_requests_quantity_weight": kill_house_info[ + 'kill_house_market_kill_requests_quantity_weight'], + "kill_house_market_kill_requests_quantity_first_weight": kill_house_info[ + 'kill_house_market_kill_requests_quantity_first_weight'], + "kill_house_market_kill_requests_quantity_final_weight": kill_house_info[ + 'kill_house_market_kill_requests_quantity_final_weight'], + "total_kill_house_market_kill_requests_quantity_agreement_light_weight": kill_house_info[ + 'total_kill_house_market_kill_requests_quantity_agreement_light_weight'], + "total_kill_house_market_kill_requests_quantity_light_weight": kill_house_info[ + 'total_kill_house_market_kill_requests_quantity_light_weight'], + "total_kill_house_market_kill_requests_quantity_heavy_weight": kill_house_info[ + 'total_kill_house_market_kill_requests_quantity_heavy_weight'], + } + return result + + +class KillHouseForKillHousePercentageSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + system_address = SystemAddressSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['key', 'system_address', 'kill_house_operator', 'name', 'active', 'killer', 'type'] + + +class KillHouseForTotalReportAutomaticStewardAllocationSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + quantity_info = serializers.SerializerMethodField('get_quantity_info') + + class Meta: + model = KillHouse + fields = ['name', 'killer', 'kill_house_operator', 'quantity_info'] + + def get_quantity_info(self, obj): + from django.db.models import F, Sum, DecimalField + date = datetime.datetime.strptime(str(self.context.get('request').GET['date']), '%Y-%m-%d').date() + + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=date + ).select_related( + 'province_request__poultry_request') + allocations = StewardAllocation.objects.filter(kill_house=obj, date__date=date) + + total_quantity = province_kill_requests.aggregate(total_quantity=Sum('main_quantity')).get( + 'total_quantity', 0) + total_allocations = allocations.aggregate(total_quantity=Sum('real_number_of_carcasses')).get( + 'total_quantity', 0) + if total_quantity == None: + total_quantity = 0 + if total_allocations == None: + total_allocations = 0 + + if total_quantity == None: + total_quantity = 0 + if total_allocations == None: + total_allocations = 0 + remain_quantity = total_quantity - total_allocations + + return { + "total_quantity": total_quantity, + "total_allocations": total_allocations, + "remain_quantity": remain_quantity + } + + +class KillHouseWageForTotalDashbordSerializer(serializers.ModelSerializer): + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'wage_info'] + + def get_wage_info(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + return_to_province=False, + trash=False) + + unpaid_province_kill_requests = province_kill_requests.filter( + wage_pay=False, + archive_by_province=False, + return_to_province=False, + trash=False) + + paid_province_kill_requests = province_kill_requests.filter( + wage_pay=True, + archive_by_province=False, + return_to_province=False, + + trash=False) + + archive_province_kill_requests = province_kill_requests.filter( + wage_pay=False, + archive_by_province=True, + return_to_province=False, + trash=False) + + return { + "total_count": len(province_kill_requests), + "paid_count": len(paid_province_kill_requests), + "unpaid_count": len(unpaid_province_kill_requests), + "archive_count": len(archive_province_kill_requests), + "total_quantity": province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0, + "total_weight": province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0, + "total_wage": province_kill_requests.aggregate(total=Sum(F('total_killed_weight') * F('wage')))[ + 'total'], + "total_paid_quantity": paid_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0, + "total_weight_paid": + paid_province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0, + "total_paid_wage": paid_province_kill_requests.aggregate(total=Sum(F('total_killed_weight') * F('wage')))[ + 'total'] or 0, + "total_unpaid_quantity": unpaid_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0, + "total_weight_unpaid": unpaid_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0, + "total_unpaid_wage": + unpaid_province_kill_requests.aggregate(total=Sum(F('total_killed_weight') * F('wage')))[ + 'total'], + "total_archive_quantity": archive_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0, + "total_weight_archive": archive_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0, + "total_archive_wage": + archive_province_kill_requests.aggregate(total=Sum(F('total_killed_weight') * F('wage')))[ + 'total'], + + } + + +class KillHouseForAutomaticStewardAllocationSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + system_address = SystemAddressSerializer(read_only=True) + province_kill_request_information = serializers.SerializerMethodField('get_province_kill_request_information') + date = serializers.SerializerMethodField('get_date') + + class Meta: + model = KillHouse + fields = ['key', 'system_address', 'kill_house_operator', 'name', 'active', 'killer', + 'province_kill_request_information', 'date' + ] + + def get_province_kill_request_information(self, obj): + from datetime import datetime, timedelta + date = datetime.strptime(str(self.context.get('request').GET['date']), '%Y-%m-%d').date() + ware_house = KillHouseWareHouse.objects.filter(kill_house=obj, date__date=date).first() + if not ware_house: + ware_house_date = datetime(year=date.year, month=date.month, day=date.day, hour=1, minute=12, second=20) + ware_house = KillHouseWareHouse( + kill_house=obj, + date=ware_house_date + ) + ware_house.save() + + total_number_of_carcasses_temp = ware_house.update_total_number_of_carcasses + ware_house.pre_cold_number_of_carcasses_to_ware_house if ware_house.update_total_number_of_carcasses > 0 else ware_house.total_number_of_carcasses + ware_house.pre_cold_number_of_carcasses_to_ware_house + total_weight_of_carcasses_temp = ware_house.update_total_weight_of_carcasses + ware_house.pre_cold_weight_of_carcasses_to_ware_house if ware_house.update_total_weight_of_carcasses > 0 else ware_house.total_weight_of_carcasses + ware_house.pre_cold_weight_of_carcasses_to_ware_house + return { + "total_number_of_carcasses": total_number_of_carcasses_temp, + "total_weight_of_carcasses": total_weight_of_carcasses_temp, + "allocated_total_number_of_carcasses": ware_house.allocated_total_number_of_carcasses, + "pre_cold_number_of_carcasses_self_ware_house": ware_house.pre_cold_number_of_carcasses_self_ware_house, + "pre_cold_weight_of_carcasses_self_ware_house": ware_house.pre_cold_weight_of_carcasses_self_ware_house, + "allocated_total_weight_of_carcasses": ware_house.allocated_total_weight_of_carcasses, + "remain_total_number_of_carcasses": total_number_of_carcasses_temp - ware_house.allocated_total_number_of_carcasses if ware_house.pre_cold_number_of_carcasses_self_ware_house == 0 else 0, + "remain_total_weight_of_carcasses": total_weight_of_carcasses_temp - ware_house.allocated_total_weight_of_carcasses if ware_house.pre_cold_weight_of_carcasses_to_ware_house == 0 else 0, + + } + + def get_date(self, obj): + return datetime.datetime.strptime(str(self.context.get('request').GET['date']), '%Y-%m-%d').date() + + +class KillHousePurchaseRequestSerializer(serializers.ModelSerializer): + kill_house = KillHouseForKillHousePercentageSerializer(read_only=True) + + class Meta: + model = KillHousePurchaseRequest + fields = '__all__' + + +class KillHouseforPurchaseRequestSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + system_address = SystemAddressSerializer(read_only=True) + allow_purchase_request = serializers.SerializerMethodField('get_allow_purchase_request') + wage_info = serializers.SerializerMethodField('get_wage_info') + kill_house_for_killer = serializers.SerializerMethodField('get_kill_house_for_killer') + + class Meta: + model = KillHouse + fields = ['key', 'max_kill_limit', 'extra_bar_kill_percent', 'total_kill_capacity', 'kill_house_operator', + 'name', 'killer', 'system_address', 'allow_purchase_request', 'wage_info', 'type', 'killer', + 'kill_house_for_killer', 'out_province_selling_limitation', 'out_province_selling_limitation_percent', + 'in_province_selling_limitation', 'in_province_selling_limitation_percent', 'quota', 'free_quota', + 'governmental_quota', 'quota_max_kill_limit', 'quota_request', 'quota_custom', + 'quota_custom_quantity', 'maximum_load_volume_increase', 'maximum_load_volume_reduction', + 'ware_house_remaining_percent_limitation', 'ware_house_remaining_percent_limitation_status', + 'ware_house_remaining_weight_limitation', 'ware_house_remaining_weight_limitation_status','ware_house_remaining_weight_archive_percent'] + + def get_allow_purchase_request(self, obj): + allow = True + limitation = False + total_limitation = False + limitation_number = 0 + purchase_request = KillHousePurchaseRequest.objects.filter(kill_house=obj).first() + if purchase_request: + allow = purchase_request.allow + limitation = purchase_request.limitation + limitation_number = purchase_request.limitation_number + total_limitation = purchase_request.total_limitation + + return { + "allow": allow, + "limitation": limitation, + "limitation_number": limitation_number, + "total_limitation": total_limitation, + } + + def get_wage_info(self, obj): + total_unpaid_wage = 0 + total_paid_wage = 0 + kill_house_kill_requests_wage = 0 + real_free_sale_wage = 0 + # role = self.context.get('request').GET['role'] + total_unpaid_wage = get_finance_info(obj)['total_price'] + slaughter_transactions = InternalTransaction.objects.filter(Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + return { + "user_token": 'k' + obj.kill_house_operator.user.user_gate_way_id, + "total_amount": total_unpaid_wage - (total_paid_wage + obj.off) + } + + def get_kill_house_for_killer(self, obj): + kill_house_for_killer_info = None + kill_house_for_killer = KillHousePercentage.objects.filter(kill_house=obj, kill_house_for_killer__isnull=False, + kill_house__killer=True).first() + + if kill_house_for_killer: + kill_house_for_killer_info = { + "kill_house_name": kill_house_for_killer.kill_house_for_killer.name, + "fullname": kill_house_for_killer.kill_house_for_killer.kill_house_operator.user.fullname, + "mobile": kill_house_for_killer.kill_house_for_killer.kill_house_operator.user.mobile, + } + + return kill_house_for_killer_info + + +class KillHouseForKillingInformationDiscrepancyReportSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['key', 'kill_house_operator', 'name', 'killer'] + + +class PosKillHouseForKillingInformationDiscrepancyReportSerializer(serializers.ModelSerializer): + class Meta: + model = KillHouse + fields = ['key', 'name'] + + +class KillHouseForProvinceSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForColdHouseSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['key', 'name', 'killer', 'kill_house_operator'] + + +class KillHouseForProvinceWageSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'info'] + + def get_info(self, obj): + total_quantity = 0 + total_weight = 0 + total_wage = 0 + role = self.context.get('request').GET['role'] + + if role in ['KillHouse', 'SuperAdmin', 'AdminX', 'Supporter']: + wage_type = 'total_wage_amount' + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + trash=False).select_related( + 'province_request__poultry_request') + elif role == 'ProvinceOperator': + wage_type = 'union_share' + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + union_share__gt=0, + return_to_province=False, + archive_wage=False, + trash=False).select_related( + 'province_request__poultry_request') + elif role == 'Company': + wage_type = 'company_share' + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + company_share__gt=0, + return_to_province=False, + archive_wage=False, + trash=False).select_related( + 'province_request__poultry_request') + elif role == 'Guilds': + wage_type = 'guilds_share' + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + guilds_share__gt=0, + return_to_province=False, + archive_wage=False, + trash=False).select_related( + 'province_request__poultry_request') + else: + wage_type = 'wallet_share' + + total_quantity += province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + + total_weight += province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + + total_wage += province_kill_requests.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + + return { + "killer": obj.killer, + "kill_house_fullname": obj.kill_house_operator.user.fullname, + "kill_house_name": obj.name, + "kill_house_mobile": obj.kill_house_operator.user.mobile, + "kill_house_city": obj.kill_house_operator.user.city.name, + "total_count": len(province_kill_requests), + "total_quantity": total_quantity, + "total_weight": total_weight, + "total_wage": total_wage, + + } + + +class KillHouseForKillHouseRequestWageSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'info'] + + def get_info(self, obj): + total_quantity = 0 + total_weight = 0 + role = self.context.get('request').GET['role'] + if role == 'ProvinceOperator': + kill_house_requests = KillHouseRequest.objects.filter(Q(killhouse_user=obj) | Q(killer=obj), + province_kill_request__union_share__gt=0, + archive_wage=False, trash=False) + elif role == 'Company': + kill_house_requests = KillHouseRequest.objects.filter(Q(killhouse_user=obj) | Q(killer=obj), + province_kill_request__company_share__gt=0, + archive_wage=False, trash=False) + elif role == 'Guilds': + + kill_house_requests = KillHouseRequest.objects.filter(Q(killhouse_user=obj) | Q(killer=obj), + province_kill_request__guilds_share__gt=0, + archive_wage=False, trash=False) + else: + kill_house_requests = KillHouseRequest.objects.filter(Q(killhouse_user=obj) | Q(killer=obj), + archive_wage=False, trash=False) + + total_quantity += kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + + total_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + return { + "killer": obj.killer, + "kill_house_fullname": obj.kill_house_operator.user.fullname, + "kill_house_name": obj.name, + "kill_house_mobile": obj.kill_house_operator.user.mobile, + "kill_house_city": obj.kill_house_operator.user.city.name, + "total_count": len(kill_house_requests), + "total_quantity": total_quantity, + "total_weight": total_weight, + + } + + +class KillHouseForNewWageInormationSerializer(serializers.ModelSerializer): + wage_info = serializers.SerializerMethodField('get_wage_info') + shares = serializers.SerializerMethodField('get_shares') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'wage_info', 'shares'] + + def get_wage_info(self, obj): + date1 = None + date2 = None + if self.context.get('request').GET.get('date1'): + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + total_paid_wage = 0 + if date1: + # finance_info = get_kill_house_finance_info(obj,date1,date2) + finance_info = get_finance_info(obj, date1, date2) + slaughter_transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), status='completed', date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + # finance_info = get_kill_house_finance_info(obj) + finance_info = get_finance_info(obj) + slaughter_transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + return { + "wage_counting_type": wage_counting_type, + "total_wage": finance_info['total_price'], + "total_paid_wage": total_paid_wage, + "off": obj.off, + "total_unpaid_wage": finance_info['total_price'] - (total_paid_wage + obj.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'], + "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'], + } + + def get_shares(self, kill_house): + date1 = None + date2 = None + 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 + + if self.context.get('request').GET.get('date1'): + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + + finance_info = get_finance_info(kill_house, date1, date2) if date1 else get_finance_info(kill_house) + if date1: + slaughter_transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), status='completed', date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + slaughter_transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), status='completed', + trash=False) + + 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'] + total_price = finance_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 + + 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 + return [ + { + "name": "اتحادیه", + "province_kill_request_wage": union_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + }, + { + "name": "شرکت", + "province_kill_request_wage": company_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + }, + { + "name": "صنف پروتئین", + "province_kill_request_wage": guilds_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + }, + { + "name": "دامپزشک", + "province_kill_request_wage": other_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + }] + + +class KillHouseColdHouseSerializer(serializers.ModelSerializer): + kill_house = KillHouseForProvinceSerializer(read_only=True) + + class Meta: + model = ColdHouse + fields = ['key', 'kill_house', 'total_input_weight', 'total_allocated_weight', + 'total_remain_weight', 'name', 'province', 'city', 'address', 'capacity', 'active', 'broadcast', + 'relocate'] + + +class KillHouseColdHousesSerializer(serializers.ModelSerializer): + cold_houses = serializers.SerializerMethodField('get_cold_houses') + + class Meta: + model = KillHouse + fields = ['key', 'cold_houses'] + + def get_cold_houses(self, obj): + cold_houses = ColdHouse.objects.filter(kill_house=obj, trash=False) + serializer = KillHouseColdHouseSerializer(cold_houses, many=True) + return serializer.data + + +class KillHouseForColdHouseSerializer(serializers.ModelSerializer): + cold_houses_info = serializers.SerializerMethodField('get_cold_houses_info') + fullname = serializers.CharField(source='kill_house_operator.user.fullname', read_only=True) + mobile = serializers.CharField(source='kill_house_operator.user.mobile', read_only=True) + province = serializers.CharField(source='kill_house_operator.user.province.name', read_only=True) + city = serializers.CharField(source='kill_house_operator.user.city.name', read_only=True) + + class Meta: + model = KillHouse + fields = ['key', 'name', 'fullname', 'mobile', 'cold_houses_info', 'province', 'city'] + + def get_cold_houses_info(self, obj): + cold_houses = ColdHouse.objects.filter(kill_house=obj, trash=False) + + total_input_weight = cold_houses.aggregate(total=Sum('total_input_weight'))[ + 'total'] or 0 + total_allocated_weight = cold_houses.aggregate(total=Sum('total_allocated_weight'))[ + 'total'] or 0 + total_remain_weight = cold_houses.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + + return { + "total_cold_houses": len(cold_houses), + "total_input_weight": total_input_weight, + "total_allocated_weight": total_allocated_weight, + "total_remain_weight": total_remain_weight, + } + + +class ParentCompanyKillHouseForNewWageInormationSerializer(serializers.ModelSerializer): + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'wage_info'] + + def get_wage_info(self, obj): + total_paid_wage = 0 + finance_info = get_kill_house_finance_info(obj) + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=obj, status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + return { + "wage_counting_type": wage_counting_type, + "total_wage": finance_info['total_price'], + "total_paid_wage": total_paid_wage, + "off": obj.off, + "total_unpaid_wage": finance_info['total_price'] - (total_paid_wage + obj.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'], + } + + +class KillHouseForProvinceWareHouseDashboardSerializer(serializers.ModelSerializer): + ware_house_info = serializers.SerializerMethodField('get_ware_house_info') + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['key', 'name', 'killer', 'kill_house_operator', 'ware_house_info'] + + def _calculate_info(self, obj, date1=None, date2=None): + product = RolesProducts.objects.filter(kill_house=obj, trash=False, name='مرغ گرم').first() + if date1: + bars_date1 = date1 + bars_date2 = date2 + # bars_date1 = date1 - timedelta(days=1) + # bars_date2 = date1 - timedelta(days=1) + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, archive_wage=False, + return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0, trash=False, + temporary_trash=False, + temporary_deleted=False, + kill_request__recive_date__date__gte=bars_date1, + kill_request__recive_date__date__lte=bars_date2, + warehouse=True) + + # kill_house_requests = KillHouseRequest.objects.filter( + # Q(killhouse_user=obj) | Q(killer=obj), + # trash=False, calculate_status=True, + # archive_wage=False, + # temporary_trash=False, + # temporary_deleted=False, + # kill_request__recive_date__date__gte=date1, + # kill_request__recive_date__date__lte=date2 + # ) + + kill_house_requests = KillHouseRequest.objects.filter( + input_warehouse=obj, + trash=False, calculate_status=True, kill_request__recive_date__date__gte=bars_date1, + kill_request__recive_date__date__lte=bars_date2, warehouse=True + ) + # kill_house_requests = kill_house_requests.filter( + # Q(killhouse_user=obj, killer__isnull=True) | Q(killhouse_user=obj, killer=obj) | Q( + # killer=obj)) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(Q(date__date__gte=date1, + date__date__lte=date2, + buy_type='carcass') | Q( + create_date__date__gte=date1, create_date__date__lte=date2, buy_type='live'), input_warehouse=obj, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, + warehouse=True).exclude( + entered_message='ورود به انبار مجازی') + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter(kill_house=obj, + date__date__gte=date1, + date__date__lte=date2, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, + warehouse=True) + + kill_house_allocations = StewardAllocation.objects.filter(kill_house=obj, trash=False, + receiver_state__in=('pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True, date__date__gte=date1, + date__date__lte=date2, warehouse=True) + segmentations = PosSegmentation.objects.filter(kill_house=obj, trash=False, date__date__gte=date1, + date__date__lte=date2, warehouse=True) + cold_house_allocations = StewardAllocation.objects.filter( + kill_house=obj, + date__date__gte=date1, + date__date__lte=date2, + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, + transaction__date__date__gte=date1, + transaction__date__date__lte=date2, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(kill_house=obj,date__date__gte=date1,date__date__lte=date2, trash=False,warehouse=True) + + + else: + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, archive_wage=False, + return_to_province=False, + state__in=('pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + first_car_allocated_quantity=0, trash=False, + warehouse=True) + + # kill_house_requests = KillHouseRequest.objects.filter( + # Q(killhouse_user=obj) | Q(killer=obj), + # temporary_trash=False, + # temporary_deleted=False, + # trash=False, calculate_status=True) + + kill_house_requests = KillHouseRequest.objects.filter( + input_warehouse=obj, + # Q(killhouse_user=obj)|Q(killer=obj), + trash=False, calculate_status=True, warehouse=True + ) + # kill_house_requests = kill_house_requests.filter( + # Q(killhouse_user=obj, killer__isnull=True) | Q(killhouse_user=obj, killer=obj) | Q( + # killer=obj)) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(input_warehouse=obj, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, + warehouse=True).exclude( + entered_message='ورود به انبار مجازی') + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter(kill_house=obj, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, + warehouse=True) + kill_house_allocations = StewardAllocation.objects.filter(kill_house=obj, trash=False, + receiver_state__in=('pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True, warehouse=True) + segmentations = PosSegmentation.objects.filter(kill_house=obj, trash=False, warehouse=True) + + cold_house_allocations = StewardAllocation.objects.filter( + kill_house=obj, + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, trash=False, warehouse=True) + archives = WarehouseArchive.objects.filter(kill_house=obj, trash=False,warehouse=True) + + + province_kill_request_info = province_kill_requests.aggregate( + total_province_kill_request_count=Count('id'), + total_province_kill_request_quantity=Sum('total_killed_quantity'), + total_province_kill_request_weight=Sum('total_killed_weight'), + + ) + kill_house_request_info = kill_house_requests.aggregate( + total_kill_house_request_count=Count('id'), + total_kill_house_request_warehouse_entered_count=Count('id', filter=Q(ware_house_confirmation=True)), + total_kill_house_request_warehouse_not_entered_count=Count('id', filter=Q(ware_house_confirmation=False)), + total_kill_house_request_quantity=Sum('accepted_real_quantity'), + total_kill_house_request_weight=Sum('accepted_real_weight'), + total_kill_house_request_warehouse_not_entered_quantity=Sum('accepted_real_quantity', + filter=Q(ware_house_confirmation=False)), + total_kill_house_request_warehouse_not_entered_weight=Sum('accepted_real_weight', + filter=Q(ware_house_confirmation=False)), + kill_house_request_warehouse_weight=Sum('ware_house_accepted_real_weight', + filter=Q(ware_house_confirmation=True)), + kill_house_request_warehouse_governmental_weight=Sum('ware_house_accepted_real_weight', + filter=Q(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=False)), + kill_house_request_warehouse_free_weight=Sum('ware_house_accepted_real_weight', + filter=Q(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=True)), + + ) + kill_house_free_bar_info = kill_house_free_bar_informations.aggregate( + total_kill_house_free_bar_live_count=Count('id', filter=Q(buy_type='live')), + total_kill_house_free_bar_carcass_count=Count('id', filter=Q(buy_type='carcass')), + total_kill_house_free_bar_warehouse_entered_count=Count('id', filter=Q(weight_of_carcasses__gt=0)), + total_kill_house_free_bar_warehouse_not_entered_count=Count('id', filter=Q(weight_of_carcasses=0)), + total_kill_house_free_bar_live_quantity=Sum('quantity', filter=Q(buy_type='live')), + total_kill_house_free_bar_live_weight=Sum('live_weight', filter=Q(buy_type='live')), + total_kill_house_free_bar_carcass_quantity=Sum('number_of_carcasses', filter=Q(buy_type='carcass')), + total_kill_house_free_bar_carcass_weight=Sum('weight_of_carcasses', filter=Q(buy_type='carcass')), + total_kill_house_free_bar_carcass_total_weight=Sum('weight_of_carcasses'), + total_kill_house_free_bar_live_warehouse_not_entered_quantity=Sum('quantity', + filter=Q(weight_of_carcasses=0)), + total_kill_house_free_bar_warehouse_not_entered_weight=Sum('live_weight', filter=Q(weight_of_carcasses=0)), + + ) + + kill_house_free_Sale_bar_info = kill_house_free_Sale_bar_informations.aggregate( + total_kill_house_free_Sale_bar_weight=Sum('real_weight_of_carcasses'), + total_kill_house_free_Sale_bar_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental')), + total_kill_house_free_Sale_bar_free_weight=Sum('real_weight_of_carcasses', filter=Q(quota='free')), + ) + + kill_house_allocations_info = kill_house_allocations.aggregate( + total_kill_house_allocations_weight=Sum('real_weight_of_carcasses'), + total_kill_house_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental')), + total_kill_house_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free')), + ) + + segmentations_aggregates_info = segmentations.aggregate( + total_segmentations_weight=Sum('weight'), + total_segmentations_governmental_weight=Sum('weight', filter=Q(quota='governmental')), + total_segmentations_free_weight=Sum('weight', filter=Q(quota='free')), + ) + cold_house_allocations_info = cold_house_allocations.aggregate( + total_cold_house_allocations_weight=Sum('real_weight_of_carcasses'), + total_cold_house_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental')), + total_cold_house_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free')), + ) + pos_allocated_weight_info = transactions.aggregate( + pos_allocated_weight=Sum('cur_weight'), + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + archives_info = archives.aggregate( + total_archive_governmental_weight=Sum('weight', filter=Q(quota='governmental')), + total_archive_free_weight=Sum('weight', filter=Q(quota='free')), + ) + + return {**province_kill_request_info, **kill_house_request_info, **kill_house_free_bar_info, + **kill_house_free_Sale_bar_info, **kill_house_allocations_info, **segmentations_aggregates_info, + **cold_house_allocations_info, **pos_allocated_weight_info, **archives_info} + + def get_ware_house_info(self, obj): + product_remain_weight = RolesProducts.objects.filter(kill_house=obj, trash=False).only( + 'total_remain_weight').first() + product_remain_weight = product_remain_weight.total_remain_weight if product_remain_weight else 0 + request = self.context.get('request') + date1 = request.GET.get('date1', None) + date2 = request.GET.get('date2', None) + + if date1 and date2: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + + total_info = self._calculate_info(obj, date1, date2) if date1 else self._calculate_info(obj) + + total_kill_house_requests_quantity = total_info['total_kill_house_request_quantity'] if total_info[ + 'total_kill_house_request_quantity'] else 0 + total_kill_house_free_bar_quantity = total_info['total_kill_house_free_bar_live_quantity'] if total_info[ + 'total_kill_house_free_bar_live_quantity'] else 0 + total_kill_house_free_bar_carcasses = total_info['total_kill_house_free_bar_carcass_quantity'] if total_info[ + 'total_kill_house_free_bar_carcass_quantity'] else 0 + + total_kill_house_requests_weight = total_info['total_kill_house_request_weight'] if total_info[ + 'total_kill_house_request_weight'] else 0 + total_kill_house_free_bar_weight = total_info['total_kill_house_free_bar_live_weight'] if total_info[ + 'total_kill_house_free_bar_live_weight'] else 0 + total_kill_house_free_bar_carcasses_weight = total_info['total_kill_house_free_bar_carcass_weight'] if \ + total_info['total_kill_house_free_bar_carcass_weight'] else 0 + + total_province_bars = total_info['total_kill_house_request_count'] if total_info[ + 'total_kill_house_request_count'] else 0 + kill_house_free_bar_informations_live = total_info['total_kill_house_free_bar_live_count'] if total_info[ + 'total_kill_house_free_bar_live_count'] else 0 + kill_house_free_bar_informations_carcasses = total_info['total_kill_house_free_bar_carcass_count'] if \ + total_info['total_kill_house_free_bar_carcass_count'] else 0 + total_entered_kill_house_requests_carcasses_weight = total_info['kill_house_request_warehouse_weight'] if \ + total_info['kill_house_request_warehouse_weight'] else 0 + total_entered_kill_house_free_bar_carcasses_weight = total_info[ + 'total_kill_house_free_bar_carcass_total_weight'] if total_info[ + 'total_kill_house_free_bar_carcass_total_weight'] else 0 + + entered_kill_house_request = total_info['total_kill_house_request_warehouse_entered_count'] if total_info[ + 'total_kill_house_request_warehouse_entered_count'] else 0 + entered_free_buying_bars = total_info['total_kill_house_free_bar_warehouse_entered_count'] if total_info[ + 'total_kill_house_free_bar_warehouse_entered_count'] else 0 + + not_entered_kill_house_request = total_info['total_kill_house_request_warehouse_not_entered_count'] if \ + total_info['total_kill_house_request_warehouse_not_entered_count'] else 0 + not_entered_free_buying_bars = total_info['total_kill_house_free_bar_warehouse_not_entered_count'] if \ + total_info['total_kill_house_free_bar_warehouse_not_entered_count'] else 0 + + not_entered_kill_house_request_quantity = total_info[ + 'total_kill_house_request_warehouse_not_entered_quantity'] if total_info[ + 'total_kill_house_request_warehouse_not_entered_quantity'] else 0 + not_entered_free_buying_bars_quantity = total_info[ + 'total_kill_house_free_bar_live_warehouse_not_entered_quantity'] if total_info[ + 'total_kill_house_free_bar_live_warehouse_not_entered_quantity'] else 0 + + not_entered_kill_house_request_weight = total_info['total_kill_house_request_warehouse_not_entered_weight'] if \ + total_info['total_kill_house_request_warehouse_not_entered_weight'] else 0 + not_entered_free_buying_bars_weight = total_info['total_kill_house_free_bar_warehouse_not_entered_weight'] if \ + total_info['total_kill_house_free_bar_warehouse_not_entered_weight'] else 0 + + total_kill_house_allocations_weight = total_info['total_kill_house_allocations_weight'] if \ + total_info['total_kill_house_allocations_weight'] else 0 + + total_kill_house_free_Sale_bar_weight = total_info['total_kill_house_free_Sale_bar_weight'] if \ + total_info['total_kill_house_free_Sale_bar_weight'] else 0 + + total_kill_house_segmentations_weight = total_info['total_segmentations_weight'] if \ + total_info['total_segmentations_weight'] else 0 + total_kill_house_cold_house_allocations_weight = total_info['total_cold_house_allocations_weight'] if \ + total_info['total_cold_house_allocations_weight'] else 0 + + kill_house_request_warehouse_governmental_weight = total_info[ + 'kill_house_request_warehouse_governmental_weight'] if \ + total_info['kill_house_request_warehouse_governmental_weight'] else 0 + + kill_house_request_warehouse_free_weight = total_info['kill_house_request_warehouse_free_weight'] if \ + total_info['kill_house_request_warehouse_free_weight'] else 0 + + total_kill_house_free_Sale_bar_governmental_weight = total_info[ + 'total_kill_house_free_Sale_bar_governmental_weight'] if \ + total_info['total_kill_house_free_Sale_bar_governmental_weight'] else 0 + + total_kill_house_free_Sale_bar_free_weight = total_info['total_kill_house_free_Sale_bar_free_weight'] if \ + total_info['total_kill_house_free_Sale_bar_free_weight'] else 0 + + total_kill_house_allocations_governmental_weight = total_info[ + 'total_kill_house_allocations_governmental_weight'] if \ + total_info['total_kill_house_allocations_governmental_weight'] else 0 + + total_kill_house_allocations_free_weight = total_info['total_kill_house_allocations_free_weight'] if \ + total_info['total_kill_house_allocations_free_weight'] else 0 + + total_segmentations_governmental_weight = total_info['total_segmentations_governmental_weight'] if \ + total_info['total_segmentations_governmental_weight'] else 0 + + total_segmentations_free_weight = total_info['total_segmentations_free_weight'] if \ + total_info['total_segmentations_free_weight'] else 0 + + total_cold_house_allocations_governmental_weight = total_info[ + 'total_cold_house_allocations_governmental_weight'] if \ + total_info['total_cold_house_allocations_governmental_weight'] else 0 + + total_cold_house_allocations_free_weight = total_info['total_cold_house_allocations_free_weight'] if \ + total_info['total_cold_house_allocations_free_weight'] else 0 + + pos_allocated_weight = total_info['pos_allocated_weight'] or 0 + pos_governmental_allocated_weight = total_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = total_info['pos_free_allocated_weight'] or 0 + + total_archive_governmental_weight = total_info['total_archive_governmental_weight'] or 0 + total_archive_free_weight = total_info['total_archive_free_weight'] or 0 + + total_governmental_input_weight = kill_house_request_warehouse_governmental_weight + total_free_input_weight = kill_house_request_warehouse_free_weight + total_entered_kill_house_free_bar_carcasses_weight + total_governmental_output_weight = total_kill_house_free_Sale_bar_governmental_weight + total_kill_house_allocations_governmental_weight + total_segmentations_governmental_weight + total_cold_house_allocations_governmental_weight + int(pos_governmental_allocated_weight / 1000) + total_free_output_weight = total_kill_house_free_Sale_bar_free_weight + total_kill_house_allocations_free_weight + total_segmentations_free_weight + total_cold_house_allocations_free_weight + int(pos_free_allocated_weight / 1000) + total_governmental_remain_weight = (total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight if ( + total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight > 0 else 0 + last_total_governmental_remain_weight = ( + (total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight) * -1 if ( + total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight < 0 else 0 + total_free_remain_weight = (total_free_input_weight - total_free_output_weight) - total_archive_free_weight if ( + total_free_input_weight - total_free_output_weight) - total_archive_free_weight > 0 else 0 + last_total_free_remain_weight = ((total_free_input_weight - total_free_output_weight) - total_archive_free_weight) * -1 if ( + total_free_input_weight - total_free_output_weight) - total_archive_free_weight < 0 else 0 + last_total_remain_weight = last_total_governmental_remain_weight + last_total_free_remain_weight + warehouse_total_weight = total_kill_house_requests_weight + total_kill_house_free_bar_weight + total_kill_house_free_bar_carcasses_weight + warehouse_total_entered_carcasses_weight = total_entered_kill_house_requests_carcasses_weight + total_entered_kill_house_free_bar_carcasses_weight + difference_weight = warehouse_total_entered_carcasses_weight - ( + total_kill_house_allocations_weight + total_kill_house_free_Sale_bar_weight + total_kill_house_segmentations_weight + total_kill_house_cold_house_allocations_weight) + final_difference_weight = difference_weight if difference_weight > 0 else (-1) * difference_weight + total_sell = total_kill_house_allocations_weight + total_kill_house_free_Sale_bar_weight + total_kill_house_segmentations_weight + total_kill_house_cold_house_allocations_weight + + return { + "product_remain_weight": product_remain_weight, + "previous_product_remain_weight": int(product_remain_weight + final_difference_weight) if date1 else 0, + "total_sell": total_sell, + "total_province_bars": total_province_bars, + "total_province_bars_quantity": total_info['total_kill_house_request_quantity'] if total_info[ + 'total_kill_house_request_quantity'] else 0, + "total_province_bars_weight": total_info['total_kill_house_request_weight'] if total_info[ + 'total_kill_house_request_weight'] else 0, + "total_kill_house_free_bar": total_info['total_kill_house_free_bar_live_count'] if total_info[ + 'total_kill_house_free_bar_live_count'] else 0, + "total_kill_house_free_live_bar_quantity": total_info['total_kill_house_free_bar_live_quantity'] if + total_info['total_kill_house_free_bar_live_quantity'] else 0, + "total_kill_house_free_live_bar_weight": total_info['total_kill_house_free_bar_live_weight'] if total_info[ + 'total_kill_house_free_bar_live_weight'] else 0, + "total_kill_house_free_carcasses_bar": total_info['total_kill_house_free_bar_carcass_count'] if total_info[ + 'total_kill_house_free_bar_carcass_count'] else 0, + "total_kill_house_free_bar_carcasses": total_info['total_kill_house_free_bar_carcass_quantity'] if + total_info['total_kill_house_free_bar_carcass_quantity'] else 0, + "total_kill_house_free_bar_carcasses_weight": total_info['total_kill_house_free_bar_carcass_weight'] if + total_info['total_kill_house_free_bar_carcass_weight'] else 0, + "province_kill_requests": total_info['total_province_kill_request_count'] if total_info[ + 'total_province_kill_request_count'] else 0, + "province_kill_requests_quantity": total_info['total_province_kill_request_quantity'] if total_info[ + 'total_province_kill_request_quantity'] else 0, + "province_kill_requests_weight": total_info['total_province_kill_request_weight'] if total_info[ + 'total_province_kill_request_weight'] else 0, + + "total_bars": total_province_bars + kill_house_free_bar_informations_live + kill_house_free_bar_informations_carcasses, + "warehouse_total_quantity": total_kill_house_requests_quantity + total_kill_house_free_bar_quantity + total_kill_house_free_bar_carcasses, + "warehouse_total_weight": warehouse_total_weight, + "warehouse_total_entered_bars": entered_kill_house_request + entered_free_buying_bars, + "warehouse_total_entered_carcasses_weight": warehouse_total_entered_carcasses_weight, + "warehouse_total_not_entered_bars": not_entered_kill_house_request + not_entered_free_buying_bars, + + "warehouse_total_not_entered_bars_quantity": not_entered_kill_house_request_quantity + not_entered_free_buying_bars_quantity, + "warehouse_total_not_entered_bars_weight": not_entered_kill_house_request_weight + not_entered_free_buying_bars_weight, + "total_kill_house_allocations_weight": total_info['total_kill_house_allocations_weight'] if total_info[ + 'total_kill_house_allocations_weight'] else 0, + "total_kill_house_free_sale__bar_carcasses_weight": total_info['total_kill_house_free_Sale_bar_weight'] if + total_info['total_kill_house_free_Sale_bar_weight'] else 0, + "total_kill_house_segmentations_weight": total_kill_house_segmentations_weight, + "total_kill_house_cold_house_allocations_weight": total_kill_house_cold_house_allocations_weight, + "total_governmental_input_weight": total_governmental_input_weight, + "total_free_input_weight": total_free_input_weight, + "total_governmental_output_weight": total_governmental_output_weight, + "total_free_output_weight": total_free_output_weight, + "total_governmental_remain_weight": total_governmental_remain_weight, + "total_free_remain_weight": total_free_remain_weight, + "last_total_governmental_remain_weight": last_total_governmental_remain_weight, + "last_total_free_remain_weight": last_total_free_remain_weight, + "last_total_remain_weight": last_total_remain_weight, + "pos_allocated_weight": int(pos_allocated_weight / 1000), + "pos_governmental_allocated_weight": int(pos_governmental_allocated_weight / 1000), + "pos_free_allocated_weight": int(pos_free_allocated_weight / 1000), + "total_archive_governmental_weight": total_archive_governmental_weight, + "total_archive_free_weight": total_archive_free_weight, + + } + + +class KillHouseForFreeBarWageSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'info'] + + def get_info(self, obj): + total_weight = 0 + total_wage = 0 + total_quantity = 0 + type = self.context.get('request').GET['type'] + role = self.context.get('request').GET['role'] + if role in ['KillHouse', 'SuperAdmin', 'AdminX', 'Supporter']: + wage_type = 'total_wage_amount' + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=obj, archive_wage=False, buy_type=type, + trash=False) + + elif role == 'ProvinceOperator': + wage_type = 'union_share' + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=obj, archive_wage=False, buy_type=type, + union_share__gt=0, trash=False) + + elif role == 'Company': + wage_type = 'company_share' + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=obj, archive_wage=False, buy_type=type, + company_share__gt=0, trash=False) + + elif role == 'Guilds': + wage_type = 'guilds_share' + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=obj, archive_wage=False, buy_type=type, + guilds_share__gt=0, trash=False) + + else: + wage_type = 'wallet_share' + + if type == 'live': + + total_weight += free_bars.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + total_quantity += free_bars.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_wage += free_bars.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + else: + + total_weight += free_bars.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_quantity += free_bars.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + + total_wage += free_bars.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + + return { + "killer": obj.killer, + "kill_house_fullname": obj.kill_house_operator.user.fullname, + "kill_house_name": obj.name, + "kill_house_mobile": obj.kill_house_operator.user.mobile, + "kill_house_city": obj.kill_house_operator.user.city.name, + "total_count": len(free_bars), + "total_weight": total_weight, + "total_quantity": total_quantity, + "total_wage": total_wage, + + } + + +class KillHouseForProvinceWageWithDateSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'info'] + + def get_info(self, obj): + total_quantity = 0 + total_weight = 0 + total_wage = 0 + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() + role = self.context.get('request').GET['role'] + if role in ['KillHouse', 'SuperAdmin', 'AdminX', 'Supporter']: + wage_type = 'total_wage_amount' + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).select_related( + 'province_request__poultry_request') + elif role == 'ProvinceOperator': + wage_type = 'union_share' + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + union_share__gt=0, + return_to_province=False, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).select_related( + 'province_request__poultry_request') + elif role == 'Company': + wage_type = 'company_share' + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + company_share__gt=0, + return_to_province=False, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).select_related( + 'province_request__poultry_request') + elif role == 'Guilds': + wage_type = 'guilds_share' + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + guilds_share__gt=0, + return_to_province=False, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).select_related( + 'province_request__poultry_request') + else: + wage_type = 'wallet_share' + + total_quantity += province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + + total_weight += province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + + total_wage += province_kill_requests.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + + return { + "killer": obj.killer, + "kill_house_fullname": obj.kill_house_operator.user.fullname, + "kill_house_name": obj.name, + "kill_house_mobile": obj.kill_house_operator.user.mobile, + "kill_house_city": obj.kill_house_operator.user.city.name, + "total_count": len(province_kill_requests), + "total_quantity": total_quantity, + "total_weight": total_weight, + "total_wage": total_wage, + + } + + +class KillHouseForKillHouseRequestWageWithDateSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'info'] + + def get_info(self, obj): + total_quantity = 0 + total_weight = 0 + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() + # role = self.context.get('request').GET['role'] + kill_house_requests = KillHouseRequest.objects.filter(Q(killhouse_user=obj) | Q(killer=obj), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + archive_wage=False, + trash=False) + + total_quantity += kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + + total_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + return { + "killer": obj.killer, + "kill_house_fullname": obj.kill_house_operator.user.fullname, + "kill_house_name": obj.name, + "kill_house_mobile": obj.kill_house_operator.user.mobile, + "kill_house_city": obj.kill_house_operator.user.city.name, + "total_count": len(kill_house_requests), + "total_quantity": total_quantity, + "total_weight": total_weight, + + } + + +# class KillHouseForProvinceWageWithDateSerializer(serializers.ModelSerializer): +# info = serializers.SerializerMethodField('get_info') +# +# class Meta: +# model = KillHouse +# fields = ['key', 'info'] +# +# def get_info(self, obj): +# total_count = 0 +# paid_count = 0 +# unpaid_count = 0 +# archive_count = 0 +# total_quantity = 0 +# total_weight_unpaid = 0 +# total_weight_archive = 0 +# total_weight_paid = 0 +# total_unpaid_wage = 0 +# total_archive_wage = 0 +# total_paid_wage = 0 +# total_paid_quantity = 0 +# total_unpaid_quantity = 0 +# total_archive_quantity = 0 +# total_quantity_sale_free = 0 +# total_quantity_sale_government = 0 +# total_weight_sale_free = 0 +# total_wage = 0 +# total_weight_sale_government = 0 +# date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() +# date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() +# role = self.context.get('request').GET['role'] +# province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, +# state__in=('pending', 'accepted'), +# return_to_province=False, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# trash=False).select_related( +# 'province_request__poultry_request') +# # province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, +# # state__in=('pending', 'accepted'), +# # return_to_province=False, +# # trash=False).select_related( +# # 'province_request__poultry_request') +# total_count = len(province_kill_requests) +# total_quantity = province_kill_requests.aggregate(total_quantity=Sum('total_killed_quantity')).get( +# 'total_quantity', 0) +# +# for province_kill_request in province_kill_requests: +# if province_kill_request.wage_pay == True: +# paid_count += 1 +# total_paid_quantity += province_kill_request.total_killed_quantity +# total_paid_wage += province_kill_request.total_killed_weight * province_kill_request.wage +# # total_paid_wage += int(province_kill_request.depositor['total_amount']) +# total_weight_paid += province_kill_request.total_killed_weight +# elif province_kill_request.wage_pay == False and province_kill_request.archive_by_province == False: +# unpaid_count += 1 +# total_unpaid_quantity += province_kill_request.total_killed_quantity +# total_unpaid_wage += province_kill_request.total_killed_weight * province_kill_request.wage +# total_weight_unpaid += province_kill_request.total_killed_weight +# +# else: +# archive_count += 1 +# total_archive_quantity += province_kill_request.total_killed_quantity +# total_archive_wage += province_kill_request.total_killed_weight * province_kill_request.wage +# total_weight_archive += province_kill_request.total_killed_weight +# if province_kill_request.province_request.poultry_request.free_sale_in_province == True: +# total_quantity_sale_free += province_kill_request.total_killed_quantity +# total_weight_sale_free += province_kill_request.total_killed_weight +# +# else: +# total_quantity_sale_government += province_kill_request.total_killed_quantity +# total_weight_sale_government += province_kill_request.total_killed_weight +# total_wage = total_paid_wage + total_unpaid_wage +# +# gate_way_percentage = PaymentGatewayPercentage.objects.get(trash=False) +# union = gate_way_percentage.union / 100 if gate_way_percentage.union > 0 else 0 +# +# if role == 'ProvinceOperator': +# total_wage = (total_paid_wage + total_unpaid_wage) * union +# total_paid_wage = total_paid_wage * union +# total_unpaid_wage = total_unpaid_wage * union +# total_archive_wage = total_archive_wage * union +# +# return { +# "killer": obj.killer, +# "kill_house_fullname": obj.kill_house_operator.user.fullname, +# "kill_house_name": obj.name, +# "kill_house_mobile": obj.kill_house_operator.user.mobile, +# "kill_house_city": obj.kill_house_operator.user.city.name, +# "total_count": total_count, +# "paid_count": paid_count, +# "unpaid_count": unpaid_count, +# "archive_count": archive_count, +# "total_quantity": total_quantity, +# "total_weight": int(total_weight_paid + total_weight_unpaid), +# "total_weight_paid": int(total_weight_paid), +# "total_weight_archive": int(total_weight_archive), +# "total_weight_unpaid": int(total_weight_unpaid), +# "total_paid_wage": total_paid_wage, +# "total_unpaid_wage": total_unpaid_wage, +# "total_archive_wage": total_archive_wage, +# # "total_wage": total_paid_wage + total_unpaid_wage, +# "total_wage": total_wage, +# "total_unpaid_quantity": total_unpaid_quantity, +# "total_paid_quantity": total_paid_quantity, +# "total_archive_quantity": total_archive_quantity, +# "total_quantity_sale_free": total_quantity_sale_free, +# "total_weight_sale_free": total_weight_sale_free, +# "total_quantity_sale_government": total_quantity_sale_government, +# "total_weight_sale_government": total_weight_sale_government, +# +# } +class KillHouseForTotalProvinceWageTransactionWithDAteSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'info'] + + def get_info(self, obj): + total_paid_wage = 0 + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() + role = self.context.get('request').GET['role'] + if role in ['KillHouse', 'AdminX', 'Supporter']: + wage_type = 'amount' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('id') + elif role == 'SuperAdmin': + wage_type = 'amount' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).exclude(union_share=0, company_share=0, guilds_share=0).order_by('id') + elif role == 'ProvinceOperator': + wage_type = 'union_share' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + date__date__gte=date1, + date__date__lte=date2, + union_share__gt=0, + trash=False).order_by('id') + elif role == 'Company': + wage_type = 'company_share' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + company_share__gt=0, + date__date__gte=date1, + date__date__lte=date2, + trash=False).order_by('id') + elif role == 'Guilds': + wage_type = 'guilds_share' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + guilds_share__gt=0, + date__date__gte=date1, + date__date__lte=date2, + trash=False).order_by('id') + else: + wage_type = 'wallet_share' + + total_paid_wage += transactions.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + if role == 'SuperAdmin': + total_paid_wage -= transactions.aggregate(total=Sum('other_share'))[ + 'total'] or 0 + + return { + "killer": obj.killer, + "kill_house_fullname": obj.kill_house_operator.user.fullname, + "kill_house_name": obj.name, + "kill_house_mobile": obj.kill_house_operator.user.mobile, + "kill_house_city": obj.kill_house_operator.user.city.name, + "total_paid_count": len(transactions), + "total_paid_wage": total_paid_wage, + + } + + +class KillHouseForTotalProvinceWageTransactionSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'info'] + + def get_info(self, obj): + total_paid_wage = 0 + role = self.context.get('request').GET['role'] + # transactions = InternalTransaction.objects.filter( + # Q(kill_house=obj) | Q(parent_kill_house=obj), + # status='completed', + # trash=False).order_by('id') + if role in ['KillHouse', 'AdminX', 'Supporter']: + wage_type = 'amount' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + trash=False).order_by('id') + elif role == 'SuperAdmin': + wage_type = 'amount' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + trash=False).exclude(union_share=0, company_share=0, guilds_share=0).order_by('id') + elif role == 'ProvinceOperator': + wage_type = 'union_share' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + union_share__gt=0, + trash=False).order_by('id') + elif role == 'Company': + wage_type = 'company_share' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + company_share__gt=0, + trash=False).order_by('id') + elif role == 'Guilds': + wage_type = 'guilds_share' + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + guilds_share__gt=0, + trash=False).order_by('id') + else: + wage_type = 'wallet_share' + + total_paid_wage += transactions.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + if role == 'SuperAdmin': + total_paid_wage -= transactions.aggregate(total=Sum('other_share'))[ + 'total'] or 0 + + return { + "killer": obj.killer, + "kill_house_fullname": obj.kill_house_operator.user.fullname, + "kill_house_name": obj.name, + "kill_house_mobile": obj.kill_house_operator.user.mobile, + "kill_house_city": obj.kill_house_operator.user.city.name, + "total_paid_count": len(transactions), + "total_paid_wage": total_paid_wage, + + } + + +class KillHouseForFreeBarWageWithDateSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'info'] + + def get_info(self, obj): + total_weight = 0 + total_wage = 0 + total_quantity = 0 + type = self.context.get('request').GET['type'] + role = self.context.get('request').GET['role'] + if role in ['KillHouse', 'SuperAdmin', 'AdminX', 'Supporter']: + wage_type = 'total_wage_amount' + elif role == 'ProvinceOperator': + wage_type = 'union_share' + elif role == 'Company': + wage_type = 'company_share' + elif role == 'Company': + wage_type = 'company_share' + else: + wage_type = 'wallet_share' + + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=obj, + date__date__gte=date1, + date__date__lte=date2, + archive_wage=False, + trash=False) + if type == 'live': + + total_weight += free_bars.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + total_quantity += free_bars.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_wage += free_bars.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + else: + + total_weight += free_bars.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_quantity += free_bars.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + + total_wage += free_bars.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + + return { + "killer": obj.killer, + "kill_house_fullname": obj.kill_house_operator.user.fullname, + "kill_house_name": obj.name, + "kill_house_mobile": obj.kill_house_operator.user.mobile, + "kill_house_city": obj.kill_house_operator.user.city.name, + "total_count": len(free_bars), + "total_weight": total_weight, + "total_quantity": total_quantity, + "total_wage": total_wage, + + } + + +class KillHouseForFreeSaleBarInformationViewSetWithDateSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'kill_house_operator', 'info'] + + def get_info(self, obj): + role = self.context.get('request').GET['role'] + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() + free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=obj, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + buyers = OutProvinceCarcassesBuyer.objects.filter(Kill_house=obj, trash=False) + + total_carcasses = free_sale_bars.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sale_bars.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + return { + "number_of_buyers": len(buyers), + "total_number_of_carcasses": total_carcasses, + "total_weight_of_carcasses": total_weight, + + } + + +class KillHouseForFreeSaleBarInformationViewSetSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'kill_house_operator', 'info'] + + def get_info(self, obj): + free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=obj, + trash=False) + buyers = OutProvinceCarcassesBuyer.objects.filter(Kill_house=obj, trash=False) + + total_carcasses = free_sale_bars.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sale_bars.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + return { + "number_of_buyers": len(buyers), + "total_number_of_carcasses": total_carcasses, + "total_weight_of_carcasses": total_weight, + + } + + +class GeneralKillHouseSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForKillHouseDriverSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['key', 'name', 'killer', 'kill_house_operator', 'union_gateway_percent', 'company_gateway_percent', + 'guilds_gateway_percent', 'other_gateway_percent'] + + +class PosGeneralKillHouseSerializer(serializers.ModelSerializer): + class Meta: + model = KillHouse + fields = ['key', 'name', 'killer'] + + +# سریالایزر مربوط به کشتارگاه +class KillHouseSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorSerializer(read_only=True) + system_address = SystemAddressSerializer(read_only=True) + allow_state = serializers.SerializerMethodField('get_register_state') + allow_direct_buying = serializers.SerializerMethodField('get_allow_direct_buying') + kill_place = serializers.SerializerMethodField('get_kill_place') + debt = serializers.SerializerMethodField('get_debt') + + # kill_request_quantity = serializers.SerializerMethodField('get_kill_request_remain_quantity') + + class Meta: + model = KillHouse + exclude = ( + 'id', + 'trash', + 'created_by', + 'modified_by', + ) + + def get_kill_place(self, instance): + place = None + percentage = KillHousePercentage.objects.filter(kill_house=instance) + if percentage.count() > 0: + percentage = percentage.last() + if percentage.kill_house_for_killer != None: + place = percentage.kill_house_for_killer.name + else: + place = percentage.kill_house.name + + return place + + def get_allow_direct_buying(self, obj): + allow_state = False + allow = ProvinceAllowKillHouseDirectBuying.objects.filter(kill_house=obj) + if allow.count() > 0: + allow_state = allow.last().allow + + return allow_state + + def get_register_state(self, instance): + allow_state = None + allow = ProvinceAllowKillHouseRegisterCar.objects.filter(kill_house=instance) + if allow.count() > 0: + allow_state = allow.last().allow + + return allow_state + + def get_debt(self, instance): + debt = False + if KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__killhouse_user=instance, + state='pending').exists(): + debt = True + + return debt + + # def get_kill_request_remain_quantity(self, obj): + # quantity_sum = 0 + # kill_req_key = None + # now = datetime.datetime.now().date() + # kill_request = KillRequest.objects.filter(kill_house=obj, recive_date__year=now.year, + # recive_date__month=now.month, recive_date__day=now.day, + # trash=False).last() + # + # if kill_request: + # quantity_sum = kill_request.remain_quantity_for_poultry + # kill_req_key = kill_request.key + # + # return { + # "quantity_sum": quantity_sum, + # "kill_req_key": kill_req_key, + # } + + +class PosKillHouseSerializer(serializers.ModelSerializer): + shop_name = serializers.CharField(source='name', read_only=True) + fullname = serializers.CharField(source='kill_house_operator.user.fullname', read_only=True) + mobile = serializers.CharField(source='kill_house_operator.user.mobile', read_only=True) + + class Meta: + model = KillHouse + fields = ['key', 'shop_name', 'fullname', 'mobile'] + + +class PspKillHouseSerializer(serializers.ModelSerializer): + unit_name = serializers.CharField(source='name', read_only=True) + fullname = serializers.CharField(source='kill_house_operator.user.fullname', read_only=True) + city = serializers.CharField(source='kill_house_operator.user.city.name', read_only=True) + mobile = serializers.CharField(source='kill_house_operator.user.mobile', read_only=True) + + class Meta: + model = KillHouse + fields = ['key', 'unit_name', 'fullname', 'mobile','city','killer'] + + +class distributionKillHouseSerializer(serializers.ModelSerializer): + shop_name = serializers.CharField(source='name', read_only=True) + fullname = serializers.CharField(source='kill_house_operator.user.fullname', read_only=True) + mobile = serializers.CharField(source='kill_house_operator.user.mobile', read_only=True) + shop_type = serializers.SerializerMethodField('get_type') + + class Meta: + model = KillHouse + fields = ['key', 'shop_name', 'fullname', 'mobile', 'shop_type'] + + def get_type(self, obj): + obj_type = 'کشتارکن' if obj.killer else 'کشتارگاه' + + return obj_type + + +class KillHouseAllowVetSerializer(serializers.ModelSerializer): + kill_house = KillHouseSerializer(read_only=True) + + class Meta: + model = KillHouseAllowVet + fields = '__all__' + + +class KillHousePercentageSerializer(serializers.ModelSerializer): + kill_house = KillHouseForKillHousePercentageSerializer(read_only=True) + kill_house_for_killer = KillHouseForProvinceSerializer(read_only=True) + kill_house_vet = serializers.SerializerMethodField('get_kill_house_vet') + + # kill_house = KillHouseSerializer(read_only=True) + # kill_house_for_killer = KillHouseSerializer(read_only=True) + + class Meta: + model = KillHousePercentage + fields = ['key', 'guilds_quantity', 'guilds_weight', 'kill_house', 'kill_house_for_killer', 'percent', + 'last_guilds_update_date', 'kill_house_vet'] + # fields = '__all__' + + def get_kill_house_vet(self, obj): + if obj.kill_house_for_killer != None: + kill_house_vet = KillHouseVet.objects.filter(kill_house=obj.kill_house_for_killer, trash=False).last() + else: + kill_house_vet = KillHouseVet.objects.filter(kill_house=obj.kill_house, trash=False).last() + + if kill_house_vet != None: + serializer = KillHouseVetForKillHousePercentageSerializer(kill_house_vet) + return serializer.data + return None + + +class KillHousePercentageForKillerKillHousseSerializer(serializers.ModelSerializer): + kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + + # kill_house_for_killer = KillHouseForAutoAllocationSerializer(read_only=True) + + class Meta: + model = KillHousePercentage + fields = ['kill_house'] + # fields = ['kill_house_for_killer'] + + +class KillHouseADDCARForKillHouseDriverSerializer(serializers.ModelSerializer): + kill_house = KillHouseForKillHouseDriverSerializer(read_only=True) + + class Meta: + model = KillHouseADDCAR + fields = ['kill_house'] + + +class KillHouseDriverForAllUserSerializer(serializers.ModelSerializer): + user_bank_info = BankCardSerializer(read_only=True, required=False) + byers = serializers.SerializerMethodField('get_buyers') + + class Meta: + model = KillHouseDriver + exclude = ( + 'id', + 'trash', + 'created_by', + 'modified_by', + 'create_date', + 'modify_date', + 'status', + 'wallet', + 'wallet_amount', + 'registrar', + 'user', + 'weight_without_load', + ) + + def get_buyers(self, obj): + cars = KillHouseADDCAR.objects.filter(driver__exact=obj) + return KillHouseADDCARForKillHouseDriverSerializer(cars, many=True).data + + +# سریالایزر مربوط به اضافه کردن راننده به کشتارگاه +class KillHouseDriverSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True, required=False) + user_bank_info = BankCardSerializer(read_only=True, required=False) + first_name_last_name = serializers.SerializerMethodField('get_first_name_last_name') + + class Meta: + model = KillHouseDriver + fields = '__all__' + extra_kwargs = { + 'capocity': {'required': False}, + 'weight_without_load': {'required': False} + } + + def get_first_name_last_name(self, instance): + user_dict = {} + user = SystemUserProfile.objects.get( + key=instance.user.key) + user_dict = { + "first_name": user.first_name, + "last_name": user.last_name, + } + + return user_dict + + +class KillHouseDriverForBarManagementSerializer(serializers.ModelSerializer): + class Meta: + model = KillHouseDriver + fields = ['driver_name', 'driver_mobile', 'type_car', 'pelak', 'health_code'] + + +# سریالایزر مربوط به اضافه کردن خودرو به کشتارگاه +class KillHouseADDCARSerializer(serializers.ModelSerializer): + kill_house = KillHouseSerializer(read_only=True) + driver = KillHouseDriverSerializer(read_only=True) + + class Meta: + model = KillHouseADDCAR + exclude = ( + 'id', + 'trash', + 'created_by', + 'modified_by', + ) + + +class KillHouseADDCARForBarManagementSerializer(serializers.ModelSerializer): + driver = KillHouseDriverForBarManagementSerializer(read_only=True) + + class Meta: + model = KillHouseADDCAR + fields = ['driver'] + + +class VetForBarManagementSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = Vet + fields = ['user'] + + +class VetFarmForBarManagementSerializer(serializers.ModelSerializer): + vet = VetForBarManagementSerializer(read_only=True) + + class Meta: + model = VetFarm + fields = ['vet'] + + +# سریالایزر مربوط به ثبت نماینده کشتارگاه +class VetSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(read_only=True) + farms = serializers.SerializerMethodField('get_farms') + kill_houses = serializers.SerializerMethodField('get_kill_houses') + + class Meta: + model = Vet + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by', + ) + + def get_farms(self, instance): + farms_list = [] + farms = VetFarm.objects.filter(vet=instance, trash=False).select_related('poultry', 'vet') + if farms.count() > 0: + for farm in farms: + internal_dict = { + "poultry_name": farm.poultry.unit_name, + "poultry_full_name": farm.poultry.user.fullname, + "poultry_mobile": farm.poultry.user.mobile, + "poultry_hall": farm.hall, + "vet_id": farm.vet.id, + "vet_farm_key": farm.key, + } + farms_list.append(internal_dict) + + return farms_list + + def get_kill_houses(self, instance): + kill_houses_list = [] + kill_house_vets = KillHouseVet.objects.filter(vet=instance, trash=False).select_related( + 'kill_house__kill_house_operator__user') + if kill_house_vets.count() > 0: + for kill_house_vet in kill_house_vets: + internal_dict = { + "Kill_house_key": kill_house_vet.kill_house.key, + "Kill_house_name": kill_house_vet.kill_house.name, + "Kill_house_user_full_name": kill_house_vet.kill_house.kill_house_operator.user.fullname, + "Kill_house_user_mobile": kill_house_vet.kill_house.kill_house_operator.user.mobile, + } + kill_houses_list.append(internal_dict) + + return kill_houses_list + + +class KillHouseVetSerializer(serializers.ModelSerializer): + vet = VetSerializer(read_only=True) + kill_house = KillHouseSerializer(read_only=True) + + class Meta: + model = KillHouseVet + fields = '__all__' + + +class VetForKillRequestSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = Vet + fields = ['user'] + + +class KillHouseVetForKillRequestSerializer(serializers.ModelSerializer): + vet = VetForKillRequestSerializer(read_only=True) + kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + + class Meta: + model = KillHouseVet + fields = '__all__' + + +class KillHouseVetForKillHousePercentageSerializer(serializers.ModelSerializer): + vet = VetForKillRequestSerializer(read_only=True) + + class Meta: + model = KillHouseVet + fields = ['vet'] + + +class KillRequestForBarManagementSerializer(serializers.ModelSerializer): + class Meta: + model = KillRequest + fields = ['recive_date'] + + +# سریالایزر مربوط به ثبت درخواست کشتار توسط کشتارگاه +class KillRequestSerializer(serializers.ModelSerializer): + kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + poultry = PoultrySerializer(read_only=True) + slaughter_house = KillHouseForAutoAllocationSerializer(read_only=True) + # kill_house = KillHouseSerializer(read_only=True) + # slaughter_house = KillHouseSerializer(read_only=True) + kill_house_vet = serializers.SerializerMethodField('get_kill_house_vet') + number_of_allocated = serializers.SerializerMethodField('get_number_of_allocated') + poultry_hatching = PoultryHatchingSerializer(read_only=True) + + # kill_house_vet = serializers.SerializerMethodField('get_kill_house_vet') + # number_of_allocated = serializers.SerializerMethodField('get_number_of_allocated') + + class Meta: + model = KillRequest + fields = '__all__' + + # def get_kill_house_vet(self, instance): + # vet = None + # kill_house_vet = KillHouseVet.objects.filter(kill_house=instance.kill_house, trash=False) + # if kill_house_vet.count() > 0: + # kill_house_vet = kill_house_vet.last() + # vet = { + # "kill_house_vet_full_name": kill_house_vet.vet.user.fullname, + # "kill_house_vet_mobile": kill_house_vet.vet.user.mobile, + # } + # + # return vet + + def get_kill_house_vet(self, obj): + kill_house_vet = KillHouseVet.objects.filter(kill_house__exact=obj.kill_house, trash=False).last() + if kill_house_vet: + return KillHouseVetForKillRequestSerializer(kill_house_vet).data + else: + return None + + # + # def get_number_of_allocated(self, instance): + # quantity = 0 + # province_kill_request = ProvinceKillRequest.objects.filter(kill_request=instance, + # state__in=('pending', 'accepted'), + # trash=False) + # if province_kill_request.count() > 0: + # quantity = province_kill_request.count() + # + # return quantity + + def get_number_of_allocated(self, instance): + return instance.kill_capacity - instance.remain_quantity + + +class KillHouseDailyQuotaSerializer(serializers.ModelSerializer): + kill_house = KillHouseSerializer(read_only=True) + killer_kill_house = KillHouseSerializer(read_only=True) + kill_request = KillRequestSerializer(read_only=True) + + class Meta: + model = KillHouseDailyQuota + fields = '__all__' + + +class AutomaticKillRequestSerializer(serializers.ModelSerializer): + class Meta: + model = AutomaticKillRequest + fields = '__all__' + + +class KillRequestFactorSerializer(serializers.ModelSerializer): + kill_request = KillRequestSerializer(read_only=True) + + class Meta: + model = KillRequestFactor + fields = '__all__' + + +class KillRequestFactorPaymentSerializer(serializers.ModelSerializer): + kill_request_factor = KillRequestFactorSerializer(read_only=True) + + class Meta: + model = KillRequestFactorPayment + fields = '__all__' + + +class KillHouseRequestForColdHouseAllocationsSerializer(serializers.ModelSerializer): + kill_house_request_info = serializers.SerializerMethodField('get_kill_house_request_info') + + class Meta: + model = KillHouseRequest + fields = ['key', 'kill_house_request_info'] + + def get_kill_house_request_info(self, obj): + return { + "poultry_fullname": obj.province_request.poultry_request.poultry.user.fullname, + "poultry_mobile": obj.province_request.poultry_request.poultry.user.mobile, + "poultry_name": obj.province_request.poultry_request.poultry.unit_name, + "kill_house_name": obj.killhouse_user.name, + "kill_house_fullname": obj.killhouse_user.kill_house_operator.user.fullname, + "kill_house_mobile": obj.killhouse_user.kill_house_operator.user.mobile, + "quantity": obj.ware_house_accepted_real_quantity, + "weight": obj.ware_house_accepted_real_weight, + } + + +# سریالایزر مربوط به ثبت درخواست کشتار بعد از تخصیص استان +class KillHouseRequestSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseSerializer(read_only=True) + kill_request = KillRequestSerializer(read_only=True) + add_car = KillHouseADDCARSerializer(read_only=True) + poultry = serializers.SerializerMethodField('get_poultry') + + class Meta: + model = KillHouseRequest + fields = '__all__' + + def get_poultry(self, instance): + poultry = Poultry.objects.get( + key=instance.province_kill_request.province_request.poultry_request.poultry.key) + poultry_dict = { + "poultry_name": poultry.unit_name, + "poultry_mobile": poultry.user.mobile, + "poultry_address": poultry.address.address, + "poultry_city": poultry.address.city.name, + "poultry_province": poultry.address.province.name, + } + + return poultry_dict + + +class KillHouseRequestForDiffrentBarInfoSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + kill_request = KillRequestForBarManagementSerializer(read_only=True) + add_car = KillHouseADDCARForBarManagementSerializer(read_only=True) + weight_info = serializers.SerializerMethodField('get_weight_info') + + class Meta: + model = KillHouseRequest + exclude = ( + 'id', + 'create_date', + 'modify_date', + # 'trash', + 'created_by', + 'modified_by', + 'killhouse_user_id_foreign_key', + 'kill_request_id_foreign_key', + 'province_request_id_foreign_key', + 'province_kill_request_id_foreign_key', + 'add_car_id_foreign_key', + 'kill_house_request_id_key', + 'capacity', + 'kill_house_request_auction_winner', + 'city_number', + 'city_name', + 'province_number', + 'province_name', + 'province_request', + 'province_kill_request', + + ) + + def get_weight_info(self, obj): + index_weight = 0 + weight = 0 + assignment_info = KillHouseAssignmentInformation.objects.filter( + kill_house_request=obj).last() + assingment_quantity = assignment_info.real_quantity + assingment_weight = assignment_info.net_weight + kill_house_vet_quantity = obj.vet_accepted_real_quantity + kill_house_vet_weight = obj.vet_accepted_real_weight + quantity = obj.quantity + weight = int(obj.quantity * obj.province_request.poultry_request.Index_weight) + + return {"assingment_quantity": assingment_quantity, + "assingment_weight": assingment_weight, + "kill_house_vet_quantity": kill_house_vet_quantity, + "kill_house_vet_weight": kill_house_vet_weight, + "quantity": quantity, + "weight": weight, + + } + + +class KillHouseRequestForBarManagementSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + killer = KillHouseForAutoAllocationSerializer(read_only=True) + bar_document_status = BarDocumentStatusSerializer(read_only=True) + kill_request = KillRequestForBarManagementSerializer(read_only=True) + add_car = KillHouseADDCARForBarManagementSerializer(read_only=True) + real_add_car = KillHouseADDCARForBarManagementSerializer(read_only=True) + poultry_request = serializers.SerializerMethodField('get_poultry_request') + kill_place = serializers.SerializerMethodField('get_kill_place') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + kill_house_vet = serializers.SerializerMethodField('get_kill_house_vet') + weight_info = serializers.SerializerMethodField('get_weight_info') + assignment_info = serializers.SerializerMethodField('get_assignment_info') + final_bar_state = serializers.SerializerMethodField('get_final_bar_state') + + class Meta: + model = KillHouseRequest + exclude = ( + 'id', + # 'create_date', + # 'modify_date', + # 'trash', + 'created_by', + 'modified_by', + 'killhouse_user_id_foreign_key', + 'kill_request_id_foreign_key', + 'province_request_id_foreign_key', + 'province_kill_request_id_foreign_key', + 'add_car_id_foreign_key', + 'kill_house_request_id_key', + 'capacity', + 'kill_house_request_auction_winner', + 'city_number', + 'city_name', + 'province_number', + 'province_name', + 'province_request', + 'province_kill_request', + + ) + + def get_poultry_request(self, obj): + poultry_request = PoultryRequest.objects.get( + key=obj.province_kill_request.province_request.poultry_request.key) + serializer = PoultryRequestForBarMangementSerializer(poultry_request) + return serializer.data + + def get_kill_place(self, obj): + kill_place = obj.kill_request.slaughter_house.name if obj.kill_request.slaughter_house != None else obj.kill_request.kill_house.name + return kill_place + + def get_vet_farm(self, obj): + vet_farm = VetFarm.objects.filter( + poultry=obj.province_kill_request.province_request.poultry_request.poultry).last() + serializer = VetFarmForBarManagementSerializer(vet_farm) + return serializer.data + + def get_kill_house_vet(self, obj): + data = None + kill_request = KillRequest.objects.get(key=obj.kill_request.key) + if kill_request.slaughter_house != None: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.slaughter_house).select_related( + 'vet__user').first() + else: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.kill_house).select_related( + 'vet__user').first() + if kill_house_vet: + data = { + "fullname": kill_house_vet.vet.user.fullname, + "mobile": kill_house_vet.vet.user.mobile, + } + return data + + def get_weight_info(self, obj): + first_index_weight = round((obj.quantity * obj.province_request.poultry_request.Index_weight) / obj.quantity, + 1) if obj.quantity > 0 else 0 + first_weight = int(obj.quantity * obj.province_request.poultry_request.Index_weight) + final_index_weight = round(obj.accepted_real_weight / obj.accepted_real_quantity, + 1) if obj.accepted_real_quantity > 0 else 0 + kill_house_price = obj.province_kill_request.kill_house_price + weight_loss = obj.accepted_real_weight - obj.ware_house_accepted_real_weight if obj.ware_house_accepted_real_weight \ + < obj.accepted_real_weight and obj.ware_house_accepted_real_weight != 0 else 0 + total_weight_loss = (weight_loss / obj.accepted_real_weight) * 100 if weight_loss != 0 else 0 + + initial_to_quarantine_ratio = round((obj.quarantine_quantity / obj.quantity) * 100, + 1) if obj.quantity > 0 and obj.quarantine_quantity else 0 + + quarantine_to_final_ratio = round((obj.quarantine_quantity / obj.accepted_real_quantity) * 100, + 1) if obj.accepted_real_quantity > 0 and obj.quarantine_quantity else 0 + + return {"index_weight": first_index_weight, + "weight": first_weight, + "final_index_weight": final_index_weight, + "kill_house_price": kill_house_price, + "weight_loss": round(total_weight_loss, 1), + "input_loss": obj.weight_loss, + "initial_to_quarantine_ratio": initial_to_quarantine_ratio, + "quarantine_to_final_ratio": quarantine_to_final_ratio, + } + + def get_assignment_info(self, obj): + assignment_state = False + state = None + assignment_key = None + net_weight = 0 + real_quantity = 0 + car_weight_without_load = 0 + car_weight_with_load = 0 + image_with_bar = image_without_bar = None + assignment = KillHouseAssignmentInformation.objects.filter(trash=False, kill_house_request=obj).first() + if assignment: + assignment_state = True + image_without_bar = assignment.car_weight_without_load_image + image_with_bar = assignment.car_weight_with_load_image + car_weight_without_load = assignment.car_weight_without_load + car_weight_with_load = assignment.car_weight_with_load + net_weight = assignment.net_weight + real_quantity = assignment.real_quantity + state = assignment.state + assignment_key = assignment.key + + return {"assignment_state": assignment_state, + "image_without_bar": image_without_bar, + "image_with_bar": image_with_bar, + "car_weight_without_load": car_weight_without_load, + "car_weight_with_load": car_weight_with_load, + "net_weight": net_weight, + "state": state, + "real_quantity": real_quantity, + "assignment_key": assignment_key + } + + def get_final_bar_state(self, obj): + final_state = 'در انتظار ورود اطلاعات' + if obj.ware_house_confirmation and obj.assignment_state_archive == 'True': + final_state = 'تکمیل شده' + elif obj.assignment_state_archive == 'True' and not obj.ware_house_confirmation: + final_state = 'در انتظار ورود به انبار' + elif obj.assignment_state_archive == 'pending' and obj.ware_house_confirmation: + final_state = 'در انتظار ورود اطلاعات بار' + else: + final_state = 'در انتظار ورود اطلاعات' + + return final_state + + +class KillHouseRequestForInputBarsSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + killer = KillHouseForAutoAllocationSerializer(read_only=True) + add_car = KillHouseADDCARForBarManagementSerializer(read_only=True) + poultry_request = serializers.SerializerMethodField('get_poultry_request') + weight_info = serializers.SerializerMethodField('get_weight_info') + + class Meta: + model = KillHouseRequest + exclude = ( + 'id', + # 'create_date', + 'modify_date', + # 'trash', + 'created_by', + 'modified_by', + 'killhouse_user_id_foreign_key', + 'kill_request_id_foreign_key', + 'province_request_id_foreign_key', + 'province_kill_request_id_foreign_key', + 'add_car_id_foreign_key', + 'kill_house_request_id_key', + 'capacity', + 'kill_house_request_auction_winner', + 'city_number', + 'city_name', + 'province_number', + 'province_name', + 'province_request', + 'province_kill_request', + + ) + + def get_poultry_request(self, obj): + poultry_request = PoultryRequest.objects.get( + key=obj.province_kill_request.province_request.poultry_request.key) + return { + "poultry_req_order_code": poultry_request.order_code, + "poultry_name": poultry_request.poultry.unit_name, + "poultry_user_name": poultry_request.poultry.user.fullname, + "poultry_mobile": poultry_request.poultry.user.mobile, + "poultry_city": poultry_request.poultry.address.city.name, + "chicken_breed": poultry_request.chicken_breed, + "date": poultry_request.send_date, + "freezing": poultry_request.freezing, + "export": poultry_request.export, + "free_sale_in_province": poultry_request.free_sale_in_province, + "direct_buying": poultry_request.direct_buying, + } + + # def get_vet_info(self, obj): + # vet_farm_name = None + # vet_farm_mobile = None + # kill_house_vet_name = None + # kill_house_vet_mobile = None + # vet_farm = VetFarm.objects.filter( + # poultry=obj.province_kill_request.province_request.poultry_request.poultry).last() + # + # if vet_farm: + # vet_farm_name = vet_farm.vet.user.mobile + # vet_farm_mobile = vet_farm.vet.user.fullname + # kill_request = KillRequest.objects.get(key=obj.kill_request.key, trash=False) + # if kill_request.slaughter_house != None: + # kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.slaughter_house).select_related( + # 'vet__user').first() + # if kill_house_vet: + # kill_house_vet_name=kill_house_vet.vet.user.fullname + # kill_house_vet_mobile=kill_house_vet.vet.user.mobile + # else: + # kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.kill_house).select_related( + # 'vet__user').first() + # if kill_house_vet: + # kill_house_vet_name=kill_house_vet.vet.user.fullname + # kill_house_vet_mobile=kill_house_vet.vet.user.mobilee + # data = { + # "vet_farm_name": vet_farm_name, + # "vet_farm_mobile": vet_farm_mobile, + # "kill_house_vet_name": kill_house_vet_name, + # "kill_house_vet_mobile": kill_house_vet_mobile, + # } + # return data + + def get_weight_info(self, obj): + if obj.ware_house_confirmation == True: + state = 'ورود به انبار' + + elif obj.assignment_state_archive == 'pending': + state = 'در انتظار تکمیل اطلاعات' + + else: + state = 'تکمیل اطلاعات' + + first_index_weight = round((obj.quantity * obj.province_request.poultry_request.Index_weight) / obj.quantity, 1) + first_weight = int(obj.quantity * obj.province_request.poultry_request.Index_weight) + final_index_weight = round(obj.accepted_real_weight / obj.accepted_real_quantity, 1) + kill_house_price = obj.province_kill_request.kill_house_price + weight_loss = obj.accepted_real_weight - obj.ware_house_accepted_real_weight if obj.ware_house_accepted_real_weight \ + < obj.accepted_real_weight and obj.ware_house_accepted_real_weight != 0 else 0 + total_weight_loss = (weight_loss / obj.accepted_real_weight) * 100 if weight_loss != 0 else 0 + return {"index_weight": first_index_weight, + "weight": first_weight, + "final_index_weight": final_index_weight, + "kill_house_price": kill_house_price, + "weight_loss": round(total_weight_loss, 1), + "input_loss": obj.weight_loss, + "state": state, + } + + +# سریالایزر مربوط به تایید یا رد توسط کشتارگاه نسبت به تخصیص استان به کشتارگاه +class KillHouseCheckRequestSerializer(serializers.ModelSerializer): + kill_house_request = KillHouseRequestSerializer(read_only=True) + + class Meta: + model = KillHouseCheckRequest + fields = '__all__' + + +# سریالایزر مربوط به ثبت اطلاعات بار توسط کشتارگاه + +class KillHouseRequestForCompletedLoadsSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + add_car = KillHouseADDCARForBarManagementSerializer(read_only=True) + real_add_car = KillHouseADDCARForBarManagementSerializer(read_only=True) + kill_place = serializers.SerializerMethodField('get_kill_place') + kill_house_vet = serializers.SerializerMethodField('get_kill_house_vet') + first_weight = serializers.SerializerMethodField('get_first_weight') + payment_remain_amount = serializers.SerializerMethodField('get_payment_remain_amount') + + class Meta: + model = KillHouseRequest + fields = ['key', 'killhouse_user', 'add_car', 'real_add_car', 'kill_place', + 'quantity', + 'bar_code', 'assignment_state_archive', 'clearance_code', 'traffic_code', 'accepted_real_quantity', + 'accepted_real_weight', 'vet_state', 'kill_house_vet', 'first_weight', 'payment_remain_amount'] + + def get_kill_place(self, obj): + kill_place = obj.kill_request.slaughter_house.name if obj.kill_request.slaughter_house != None else obj.kill_request.kill_house.name + return kill_place + + def get_kill_house_vet(self, obj): + kill_house_vet_fullname = None + kill_house_vet_mobile = None + vet_check_date = None + if obj.vet_state == 'accepted': + vet_check = VetCheckRequest.objects.filter(kill_house_request=obj).only('kill_house_request', + 'create_date').first() + vet_check_date = vet_check.create_date + kill_house = obj.kill_request.slaughter_house if obj.kill_request.slaughter_house != None else obj.kill_request.kill_house + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_house, trash=False).select_related( + 'vet__user').first() + if kill_house_vet: + kill_house_vet_fullname = kill_house_vet.vet.user.fullname + kill_house_vet_mobile = kill_house_vet.vet.user.mobile + return { + "kill_house_vet_fullname": kill_house_vet_fullname, + "kill_house_vet_mobile": kill_house_vet_mobile, + "vet_check_date": vet_check_date, + } + + def get_first_weight(self, obj): + weight = obj.province_kill_request.province_request.poultry_request.Index_weight * obj.quantity + return weight + + def get_payment_remain_amount(self, obj): + kill_house_payment = KillRequestFactorPayment.objects.filter( + kill_request_factor__kill_request=obj.kill_request) + if kill_house_payment.count() > 0: + kill_request_payment_remain_amount = kill_house_payment.last().remain_amount + else: + kill_request_payment_remain_amount = 0 + return { + "kill_request_payment_remain_amount": kill_request_payment_remain_amount, + "sms_payment": obj.kill_request.sms_payment, + "buy_type": obj.province_kill_request.payment_type, + } + + +class KillHouseAssignmentInformationForCompletedLoadsSerializer(serializers.ModelSerializer): + kill_house_request = KillHouseRequestForCompletedLoadsSerializer(read_only=True) + poultry_request = serializers.SerializerMethodField('get_poultry_request') + banks_information = serializers.SerializerMethodField('get_banks_information') + + class Meta: + model = KillHouseAssignmentInformation + fields = ['kill_house_request', 'poultry_request', 'banks_information', 'car_weight_without_load', + 'car_weight_without_load_image', 'car_weight_with_load', 'car_weight_with_load_image', 'net_weight', + 'state', 'real_quantity', 'protest_time'] + + def get_poultry_request(self, obj): + poultry_request = PoultryRequest.objects.get( + key=obj.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.key) + return { + "poultry_province": poultry_request.poultry.user.province.name, + "poultry_city": poultry_request.poultry.user.city.name, + "order_code": poultry_request.order_code, + "poultry_name": poultry_request.poultry.user.fullname, + "unit_name": poultry_request.poultry.unit_name, + "poultry_mobile": poultry_request.poultry.user.mobile, + "poultry_request_quantity": poultry_request.quantity, + "poultry_request_id": poultry_request.id, + "age": (datetime.datetime.now() - poultry_request.hatching.date).days + 1, + + "index_weight": poultry_request.Index_weight, + "chicken_breed": poultry_request.chicken_breed, + "create_date": poultry_request.create_date, + "send_date": poultry_request.send_date, + "hatching_date": poultry_request.hatching.date, + "cell_type": poultry_request.cell_type, + "losses": poultry_request.hatching.losses, + } + + def get_banks_information(self, obj): + poultry_name_of_bank_user = None + poultry_bank_name = None + poultry_card = None + poultry_account = None + poultry_shaba = None + province_name_of_bank_user = None + province_bank_name = None + province_card = None + province_account = None + province_shaba = None + allocation = ShareOfAllocation.objects.all() + if allocation.count() > 0: + allocation = allocation.last().total + else: + allocation = 0 + + poultry = Poultry.objects.get( + key=obj.kill_house_request.province_request.poultry_request.poultry.key, + trash=False) + if poultry.user_bank_info != None: + poultry_name_of_bank_user = poultry.user_bank_info.name_of_bank_user + poultry_bank_name = poultry.user_bank_info.bank_name + poultry_card = poultry.user_bank_info.card + poultry_account = poultry.user_bank_info.account + poultry_shaba = poultry.user_bank_info.shaba + operator = ProvinceOperator.objects.filter(trash=False) + if operator.last().user_bank_info != None: + operator = operator.last() + province_name_of_bank_user = operator.user_bank_info.name_of_bank_user + province_bank_name = operator.user_bank_info.bank_name + province_card = operator.user_bank_info.shaba + province_account = operator.user_bank_info.account + province_shaba = operator.user_bank_info.shaba + + return { + "poultry_name_of_bank_user": poultry_name_of_bank_user, + "poultry_bank_name": poultry_bank_name, + "poultry_card": poultry_card, + "poultry_account": poultry_account, + "poultry_shaba": poultry_shaba, + "province_name_of_bank_user": province_name_of_bank_user, + "province_bank_name": province_bank_name, + "province_card": province_card, + "province_account": province_account, + "province_shaba": province_shaba, + "province_wage": allocation, + + } + + +class KillHouseAssignmentInformationSerializer(serializers.ModelSerializer): + kill_house_request = KillHouseRequestSerializer(read_only=True) + + class Meta: + model = KillHouseAssignmentInformation + fields = '__all__' + + +class KillHouseAssignmentInformationForAggregateLoadsSerializer(serializers.ModelSerializer): + class Meta: + model = KillHouseAssignmentInformation + fields = ['key', 'car_weight_without_load', 'car_weight_without_load_image', 'car_weight_with_load', + 'car_weight_with_load_image', 'net_weight', 'real_quantity'] + + +class KillHouseRequestForAggregateLoadsSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + killer = KillHouseForAutoAllocationSerializer(read_only=True) + add_car = KillHouseADDCARForBarManagementSerializer(read_only=True) + poultry_request = serializers.SerializerMethodField('get_poultry_request') + kill_place = serializers.SerializerMethodField('get_kill_place') + assingment_information = serializers.SerializerMethodField('get_assingment_information') + first_weight = serializers.SerializerMethodField('get_first_weight') + + class Meta: + model = KillHouseRequest + fields = ['key', 'killhouse_user', 'add_car', 'poultry_request', 'kill_place', 'assingment_information', + 'quantity', + 'bar_code', 'assignment_state_archive', 'clearance_code', 'traffic_code', 'accepted_real_quantity', + 'accepted_real_weight', 'vet_state', 'first_weight', 'killer'] + + def get_poultry_request(self, obj): + poultry_request = PoultryRequest.objects.get( + key=obj.province_kill_request.province_request.poultry_request.key) + serializer = PoultryRequestForBarMangementSerializer(poultry_request) + return serializer.data + + def get_kill_place(self, obj): + kill_place = obj.kill_request.slaughter_house.name if obj.kill_request.slaughter_house != None else obj.kill_request.kill_house.name + return kill_place + + def get_assingment_information(self, obj): + assignment = KillHouseAssignmentInformation.objects.filter(kill_house_request=obj).first() + serializer = KillHouseAssignmentInformationForAggregateLoadsSerializer(assignment) + return serializer.data + + def get_first_weight(self, obj): + weight = obj.province_kill_request.province_request.poultry_request.Index_weight * obj.quantity + return weight + + +class KillHouseAssignmentImagesSerializer(serializers.ModelSerializer): + kill_house = KillHouseSerializer(read_only=True) + + class Meta: + model = KillHouseAssignmentImages + fields = '__all__' + + +class VetForAllUserSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(read_only=True) + + class Meta: + model = Vet + fields = ['address', 'user_bank_info', 'identity_documents', 'active'] + + +class KillHouseVetForKillHouseVetSerializer(serializers.ModelSerializer): + kill_house = KillHouseForKillHouseVetKillHouseSerializer(read_only=True) + + class Meta: + model = KillHouseVet + fields = ['kill_house'] + + +class KillHouseVetForAllUserSerializer(serializers.ModelSerializer): + vet = VetForAllUserSerializer(read_only=True) + # kill_house = KillHouseForAllUserSerializer(read_only=True) + kill_houses = serializers.SerializerMethodField('get_kill_houses') + + class Meta: + model = KillHouseVet + fields = ['vet', 'kill_houses'] + + def get_kill_houses(self, obj): + kill_houses = KillHouseVet.objects.filter(key=obj.key) + return KillHouseVetForKillHouseVetSerializer(kill_houses, many=True).data + + +# سریالایزر مربوط به ثبت اطلاعات بار توسط کشتارگاه +class VetCheckRequestSerializer(serializers.ModelSerializer): + class Meta: + model = VetCheckRequest + fields = '__all__' + + +class ProvinceKillRequestForAutoAllocationSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + + class Meta: + model = ProvinceKillRequest + fields = ['killhouse_user', 'main_quantity'] + + +# سریالایزر مربوط به تخصیص استان به کشتارگاه +class ProvinceKillRequestSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseSerializer(read_only=True) + kill_request = KillRequestSerializer(read_only=True) + + class Meta: + model = ProvinceKillRequest + fields = '__all__' + + +class ProvinceKillRequestProvinceWageSerializer(serializers.ModelSerializer): + province_request = serializers.SerializerMethodField('get_province_request') + kill_house_requests = serializers.SerializerMethodField('get_kill_house_request') + + class Meta: + model = ProvinceKillRequest + fields = ['province_request', 'kill_house_requests', 'wage_pay', 'depositor', 'total_amount_editor', + 'archive_by_province', 'archive_message', 'archiver'] + + def get_province_request(self, obj): + role = self.context.get('request').GET['role'] + kill_place = obj.kill_request.slaughter_house.name if obj.kill_request.slaughter_house != None else obj.kill_request.kill_house.name + kill_house_user_full_name = obj.killhouse_user.kill_house_operator.user.fullname + kill_house_user_mobile = obj.killhouse_user.kill_house_operator.user.mobile + killer = obj.killhouse_user.killer + province_request = ProvinceCheckOperatorRequest.objects.filter(key=obj.province_request.key, + trash=False).select_related( + 'poultry_request__poultry__user', 'poultry_request__poultry__address__city', 'poultry_request').last() + + if role in ['KillHouse', 'SuperAdmin', 'AdminX', 'Supporter']: + total_amount = obj.total_wage_amount + elif role == 'ProvinceOperator': + total_amount = obj.union_share + elif role == 'Company': + total_amount = obj.company_share + elif role == 'Company': + total_amount = obj.guilds_share + else: + total_amount = obj.total_wage_amount + + return { + "order_code": province_request.poultry_request.order_code, + "poultry_fullname": province_request.poultry_request.poultry.user.fullname, + "poultry_mobile": province_request.poultry_request.poultry.user.mobile, + "poultry_city": province_request.poultry_request.poultry.address.city.name, + "breed": province_request.poultry_request.chicken_breed, + "index_weight": province_request.poultry_request.Index_weight, + "send_date": province_request.poultry_request.send_date, + "wage": obj.wage, + "killer": killer, + "kill_place": kill_place, + "kill_house_user_full_name": kill_house_user_full_name, + "kill_house_user_mobile": kill_house_user_mobile, + "province_kill_request_quantity": obj.total_killed_quantity, + "province_kill_request_key": obj.key, + "province_kill_request_total_weight": obj.total_killed_weight, + "total_amount": total_amount, + "prev_total_amount": obj.prev_total_amount, + # "prev_total_amount": wage * (obj.main_quantity * province_request.poultry_request.Index_weight) + "free_sale": province_request.poultry_request.free_sale_in_province, + } + + def get_kill_house_request(self, obj): + kill_house_request = KillHouseRequest.objects.filter(province_kill_request=obj, + trash=False) + serializer = KillHouseRequestForBarManagementSerializer(kill_house_request, many=True) + return serializer.data + + +class KillRequestForDirectBuyingSerializer(serializers.ModelSerializer): + kill_house = KillHouseForCommonlyUsedSerializer(read_only=True) + slaughter_house = KillHouseForCommonlyUsedSerializer(read_only=True) + poultry = PoultryForPredictionSerializer(read_only=True) + poultry_request = PoultryRequestForMarketSerializer(read_only=True) + + # kill_house_vet = serializers.SerializerMethodField('get_kill_house_vet') + + class Meta: + model = KillRequest + fields = ['key', 'create_date', 'recive_date', 'free_direct_buying', 'chicken_breed', 'kill_house', + 'slaughter_house', 'poultry', 'poultry_request', 'payment_deadline_date', 'payment_deadline_days', + 'kill_capacity', 'Index_weight', 'amount', 'market_final_accept', 'market_state', 'recive_time', + 'market_code_status', 'input_market_code', 'market_code','market_state_message'] + + # def get_kill_house_vet(self, obj): + # kill_house_vet = KillHouseVet.objects.filter(kill_house__exact=obj.kill_house, trash=False).last() + # if kill_house_vet: + # return KillHouseVetForKillRequestSerializer(kill_house_vet).data + # else: + # return None + + +class ProvinceKillRequestForDirectBuyingSerializer(serializers.ModelSerializer): + kill_request = KillRequestForDirectBuyingSerializer(read_only=True) + general_info = serializers.SerializerMethodField('get_general_info') + + class Meta: + model = ProvinceKillRequest + fields = ['key', 'kill_request', 'total_killed_quantity', 'total_killed_weight', 'general_info', + 'payment_deadline_days', 'payment_deadline_date', 'payment_deadline', 'payment_deadline_archive', + 'payment_deadline_state', 'payment_deadline_checker_fullname', 'payment_deadline_checker_mobile', + 'payment_deadline_check_date', 'payment_deadline_archive_message', 'final_accept', + 'extension_payment_deadline_days', 'payment_deadline_amount', 'extension_payment_deadline_days', + 'extension_payment_deadline_date'] + + def get_general_info(self, obj): + age = ((obj.kill_request.recive_date.date()) - (obj.kill_request.poultry_hatching.date.date())).days + 1 + total_amount = int(obj.kill_request.amount * obj.total_killed_weight) + payments = DirectBuyingPayment.objects.filter(province_kill_request=obj, trash=False) + total_paid_amount = payments.aggregate(total=Sum('amount'))['total'] or 0 + + return { + "age": age, + "total_amount": total_amount, + "Index_weight": round((obj.total_killed_weight / obj.total_killed_quantity), 2), + "total_paid_amount": total_paid_amount + + } + + +class ProvinceKillRequestForKillingInformationDiscrepancyReportSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForKillingInformationDiscrepancyReportSerializer(read_only=True) + total_info = serializers.SerializerMethodField('get_total_info') + + class Meta: + model = ProvinceKillRequest + fields = ['killhouse_user', 'total_info'] + + def get_total_info(self, obj): + province_kill_request_quantity = obj.main_quantity + province_kill_request_weight = int(obj.main_quantity * obj.province_request.poultry_request.Index_weight) + province_kill_request_remain_quantity = obj.quantity + province_kill_request_remain_weight = int(obj.quantity * obj.province_request.poultry_request.Index_weight) + kill_house_requests = KillHouseRequest.objects.filter(trash=False, province_kill_request=obj).annotate( + total_quantity=Sum('accepted_real_quantity'), + total_weight=Sum('accepted_real_weight'), + + ) + kill_house_request_quantity = kill_house_requests.aggregate(total=Sum('total_quantity'))['total'] + kill_house_request_weight = kill_house_requests.aggregate(total=Sum('total_weight'))['total'] + + return { + "province_kill_request_quantity": province_kill_request_quantity, + "province_kill_request_weight": province_kill_request_weight, + "province_kill_request_remain_quantity": province_kill_request_remain_quantity, + "province_kill_request_remain_weight": province_kill_request_remain_weight, + "kill_house_requests_count": kill_house_requests.count(), + "kill_house_request_quantity": kill_house_request_quantity if kill_house_request_quantity != None else 0, + "kill_house_request_weight": kill_house_request_weight if kill_house_request_weight != None else 0, + "operator_fullname": obj.killhouse_user.kill_house_operator.user.fullname, + "operator_mobile": obj.killhouse_user.kill_house_operator.user.mobile, + "role": "KillHouse", + + } + + +# سریالایزر مربوط به ثبت درخواست بورسی کشتارگاه +class KillHouseRequestExchangeSerializer(serializers.ModelSerializer): + user = UserProfileSerializer(read_only=True) + + class Meta: + model = KillHouseRequestExchange + fields = '__all__' + + +# سریالایزر مربوط به ثبت درخواست رزرو بورسی کشتارگاه +class KillHouseRequestExchangeReserveSerializer(serializers.ModelSerializer): + poultry_exchange = PoultryRequestExchangeSerializer(read_only=True) + + class Meta: + model = KillHouseRequestExchangeReserve + fields = '__all__' + + +# سریالایزر مربوط به ثبت درخواست رزرو بورسی کشتارگاه +class KillHouseRequestActionSerializer(serializers.ModelSerializer): + poultry_request = PoultryRequestSerializer(read_only=True) + kill_house = KillHouseSerializer(read_only=True) + winner = serializers.SerializerMethodField('get_winner') + + class Meta: + model = KillHouseRequestAction + fields = '__all__' + + def get_winner(self, instance): + winners = KillHouseRequestActionWinner.objects.filter(kill_house_request_auction=instance) + if winners.count() > 0: + winners = winners.last() + internal_dict = { + "key": winners.key, + "fee": winners.fee, + "quantity": winners.quantity + } + + return internal_dict + + +# سریالایزر مربوط به ثبت درخواست رزرو بورسی کشتارگاه +class KillHouseRequestActionWinnerSerializer(serializers.ModelSerializer): + kill_house_request_auction = KillHouseRequestActionSerializer(read_only=True) + + class Meta: + model = KillHouseRequestActionWinner + fields = '__all__' + + +# سریالایزر مربوط به اضافه کردن خودرو به درخواست بورسی کشتارگاه +class KillHouseRequestExchangeAddCarSerializer(serializers.ModelSerializer): + kill_house_reserve = KillHouseRequestExchangeReserveSerializer(read_only=True) + + class Meta: + model = KillHouseRequestExchangeAddCar + fields = '__all__' + + +# سریالایزر مربوط به تایید یا رد درخواست بورسی کشتارگاه توسط مرغدار + +class PoultryRequestExchangeAcceptSerializer(serializers.ModelSerializer): + poultry_request_exchange = PoultryRequestExchangeSerializer(read_only=True) + kill_house_request_exchange_reserve = KillHouseRequestExchangeReserveSerializer(read_only=True) + + class Meta: + model = PoultryRequestExchangeAccept + fields = '__all__' + + +class DriverRequestCancelSerializer(serializers.ModelSerializer): + Kill_house_add_car = KillHouseADDCARSerializer(read_only=True) + kill_house_request = KillHouseRequestSerializer(read_only=True) + + class Meta: + model = DriverRequestCancel + fields = '__all__' + + +class KillHouseComplaintSerializer(serializers.ModelSerializer): + bar = KillHouseAssignmentInformationSerializer(read_only=True) + + class Meta: + model = KillHouseComplaint + fields = '__all__' + + +class CheckKillHouseComplaintSerializer(serializers.ModelSerializer): + complaint = KillHouseComplaintSerializer(read_only=True) + + class Meta: + model = CheckKillHouseComplaint + fields = '__all__' + + +class CheckUnusualCasualtiesSerializer(serializers.ModelSerializer): + killHousecomplaint = KillHouseComplaintSerializer(read_only=True) + + class Meta: + model = CheckUnusualCasualties + fields = '__all__' + + +class KillHouseCreditorsSerializer(serializers.ModelSerializer): + kill_house = KillHouseSerializer(read_only=True) + + class Meta: + model = KillHouseCreditors + fields = '__all__' + + +class KillHouseWareHouseForDailyBroadCastOInDetailsSerializer(serializers.ModelSerializer): + informations = serializers.SerializerMethodField('get_informations') + + class Meta: + model = KillHouse + fields = ['informations', 'key'] + + def get_informations(self, obj): + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1, + date__date__lte=date2, kill_house=obj, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + total_pre_cold_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[ + 'total'] + total_pre_cold_weight = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[ + 'total'] + total_number_of_free_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('free_weight_of_carcasses'))[ + 'total'] + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + return { + "buyers": obj.name, + "city": obj.kill_house_operator.user.city.name, + "incoming_quantity_of_cold_house": 0, + "incoming_weight_of_cold_house": 0, + "total_pre_cold_quantity": total_pre_cold_quantity if total_pre_cold_quantity != None else 0, + "total_pre_cold_weight": total_pre_cold_weight if total_pre_cold_weight != None else 0, + "total_number_of_free_carcasses": total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + "total_free_weight_of_carcasses": total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + "total_number_of_carcasses": total_number_of_carcasses if total_number_of_carcasses != None else 0, + "total_weight_of_carcasses": total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + "final_total_number_of_carcasses": final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + "final_total_weight_of_carcasses": final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + "total_allocated_quantity": total_allocated_quantity if total_allocated_quantity != None else 0, + "total_allocated_weight": total_allocated_weight if total_allocated_weight != None else 0, + "total_accepted_allocated_quantity": total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + "total_accepted_allocated_weight": total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + "total_remain_quantity": total_remain_quantity if total_remain_quantity != None else 0, + "total_remain_weight": total_remain_weight if total_remain_weight != None else 0, + "number_of_guild": number_of_guild, + "number_of_steward": number_of_steward, + + } + + +class KillHouseWareHouseSerializer(serializers.ModelSerializer): + kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + + class Meta: + model = KillHouseWareHouse + fields = '__all__' + + +class KillHouseFreeBarInformationSerializer(serializers.ModelSerializer): + kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + exclusive_killer = KillHouseForAutoAllocationSerializer(read_only=True) + + class Meta: + model = KillHouseFreeBarInformation + fields = '__all__' + + +class KillHouseFreeBarInformationForWageTotalSerializer(serializers.ModelSerializer): + kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + total_amount = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouseFreeBarInformation + fields = '__all__' + + def get_info(self, obj): + role = self.context.get('request').GET['role'] + if role in ['KillHouse', 'SuperAdmin', 'AdminX', 'Supporter']: + amount = obj.total_wage_amount + elif role == 'ProvinceOperator': + amount = obj.union_share + elif role == 'Company': + amount = obj.company_share + elif role == 'Guilds': + amount = obj.guilds_share + else: + amount = obj.total_wage_amount + return amount + + +class TypeActivityForKillHouseBuyerSerializer(serializers.ModelSerializer): + class Meta: + model = TypeActivity + fields = ['key', 'title'] + + +class OutProvinceCarcassesBuyerForKillHouseSerializer(serializers.ModelSerializer): + type_activity = TypeActivityForKillHouseBuyerSerializer(read_only=True) + Kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + + class Meta: + model = OutProvinceCarcassesBuyer + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by' + ) + + +class KillHouseFreeSaleBarInformationSerializer(serializers.ModelSerializer): + kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + buyer = OutProvinceCarcassesBuyerForKillHouseSerializer(read_only=True) + + class Meta: + model = KillHouseFreeSaleBarInformation + fields = '__all__' + + +class ProvinceKillRequestForLetterVetSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = ProvinceKillRequest + fields = ['killhouse_user', 'info'] + + def get_info(self, obj): + if obj.kill_request.slaughter_house == None: + kill_place = obj.kill_request.kill_house.name + else: + kill_place = obj.kill_request.slaughter_house.name + return { + "kill_place": kill_place, + "quantity": obj.main_quantity, + "weight": obj.main_quantity * obj.province_request.poultry_request.Index_weight, + } + + +class PoultryRequestoutProvinceSerializer(serializers.ModelSerializer): + poultry = PoultryForPoultryRequestLetterSerializer(read_only=True) + out_province_poultry_request_buyer = OutProvincePoultryRequestBuyerSerializer(read_only=True) + hatching = serializers.SerializerMethodField('get_hatching') + out_state = serializers.SerializerMethodField('get_out_state') + total_system_quarantine_quantity = serializers.SerializerMethodField('get_total_system_quarantine_quantity') + + class Meta: + model = PoultryRequest + fields = ['key', 'out_state', 'hatching', 'create_date', 'poultry', 'order_code', 'quantity', 'remain_quantity', + 'send_date', + 'chicken_breed', 'financial_operation', 'Index_weight', 'amount', 'state_process', 'province_state', + 'order_code', 'registrar', 'buyer', 'out', 'quarantine_code', 'final_state', + 'out_province_request_cancel', 'out_province_request_canceller', 'out_province_driver_info', + 'hatching_left_over', 'freezing', 'total_wage_amount', 'wage_pay', 'has_wage', 'payer_type', + 'payer_fullname', 'out_province_poultry_request_buyer', 'buyer_mobile', 'buyer_fullname', + 'buyer_city', 'buyer_province', 'agent', 'killer_kill_house_unit_name', 'killer_kill_house_city', + 'killer_kill_house_province', 'kill_house_unique_id', 'payment_link', 'quarantine_quantity', + 'total_system_quarantine_quantity'] + + def get_hatching(self, obj): + + # if ProvinceKillRequest.objects.filter( + # province_request__city_request_Poultry__poultry_request=obj, + # state='accepted').exists(): + # age = (obj.send_date - obj.hatching.date).days + 1 + # else: + # age = (datetime.datetime.now() - obj.hatching.date).days + 1 + age = (obj.send_date - obj.hatching.date).days + 1 + + return { + "age": age, + "left_over": obj.hatching.left_over, + "city": obj.poultry.address.city.name, + "province": obj.poultry.address.province.name, + "hatching_quantity": obj.hatching.quantity, + } + + def get_out_state(self, obj): + state = None + if obj.province_state == 'rejected': + state = 'رد شده' + elif obj.province_state == 'pending' and obj.out_province_request_cancel == False: + state = 'در انتظار تایید' + + elif obj.province_state == 'accepted' and obj.has_wage == True and obj.wage_pay == False and obj.out_province_request_cancel == False and obj.out_province_request_cancel == False: + state = 'در انتظار پرداخت' + elif obj.province_state == 'accepted' and obj.has_wage == False and obj.wage_pay == False and obj.out_province_request_cancel == False and obj.out_province_request_cancel == False: + state = 'تایید شده' + elif obj.province_state == 'accepted' and obj.has_wage == True and obj.wage_pay == True and obj.out_province_request_cancel == False and obj.out_province_request_cancel == False: + state = 'پرداخت شده' + else: + state = 'لغو شده' + + return state + + def get_total_system_quarantine_quantity(self, obj): + code = PoultryRequestQuarantineCode.objects.filter(trash=False, poultry_request=obj).aggregate( + total=Sum('system_quarantine_quantity'))['total'] or 0 + return code + + +class PoultryRequestLetterTotalSerializer(serializers.ModelSerializer): + poultry = PoultryForPoultryRequestLetterSerializer(read_only=True) + + class Meta: + model = PoultryRequest + fields = ['poultry', 'order_code'] + + +class PoultryRequestLetterForProvinceVetSerializer(serializers.ModelSerializer): + poultry = PoultryForBarManagementSerializer(read_only=True) + hatching = serializers.SerializerMethodField('get_hatching') + province_kill_requests = serializers.SerializerMethodField('get_province_kill_requests') + + class Meta: + model = PoultryRequest + fields = ['key', 'id', 'poultry', 'order_code', 'send_date', + 'province_kill_requests', 'quantity', 'Index_weight', 'hatching'] + + def get_hatching(self, obj): + vet_farm = VetFarm.objects.filter(trash=False, poultry=obj.poultry).first() + pricing = Pricing.objects.filter(trash=False).last() + vet_farm_name = vet_farm.vet.user.fullname if vet_farm else None + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else None + age = (datetime.datetime.now() - obj.hatching.date).days + 1 + return { + "vet_farm_name": vet_farm_name, + "vet_farm_mobile": vet_farm_mobile, + "age": age, + "hatching_quantity": obj.hatching.quantity, + "price": pricing.live_chicken_price if pricing else None, + } + + def get_province_kill_requests(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request=obj) + serializer = ProvinceKillRequestForLetterVetSerializer(province_kill_requests, many=True) + return serializer.data + + +class KillHouseRequestForTotalInformationSerializer(serializers.ModelSerializer): + add_car = KillHouseADDCARForBarManagementSerializer(read_only=True) + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + kill_place = serializers.SerializerMethodField('get_kill_place') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + kill_house_vet = serializers.SerializerMethodField('get_kill_house_vet') + weight_info = serializers.SerializerMethodField('get_weight_info') + + class Meta: + model = KillHouseRequest + exclude = ( + 'id', + 'create_date', + 'modify_date', + # 'trash', + 'created_by', + 'modified_by', + 'killhouse_user_id_foreign_key', + 'kill_request_id_foreign_key', + 'province_request_id_foreign_key', + 'province_kill_request_id_foreign_key', + 'add_car_id_foreign_key', + 'kill_house_request_id_key', + 'capacity', + 'kill_house_request_auction_winner', + 'city_number', + 'city_name', + 'province_number', + 'province_name', + 'province_request', + 'province_kill_request', + + ) + + def get_kill_place(self, obj): + kill_place = obj.kill_request.slaughter_house.name if obj.kill_request.slaughter_house != None else obj.kill_request.kill_house.name + return kill_place + + def get_vet_farm(self, obj): + vet_farm = VetFarm.objects.filter( + poultry=obj.province_kill_request.province_request.poultry_request.poultry).last() + serializer = VetFarmForBarManagementSerializer(vet_farm) + return serializer.data + + def get_kill_house_vet(self, obj): + data = None + kill_request = KillRequest.objects.get(key=obj.kill_request.key, trash=False) + if kill_request.slaughter_house != None: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.slaughter_house).select_related( + 'vet__user').first() + else: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.kill_house).select_related( + 'vet__user').first() + if kill_house_vet: + data = { + "fullname": kill_house_vet.vet.user.fullname, + "mobile": kill_house_vet.vet.user.mobile, + } + return data + + def get_weight_info(self, obj): + + return { + "weight": int(obj.quantity * obj.province_request.poultry_request.Index_weight), + "index_weight": round(int(obj.quantity * obj.province_request.poultry_request.Index_weight) / obj.quantity, + 2), + } + + +class KillHouseRequestForTotalInformationInTableSerializer(serializers.ModelSerializer): + add_car = KillHouseADDCARForBarManagementSerializer(read_only=True) + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + kill_place = serializers.SerializerMethodField('get_kill_place') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + kill_house_vet = serializers.SerializerMethodField('get_kill_house_vet') + weight_info = serializers.SerializerMethodField('get_weight_info') + vet_check = serializers.SerializerMethodField('get_vet_check') + assignment = serializers.SerializerMethodField('get_assignment') + + class Meta: + model = KillHouseRequest + exclude = ( + 'id', + 'create_date', + 'modify_date', + # 'trash', + 'created_by', + 'modified_by', + 'killhouse_user_id_foreign_key', + 'kill_request_id_foreign_key', + 'province_request_id_foreign_key', + 'province_kill_request_id_foreign_key', + 'add_car_id_foreign_key', + 'kill_house_request_id_key', + 'capacity', + 'kill_house_request_auction_winner', + 'city_number', + 'city_name', + 'province_number', + 'province_name', + 'province_request', + 'province_kill_request', + + ) + + def get_kill_place(self, obj): + kill_place = obj.kill_request.slaughter_house.name if obj.kill_request.slaughter_house != None else obj.kill_request.kill_house.name + return kill_place + + def get_vet_farm(self, obj): + vet_farm = VetFarm.objects.filter( + poultry=obj.province_kill_request.province_request.poultry_request.poultry).last() + serializer = VetFarmForBarManagementSerializer(vet_farm) + return serializer.data + + def get_kill_house_vet(self, obj): + data = None + kill_request = KillRequest.objects.get(key=obj.kill_request.key, trash=False) + if kill_request.slaughter_house != None: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.slaughter_house).select_related( + 'vet__user').first() + else: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.kill_house).select_related( + 'vet__user').first() + if kill_house_vet: + data = { + "fullname": kill_house_vet.vet.user.fullname, + "mobile": kill_house_vet.vet.user.mobile, + } + return data + + def get_weight_info(self, obj): + + return { + "weight": int(obj.quantity * obj.province_request.poultry_request.Index_weight), + "index_weight": round(int(obj.quantity * obj.province_request.poultry_request.Index_weight) / obj.quantity, + 2), + } + + def get_vet_check(self, obj): + try: + vet_check = VetCheckRequest.objects.get(kill_house_request=obj) + vet_state = { + "date": vet_check.create_date, + "state": vet_check.state, + "kill_house_vet_fullname": vet_check.vet.user.fullname, + "kill_house_vet_mobile": vet_check.vet.user.mobile, + } + except: + vet_state = None + + return vet_state + + def get_assignment(self, obj): + try: + assignment = KillHouseAssignmentInformation.objects.get(kill_house_request=obj) + assignment_info = { + "net_weight": assignment.net_weight, + "real_quantity": assignment.real_quantity, + "car_weight_without_load_image": assignment.car_weight_without_load_image, + "car_weight_with_load_image": assignment.car_weight_with_load_image, + "state": assignment.state, + } + except: + assignment_info = None + + return assignment_info + + +class ProvinceKillRequestForTotalInformationSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + weight_info = serializers.SerializerMethodField('get_weight_info') + kill_place = serializers.SerializerMethodField('get_kill_place') + + class Meta: + model = ProvinceKillRequest + fields = ['killhouse_user', 'quantity', 'kill_place', 'main_quantity', 'total_killed_quantity', + 'first_car_allocated_quantity', 'total_killed_weight', 'automatic', 'weight_info', 'state'] + + def get_weight_info(self, obj): + province_kill_request_quantity = obj.main_quantity + province_kill_request_weight = int(obj.main_quantity * obj.province_request.poultry_request.Index_weight) + province_kill_request_index_weight = round((province_kill_request_weight / province_kill_request_quantity), 2) + + return { + "province_kill_request_quantity": province_kill_request_quantity, + "province_kill_request_weight": province_kill_request_weight, + "province_kill_request_index_weight": province_kill_request_index_weight, + } + + def get_kill_place(self, obj): + kill_place = obj.kill_request.slaughter_house.name if obj.kill_request.slaughter_house != None else obj.kill_request.kill_house.name + return kill_place + + +class ProvinceKillRequestForTotalInformationInTableSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForAutoAllocationSerializer(read_only=True) + weight_info = serializers.SerializerMethodField('get_weight_info') + kill_place = serializers.SerializerMethodField('get_kill_place') + kill_house_requests = serializers.SerializerMethodField('get_kill_house_requests') + + class Meta: + model = ProvinceKillRequest + fields = ['killhouse_user', 'quantity', 'kill_place', 'main_quantity', 'total_killed_quantity', + 'first_car_allocated_quantity', 'total_killed_weight', 'automatic', 'kill_house_requests', + 'weight_info', 'state'] + + def get_weight_info(self, obj): + province_kill_request_quantity = obj.main_quantity + province_kill_request_weight = int(obj.main_quantity * obj.province_request.poultry_request.Index_weight) + province_kill_request_index_weight = round((province_kill_request_weight / province_kill_request_quantity), 2) + + return { + "province_kill_request_quantity": province_kill_request_quantity, + "province_kill_request_weight": province_kill_request_weight, + "province_kill_request_index_weight": province_kill_request_index_weight, + } + + def get_kill_place(self, obj): + kill_place = obj.kill_request.slaughter_house.name if obj.kill_request.slaughter_house != None else obj.kill_request.kill_house.name + return kill_place + + def get_kill_house_requests(self, obj): + kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=obj) + kill_house_requests_serializer = KillHouseRequestForTotalInformationInTableSerializer(kill_house_requests, + many=True) + return kill_house_requests_serializer.data + + +class PoultryRequestForTotalInformationSerializer(serializers.ModelSerializer): + poultry = PoultryForBarManagementSerializer(read_only=True) + hatching = serializers.SerializerMethodField('get_hatching') + city_state = serializers.SerializerMethodField('get_city_state') + province_state = serializers.SerializerMethodField('get_province_state') + province_kill_requests = serializers.SerializerMethodField('get_province_kill_requests') + kill_house_requests = serializers.SerializerMethodField('get_kill_house_requests') + + class Meta: + model = PoultryRequest + fields = ['key', 'create_date', 'poultry', 'quantity', 'send_date', 'direct_buying', 'union', 'state_process', + 'free_sale_in_province', 'hatching', + 'province_state', 'amount', 'financial_operation', + 'chicken_breed', 'order_code', 'city_state', 'province_state', 'Index_weight', + 'province_kill_requests', 'kill_house_requests', 'freezing', 'out', 'out_province_driver_info', + 'out_province_request_canceller', 'out_province_request_cancel', 'buyer'] + + def get_city_state(self, obj): + try: + if obj.out == True: + city_operator = CityOperator.objects.get(key=obj.city_operator.key, trash=False) + return { + "city_operator_fullname": city_operator.user.fullname, + "city_operator_mobile": city_operator.user.mobile, + "state": 'accept' if obj.state_process == 'accepted' else 'reject', + "poultry": obj.poultry.unit_name, + "city": obj.poultry.address.city.name, + "province": obj.poultry.address.province.name, + "date": obj.send_date.date(), + } + + else: + city = CityOperatorCheckRequest.objects.get(trash=False, poultry_request=obj) + return { + "city_operator_fullname": city.city_operator_system.user.fullname, + "city_operator_mobile": city.city_operator_system.user.mobile, + "state": city.state, + "poultry": city.poultry_request.poultry.unit_name, + "city": city.poultry_request.poultry.address.city.name, + "province": city.poultry_request.poultry.address.province.name, + "date": city.create_date.date(), + } + except: + city_operator = CityOperator.objects.get(key=obj.city_operator.key, trash=False) + return { + "city_operator_fullname": city_operator.user.fullname, + "city_operator_mobile": city_operator.user.mobile, + "state": 'pending', + "poultry": obj.poultry.unit_name, + "city": obj.poultry.address.city.name, + "province": obj.poultry.address.province.name, + "date": None, + } + + def get_hatching(self, obj): + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=obj, + state='accepted').exists(): + + age2 = (obj.send_date - obj.hatching.date).days + 1 + else: + age2 = (datetime.datetime.now() - obj.hatching.date).days + 1 + price = Pricing.objects.filter(trash=False).last() + price = price.live_chicken_price if price else None + try: + vet_farm = VetFarm.objects.get(poultry=obj.poultry, trash=False) + vet_farm_info = { + "vet_farm_fullname": vet_farm.vet.user.fullname, + "vet_farm_mobile": vet_farm.vet.user.mobile + } + except: + vet_farm_info = None + + return { + "quantity": obj.hatching.quantity, + "left_over": obj.hatching.left_over, + "age": age2, + "price": price, + "vet_farm_info": vet_farm_info, + "weight": int(obj.quantity * obj.Index_weight) + + } + + def get_province_state(self, obj): + try: + if obj.out == True: + province_operator = ProvinceOperator.objects.get(user__role__name='ProvinceOperator', trash=False) + return { + "province_operator_fullname": province_operator.user.fullname, + "province_operator_mobile": province_operator.user.mobile, + "state": 'accept' if obj.province_state == 'accepted' else 'reject', + "poultry": obj.poultry.unit_name, + "city": obj.poultry.address.city.name, + "province": obj.poultry.address.province.name, + "date": obj.send_date.date(), + } + else: + province = ProvinceCheckOperatorRequest.objects.get(trash=False, poultry_request=obj) + return { + "province_operator_fullname": province.province_operator_system.user.fullname, + "province_operator_mobile": province.province_operator_system.user.mobile, + "state": province.state, + "poultry": province.poultry_request.poultry.unit_name, + "city": province.poultry_request.poultry.address.city.name, + "province": province.poultry_request.poultry.address.province.name, + "date": province.create_date.date(), + } + except: + province_operator = ProvinceOperator.objects.get(user__role__name='ProvinceOperator', trash=False) + return { + "province_operator_fullname": province_operator.user.fullname, + "province_operator_mobile": province_operator.user.mobile, + "state": 'pending', + "poultry": obj.poultry.unit_name, + "city": obj.poultry.address.city.name, + "province": obj.poultry.address.province.name, + "date": None, + } + + def get_province_kill_requests(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), trash=False, + province_request__poultry_request__key=obj.key) + province_kill_request_serializer = ProvinceKillRequestForTotalInformationSerializer(province_kill_requests, + many=True) + poultry_request_quantity = obj.quantity + poultry_request_remain_quantity = obj.remain_quantity + allocated_quantity = province_kill_requests.aggregate(total=Sum('main_quantity'))['total'] + + return { + "province_kill_request_serializer": province_kill_request_serializer.data, + "province_kill_requests_total_info": { + "poultry_request_quantity": poultry_request_quantity, + "poultry_request_remain_quantity": poultry_request_remain_quantity, + "allocated_quantity": allocated_quantity if allocated_quantity != None else 0, + } + } + + def get_kill_house_requests(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), trash=False, + province_request__poultry_request__key=obj.key) + allocated_quantity = province_kill_requests.aggregate(total=Sum('main_quantity'))['total'] + remain_quantity = province_kill_requests.aggregate(total=Sum('quantity'))['total'] + kill_house_requests = KillHouseRequest.objects.filter( + (Q(trash=False) | Q(trash=True, bar_remover__isnull=False)), province_request__poultry_request=obj) + kill_house_request_quantity = kill_house_requests.aggregate(total=Sum('quantity'))['total'] + + kill_house_request_vet_check = kill_house_requests.filter( + (Q(trash=False, vet_state='accepted', assignment_state_archive='pending') | Q(trash=False, + vet_state='pending', + assignment_state_archive='True'))) + kill_house_request_assignment = kill_house_requests.filter(trash=False, assignment_state_archive='True') + + kill_house_requests_serializer = KillHouseRequestForTotalInformationSerializer(kill_house_requests, + many=True) + kill_house_request_vet_check_serializer = KillHouseRequestForTotalInformationSerializer( + kill_house_request_vet_check, + many=True) + kill_house_request_assignment_serializer = KillHouseRequestForTotalInformationSerializer( + kill_house_request_assignment, + many=True) + + return { + "allocated_quantity": allocated_quantity, + "remain_quantity": remain_quantity, + "kill_house_request_quantity": kill_house_request_quantity if kill_house_request_quantity != None else 0, + "number_of_bars": len(kill_house_requests), + "vet_accepted_number_of_bars": len(kill_house_request_vet_check), + "vet_remain_number_of_bars": len(kill_house_requests) - len(kill_house_request_vet_check), + "kill_house_request_assignment": len(kill_house_request_assignment), + "assignment_remain_number_of_bars": len(kill_house_requests) - len(kill_house_request_assignment), + "kill_house_requests_serializer": kill_house_requests_serializer.data, + "kill_house_request_vet_check_serializer": kill_house_request_vet_check_serializer.data, + "kill_house_request_assignment_serializer": kill_house_request_assignment_serializer.data, + + } + + +class PoultryRequestForTotalInformationInTableSerializer(serializers.ModelSerializer): + poultry = PoultryForBarManagementSerializer(read_only=True) + hatching = serializers.SerializerMethodField('get_hatching') + city_state = serializers.SerializerMethodField('get_city_state') + province_state = serializers.SerializerMethodField('get_province_state') + province_kill_requests = serializers.SerializerMethodField('get_province_kill_requests') + + class Meta: + model = PoultryRequest + fields = ['key', 'create_date', 'poultry', 'quantity', 'send_date', 'direct_buying', 'union', 'state_process', + 'free_sale_in_province', 'hatching', + 'province_state', 'amount', 'financial_operation', + 'chicken_breed', 'order_code', 'city_state', 'province_state', 'Index_weight', + 'province_kill_requests'] + + def get_city_state(self, obj): + try: + city = CityOperatorCheckRequest.objects.get(trash=False, poultry_request=obj) + return { + "city_operator_fullname": city.city_operator_system.user.fullname, + "city_operator_mobile": city.city_operator_system.user.mobile, + "state": city.state, + "poultry": city.poultry_request.poultry.unit_name, + "city": city.poultry_request.poultry.address.city.name, + "province": city.poultry_request.poultry.address.province.name, + "date": city.create_date.date(), + } + except: + city_operator = CityOperator.objects.get(key=obj.city_operator.key, trash=False) + return { + "city_operator_fullname": city_operator.user.fullname, + "city_operator_mobile": city_operator.user.mobile, + "state": 'pending', + "poultry": obj.poultry.unit_name, + "city": obj.poultry.address.city.name, + "province": obj.poultry.address.province.name, + "date": None, + } + + def get_hatching(self, obj): + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=obj, + state='accepted').exists(): + + age2 = (obj.send_date - obj.hatching.date).days + 1 + else: + age2 = (datetime.datetime.now() - obj.hatching.date).days + 1 + price = Pricing.objects.filter(trash=False).last() + price = price.live_chicken_price if price else None + try: + vet_farm = VetFarm.objects.get(poultry=obj.poultry, trash=False) + vet_farm_info = { + "vet_farm_fullname": vet_farm.vet.user.fullname, + "vet_farm_mobile": vet_farm.vet.user.mobile + } + except: + vet_farm_info = None + + return { + "quantity": obj.hatching.quantity, + "left_over": obj.hatching.left_over, + "age": age2, + "price": price, + "vet_farm_info": vet_farm_info, + "weight": int(obj.quantity * obj.Index_weight) + + } + + def get_province_state(self, obj): + try: + province = ProvinceCheckOperatorRequest.objects.get(trash=False, poultry_request=obj) + return { + "province_operator_fullname": province.province_operator_system.user.fullname, + "province_operator_mobile": province.province_operator_system.user.mobile, + "state": province.state, + "poultry": province.poultry_request.poultry.unit_name, + "city": province.poultry_request.poultry.address.city.name, + "province": province.poultry_request.poultry.address.province.name, + "date": province.create_date.date(), + } + except: + province_operator = ProvinceOperator.objects.get(user__role__name='ProvinceOperator', trash=False) + return { + "province_operator_fullname": province_operator.user.fullname, + "province_operator_mobile": province_operator.user.mobile, + "state": 'pending', + "poultry": obj.poultry.unit_name, + "city": obj.poultry.address.city.name, + "province": obj.poultry.address.province.name, + "date": None, + } + + def get_province_kill_requests(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), trash=False, + province_request__poultry_request__key=obj.key) + province_kill_request_serializer = ProvinceKillRequestForTotalInformationInTableSerializer( + province_kill_requests, + many=True) + + return province_kill_request_serializer.data + + +class SlaughterHouseTransactionSerializer(serializers.ModelSerializer): + kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + parent_kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + + class Meta: + model = SlaughterHouseTransaction + fields = '__all__' + + +class KillHouseWageSerializer(serializers.ModelSerializer): + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'wage_info'] + + def get_wage_info(self, obj): + total_weight = 0 + total_wage = 0 + total_paid_wage = 0 + total_unpaid_wage = 0 + kill_house_requests = KillHouseRequest.objects.filter(Q(killer=obj) | Q(killhouse_user=obj), trash=False) + total_wage += \ + kill_house_requests.aggregate(total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + total_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + first_car_allocated_quantity=0, + state__in=('pending', 'accepted'), trash=False, + return_to_province=False, archive_by_province=False) + total_wage += province_kill_requests.aggregate(total=Sum(F('total_killed_weight') * F('wage')))[ + 'total'] or 0 + total_weight += province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + transactions = SlaughterHouseTransaction.objects.filter(Q(kill_house=obj) | Q(parent_kill_house=obj), + state='completed', trash=False) + total_paid_wage = transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + return { + "total_weight": total_weight, + "total_wage": total_wage, + "total_paid_wage": total_paid_wage, + "total_unpaid_wage": total_wage - total_paid_wage, + } + + +class TotalWageInformationExclusiveKillerSerializer(serializers.ModelSerializer): + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = KillHouse + fields = ['name', 'key', 'wage_info'] + + def get_wage_info(self, obj): + 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_kill_house_finance_info(obj) + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=obj, 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'] + total_price = finance_info['total_price'] + + # total_pure_province_carcasses_price = finance_info['total_pure_province_carcasses_price'] + # total_out_selling_province_carcasses_price = finance_info['total_out_selling_province_carcasses_price'] + # 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'] + # total_price = finance_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 + + 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 + + shares = [ + { + "name": "اتحادیه", + "province_kill_request_wage": union_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + }, + { + "name": "شرکت", + "province_kill_request_wage": company_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + }, + { + "name": "صنف پروتئین", + "province_kill_request_wage": guilds_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + }, + { + "name": "دامپزشک", + "province_kill_request_wage": other_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + }] + + return { + "wage_counting_type": wage_counting_type, + "total_wage": finance_info['total_price'], + "total_paid_wage": total_paid_wage, + "off": obj.off, + "total_unpaid_wage": finance_info['total_price'] - (total_paid_wage + obj.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'], + "user_token": 'k' + obj.kill_house_operator.user.user_gate_way_id, + "shares": shares, + "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'], + + } + + +class TotalWageInformationKillHouseExclusiveKillerSerializer(serializers.ModelSerializer): + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = KillHouse + fields = ['name', 'key', 'wage_info'] + + def get_wage_info(self, obj): + # kill_house_ids = KillHouseRequest.objects.filter(Q(killhouse_user=obj) | Q(killer=obj), archive_wage=False, + # trash=False + # ).values_list('killer', flat=True).distinct() + kill_house_ids = KillHousePercentage.objects.filter( + Q(kill_house=obj) | Q(kill_house_for_killer=obj, kill_house__type='exclusive'), trash=False).values_list( + 'kill_house', flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids) + kill_house_srz = TotalWageInformationExclusiveKillerSerializer(kill_houses, many=True, + context={'kill_house': obj}) + return kill_house_srz.data + + +class ProvinceRequestForKillHouseLetterSerialize(serializers.ModelSerializer): + wage_info = serializers.SerializerMethodField('get_wage_info') + + model = ProvinceKillRequest + fields = ['id', 'wage_info'] + + def get_wage_info(self, obj): + age = (datetime.datetime.now() - obj.province_request.poultry_request.hatching.date).days + 1 + poultry = { + 'poultry': obj.province_request.poultry_request.poultry.unit_name, + 'poultry_mobile': obj.province_request.poultry_request.poultry.user.mobile, + 'poultry_city': obj.province_request.poultry_request.poultry.address.city.name, + 'quantity': obj.main_quantity, + 'Index_weight': obj.province_request.poultry_request.Index_weight, + 'chicken_age': age, + } + return poultry + + +class KillHouseLetterForProvinceSerializer(serializers.ModelSerializer): + province_kill_request = serializers.SerializerMethodField() + total_quantity = serializers.SerializerMethodField() + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['key', 'killer', 'name', 'kill_house_operator', 'province_kill_request', 'total_quantity'] + + def get_province_kill_request(self, obj): + date = self.context.get('date') + kill_requests = KillHouseRequest.objects.filter( + Q(killer=obj) | Q(killhouse_user=obj), + trash=False, + kill_request__recive_date__date=date + ).select_related( + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__hatching', + 'province_request__poultry_request__poultry__address', + 'add_car__driver' + ) + + total_quantity = kill_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get('total_quantity', 0) + self.total_quantity = total_quantity + + poultries = [ + { + 'poultry': kill.province_request.poultry_request.poultry.unit_name, + 'poultry_mobile': kill.province_request.poultry_request.poultry.user.mobile, + 'poultry_city': kill.province_request.poultry_request.poultry.address.city.name, + 'quantity': kill.accepted_real_quantity, + 'Index_weight': kill.province_request.poultry_request.Index_weight, + 'chicken_age': (datetime.datetime.now() - kill.province_request.poultry_request.hatching.date).days + 1, + 'weight': kill.accepted_real_weight, + 'car_type': kill.add_car.driver.type_car, + 'driver_name': kill.add_car.driver.driver_name, + 'traffic_code': kill.traffic_code, + 'clearance_code': kill.clearance_code, + 'pelak': kill.add_car.driver.pelak, + } + for kill in kill_requests + ] + + return poultries + + def get_total_quantity(self, obj): + return getattr(self, 'total_quantity', 0) + + +class KillHousetestSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_province_kill_request') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'info'] + + def get_province_kill_request(self, obj): + total_weight = 0 + total_wage = 0 + total_paid_wage = 0 + total_unpaid_wage = 0 + union_total_weight = 0 + union_total_wage = 0 + union_total_paid_wage = 0 + union_total_unpaid_wage = 0 + union_province_kill_request_total_wage = 0 + freezing_union_province_kill_request_total_wage = 0 + union_kill_house_free_live_bar_total_wage = 0 + union_kill_house_free_carcases_bar_total_wage = 0 + union_chain_allocation_total_wage = 0 + union_province_kill_request_total_weight = 0 + freezing_union_province_kill_request_total_weight = 0 + union_kill_house_free_live_bar_total_weight = 0 + union_kill_house_free_carcases_bar_total_weight = 0 + union_chain_allocation_total_weight = 0 + + company_total_weight = 0 + company_total_wage = 0 + company_total_paid_wage = 0 + company_total_unpaid_wage = 0 + company_province_kill_request_total_wage = 0 + freezing_company_province_kill_request_total_wage = 0 + company_kill_house_free_live_bar_total_wage = 0 + company_kill_house_free_carcases_bar_total_wage = 0 + company_chain_allocation_total_wage = 0 + company_province_kill_request_total_weight = 0 + freezing_company_province_kill_request_total_weight = 0 + company_kill_house_free_live_bar_total_weight = 0 + company_kill_house_free_carcases_bar_total_weight = 0 + company_chain_allocation_total_weight = 0 + + guilds_total_weight = 0 + guilds_total_wage = 0 + guilds_total_paid_wage = 0 + guilds_total_unpaid_wage = 0 + guilds_province_kill_request_total_wage = 0 + freezing_guilds_province_kill_request_total_wage = 0 + guilds_kill_house_free_live_bar_total_wage = 0 + guilds_kill_house_free_carcases_bar_total_wage = 0 + guilds_chain_allocation_total_wage = 0 + guilds_province_kill_request_total_weight = 0 + freezing_guilds_province_kill_request_total_weight = 0 + guilds_kill_house_free_live_bar_total_weight = 0 + guilds_kill_house_free_carcases_bar_total_weight = 0 + guilds_chain_allocation_total_weight = 0 + province_kill_request_total_wage = 0 + province_kill_request_total_weight = 0 + freezing_province_kill_requests_total_wage = 0 + freezing_province_kill_requests_total_weight = 0 + chain_total_wage = 0 + chain_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 + + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), trash=False, + return_to_province=False, + first_car_allocated_quantity=0, + archive_wage=False, + ).exclude(union_share=0, company_share=0, + guilds_share=0) + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True) + + kill_house_requests = KillHouseRequest.objects.filter( + Q(Q(killer=obj) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) | Q(killer=obj)), + # killhouse_user=kill_house, + archive_wage=False, + trash=False + ) + + kill_house_requests = kill_house_requests.filter(Q(killer=obj) | Q(killhouse_user=obj)).exclude( + province_kill_request__union_share=0, province_kill_request__company_share=0, + province_kill_request__guilds_share=0) + + # kill_house_requests = KillHouseRequest.objects.filter( + # Q(Q(killhouse_user=obj) & Q(killer=obj)) | Q( + # Q(killhouse_user=obj) & Q(killer__isnull=True)) | Q( + # Q(killhouse_user=obj) | Q(killer=obj)), archive_wage=False, + # trash=False + # ).exclude(province_kill_request__union_share=0, province_kill_request__company_share=0, + # province_kill_request__guilds_share=0) + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True) + + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=obj, archive_wage=False, + trash=False) + free_bars_live = free_bars.filter(buy_type='live', trash=False) + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False) + province_kill_requests_total_wage = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_wage_amount'))[ + 'total'] or 0 + freezing_province_kill_request_total_wage = \ + freezing_province_kill_requests.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + total_wage += province_kill_requests_total_wage + freezing_province_kill_request_total_wage + province_kill_requests_total_weight = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_province_kill_request_total_weight = \ + freezing_province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + total_weight += province_kill_requests_total_weight + freezing_province_kill_request_total_weight + kill_house_reqest_total_wage = \ + kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + freezing_kill_house_reqest_total_wage = \ + freezing_kill_house_requests.aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + total_wage += kill_house_reqest_total_wage + freezing_kill_house_reqest_total_wage + + kill_house_reqest_total_weight = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + freezing_kill_house_reqest_total_weight = \ + freezing_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + total_weight += kill_house_reqest_total_weight + freezing_kill_house_reqest_total_weight + + free_bars_live_total_wage = free_bars_live.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_wage += free_bars_live_total_wage + free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + total_weight += free_bars_live_total_weight + free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_wage += free_bars_carcases_total_wage + free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_weight += free_bars_carcases_total_weight + + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=obj, status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + union_province_kill_request_total_weight = \ + province_kill_requests.filter(union_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_union_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(union_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + union_province_kill_request_total_weight += \ + kill_house_requests.filter(province_kill_request__union_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + freezing_union_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + union_province_kill_request_total_wage = \ + province_kill_requests.filter(union_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('union_share'))[ + 'total'] or 0 + union_province_kill_request_total_wage += \ + kill_house_requests.filter(province_kill_request__union_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + + freezing_union_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + freezing_union_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + union_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + union_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + union_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + union_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_paid_wage += \ + slaughter_transactions.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_weight = union_province_kill_request_total_weight + freezing_union_province_kill_request_total_weight + union_chain_allocation_total_weight + union_kill_house_free_live_bar_total_weight + union_kill_house_free_carcases_bar_total_weight + union_total_wage = union_province_kill_request_total_wage + freezing_union_province_kill_request_total_wage + union_chain_allocation_total_wage + union_kill_house_free_live_bar_total_wage + union_kill_house_free_carcases_bar_total_wage + union_total_unpaid_wage = union_total_wage - union_total_paid_wage + + company_province_kill_request_total_weight = \ + province_kill_requests.filter(company_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + company_province_kill_request_total_weight += \ + kill_house_requests.filter(province_kill_request__company_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(company_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + company_province_kill_request_total_wage = \ + province_kill_requests.filter(company_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('company_share'))[ + 'total'] or 0 + company_province_kill_request_total_wage += \ + kill_house_requests.filter(province_kill_request__company_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + freezing_company_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + company_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + company_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + + company_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate( + total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + company_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_paid_wage += \ + slaughter_transactions.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_weight = company_province_kill_request_total_weight + freezing_company_province_kill_request_total_weight + company_chain_allocation_total_weight + company_kill_house_free_live_bar_total_weight + company_kill_house_free_carcases_bar_total_weight + company_total_wage = company_province_kill_request_total_wage + freezing_company_province_kill_request_total_wage + company_chain_allocation_total_wage + company_kill_house_free_live_bar_total_wage + company_kill_house_free_carcases_bar_total_wage + company_total_unpaid_wage = company_total_wage - company_total_paid_wage + + guilds_province_kill_request_total_weight = \ + province_kill_requests.filter(guilds_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + guilds_province_kill_request_total_weight += \ + kill_house_requests.filter(province_kill_request__guilds_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + freezing_guilds_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + guilds_province_kill_request_total_wage = \ + province_kill_requests.filter(guilds_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_province_kill_request_total_wage += \ + kill_house_requests.filter(province_kill_request__guilds_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + guilds_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + guilds_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + + guilds_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate( + total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + guilds_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_total_paid_wage += \ + slaughter_transactions.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + + guilds_total_weight = guilds_province_kill_request_total_weight + freezing_guilds_province_kill_request_total_weight + guilds_chain_allocation_total_weight + guilds_kill_house_free_live_bar_total_weight + guilds_kill_house_free_carcases_bar_total_weight + guilds_total_wage = guilds_province_kill_request_total_wage + freezing_guilds_province_kill_request_total_wage + guilds_chain_allocation_total_wage + guilds_kill_house_free_live_bar_total_wage + guilds_kill_house_free_carcases_bar_total_wage + guilds_total_unpaid_wage = guilds_total_wage - guilds_total_paid_wage + return { + "total_weight": total_weight, + "total_wage": total_wage, + "total_paid_wage": total_paid_wage, + "total_unpaid_wage": total_wage - total_paid_wage, + "province_kill_requests_total_wage": province_kill_requests_total_wage, + "province_kill_requests_total_weight": province_kill_requests_total_weight, + "freezing_province_kill_requests_total_wage": freezing_province_kill_requests_total_wage, + "freezing_province_kill_requests_total_weight": freezing_province_kill_requests_total_weight, + "free_bars_live_total_wage": free_bars_live_total_wage, + "free_bars_live_total_weight": free_bars_live_total_weight, + "free_bars_carcases_total_wage": free_bars_carcases_total_wage, + "free_bars_carcases_total_weight": free_bars_carcases_total_weight, + "shares": { + "union_total_weight": union_total_weight, + "union_total_wage": union_total_wage, + "union_total_paid_wage": union_total_paid_wage, + "union_total_unpaid_wage": union_total_unpaid_wage, + "union_province_kill_request_total_wage": union_province_kill_request_total_wage, + "union_kill_house_free_live_bar_total_wage": union_kill_house_free_live_bar_total_wage, + "union_kill_house_free_carcases_bar_total_wage": union_kill_house_free_carcases_bar_total_wage, + "union_chain_allocation_total_wage": union_chain_allocation_total_wage, + "union_province_kill_request_total_weight": union_province_kill_request_total_weight, + "union_kill_house_free_live_bar_total_weight": union_kill_house_free_live_bar_total_weight, + "union_kill_house_free_carcases_bar_total_weight": union_kill_house_free_carcases_bar_total_weight, + "union_chain_allocation_total_weight": union_chain_allocation_total_weight, + "freezing_union_province_kill_request_total_wage": freezing_union_province_kill_request_total_wage, + "freezing_union_province_kill_request_total_weight": freezing_union_province_kill_request_total_weight, + + "company_total_weight": company_total_weight, + "company_total_wage": company_total_wage, + "company_total_paid_wage": company_total_paid_wage, + "company_total_unpaid_wage": company_total_unpaid_wage, + "company_province_kill_request_total_wage": company_province_kill_request_total_wage, + "company_kill_house_free_live_bar_total_wage": company_kill_house_free_live_bar_total_wage, + "company_kill_house_free_carcases_bar_total_wage": company_kill_house_free_carcases_bar_total_wage, + "company_chain_allocation_total_wage": company_chain_allocation_total_wage, + "company_province_kill_request_total_weight": company_province_kill_request_total_weight, + "company_kill_house_free_live_bar_total_weight": company_kill_house_free_live_bar_total_weight, + "company_kill_house_free_carcases_bar_total_weight": company_kill_house_free_carcases_bar_total_weight, + "company_chain_allocation_total_weight": company_chain_allocation_total_weight, + "freezing_company_province_kill_request_total_wage": freezing_company_province_kill_request_total_wage, + "freezing_company_province_kill_request_total_weight": freezing_company_province_kill_request_total_weight, + + "guilds_total_weight": guilds_total_weight, + "guilds_total_wage": guilds_total_wage, + "guilds_total_paid_wage": guilds_total_paid_wage, + "guilds_total_unpaid_wage": guilds_total_unpaid_wage, + "guilds_province_kill_request_total_wage": guilds_province_kill_request_total_wage, + "guilds_kill_house_free_live_bar_total_wage": guilds_kill_house_free_live_bar_total_wage, + "guilds_kill_house_free_carcases_bar_total_wage": guilds_kill_house_free_carcases_bar_total_wage, + "guilds_chain_allocation_total_wage": guilds_chain_allocation_total_wage, + "guilds_province_kill_request_total_weight": guilds_province_kill_request_total_weight, + "guilds_kill_house_free_live_bar_total_weight": guilds_kill_house_free_live_bar_total_weight, + "guilds_kill_house_free_carcases_bar_total_weight": guilds_kill_house_free_carcases_bar_total_weight, + "guilds_chain_allocation_total_weight": guilds_chain_allocation_total_weight, + "freezing_guilds_province_kill_request_total_wage": freezing_guilds_province_kill_request_total_wage, + "freezing_guilds_province_kill_request_total_weight": freezing_guilds_province_kill_request_total_weight, + } + } + + +class VetKillHouseSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(read_only=True) + kill_houses = serializers.SerializerMethodField('get_kill_houses') + + class Meta: + model = Vet + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by', + ) + + def get_kill_houses(self, instance): + kill_houses_list = [] + kill_house_vets = KillHouseVet.objects.filter(vet=instance, trash=False).select_related( + 'kill_house__kill_house_operator__user') + if kill_house_vets.count() > 0: + for kill_house_vet in kill_house_vets: + internal_dict = { + "Kill_house_key": kill_house_vet.kill_house.key, + "Kill_house_name": kill_house_vet.kill_house.name, + "Kill_house_user_full_name": kill_house_vet.kill_house.kill_house_operator.user.fullname, + "Kill_house_user_mobile": kill_house_vet.kill_house.kill_house_operator.user.mobile, + } + kill_houses_list.append(internal_dict) + + return kill_houses_list + + +class VetFarmListSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(read_only=True) + farms = serializers.SerializerMethodField('get_farms') + + class Meta: + model = Vet + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by', + ) + + def get_farms(self, instance): + farms_list = [] + farms = VetFarm.objects.filter(vet=instance, trash=False).select_related('poultry', 'vet') + if farms.count() > 0: + for farm in farms: + internal_dict = { + "poultry_name": farm.poultry.unit_name, + "poultry_full_name": farm.poultry.user.fullname, + "poultry_mobile": farm.poultry.user.mobile, + "poultry_hall": farm.hall, + "vet_id": farm.vet.id, + "vet_farm_key": farm.key, + } + farms_list.append(internal_dict) + + return farms_list + + +class KillHouseOperatorForBarDifferenceRequestSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = KillHouseOperator + fields = ['user'] + + +class KillHouseForBarDifferenceRequestSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForBarDifferenceRequestSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['kill_house_operator', 'name', 'killer', 'key'] + + +class BarDifferenceRequestSerializer(serializers.ModelSerializer): + hatching = PoultryHatchingForBarDifferenceRequestSerializer(read_only=True) + kill_house = KillHouseForBarDifferenceRequestSerializer(read_only=True) + bar_info = serializers.SerializerMethodField('get_bar_info') + + class Meta: + model = BarDifferenceRequest + fields = '__all__' + + def get_bar_info(self, obj): + total_quantity = 0 + first_total_quantity = 0 + difference_quantity = 0 + total_weight = 0 + Province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj.kill_house, trash=False, + state__in=('pending', 'accepted'), + return_to_province=False, + province_request__poultry_request__hatching=obj.hatching) + + first_total_quantity = \ + Province_kill_requests.aggregate(total=Sum('main_quantity'))[ + 'total'] or 0 + + total_quantity = \ + Province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_weight = \ + Province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + + difference_quantity = first_total_quantity - total_quantity + # kill_house_requests = KillHouseRequest.objects.filter(Q(killhouse_user=obj.kill_house) | Q(killer=obj.kill_house),trash=False, + # province_request__poultry_request__hatching=obj.hatching) + # + # + # total_quantity +=\ + # kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + # 'total'] or 0 + # total_weight +=\ + # kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + # 'total'] or 0 + + result = { + "first_total_quantity": first_total_quantity, + "total_quantity": total_quantity, + "difference_quantity": difference_quantity, + "total_weight": total_weight, + } + + return result + + +class KillHouseOperatorForHatchingDetailSerializer(serializers.ModelSerializer): + user = SystemUserProfileForPoultryLocSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = KillHouseOperator + fields = ['user', 'address'] + + +class KillHouseForHatchingDetailSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForHatchingDetailSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['kill_house_operator', 'name'] + + +class KillHouseRequestForHatchingDetailSerializer(serializers.ModelSerializer): + buyer = KillHouseForHatchingDetailSerializer(source='killhouse_user', read_only=True) + date = serializers.DateTimeField(source='kill_request.recive_date', read_only=True) + killer_info = KillHouseForHatchingDetailSerializer(source='killer', read_only=True) + product = serializers.CharField(default='مرغ گرم', read_only=True) + status = serializers.SerializerMethodField() + poultry_request = serializers.SerializerMethodField() + + class Meta: + model = KillHouseRequest + fields = [ + 'bar_code', 'date', 'buyer', 'killer_info', + 'product', 'clearance_code', 'accepted_real_quantity', 'accepted_real_weight', 'quarantine_quantity', + 'status', 'ware_house_accepted_real_quantity', 'ware_house_accepted_real_weight', 'poultry_request' + ] + read_only_fields = fields + + def get_status(self, obj): + if obj.ware_house_confirmation == True: + status = 'ورود به انبار' + elif obj.assignment_state_archive == 'True' and obj.ware_house_confirmation == False: + status = 'در انتظار ورود به انبار' + elif obj.assignment_state_archive == 'True': + status = 'تخلیه شده' + else: + status = 'درانتظار تخلیه' + return status + + def get_poultry_request(self, obj): + return PoultryRequestForBarMangementSerializer(obj.province_kill_request.province_request.poultry_request).data + + +class KillHouseForPerformanceDashboardSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForBarDifferenceRequestSerializer(read_only=True) + killing_info = serializers.SerializerMethodField('get_killing_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'kill_house_operator', 'killer', 'killing_info'] + + def get_killing_info(self, obj): + date1 = self.context.get('date1') + date2 = self.context.get('date2') + + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, killhouse_user=obj, + state__in=('pending', 'accepted'), + return_to_province=False, archive_wage=False, + temporary_trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + first_car_allocated_quantity=0) + kill_house_requests = KillHouseRequest.objects.filter(Q(killer=obj) | Q(killhouse_user=obj), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + calculate_status=True, temporary_trash=False, trash=False) + kill_house_free_bar = KillHouseFreeBarInformation.objects.filter(kill_house=obj, calculate_status=True, + buy_type='live', + create_date__date__gte=date1, + create_date__date__lte=date2, + temporary_trash=False, trash=False) + + province_kill_requests_aggregates = province_kill_requests.aggregate( + total_count=Count('id'), + total_weight=Sum('total_killed_weight'), + total_quantity=Sum('total_killed_quantity') + ) + + kill_house_requests_aggregates = kill_house_requests.aggregate( + total_count=Count('id'), + total_weight=Sum('accepted_real_weight'), + total_quantity=Sum('accepted_real_quantity') + ) + kill_house_requests_ware_house_true = kill_house_requests.filter(ware_house_confirmation=True).aggregate( + total_count=Count('id'), + total_weight=Sum('accepted_real_weight'), + total_quantity=Sum('accepted_real_quantity') + ) + kill_house_requests_ware_house_false = kill_house_requests.filter(ware_house_confirmation=False).aggregate( + total_count=Count('id'), + total_weight=Sum('accepted_real_weight'), + total_quantity=Sum('accepted_real_quantity') + ) + + kill_house_free_bar_aggregates = kill_house_free_bar.aggregate( + total_count=Count('id'), + total_weight=Sum('live_weight'), + total_quantity=Sum('quantity') + + ) + total_weight = (province_kill_requests_aggregates['total_weight'] or 0) + ( + kill_house_requests_aggregates['total_weight'] or 0) + \ + (kill_house_free_bar_aggregates['total_weight'] or 0) + total_quantity = (province_kill_requests_aggregates['total_quantity'] or 0) + \ + (kill_house_requests_aggregates['total_quantity'] or 0) + \ + (kill_house_free_bar_aggregates['total_quantity'] or 0) + total_avg_weight = round(total_weight / total_quantity, 1) if total_quantity > 0 else 0 + return { + "province_kill_requests_count": province_kill_requests_aggregates['total_count'] or 0, + "province_kill_requests_quantity": province_kill_requests_aggregates['total_quantity'] or 0, + "province_kill_requests_weight": province_kill_requests_aggregates['total_weight'] or 0, + "kill_house_requests_count": kill_house_requests_aggregates['total_count'] or 0, + "kill_house_requests_quantity": kill_house_requests_aggregates['total_quantity'] or 0, + "kill_house_requests_weight": kill_house_requests_aggregates['total_weight'] or 0, + "kill_house_free_bar_count": kill_house_free_bar_aggregates['total_count'] or 0, + "kill_house_free_bar_quantity": kill_house_free_bar_aggregates['total_quantity'] or 0, + "kill_house_free_bar_weight": kill_house_free_bar_aggregates['total_weight'] or 0, + "total_quantity": total_quantity, + "total_weight": total_weight, + "total_avg_weight": total_avg_weight, + "total_count": province_kill_requests_aggregates['total_count'] or 0 + kill_house_requests_aggregates[ + 'total_count'] or 0 + + kill_house_free_bar_aggregates['total_count'] or 0, + "kill_house_requests_ware_house_true_quantity": kill_house_requests_ware_house_true['total_quantity'] or 0, + "kill_house_requests_ware_house_true_weight": kill_house_requests_ware_house_true['total_weight'] or 0, + "kill_house_requests_ware_house_false_quantity": kill_house_requests_ware_house_false[ + 'total_quantity'] or 0, + "kill_house_requests_ware_house_false_weight": kill_house_requests_ware_house_false['total_weight'] or 0, + + } + + +class DirectBuyingPaymentSerializer(serializers.ModelSerializer): + class Meta: + model = DirectBuyingPayment + fields = ['key', 'amount', 'image', 'date', 'payment_deadline_supporter_message'] + + +class KillHouseForDirectBuyingSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['name', 'kill_house_operator'] + + +class KillRequestForDirectBuyingTrueSerializer(serializers.ModelSerializer): + kill_house = KillHouseForDirectBuyingSerializer(read_only=True) + slaughter_house = KillHouseForDirectBuyingSerializer(read_only=True) + poultry = PoultryForPredictionSerializer(read_only=True) + poultry_request = PoultryRequestForMarketSerializer(read_only=True) + poultry_hatching = PoultryHatchingForLocSerializer(read_only=True) + + class Meta: + model = KillRequest + fields = ['key', 'create_date', 'recive_date', 'free_direct_buying', 'chicken_breed', 'kill_house', + 'slaughter_house', 'poultry', 'poultry_request', 'payment_deadline_date', 'payment_deadline_days', + 'kill_capacity', 'Index_weight', 'amount', 'market_final_accept', 'market_state', 'recive_time', + 'market_code_status', 'market_code', 'input_market_code', 'direct_buying_state', 'free_direct_buying', + 'poultry_hatching', 'automatic_accept', 'input_direct_buying_code'] + + +class ReturnProvinceKillRequestSerializer(serializers.ModelSerializer): + killhouse_user = KillHouseForReturnBuyingSerializer(read_only=True) + poultry_unit_name = serializers.CharField(source='province_request.poultry_request.poultry.unit_name', + read_only=True) + poultry_fullname = serializers.CharField(source='province_request.poultry_request.poultry.user.fullname', + read_only=True) + poultry_mobile = serializers.CharField(source='province_request.poultry_request.poultry.user.mobile', + read_only=True) + poultry_city = serializers.CharField(source='province_request.poultry_request.poultry.user.city.name', + read_only=True) + killing_date = serializers.CharField(source='province_request.poultry_request.send_date', read_only=True) + order_code = serializers.CharField(source='province_request.poultry_request.order_code', read_only=True) + poultry_request_quantity = serializers.CharField(source='province_request.poultry_request.quantity', read_only=True) + poultry_amount = serializers.CharField(source='province_request.poultry_request.amount', read_only=True) + + class Meta: + model = ProvinceKillRequest + fields = '__all__' diff --git a/panel/KillHouse/views.py b/panel/KillHouse/views.py new file mode 100644 index 0000000..72fd33a --- /dev/null +++ b/panel/KillHouse/views.py @@ -0,0 +1,19742 @@ +import random +import string +import threading +from datetime import datetime, timedelta + +import jdatetime +import requests +from django.contrib.auth.models import User, Group +from django.db.models import Case, When, Avg +from django.http import JsonResponse, HttpResponse +from django.http import QueryDict +from django.shortcuts import get_object_or_404 +from django.utils import timezone +from django.views.decorators.csrf import csrf_exempt +from django_filters.rest_framework import DjangoFilterBackend +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, +) +from rest_framework import status +from rest_framework import viewsets +from rest_framework.decorators import permission_classes, api_view +from rest_framework.generics import GenericAPIView +from rest_framework.pagination import PageNumberPagination +from rest_framework.permissions import AllowAny +from rest_framework.response import Response +from rest_framework.views import APIView + +from authentication.arvan_image.arvan_storage import upload_object_resize +from authentication.models import UserProfile, SystemUserProfile, City, Province, SystemAddress +from authentication.serializer.serializer import SystemUserProfileSerializer +from authentication.sms_management import kill_request_province_sms, province_kill_request_to_kill_house_sms, \ + kill_request_delete_province_sms, province_kill_request_accept_sms, document_discrepancy_sms, export_code_sms, \ + car_allocation_vet_farm_sms, delete_car_allocation_vet_farm_sms, send_sms_for_bar_difference_request, \ + confirm_price_poultry_request_direct_buying_sms, send_sms_fro_kill_request_market, send_sms_for_sale_bar +from authentication.views import ARTA_URL_CHANGE_MOBILE_NUMBER +from bot_eata import bot_eitaa_for_each_province_kill_request, bot_eitaa_for_each_delete_province_kill_request, \ + send_single_bar_to_eitaa +from deposit_id import market_code_state +from general_urls import base_url_sms, base_url_for_sms_report +from panel.KillHouse.helpers import kill_house_requests_product_warehousing, kill_house_free_buying_product_warehousing, \ + kill_house_free_sale_product_warehousing, get_finance_info, generate_unique_bar_code, \ + send_ticket_for_bar_difference_request, market_poultry_request_remain_quantity, market_kill_request_share_quantity, \ + calculate_governmental_quota, check_kill_house_remain_limitation_weight +from panel.KillHouse.serializers import ( + KillHouseSerializer, + KillHouseRequestSerializer, + KillRequestSerializer, + KillHouseAssignmentInformationSerializer, + KillHouseCheckRequestSerializer, + KillHouseADDCARSerializer, + VetSerializer, + VetCheckRequestSerializer, + ProvinceKillRequestSerializer, + KillHouseRequestExchangeSerializer, + KillHouseRequestExchangeReserveSerializer, + KillHouseRequestExchangeAddCarSerializer, + KillHouseDriverSerializer, + KillHouseOperatorSerializer, + + KillHouseRequestActionSerializer, + + KillHouseRequestActionWinnerSerializer, DriverRequestCancelSerializer, KillHouseVetSerializer, + KillHouseComplaintSerializer, CheckKillHouseComplaintSerializer, CheckUnusualCasualtiesSerializer, + KillHousePercentageSerializer, KillHouseAssignmentImagesSerializer, KillRequestFactorSerializer, + KillRequestFactorPaymentSerializer, AutomaticKillRequestSerializer, KillHouseCreditorsSerializer, + KillHouseAllowVetSerializer, KillHouseWareHouseSerializer, KillHouseFreeBarInformationSerializer, + KillHouseRequestForBarManagementSerializer, ProvinceKillRequestProvinceWageSerializer, + KillHouseForProvinceWageSerializer, KillHouseforPurchaseRequestSerializer, KillHousePurchaseRequestSerializer, + KillHouseForAutomaticStewardAllocationSerializer, KillHouseForTotalReportAutomaticStewardAllocationSerializer, + PoultryRequestLetterForProvinceVetSerializer, + ProvinceKillRequestForKillingInformationDiscrepancyReportSerializer, KillHouseRequestForDiffrentBarInfoSerializer, + PoultryRequestForTotalInformationSerializer, PoultryRequestForTotalInformationInTableSerializer, + KillHouseWareHouseForDailyBroadCastOInDetailsSerializer, KillHouseAssignmentInformationForCompletedLoadsSerializer, + KillHouseFreeSaleBarInformationSerializer, KillHouseWageForTotalDashbordSerializer, + KillHouseForProvinceWageWithDateSerializer, SlaughterHouseTransactionSerializer, KillHouseWageSerializer, + KillHouseForFreeBarWageSerializer, KillHouseForFreeBarWageWithDateSerializer, + KillHouseForTotalProvinceWageTransactionSerializer, KillHouseForTotalProvinceWageTransactionWithDAteSerializer, + KillHouseForKillHouseRequestWageWithDateSerializer, KillHouseForKillHouseRequestWageSerializer, + KillHouseFreeBarInformationForWageTotalSerializer, + TotalWageInformationKillHouseExclusiveKillerSerializer, KillHouseLetterForProvinceSerializer, + PoultryRequestoutProvinceSerializer, BarDocumentStatusSerializer, GeneralKillHouseSerializer, + VetKillHouseSerializer, VetFarmListSerializer, KillHouseForKillHouseVetKillHouseSerializer, + KillHouseForFreeSaleBarInformationViewSetSerializer, + KillHouseForFreeSaleBarInformationViewSetWithDateSerializer, KillHouseForNewWageInormationSerializer, + KillHouseRequestForInputBarsSerializer, PosKillHouseSerializer, KillHouseForProvinceWareHouseDashboardSerializer, + ParentCompanyKillHouseForNewWageInormationSerializer, KillHouseForColdHouseSerializer, + KillHouseColdHousesSerializer, BarDifferenceRequestSerializer, distributionKillHouseSerializer, + KillHouseForPerformanceDashboardSerializer, DirectBuyingPaymentSerializer, KillRequestForDirectBuyingSerializer, + ProvinceKillRequestForDirectBuyingSerializer, KillHouseForCommonlyUsedSerializer, KillHouseMarketInfoSerializer, + KillHouseForColdHouseAllocationSerializer, KillHouseForSegmentationSerializer, + KillHouseComparativeInformationSerializer, KillRequestForDirectBuyingTrueSerializer, + ReturnProvinceKillRequestSerializer, TotalKillHouseRemainWeightViewSetSerializer, + TotalKillHouseWarehouseArchiveDashboardSerializer, PspKillHouseSerializer +) +from panel.ProvinceOperator.serializers import ProvinceFactorToKillHouseSerializer, StewardAllocationSerializer +from panel.ProvinceOperator.views import ARVAN_Kill_house_Factor_URL +from panel.ReportingPanel.helper import kill_house_request_filterset_fields, \ + poultry_request_new_fields +from panel.ReportingPanel.views import get_gid_out_province +from panel.VetFarm.serializers import VetFarmSerializer +from panel.admin import PROJECT_API_KEY +from panel.filterset import KillHouseDriverFilterSet, VetFilterSet, KillHouseRequestFilterSet, \ + ProvinceKillRequestFilterSet, KillHouseFilterSet, KillRequestFilterSet, PoultryRequestFilterSet, \ + KillHouseFreeBarInformationFilterSet, DashboardEnterLoadInformationFilterSet, \ + DashboardKillHouseFreeBarInformationFilterSet, VetFarmAndKillHouseFilterSet, ProvinceKillRequestNewFilterSet, \ + DashboardKillRequestFilterSet, KillHouseFreeSaleBarInformationFilterSet, \ + BarDifferenceRequestFilterSet, DirectBuyingPaymentFilterSet, ReturnProvinceKillRequestFilterSet +from panel.helper import build_query +from panel.models import ( + KillHouse, + KillHouseRequest, + KillRequest, + ProvinceCheckOperatorRequest, + KillHouseCheckRequest, + KillHouseAssignmentInformation, + ProvinceFactorToKillHouse, + KillHouseADDCAR, + Vet, + VetCheckRequest, + ProvinceKillRequest, + KillHouseRequestExchange, + KillHouseRequestExchangeReserve, + PoultryRequestExchange, + KillHouseRequestExchangeAddCar, + PoultryRequest, + KillHouseDriver, + KillHouseOperator, + VetFarm, + KillHouseRequestAction, + KillHouseRequestActionWinner, DriverRequestCancel, KillHouseVet, PercentageOfLosses, KillHouseComplaint, + CheckKillHouseComplaint, ProvinceFactorToKillHouseForPoultry, CheckUnusualCasualties, KillHousePercentage, + TotalPoultryRequestQuantity, KillHouseAssignmentImages, VetSupervisor, KillRequestFactor, KillRequestFactorPayment, + Pricing, AutomaticKillRequest, KillHouseCreditors, ShareOfAllocation, ProvinceOperator, SmsLicense, + KillHouseAllowVet, Wallet, ProvinceAllowKillHouseRegisterCar, PoultryHatching, Poultry, + AutoAcceptProvinceKillRequest, KillHouseWareHouse, KillHouseFreeBarInformation, Guilds, + CityOperator, PoultryRequestAuction, ProvinceAllowKillHouseChooseStewardGuilds, KillHouseHourLimit, + ProvinceAllowKillHouseDirectBuying, KillHousePurchaseRequest, Steward, StewardAllocation, StewardWareHouse, + ColdHouseAllocations, KillHouseFreeSaleBarInformation, OperationLimitation, + EvacuationPermit, TimeRange, SlaughterHouseTransaction, WageType, PercentageOfWageType, + InternalTransaction, BarDocumentStatus, VetFarmAggregatePermission, OutProvinceCarcassesBuyer, RolesProducts, + AutomaticDirectBuyingPermission, FreeSaleWithinprovince, CityOperatorCheckRequest, POSMachine, ColdHouse, + BarDifferenceRequest, ChickenAgeRange, RequestLimitation, PriceConfirmation, DirectBuyingPayment, + DirectBuyingVerification, FinePermission, IndexWeightCategory, PosSegmentation, RestrictionCarcassDistribution, + AllowRegisterCodeForKillHouseFreeSaleBarInformation, ProductsTransactions, + LimitationForDirectPurchaseAndBarInformation, WarehouseArchive +) +# آدرس پایه مربوط به ذخیره عکس در گالری مربوط به کشتارگاه در استوریج آروان +from panel.poultry.helpers import poultry_prediction, create_update_chicken_commission_prices +from panel.poultry.serializers import PoultryRequestSerializer, PoultryRequestForKillingInformationSerializer +from ticket.bucket import upload_to_liara +from ticket.helper import send_image_to_server + +ARVAN_Kill_house_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' +ARTA_URL_REGISTER = "https://userbackend.rasadyar.com/api/register/" + + +class CustomPagination(PageNumberPagination): + page_size = 10 + + +from django.db.models import Q + + +def get_exclusive_killer_operation(kill_houses): + for kill_house in kill_houses: + total_unpaid_wage = 0 + total_paid_wage = 0 + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + state__in=('pending', 'accepted'), trash=False, + return_to_province=False, + first_car_allocated_quantity=0, + archive_wage=False, + ) + kill_house_requests = KillHouseRequest.objects.filter( + Q(Q(killer=kill_house) & Q(killhouse_user=kill_house)) | Q( + Q(killer__isnull=True) & Q(killhouse_user=kill_house)) | Q( + Q(killer__isnull=True) | Q(killer=kill_house)), + # killhouse_user=kill_house, + archive_wage=False, + trash=False + ) + + kill_house_requests = kill_house_requests.filter(Q(killer=kill_house) | Q(killhouse_user=kill_house)) + + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, archive_wage=False, + trash=False) + + total_unpaid_wage += province_kill_requests.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_unpaid_wage += free_bars.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_unpaid_wage += \ + kill_house_requests.aggregate(total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=kill_house, status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + total_amount = total_unpaid_wage - total_paid_wage + kill_house_purchase = KillHousePurchaseRequest.objects.filter(limitation=True, kill_house=kill_house).first() + if kill_house_purchase: + if total_amount >= kill_house_purchase.limitation_number: + kill_house.show_exclusive = False + kill_house.save() + else: + kill_house.show_exclusive = True + kill_house.save() + else: + kill_house.show_exclusive = True + kill_house.save() + + +def update_kill_house_requests(province_kill_request, poultry_request): + # gate_way_percentage = PaymentGatewayPercentage.objects.get(trash=False) + kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_request, trash=False) + + total_kill_house_requests_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity'))[ + 'total_quantity'] + total_kill_house_requests_weight = kill_house_requests.aggregate(total_weight=Sum('accepted_real_weight'))[ + 'total_weight'] + total_first_allocated_cars = kill_house_requests.aggregate(total_weight=Sum('quantity'))[ + 'total_weight'] + + province_kill_request.total_killed_quantity = total_kill_house_requests_quantity or province_kill_request.main_quantity + province_kill_request.first_car_allocated_quantity = total_first_allocated_cars or 0 + province_kill_request.total_killed_weight = total_kill_house_requests_weight or int( + province_kill_request.main_quantity * poultry_request.Index_weight) + province_kill_request.total_wage_amount = province_kill_request.total_killed_weight * province_kill_request.wage + + province_kill_request.save() + + union_percent = province_kill_request.union_share_percent / 100 if province_kill_request.union_share_percent > 0 else 0 + company_percent = province_kill_request.company_share_percent / 100 if province_kill_request.company_share_percent > 0 else 0 + guilds_percent = province_kill_request.guilds_share_percent / 100 if province_kill_request.guilds_share_percent > 0 else 0 + city_share_percent = province_kill_request.city_share_percent / 100 if province_kill_request.city_share_percent > 0 else 0 + wallet_share_percent = province_kill_request.wallet_share_percent / 100 if province_kill_request.wallet_share_percent > 0 else 0 + other_share_percent = province_kill_request.other_share_percent / 100 if province_kill_request.other_share_percent > 0 else 0 + province_kill_request.union_share = int(union_percent * province_kill_request.total_wage_amount) + province_kill_request.company_share = int(company_percent * province_kill_request.total_wage_amount) + province_kill_request.guilds_share = int(guilds_percent * province_kill_request.total_wage_amount) + province_kill_request.city_share = int(city_share_percent * province_kill_request.total_wage_amount) + province_kill_request.wallet_share = int(wallet_share_percent * province_kill_request.total_wage_amount) + province_kill_request.other_share = int(other_share_percent * province_kill_request.total_wage_amount) + province_kill_request.save() + + +def update_province_kill_requests(poultry_hatching): + province_kill_requests = ProvinceKillRequest.objects.filter( + trash=False, + state__in=('pending', 'accepted'), + return_to_province=False, + province_request__poultry_request__hatching=poultry_hatching + ) + + total_killed_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] + total_extra_quantity = province_kill_requests.aggregate(total=Sum('extra_killed_quantity'))['total'] + + free_filter = Q(province_request__poultry_request__free_sale_in_province=True, state__in=('pending', 'accepted'), + trash=False) + governmental_filter = ~free_filter + + total_free_quantity = \ + province_kill_requests.filter(free_filter, province_request__poultry_request__export=False).aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] + total_free_weight = \ + province_kill_requests.filter(free_filter, province_request__poultry_request__export=False).aggregate( + total=Sum('total_killed_weight'))['total'] + total_governmental_quantity = \ + province_kill_requests.filter(governmental_filter, province_request__poultry_request__export=False).aggregate( + total=Sum('total_killed_quantity'))['total'] + total_governmental_weight = \ + province_kill_requests.filter(governmental_filter, province_request__poultry_request__export=False).aggregate( + total=Sum('total_killed_weight'))['total'] + total_export_quantity = \ + province_kill_requests.filter(province_request__poultry_request__export=True).aggregate( + total=Sum('total_killed_quantity'))['total'] + total_export_weight = \ + province_kill_requests.filter(province_request__poultry_request__export=True).aggregate( + total=Sum('total_killed_weight'))['total'] + + poultry_hatching.free_killed_quantity = total_free_weight or 0 + poultry_hatching.free_quantity = total_free_quantity or 0 + poultry_hatching.governmental_killed_quantity = total_governmental_weight or 0 + poultry_hatching.governmental_quantity = total_governmental_quantity or 0 + poultry_hatching.export_killed_weight = total_export_weight or 0 + poultry_hatching.export_killed_quantity = total_export_quantity or 0 + poultry_hatching.extra_killed_quantity = total_extra_quantity or 0 + poultry_hatching.killed_quantity = total_killed_quantity or 0 + + poultry_hatching.save() + + +class BarDocumentStatusViewset(viewsets.ModelViewSet): + queryset = BarDocumentStatus.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = BarDocumentStatusSerializer + + def list(self, request, *args, **kwargs): + bar_documents_status = BarDocumentStatus.objects.filter(trash=False).order_by('priority_id') + serializer = self.serializer_class(bar_documents_status, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + + if 'priority_list' in request.data: + priority_list = request.data['priority_list'] + priorities = {item['key']: item['value'] for item in priority_list} + bar_documents_status = BarDocumentStatus.objects.filter(trash=False).order_by('priority_id') + for document in bar_documents_status: + priority_id = priorities.get(str(document.key)) + if priority_id is not None: + document.priority_id = priority_id + document.save() + + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + bar_documents_status = BarDocumentStatus.objects.get(key=request.data['bar_documents_status_key'], trash=False) + request.data.pop('bar_documents_status_key') + serializer = self.serializer_class(bar_documents_status) + serializer.update(instance=bar_documents_status, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + bar_documents_status = BarDocumentStatus.objects.get(id=pk, trash=False) + if KillHouseRequest.objects.filter(bar_document_status=bar_documents_status, + trash=False).exists(): + return Response({"result": "به علت استفاده ار این وضعیت سند بر روی بار امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + bar_documents_status.delete() + return Response({"result": "با موفقیت حذف شد."}, + status=status.HTTP_200_OK) + + +class KillHouseCreditorsViewSet(viewsets.ModelViewSet): + queryset = KillHouseCreditors.objects.all() + serializer_class = KillHouseCreditorsSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + creditors = KillHouseCreditors.objects.filter(kill_house__system_address__province=user.province).order_by('id') + serializer_request = self.serializer_class(creditors, many=True) + return Response(serializer_request.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + creditors = KillHouseCreditors.objects.get(key=request.data["key"], trash=False) + request.data.pop('key') + amount = request.data['amount'] + request.data.pop('amount') + + creditors.amount -= float(amount) + creditors.save() + + serializer = self.serializer_class(creditors) + serializer.update(instance=creditors, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به اپراتور کشتارگاه +class KillHouseOperatorViewSet(viewsets.ModelViewSet): + queryset = KillHouseOperator.objects.all() + serializer_class = KillHouseOperatorSerializer + permission_classes = [TokenHasReadWriteScope] + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house_operator_serializer = KillHouseOperatorSerializer(kill_house_operator) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + kill_house_serializer = KillHouseSerializer(kill_house, many=True) + profile_info = { + # 'profile': user_serializer.data, + 'kill_house_operator': kill_house_operator_serializer.data, + 'kill_house': kill_house_serializer.data + } + return Response(profile_info, status=status.HTTP_200_OK) + + +class KillHouseForKillHouseRequestWageViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForKillHouseRequestWageSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + + def list(self, request, *args, **kwargs): + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'ProvinceOPerator': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + archive_wage=False, + province_kill_request__union_share__gt=0, + trash=False).values( + 'killhouse_user'), trash=False) + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_kill_request__company_share__gt=0, + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_kill_request__guilds_share__gt=0, + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + else: + + kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + else: + + if request.GET['role'] == 'ProvinceOPerator': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter( + province_kill_request__union_share__gt=0, + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter( + province_kill_request__company_share__gt=0, + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter( + province_kill_request__guilds_share__gt=0, + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + else: + + kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter( + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_houses = ps.filter() + else: + kill_houses = kill_houses + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + if 'date1' in request.GET: + serializer = KillHouseForKillHouseRequestWageWithDateSerializer(page, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + if 'date1' in request.GET: + serializer = KillHouseForProvinceWageWithDateSerializer(kill_houses, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(kill_houses, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseForNewWageInormationViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForNewWageInormationSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + + def list(self, request, *args, **kwargs): + 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, trash=False).exclude(id__in=kill_house_ids).order_by( + 'id') + serializer = self.get_serializer(kill_houses, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseForColdHouseViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForColdHouseSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + + def list(self, request, *args, **kwargs): + kill_houses = KillHouse.objects.filter(out_province=False, trash=False, + pk__in=ColdHouse.objects.filter(kill_house__isnull=False).values_list( + 'kill_house', flat=True)).order_by('id') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + kill_houses_list = [] + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_houses_list = ps.filter() + kill_houses = [] if len(kill_houses_list) == 0 else kill_houses_list + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.get_serializer(kill_houses, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseColdHousesViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseColdHousesSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + serializer = self.get_serializer(kill_houses) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ParentCompanyKillHouseForNewWageInormationViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = ParentCompanyKillHouseForNewWageInormationSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + serializer = self.get_serializer(kill_houses, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseForProvinceWareHouseDashboardViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + serializer_class = KillHouseForProvinceWareHouseDashboardSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET.get('role') + kill_house_filters = {'out_province': False, 'active': True, 'trash': False} + if role in ['CityJahad']: + kill_house_filters['kill_house_operator__user__city'] = user.city + + kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by( + 'id') + + kill_houses = kill_houses.annotate( + allocation_count=Count( + 'kill_house_steward_allocation', + filter=Q(kill_house_steward_allocation__receiver_state__in=['pending', 'accepted']) + ) + ).order_by( + '-allocation_count' + ) + serializer = self.get_serializer(kill_houses, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseForTotalProvinceWareHouseDashboardViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + serializer_class = KillHouseForProvinceWareHouseDashboardSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET.get('role') + kill_house_filters = {'out_province': False, 'active': True, 'trash': False} + if role in ['CityJahad']: + kill_house_filters['kill_house_operator__user__city'] = user.city + + kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by( + 'id') + + kill_houses = kill_houses.annotate( + allocation_count=Count( + 'kill_house_steward_allocation', + filter=Q(kill_house_steward_allocation__receiver_state__in=['pending', 'accepted']) + ) + ).order_by( + '-allocation_count' + ) + products = RolesProducts.objects.filter(kill_house__in=kill_houses, trash=False, name='مرغ گرم') + + # products = RolesProducts.objects.filter(kill_house__in=kill_houses, trash=False) + # product_remain_weight = products.aggregate(total=Sum('total_remain_weight'))[ + # 'total'] or 0 + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + bars_date1 = date1 + bars_date2 = date2 + # bars_date1 = date1 - timedelta(days=1) + # bars_date2 = date2 - timedelta(days=1) + + kill_house_requests = KillHouseRequest.objects.filter( + input_warehouse__in=kill_houses, + kill_request__recive_date__date__gte=bars_date1, + kill_request__recive_date__date__lte=bars_date2, + temporary_trash=False, + temporary_deleted=False, + trash=False, calculate_status=True, warehouse=True) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(Q(date__date__gte=date1, + date__date__lte=date2, + buy_type='carcass') | Q( + create_date__date__gte=date1, create_date__date__lte=date2, buy_type='live'), + input_warehouse__in=kill_houses, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, + warehouse=True).exclude( + entered_message='ورود به انبار مجازی') + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + date__date__gte=date1, + date__date__lte=date2, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, warehouse=True) + kill_house_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, trash=False, + receiver_state__in=('pending', 'accepted'), + date__date__gte=date1, + date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True, warehouse=True) + segmentations = PosSegmentation.objects.filter(kill_house__in=kill_houses, trash=False, + date__date__gte=date1, + date__date__lte=date2, warehouse=True) + cold_house_allocations = StewardAllocation.objects.filter( + kill_house__in=kill_houses, + date__date__gte=date1, + date__date__lte=date2, + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product__in=products, transaction__paid=True, + transaction__date__date__gte=date1, + transaction__date__date__lte=date2, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(kill_house__in=kill_houses, date__date__gte=date1, + date__date__lte=date2, trash=False, warehouse=True) + + + else: + kill_house_requests = KillHouseRequest.objects.filter( + input_warehouse__in=kill_houses, + temporary_trash=False, + temporary_deleted=False, + trash=False, calculate_status=True, warehouse=True) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter( + input_warehouse__in=kill_houses, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, warehouse=True).exclude(entered_message='ورود به انبار مجازی') + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, warehouse=True) + kill_house_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, trash=False, + receiver_state__in=('pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True, warehouse=True) + + segmentations = PosSegmentation.objects.filter(kill_house__in=kill_houses, trash=False, warehouse=True) + cold_house_allocations = StewardAllocation.objects.filter( + kill_house__in=kill_houses, + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product__in=products, transaction__paid=True, + trash=False, warehouse=True) + archives = WarehouseArchive.objects.filter(kill_house__in=kill_houses, trash=False, warehouse=True) + + total_kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + total_kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + total_entered_kill_house_requests_carcasses_weight = \ + kill_house_requests.filter(ware_house_confirmation=True).aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + total_entered_kill_house_requests_carcasses_governmental_weight = \ + kill_house_requests.filter(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=False).aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + total_entered_kill_house_requests_carcasses_free_weight = \ + kill_house_requests.filter(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=True).aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + kill_house_free_bar_informations_live = kill_house_free_bar_informations.filter(buy_type='live') + kill_house_free_bar_informations_carcasses = kill_house_free_bar_informations.filter(buy_type='carcass') + total_kill_house_free_bar_quantity = \ + kill_house_free_bar_informations_live.aggregate(total=Sum('quantity'))['total'] or 0 + total_kill_house_free_bar_weight = \ + kill_house_free_bar_informations_live.aggregate(total=Sum('live_weight'))['total'] or 0 + total_kill_house_free_bar_carcasses = \ + kill_house_free_bar_informations_carcasses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_kill_house_free_bar_carcasses_weight = \ + kill_house_free_bar_informations_carcasses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_entered_kill_house_free_bar_carcasses_weight = \ + kill_house_free_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_free_sale__bar_carcasses_weight = \ + kill_house_free_Sale_bar_informations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_kill_house_free_sale__bar_carcasses_governmental_weight = \ + kill_house_free_Sale_bar_informations.filter(quota='governmental').aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_free_sale__bar_carcasses_free_weight = \ + kill_house_free_Sale_bar_informations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_allocations_weight = \ + kill_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_kill_house_allocations_governmental_weight = \ + kill_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_kill_house_allocations_free_weight = \ + kill_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + segmentations_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_governmental_weight = \ + segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_free_weight = \ + segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + cold_house_allocations_weight = \ + cold_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + cold_house_allocations_governmental_weight = \ + cold_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + cold_house_allocations_free_weight = \ + cold_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + pos_allocated_weight_info = transactions.aggregate( + pos_allocated_weight=Sum('cur_weight'), + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + archives_info = archives.aggregate( + total_archive_governmental_weight=Sum('weight', filter=Q(quota='governmental')), + total_archive_free_weight=Sum('weight', filter=Q(quota='free')), + ) + pos_allocated_weight = pos_allocated_weight_info['pos_allocated_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + total_archive_governmental_weight = archives_info['total_archive_governmental_weight'] or 0 + total_archive_free_weight = archives_info['total_archive_free_weight'] or 0 + + total_governmental_input_weight = total_entered_kill_house_requests_carcasses_governmental_weight + total_free_input_weight = total_entered_kill_house_requests_carcasses_free_weight + total_entered_kill_house_free_bar_carcasses_weight + total_governmental_output_weight = total_kill_house_free_sale__bar_carcasses_governmental_weight + segmentations_governmental_weight + total_kill_house_allocations_governmental_weight + cold_house_allocations_governmental_weight + int(pos_governmental_allocated_weight / 1000) + total_free_output_weight = total_kill_house_free_sale__bar_carcasses_free_weight + total_kill_house_allocations_free_weight + segmentations_free_weight + cold_house_allocations_free_weight + int(pos_free_allocated_weight / 1000) + total_governmental_remain_weight = ( + total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight if ( + total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight > 0 else 0 + last_total_governmental_remain_weight = ( + ( + total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight) * -1 if ( + total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight < 0 else 0 + total_free_remain_weight = (total_free_input_weight - total_free_output_weight) - total_archive_free_weight if ( + total_free_input_weight - total_free_output_weight) - total_archive_free_weight > 0 else 0 + last_total_free_remain_weight = (( + total_free_input_weight - total_free_output_weight) - total_archive_free_weight) * -1 if ( + total_free_input_weight - total_free_output_weight) - total_archive_free_weight < 0 else 0 + last_total_remain_weight = last_total_governmental_remain_weight + last_total_free_remain_weight + warehouse_total_weight = total_kill_house_requests_weight + total_kill_house_free_bar_weight + total_kill_house_free_bar_carcasses_weight + warehouse_total_entered_carcasses_weight = total_entered_kill_house_requests_carcasses_weight + total_entered_kill_house_free_bar_carcasses_weight + result = { + "product_remain_weight": int(total_governmental_remain_weight + total_free_remain_weight), + "warehouse_total_quantity": int( + total_kill_house_requests_quantity + total_kill_house_free_bar_quantity + total_kill_house_free_bar_carcasses), + "warehouse_total_weight": int(warehouse_total_weight), + "warehouse_total_entered_carcasses_weight": int(warehouse_total_entered_carcasses_weight), + "total_kill_house_allocations_weight": int(total_kill_house_allocations_weight), + "total_kill_house_free_sale_bar_carcasses_weight": int(total_kill_house_free_sale__bar_carcasses_weight), + "segmentations_weight": int(segmentations_weight), + "cold_house_allocations_weight": int(cold_house_allocations_weight), + "total_governmental_input_weight": int(total_governmental_input_weight), + "total_free_input_weight": int(total_free_input_weight), + "total_governmental_output_weight": int(total_governmental_output_weight), + "total_free_output_weight": int(total_free_output_weight), + "total_governmental_remain_weight": int(total_governmental_remain_weight), + "total_free_remain_weight": int(total_free_remain_weight), + "last_total_governmental_remain_weight": int(last_total_governmental_remain_weight), + "last_total_free_remain_weight": int(last_total_free_remain_weight), + "last_total_remain_weight": int(last_total_remain_weight), + "pos_allocated_weight": int(pos_allocated_weight / 1000), + "pos_governmental_allocated_weight": int(pos_governmental_allocated_weight / 1000), + "pos_free_allocated_weight": int(pos_free_allocated_weight / 1000), + "total_archive_governmental_weight": total_archive_governmental_weight, + "total_archive_free_weight": total_archive_free_weight, + + } + return Response(result, status=status.HTTP_200_OK) + + +class KillHouseDistributionInormationViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForNewWageInormationSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + role = request.GET.get('role') + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + steward_allocations = StewardAllocation.objects.filter(kill_house=kill_house, + receiver_state__in=('pending', 'accepted'), + calculate_status=True, trash=False) + free_sales = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False, + calculate_status=True) + steward_allocations_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + free_sales_weight = free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + else: + guild = Guilds.objects.get(user=user, trash=False) + steward_allocations = StewardAllocation.objects.filter(Q(steward=guild) | Q(guilds=guild), + receiver_state__in=('pending', 'accepted'), + calculate_status=True, trash=False) + steward_allocations_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + free_sales_weight = 0 + + result = { + "steward_allocations_weight": steward_allocations_weight, + "free_sales_weight": free_sales_weight, + } + + return Response(result, status=status.HTTP_200_OK) + + +class KillHouseTotalDashboardForNewWageInormationViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForKillHouseRequestWageSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + 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 + + 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') + 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 + ) + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, + archive_wage=False, + trash=False) + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + archive_wage=False, + trash=False) + + slaughter_transactions = InternalTransaction.objects.filter( + kill_house__in=kill_houses, status='completed', + trash=False) + + 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 + total_province_carcasses_weight = total_province_live_weight * 0.75 + total_pure_province_carcasses_weight = total_province_carcasses_weight - total_out_selling_province_carcasses_weight + total_out_live_buying_province_carcasses_weight = \ + kill_house_free_bar_info.filter(buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0 + 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 + total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_wage_type_amount + 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 + + result = { + "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": 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, + + } + return Response(result, status=status.HTTP_200_OK) + + +class KillHouseForProvinceWageViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForProvinceWageSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + + def list(self, request, *args, **kwargs): + + if request.GET['type'] == 'unpaid': + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'ProvinceOPerator': + kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + state__in=( + 'pending', + 'accepted'), + return_to_province=False, + archive_wage=False, + union_share__gt=0, + trash=False).values( + 'killhouse_user'), trash=False) + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + state__in=( + 'pending', + 'accepted'), + return_to_province=False, + archive_wage=False, + company_share__gt=0, + trash=False).values( + 'killhouse_user'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + state__in=( + 'pending', + 'accepted'), + return_to_province=False, + archive_wage=False, + guilds_share__gt=0, + trash=False).values( + 'killhouse_user'), trash=False) + else: + kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + state__in=( + 'pending', + 'accepted'), + return_to_province=False, + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + + else: + + if request.GET['role'] == 'ProvinceOPerator': + kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter( + state__in=( + 'pending', + 'accepted'), + return_to_province=False, + archive_wage=False, + union_share__gt=0, + trash=False).values( + 'killhouse_user'), trash=False) + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter( + state__in=( + 'pending', + 'accepted'), + return_to_province=False, + company_share__gt=0, + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter( + state__in=( + 'pending', + 'accepted'), + return_to_province=False, + archive_wage=False, + + guilds_share__gt=0, + trash=False).values( + 'killhouse_user'), trash=False) + else: + kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter( + + state__in=( + 'pending', + 'accepted'), + return_to_province=False, + archive_wage=False, + trash=False).values( + 'killhouse_user'), trash=False) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_houses = ps.filter() + else: + kill_houses = kill_houses + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + if 'date1' in request.GET: + serializer = KillHouseForProvinceWageWithDateSerializer(page, many=True, context={'request': request}) + else: + + serializer = self.get_serializer(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + if 'date1' in request.GET: + serializer = KillHouseForProvinceWageWithDateSerializer(kill_houses, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(kill_houses, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# class KillHouseForProvinceWageViewSet(viewsets.ModelViewSet): +# queryset = KillHouse.objects.all() +# serializer_class = KillHouseForProvinceWageSerializer +# pagination_class = CustomPagination +# permission_classes = [TokenHasReadWriteScope] +# filter_backends = [DjangoFilterBackend] +# filterset_class = KillHouseFilterSet +# filterset_fields = [ +# 'name', +# 'kill_house_operator__user__fullname', +# 'kill_house_operator__user__mobile', +# 'system_address__city__name', +# +# ] +# +# def list(self, request, *args, **kwargs): +# +# if request.GET['type'] == 'unpaid': +# if 'date1' in request.GET: +# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() +# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() +# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=False, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# state__in=( +# 'pending', +# 'accepted'), +# archive_by_province=False, +# return_to_province=False, +# trash=False).values( +# 'killhouse_user'), trash=False) +# else: +# +# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=False, +# state__in=( +# 'pending', +# 'accepted'), +# archive_by_province=False, +# return_to_province=False, +# trash=False).values( +# 'killhouse_user'), trash=False) +# +# +# elif request.GET['type'] == 'paid': +# if 'date1' in request.GET: +# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() +# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() +# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=True, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# state__in=( +# 'pending', +# 'accepted'), +# archive_by_province=False, +# return_to_province=False, +# trash=False).values( +# 'killhouse_user'), trash=False) +# +# else: +# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=True, +# state__in=( +# 'pending', +# 'accepted'), +# archive_by_province=False, +# return_to_province=False, +# trash=False).values( +# 'killhouse_user'), trash=False) +# +# +# elif request.GET['type'] == 'archive': +# if 'date1' in request.GET: +# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() +# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() +# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=False, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# state__in=( +# 'pending', +# 'accepted'), +# archive_by_province=True, +# return_to_province=False, +# trash=False).values( +# 'killhouse_user'), trash=False) +# +# else: +# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=False, +# state__in=( +# 'pending', +# 'accepted'), +# archive_by_province=True, +# return_to_province=False, +# trash=False).values( +# 'killhouse_user'), trash=False) +# +# else: +# if 'date1' in request.GET: +# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() +# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() +# kill_houses = KillHouse.objects.filter( +# pk__in=ProvinceKillRequest.objects.filter( +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# state__in=('pending', 'accepted'), trash=False).values( +# 'killhouse_user'), trash=False) +# else: +# kill_houses = KillHouse.objects.filter( +# pk__in=ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), trash=False).values( +# 'killhouse_user'), trash=False) +# +# if 'search' in request.GET: +# if request.GET['search'] == 'filter': +# if request.GET['value'] != "": +# for item in self.filterset_fields: +# query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) +# if (self.filterset_class( +# data=query, +# queryset=kill_houses +# ) +# ).filter(): +# ps = self.filterset_class(data=query, queryset=kill_houses) +# kill_houses = ps.filter() +# else: +# kill_houses = kill_houses +# page_size = request.query_params.get('page_size', None) +# if page_size: +# self.pagination_class.page_size = int(page_size) +# +# page = self.paginate_queryset(kill_houses) +# if page is not None: +# if 'date1' in request.GET: +# serializer = KillHouseForProvinceWageWithDateSerializer(page, many=True, context={'request': request}) +# else: +# +# serializer = self.get_serializer(page, many=True, context={'request': request}) +# return self.get_paginated_response(serializer.data) +# +# if 'date1' in request.GET: +# serializer = KillHouseForProvinceWageWithDateSerializer(kill_houses, many=True, +# context={'request': request}) +# else: +# +# serializer = self.get_serializer(kill_houses, many=True, context={'request': request}) +# return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseForTotalProvinceWageTransactionViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForTotalProvinceWageTransactionSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + + def list(self, request, *args, **kwargs): + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'ProvinceOperator': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='kill_house', + union_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='kill_house', + company_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='kill_house', + guilds_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + + elif request.GET['role'] == 'SuperAdmin': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + payer_type='kill_house', + status='completed', + trash=False).exclude(union_share=0, company_share=0, guilds_share=0).values( + 'kill_house'), trash=False) + else: + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + payer_type='kill_house', + status='completed', + trash=False).values( + 'kill_house'), trash=False) + else: + + if request.GET['role'] == 'ProvinceOperator': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='kill_house', + union_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='kill_house', + company_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='kill_house', + guilds_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + + elif request.GET['role'] == 'SuperAdmin': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='kill_house', + trash=False).exclude(union_share=0, company_share=0, guilds_share=0).values( + 'kill_house'), trash=False) + else: + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='kill_house', + trash=False).values( + 'kill_house'), trash=False) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_houses = ps.filter() + else: + kill_houses = kill_houses + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + if 'date1' in request.GET: + serializer = KillHouseForTotalProvinceWageTransactionWithDAteSerializer(page, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + if 'date1' in request.GET: + serializer = KillHouseForTotalProvinceWageTransactionWithDAteSerializer(kill_houses, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(kill_houses, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseForFreeBarWageViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForFreeBarWageSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + + def list(self, request, *args, **kwargs): + type = request.GET['type'] + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'ProvinceOperator': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + archive_wage=False, + union_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + company_share__gt=0, + archive_wage=False, + trash=False).values( + 'kill_house'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + guilds_share__gt=0, + archive_wage=False, + trash=False).values( + 'kill_house'), trash=False) + else: + + kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + archive_wage=False, + trash=False).values( + 'kill_house'), trash=False) + else: + + if request.GET['role'] == 'ProvinceOperator': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter( + buy_type=type, + union_share__gt=0, + archive_wage=False, + trash=False).values( + 'kill_house'), trash=False) + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter( + buy_type=type, + company_share__gt=0, + archive_wage=False, + trash=False).values( + 'kill_house'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter( + buy_type=type, + guilds_share__gt=0, + archive_wage=False, + trash=False).values( + 'kill_house'), trash=False) + else: + + kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter( + buy_type=type, + archive_wage=False, + trash=False).values( + 'kill_house'), trash=False) + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_houses = ps.filter() + else: + kill_houses = kill_houses + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + if 'date1' in request.GET: + serializer = KillHouseForFreeBarWageWithDateSerializer(page, many=True, context={'request': request}) + else: + + serializer = self.get_serializer(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + if 'date1' in request.GET: + serializer = KillHouseForFreeBarWageWithDateSerializer(kill_houses, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(kill_houses, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseForFreeSaleBarInformationViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForFreeSaleBarInformationViewSetSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2) + + + else: + free_sales = KillHouseFreeSaleBarInformation.objects.filter(kill_house__system_address__city=user.city, + trash=False, date__date__gte=date1, + date__date__lte=date2) + + + + else: + if request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False) + + + + else: + free_sales = KillHouseFreeSaleBarInformation.objects.filter(kill_house__system_address__city=user.city, + trash=False) + + kill_houses = KillHouse.objects.filter(pk__in=free_sales.values_list('kill_house', flat=True)).order_by('id') + + if 'date1' in request.GET: + serializer = KillHouseForFreeSaleBarInformationViewSetWithDateSerializer(kill_houses, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(kill_houses, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به ثبت کشتارگاه + + +class KillHouseforPurchaseRequestViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.filter(trash=False, out_province=False).order_by('id') + serializer_class = KillHouseforPurchaseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + +class KillHousePurchaseRequestPermissionViewSet(viewsets.ModelViewSet): + queryset = KillHousePurchaseRequest.objects.all() + serializer_class = KillHousePurchaseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + total_unpaid_wage = 0 + total_paid_wage = 0 + permission = True + exclusive = False + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_role = Group.objects.get(name='KillHouse') + if kill_house_role in user.role.all(): + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + exclusive = True if kill_house.type == 'exclusive' else False + purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first() + if purchase: + if purchase.total_limitation == True: + permission = False + else: + permission = True + else: + permission = True + + return Response({ + "permission": permission, + "exclusive": exclusive + }, status=status.HTTP_200_OK) + + +class KillHousePurchaseRequestViewSet(viewsets.ModelViewSet): + queryset = KillHousePurchaseRequest.objects.all() + serializer_class = KillHousePurchaseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def update(self, request, pk=None, *args, **kwargs): + kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + request.data.pop('kill_house_key') + serializer = self.serializer_class(data=request.data) + purchace = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first() + if purchace: + serializer.update(instance=purchace, validated_data=request.data) + else: + if serializer.is_valid(): + purchace = serializer.create(validated_data=request.data) + purchace.kill_house = kill_house + purchace.save() + + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + +class TotalReportOfKillHouseWareHouseForDailyBroadCastInDetailsViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseWareHouseForDailyBroadCastOInDetailsSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1, + date__date__lte=date2, trash=False) + kill_houses = KillHouse.objects.filter( + pk__in=kill_house_ware_houses.values('kill_house') + ) + + serializer = self.serializer_class(kill_houses, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalReportOfKillHouseWareHouseForDailyBroadCastViewSet(viewsets.ModelViewSet): + queryset = KillHouseWareHouse.objects.all() + serializer_class = KillHouseWareHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1, + date__date__lte=date2, trash=False) + number_of_kill_houses = KillHouse.objects.filter( + pk__in=kill_house_ware_houses.values('kill_house') + ) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + total_pre_cold_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[ + 'total'] + total_pre_cold_weight = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[ + 'total'] + total_number_of_free_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('free_weight_of_carcasses'))[ + 'total'] + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + return Response({ + "buyers": len(number_of_kill_houses), + "incoming_quantity_of_cold_house": 0, + "incoming_weight_of_cold_house": 0, + "total_pre_cold_quantity": total_pre_cold_quantity if total_pre_cold_quantity != None else 0, + "total_pre_cold_weight": total_pre_cold_weight if total_pre_cold_weight != None else 0, + "total_number_of_free_carcasses": total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + "total_free_weight_of_carcasses": total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + "total_number_of_carcasses": total_number_of_carcasses if total_number_of_carcasses != None else 0, + "total_weight_of_carcasses": total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + "final_total_number_of_carcasses": final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + "final_total_weight_of_carcasses": final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + "total_allocated_quantity": total_allocated_quantity if total_allocated_quantity != None else 0, + "total_allocated_weight": total_allocated_weight if total_allocated_weight != None else 0, + "total_accepted_allocated_quantity": total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + "total_accepted_allocated_weight": total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + "total_remain_quantity": total_remain_quantity if total_remain_quantity != None else 0, + "total_remain_weight": total_remain_weight if total_remain_weight != None else 0, + "number_of_guild": number_of_guild, + "number_of_steward": number_of_steward, + + }) + + +class TotalReportForDailyBroadCastViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForTotalReportAutomaticStewardAllocationSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + date_one_day_ago = date - timedelta(days=1) + province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), + kill_request__recive_date__date=date_one_day_ago).select_related( + 'killhouse_user') + kill_houses = KillHouse.objects.filter( + pk__in=province_kill_requests.values('killhouse_user') + ) + kill_house_ware_houses = KillHouseWareHouse.objects.filter(kill_house__in=kill_houses, date__date=date) + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, trash=False, + date__date=date).order_by('id') + + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + allocated_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('allocated_total_number_of_carcasses'))['total'] + allocated_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('allocated_total_weight_of_carcasses'))['total'] + remain_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))['total'] + remain_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))['total'] + + return Response({ + "buyers": len(kill_house_ware_houses), + "allocations": len(steward_allocations), + "total_number_of_carcasses": total_number_of_carcasses if total_number_of_carcasses != None else 0, + "total_weight_of_carcasses": total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + "allocated_total_number_of_carcasses": allocated_total_number_of_carcasses if allocated_total_number_of_carcasses != None else 0, + "allocated_total_weight_of_carcasses": allocated_total_weight_of_carcasses if allocated_total_weight_of_carcasses != None else 0, + "remain_total_number_of_carcasses": remain_total_number_of_carcasses if remain_total_number_of_carcasses != None else 0, + "remain_total_weight_of_carcasses": remain_total_weight_of_carcasses if remain_total_weight_of_carcasses != None else 0, + }) + + +class KillHouseForTotalReportAutomaticStewardAllocationViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForTotalReportAutomaticStewardAllocationSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key']) + serializer = self.serializer_class(kill_house, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseForAutomaticStewardAllocationViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForAutomaticStewardAllocationSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + date = date - timedelta(days=1) + if request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user) + serializer = self.serializer_class(kill_house, many=True, context={'request': request}) + else: + province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), + kill_request__recive_date__date=date).select_related( + 'killhouse_user') + kill_houses = KillHouse.objects.filter( + pk__in=province_kill_requests.values('killhouse_user') + ) + + serializer = self.serializer_class(kill_houses, context={'request': request}, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ثبت کشتارگاه + def create(self, request, *args, **kwargs): + group = Group.objects.get(name__exact="KillHouse") + city = City.objects.get(name=request.data['city']) + request.data.pop('city') + province = Province.objects.get(key=city.province.key) + system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last() + if system_profile: + if KillHouse.objects.filter(kill_house_operator__user=system_profile, trash=False).exists(): + return Response({"result": "این کشتارگاه قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + + else: + password = request.data['password'] + data = { + "username": request.data['mobile'], + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=request.data['mobile'], first_name=request.data['first_name'], + last_name=request.data['last_name']) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=request.data['mobile'], + first_name=request.data['first_name'], + last_name=request.data['last_name'], + fullname=request.data['first_name'] + " " + request.data['last_name'], + user=user, + base_order=base_id, + password=password, + national_id=request.data['national_id'], + city=city, + province=province + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) + address = SystemAddress(city=city, province=province, address=request.data['address']) + address.save() + wallet = Wallet() + wallet.save() + system_profile.role.add(group) + operator = KillHouseOperator.objects.filter(user=system_profile, trash=False).last() + if operator: + pass + else: + operator = KillHouseOperator( + user=system_profile, + address=address, + wallet=wallet, + ) + operator.save() + request.data.pop('mobile') + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('national_id') + request.data.pop('password') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house = serializer.create(validated_data=request.data) + kill_house.kill_house_operator = operator + kill_house.system_address = address + kill_house.save() + percentage = KillHousePercentage(kill_house=kill_house) + percentage.save() + province_allow_kill_house_choose_steward_guilds = ProvinceAllowKillHouseChooseStewardGuilds( + kill_house=kill_house) + province_allow_kill_house_choose_steward_guilds.save() + province_allow_direct_buying = ProvinceAllowKillHouseDirectBuying(kill_house=kill_house) + province_allow_direct_buying.save() + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع برای نمایش مربوط به نمایش کشتارگاه + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'role' in request.GET: + # if 'kill_house' in request.GET: + # kill_house = KillHouse.objects.filter(system_address__province=user.province, killer=False, trash=False) + # + # else: + if request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, + trash=False) + + # if request.GET['role'] == 'ProvinceInspector' or request.GET['role'] == 'ProvinceOperator': + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + serializer = KillHouseSerializer(kill_house, many=True) + elif 'kill_house' in request.GET: + kill_house = KillHouse.objects.filter(system_address__province=user.province, + kill_house_operator__killer=False, killer=False, trash=False) + serializer = KillHouseSerializer(kill_house, many=True) + + elif 'all' in request.GET: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + serializer = KillHouseSerializer(kill_house, many=True) + + elif 'psp' in request.GET: + kill_house = KillHouse.objects.filter(out_province=False, trash=False) + serializer = PspKillHouseSerializer(kill_house, many=True) + + elif 'self_kill_houses' in request.GET: + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, + trash=False) + serializer = KillHouseSerializer(kill_house, many=True) + elif 'exclusive-killers' in request.GET: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + percentage = KillHousePercentage.objects.filter( + Q(kill_house=kill_house) | Q(kill_house_for_killer=kill_house, kill_house__type='exclusive', + kill_house__show_exclusive=True), + trash=False).values_list('kill_house__id', flat=True).distinct() + kill_houses = KillHouse.objects.filter(id__in=percentage, trash=False) + + serializer = KillHouseSerializer(kill_houses, many=True) + + elif 'total-exclude-exclusive-killers' in request.GET: + percentage = KillHousePercentage.objects.filter(kill_house_for_killer__isnull=False, + kill_house__type='exclusive', + kill_house__show_exclusive=True, trash=False).values_list( + 'kill_house__id', flat=True).distinct() + kill_houses = KillHouse.objects.filter(trash=False).exclude(id__in=percentage).order_by('id', 'killer') + + serializer = distributionKillHouseSerializer(kill_houses, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'exclusive-killers-free-bar' in request.GET: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + percentage = KillHousePercentage.objects.filter(kill_house_for_killer=kill_house, + kill_house__type='exclusive', + kill_house__show_exclusive=True, trash=False).values_list( + 'kill_house__id', flat=True) + + kill_houses = KillHouse.objects.filter(Q(id__in=percentage) | Q(killer=True, type='public'), trash=False) + + serializer = KillHouseSerializer(kill_houses, many=True) + + elif 'dispenser' in request.GET: + kill_house = KillHouse.objects.filter(system_address__province=user.province, + out_province=False, trash=False).order_by('id') + serializer = GeneralKillHouseSerializer(kill_house, many=True) + + elif 'gate-way-kill-houses' in request.GET: + kill_house = KillHouse.objects.filter(system_address__province=user.province, + out_province=False, trash=False) + serializer = GeneralKillHouseSerializer(kill_house, many=True) + + + else: + try: + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False).first() + serializer = KillHouseSerializer(kill_house) + except: + kill_house = KillHouse.objects.filter(out_province=False, type='public', trash=False) + serializer = KillHouseSerializer(kill_house, many=True) + + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع برای ویرایش درخواست کشتار ثبت شده از سمت کشتارگاه + def update(self, request, *args, pk=None, **kwargs): + # refresh(request.user.id) + + kill_house = KillHouse.objects.filter( + key=request.data['kill_house_key'], trash=False + ).select_related('kill_house_operator__user').last() + system_user_profile = SystemUserProfile.objects.get(key=kill_house.kill_house_operator.user.key) + + if 'company_gateway_percent' in request.data.keys(): + kill_house.company_gateway_percent = request.data['company_gateway_percent'] + kill_house.union_gateway_percent = request.data['union_gateway_percent'] + kill_house.guilds_gateway_percent = request.data['guilds_gateway_percent'] + kill_house.other_gateway_percent = request.data['other_gateway_percent'] + kill_house.save() + elif 'quota' in request.data.keys(): + kill_house.quota = request.data['quota'] + kill_house.governmental_quota = request.data['governmental_quota'] + kill_house.quota_max_kill_limit = request.data['quota_max_kill_limit'] + kill_house.quota_request = request.data['quota_request'] + kill_house.quota_custom = request.data['quota_custom'] + kill_house.quota_custom_quantity = request.data['quota_custom_quantity'] + kill_house.save() + elif 'maximum_load_volume_increase' in request.data.keys(): + kill_house.maximum_load_volume_increase = request.data['maximum_load_volume_increase'] + kill_house.maximum_load_volume_reduction = request.data['maximum_load_volume_reduction'] + kill_house.save() + + elif 'ware_house_remaining_weight_limitation_status' in request.data.keys(): + kill_house.ware_house_remaining_weight_limitation_status = request.data[ + 'ware_house_remaining_weight_limitation_status'] + kill_house.ware_house_remaining_weight_limitation = request.data['ware_house_remaining_weight_limitation'] + kill_house.ware_house_remaining_percent_limitation_status = request.data[ + 'ware_house_remaining_percent_limitation_status'] + kill_house.ware_house_remaining_percent_limitation = request.data['ware_house_remaining_percent_limitation'] + kill_house.save() + + + elif 'total_kill_capacity' in request.data.keys(): + kill_house.max_kill_limit = request.data['max_kill_limit'] + kill_house.total_kill_capacity = request.data['total_kill_capacity'] + kill_house.extra_bar_kill_percent = request.data['extra_bar_kill_percent'] + kill_house.save() + elif 'name' in request.data.keys(): + kill_house.name = request.data['name'] + kill_house.save() + elif 'active' in request.data.keys(): + kill_house.active = request.data['active'] + kill_house.save() + elif 'type' in request.data.keys(): + kill_house.type = request.data['type'] + kill_house.save() + + elif 'out_province_selling_limitation' in request.data.keys(): + kill_house.out_province_selling_limitation = request.data['out_province_selling_limitation'] + kill_house.out_province_selling_limitation_percent = request.data['out_province_selling_limitation_percent'] + kill_house.save() + elif 'in_province_selling_limitation' in request.data.keys(): + kill_house.in_province_selling_limitation = request.data['in_province_selling_limitation'] + kill_house.in_province_selling_limitation_percent = request.data['in_province_selling_limitation_percent'] + kill_house.save() + elif 'governmental_selling_permission' in request.data.keys(): + kill_house.governmental_selling_permission = request.data['governmental_selling_permission'] + kill_house.in_province_governmental_selling_percent = request.data[ + 'in_province_governmental_selling_percent'] + kill_house.out_province_governmental_selling_percent = request.data[ + 'out_province_governmental_selling_percent'] + kill_house.segmentation_governmental_percent = request.data['segmentation_governmental_percent'] + + kill_house.save() + + elif 'free_selling_permission' in request.data.keys(): + kill_house.free_selling_permission = request.data['free_selling_permission'] + kill_house.in_province_free_selling_percent = request.data['in_province_free_selling_percent'] + kill_house.out_province_free_selling_percent = request.data['out_province_free_selling_percent'] + kill_house.segmentation_free_selling_percent = request.data['segmentation_free_selling_percent'] + + kill_house.save() + + elif 'ware_house_remaining_weight_archive_percent': + kill_house.ware_house_remaining_weight_archive_percent = request.data[ + 'ware_house_remaining_weight_archive_percent'] + kill_house.save() + + else: + system_user_profile.first_name = request.data['first_name'] + system_user_profile.last_name = request.data['last_name'] + system_user_profile.fullname = request.data['first_name'] + " " + request.data['last_name'] + system_user_profile.save() + first_mobile_number = system_user_profile.mobile + second_mobile_number = request.data['mobile'] + request.data.pop('mobile') + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = second_mobile_number + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + return Response({"result": "باموفقیت ویرایش شد"}, status=status.HTTP_200_OK) + + # ویوست مربوط به ثبت کشتارگاه + + +class PosKillHouseViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = PosKillHouseSerializer + permission_classes = [AllowAny] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + + def list(self, request, *args, **kwargs): + pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False) + if pos.kill_house: + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id').exclude( + id=pos.kill_house.id) + + else: + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + kill_houses_list = [] + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_houses_list = ps.filter() + kill_houses = [] if len(kill_houses_list) == 0 else kill_houses_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_houses, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseAllowVetViewSet(viewsets.ModelViewSet): + queryset = KillHouseAllowVet.objects.all() + serializer_class = KillHouseAllowVetSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ثبت کشتارگاه + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_operator = KillHouseOperator.objects.get(user=user) + kill_houses = KillHouse.objects.filter(kill_house_operator=kill_house_operator) + kill_house_allow_vets = KillHouseAllowVet.objects.filter(kill_house__in=kill_houses) + allow = request.data['allow'] + if kill_house_allow_vets.count() > 0: + for kill_house_allow_vet in kill_house_allow_vets: + kill_house_allow_vet.allow = allow + kill_house_allow_vet.save() + else: + for kill_house in kill_houses: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + allow = serializer.create(validated_data=request.data) + allow.kill_house = kill_house + allow.save() + return Response({"result": "created"}, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_operator = KillHouseOperator.objects.get(user=user) + kill_houses = KillHouse.objects.filter(kill_house_operator=kill_house_operator) + kill_house_allow_vet = KillHouseAllowVet.objects.filter(kill_house__in=kill_houses) + serializer = KillHouseAllowVetSerializer(kill_house_allow_vet, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHousePercentageViewSet(viewsets.ModelViewSet): + queryset = KillHousePercentage.objects.all() + serializer_class = KillHousePercentageSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + percents = [] + user_profile = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(system_address__province=user_profile.province, trash=False) + if kill_house: + percents = KillHousePercentage.objects.filter(kill_house__in=kill_house).order_by('-percent') + + serializer = KillHousePercentageSerializer(percents, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'percentage_list' in request.data.keys(): + kill_house_percentage_lists = request.data['percentage_list'] + request.data.pop('percentage_list') + if request.data['type'] == 'manual': + for kill_house_percentage_list in kill_house_percentage_lists: + kill_house_percentage = KillHousePercentage.objects.get(key=kill_house_percentage_list["key"], + trash=False) + kill_house_percentage.percent = kill_house_percentage_list["percent"] + if 'killer_kill_house_key' in kill_house_percentage_list.keys(): + if kill_house_percentage_list['killer_kill_house_key'] != None: + kill_house_percentage.kill_house_for_killer = KillHouse.objects.get( + key=kill_house_percentage_list['killer_kill_house_key'], trash=False) + kill_house_percentage.save() + else: + + guilds = Guilds.objects.filter(kill_house_centers_allocation__isnull=False, trash=False) + total_count = len(guilds) + total_weight = guilds.aggregate(total_quantity=Sum('allocation_limit')).get('total_quantity', 0) + + if total_count == 0: + return Response({"result": "صنفی وجود ندارد برای کشتارگاه ها و کشتارکن ها"}, + status=status.HTTP_403_FORBIDDEN) + if request.data['type'] == 'guilds_weight': + + for kill_house_percentage_list in kill_house_percentage_lists: + kill_house_percentage = KillHousePercentage.objects.get(key=kill_house_percentage_list["key"], + trash=False) + kill_house_percentage_weight = 0 + for guild in guilds: + if len(guild.kill_house_centers_allocation) == 0 or guild.kill_house_centers_allocation == None: + continue + if guild.kill_house_centers_allocation[0]['value'] == str( + kill_house_percentage.kill_house.key): + kill_house_percentage_weight += guild.allocation_limit + kill_house_percentage.percent = round((kill_house_percentage_weight / total_weight) * 100, 2) + kill_house_percentage.guilds_weight = kill_house_percentage_weight + kill_house_percentage.last_guilds_update_date = str(datetime.now()) + kill_house_percentage.save() + + + else: + + for kill_house_percentage_list in kill_house_percentage_lists: + kill_house_percentage = KillHousePercentage.objects.get(key=kill_house_percentage_list["key"], + trash=False) + kill_house_percentage_counter = 0 + for guild in guilds: + if len(guild.kill_house_centers_allocation) == 0 or guild.kill_house_centers_allocation == None: + continue + if guild.kill_house_centers_allocation[0]['value'] == str( + kill_house_percentage.kill_house.key): + kill_house_percentage_counter += 1 + kill_house_percentage.percent = round((kill_house_percentage_counter / total_count) * 100, 2) + kill_house_percentage.guilds_quantity = kill_house_percentage_counter + kill_house_percentage.last_guilds_update_date = str(datetime.now()) + kill_house_percentage.save() + + elif 'percentage_key' in request.data.keys(): + percentage = KillHousePercentage.objects.get(key=request.data['percentage_key']) + if 'identity' in request.data.keys(): + kill_house = KillHouse.objects.get(key=percentage.kill_house.key) + if kill_house.killer == False: + if request.data['identity'] == 'Killer': + previous_state = kill_house.killer + if KillHousePercentage.objects.filter( + kill_house_for_killer=kill_house).exists(): + return Response({ + "result": "این کشتارگاه توسط چندین کشتارکن رزرو شده است و امکان تغییر ماهیت وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + if KillRequest.objects.filter(remain_quantity__gt=0, slaughter_house=kill_house, + trash=False).exists(): + return Response({ + "result": "این کشتارگاه توسط چندین کشتارکن در قسمت اعلام نیاز کشتارگاه رزرو شده است و امکان تغییر ماهیت وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + kill_house.killer = True + kill_house.save() + new_state = kill_house.killer + percentage.change_data = { + "previous_killer_state": previous_state, + "new_killer_state": new_state, + "type": kill_house.type, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()), + "kill_house": percentage.kill_house_for_killer.name if percentage.kill_house_for_killer != None else None, + + } + percentage.save() + + + else: + if request.data['identity'] == 'KillHouse': + previous_state = kill_house.killer + kill_house.killer = False + kill_house.save() + new_state = kill_house.killer + percentage.kill_house_for_killer = None + percentage.change_data = { + "previous_killer_state": previous_state, + "new_killer_state": new_state, + "type": kill_house.type, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()), + "kill_house": percentage.kill_house_for_killer.name if percentage.kill_house_for_killer != None else None, + + } + percentage.save() + + + else: + kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) + percentage.kill_house_for_killer = kill_house + if percentage.change_data: + percentage.change_data["kill_house"] = kill_house.name + percentage.change_data["date"] = str(datetime.now()) + percentage.save() + return Response({"result": "با موفقیت ویرایش شد."}, status=status.HTTP_200_OK) + + +# ویوست مربوط به اضافه کردن خودرو به کشتارگاه +class KillHouseDriverViewSet(viewsets.ModelViewSet): + queryset = KillHouseDriver.objects.all() + serializer_class = KillHouseDriverSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseDriverFilterSet + filterset_fields = [ + 'health_code', + 'user__mobile', + 'user__national_id', + 'user__base_order', + ] + + # تابع مربوط به اضافه کردن خودرو به کشتارگاه + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.data['role'] + request.data.pop('role') + + # refresh(request.user.id) + kill_house = None + if 'kill_house_key' in request.data.keys(): + if request.data['kill_house_key'] != None: + kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) + request.data.pop('kill_house_key') + if role == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + # if not ProvinceAllowKillHouseRegisterCar.objects.filter( + # kill_house__in=kill_house, allow=True).exists(): + # return Response({"result": "شما اجازه ساخت ماشین ندارید"}, status=status.HTTP_403_FORBIDDEN) + person = SystemUserProfile.objects.get(user=request.user) + group = Group.objects.get(name__exact="Driver") + city = City.objects.get(name=request.data['city_name']) + province = Province.objects.get(key=user.province.key) + request.data.pop('city_name') + # request.data.pop('province_name') + if KillHouseDriver.objects.filter(pelak=request.data['pelak'], trash=False).exists(): + return Response({"result": "این ماشین قبلا ثبت شده!"}, status=status.HTTP_403_FORBIDDEN) + system_profile = SystemUserProfile.objects.filter(mobile=request.data['driver_mobile'], trash=False) + if system_profile.count() > 0: + system_profile = system_profile.last() + if group not in system_profile.role.all(): + system_profile.role.add(group) + + else: + + password = "00100" + data = { + "username": request.data['driver_mobile'], + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + if req.status_code == 200: + user = User(username=request.data['driver_mobile'], first_name=request.data['first_name'], + last_name=request.data['last_name']) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=request.data['driver_mobile'], + first_name=request.data['first_name'], + last_name=request.data['last_name'], + fullname=request.data['first_name'] + " " + request.data['last_name'], + user=user, + base_order=base_id, + password=password, + city=city, + province=province + ) + system_profile.save() + system_profile.role.add(group) + + + else: + return Response({"result": "در ثبت کاربر مشکلی پیش آمده است!"}, status=status.HTTP_403_FORBIDDEN) + + wallet = Wallet() + wallet.save() + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + full_name = request.data['first_name'] + " " + request.data['last_name'] + request.data.pop('first_name') + request.data.pop('last_name') + kill_house_driver = serializer.create(validated_data=request.data) + kill_house_driver.user = system_profile + kill_house_driver.wallet = wallet + kill_house_driver.registrar = { + "role": role, + "full_name": person.fullname, + "mobile": person.mobile, + "date": str(kill_house_driver.create_date) + } + kill_house_driver.driver_name = full_name + kill_house_driver.save() + if kill_house != None: + if KillHouseADDCAR.objects.filter(kill_house__in=kill_house, driver=kill_house_driver, + trash=False).exists(): + return Response({"result": "این ماشین قبلا برای کشتارگاه ثبت شده!"}, + status=status.HTTP_403_FORBIDDEN) + else: + add_car = KillHouseADDCAR( + kill_house=kill_house.last(), + driver=kill_house_driver + ) + add_car.save() + else: + if kill_house_driver.type == 'rental': + # kill_houses = KillHouse.objects.filter(trash=False) + # for kill_house in kill_houses: + add_car = KillHouseADDCAR( + # kill_house=kill_house, + driver=kill_house_driver + ) + add_car.save() + + return Response({"result": "ماشین با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + if 'role' in request.GET: + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + list_car = [] + if 'health_code' in request.GET: + + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, request.GET['health_code'])) + if (self.filterset_class( + data=query, + queryset=self.queryset.filter(trash=False) + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=self.queryset) + filtered_kill_house_driver = ps.filter() + serializer = self.serializer_class(filtered_kill_house_driver, many=True) + return Response(serializer.data) + return Response(list_car) + + + # cars = KillHouseDriver.objects.filter(health_code=request.GET['health_code'], + # trash=False) + # if cars.count() > 0: + # cars = cars.last() + # dict1 = { + # "id": cars.id, + # "key": cars.key, + # "driver_name": cars.driver_name, + # "driver_mobile": cars.driver_mobile, + # "type_car": cars.type_car, + # "pelak": cars.pelak, + # "capocity": float(cars.capocity), + # "weight_without_load": cars.weight_without_load, + # "health_code": cars.health_code, + # } + # list_car.append(dict1) + # return Response(list_car, status=status.HTTP_200_OK) + else: + if request.GET['role'] == 'KillHouse': + kill_house_drivers = KillHouseDriver.objects.filter(user__province=user.province, type='rental', + archive=False) + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False).first() + add_car = KillHouseADDCAR.objects.filter(kill_house=kill_house, trash=False, + archive=False).order_by('id') + if add_car.count() > 0: + kill_house_list = [] + for add_car_obj in add_car: + allow = ProvinceAllowKillHouseRegisterCar.objects.filter( + kill_house=add_car_obj.kill_house) + if allow.count() > 0: + allow_state = allow.last().allow + else: + allow_state = None + kill_house_name = add_car_obj.kill_house.name + kill_house_key = add_car_obj.kill_house.key + kill_house_dict = {"kill_house_name": kill_house_name, "kill_house_key": kill_house_key, + "allow_state": allow_state} + if not any(d["kill_house_name"] == kill_house_name for d in kill_house_list): + kill_house_list.append(kill_house_dict) + + dict1 = { + "id": add_car_obj.driver.id, + "key": add_car_obj.driver.key, + "add_car_key": add_car_obj.key, + "driver_name": add_car_obj.driver.driver_name, + "driver_type": add_car_obj.driver.type, + "driver_active_state": add_car_obj.driver.active_state, + "add_car_active_state": add_car_obj.active_state, + "first_name": add_car_obj.driver.user.first_name, + "last_name": add_car_obj.driver.user.last_name, + "city": add_car_obj.driver.user.city.name, + "driver_mobile": add_car_obj.driver.driver_mobile, + "kill_house_list": kill_house_list, + "type_car": add_car_obj.driver.type_car, + "type": add_car_obj.driver.type, + "pelak": add_car_obj.driver.pelak, + "capocity": float(add_car_obj.driver.capocity), + "weight_without_load": add_car_obj.driver.weight_without_load, + "health_code": add_car_obj.driver.health_code, + } + list_car.append(dict1) + if kill_house_drivers: + for kill_house_driver in kill_house_drivers: + dict2 = { + "id": kill_house_driver.id, + "key": kill_house_driver.key, + "add_car_key": None, + "add_car_active_state": kill_house_driver.active_state, + "driver_name": kill_house_driver.driver_name, + "driver_type": kill_house_driver.type, + "driver_active_state": kill_house_driver.active_state, + "first_name": kill_house_driver.user.first_name, + "last_name": kill_house_driver.user.last_name, + "city": kill_house_driver.user.city.name, + "driver_mobile": kill_house_driver.driver_mobile, + "kill_house_list": [], + "type_car": kill_house_driver.type_car, + "type": kill_house_driver.type, + "pelak": kill_house_driver.pelak, + "capocity": float(kill_house_driver.capocity), + "weight_without_load": kill_house_driver.weight_without_load, + "health_code": kill_house_driver.health_code, + } + list_car.append(dict2) + + return Response(list_car, status=status.HTTP_200_OK) + else: + list_car = [] + cars = KillHouseDriver.objects.filter(user__province=user.province, trash=False, + archive=False).order_by('id') \ + .select_related('user') + + if cars.count() > 0: + for car in cars: + add_car = KillHouseADDCAR.objects.filter(driver=car, trash=False, + archive=False).select_related( + 'kill_house') + if add_car.count() > 0: + kill_house_list = [] + for add_car_obj in add_car: + if add_car_obj.kill_house != None: + allow = ProvinceAllowKillHouseRegisterCar.objects.filter( + kill_house=add_car_obj.kill_house) + if allow.count() > 0: + allow_state = allow.last().allow + else: + allow_state = None + kill_house_name = add_car_obj.kill_house.name + kill_house_key = add_car_obj.kill_house.key + kill_house_dict = {"kill_house_name": kill_house_name, + "kill_house_key": kill_house_key, "allow_state": allow_state} + if not any(d["kill_house_name"] == kill_house_name for d in kill_house_list): + kill_house_list.append(kill_house_dict) + + dict1 = { + "id": car.id, + "key": car.key, + "add_car_key": None, + "driver_name": car.driver_name, + "driver_type": car.type, + "driver_active_state": car.active_state, + "type": car.type, + "first_name": car.user.first_name, + "last_name": car.user.last_name, + "city": car.user.city.name, + "driver_mobile": car.driver_mobile, + "kill_house_list": kill_house_list, + "type_car": car.type_car, + "pelak": car.pelak, + "capocity": float(car.capocity), + "weight_without_load": car.weight_without_load, + "health_code": car.health_code, + } + list_car.append(dict1) + else: + dict1 = { + "id": car.id, + "type": car.type, + "add_car_key": None, + "key": car.key, + "driver_type": car.type, + "driver_name": car.driver_name, + "driver_active_state": car.active_state, + "first_name": car.user.first_name, + "last_name": car.user.last_name, + "city": car.user.city.name, + "driver_mobile": car.driver_mobile, + "kill_house_list": [], + "type_car": car.type_car, + "pelak": car.pelak, + "capocity": float(car.capocity), + "weight_without_load": car.weight_without_load, + "health_code": car.health_code, + } + list_car.append(dict1) + + return Response(list_car, status=status.HTTP_200_OK) + else: + return Response(list_car, status=status.HTTP_200_OK) + + else: + return Response([], status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + if 'change_activation' in request.data.keys(): + car = KillHouseDriver.objects.get(key=request.data["driver_key"]) + + add_cars = KillHouseADDCAR.objects.filter(driver=car, trash=False) + for add_car in add_cars: + add_car.active_state = request.data['change_activation'] + add_car.save() + car.active_state = request.data['change_activation'] + car.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + elif 'add_car_change_activation' in request.data.keys(): + add_car = KillHouseADDCAR.objects.get(key=request.data["add_car_key"], trash=False) + add_car.active_state = request.data['add_car_change_activation'] + add_car.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + + + else: + car = KillHouseDriver.objects.get(key=request.data["driver_key"]) + + if 'city_name' in request.data.keys() and request.data['city_name'] != None: + city = City.objects.get(name=request.data['city_name']) + else: + city = None + request.data.pop('city_name') + + user = SystemUserProfile.objects.get(key=car.user.key) + request.data.pop('driver_key') + first_name = request.data['first_name'] + last_name = request.data['last_name'] + request.data.pop('first_name') + request.data.pop('last_name') + if first_name != None: + user.first_name = first_name + if last_name != None: + user.last_name = last_name + if city != None: + user.city = city + if first_name != None and last_name != None: + car.driver_name = first_name + "" + last_name + user.fullname = first_name + "" + last_name + # serializer = self.serializer_class(car) + user.save() + car.save() + serializer = self.serializer_class(car) + serializer.update(instance=car, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + car = KillHouseDriver.objects.get(key=request.GET["key"]) + if KillHouseRequest.objects.filter(active_state='active', add_car__driver=car, trash=False).exists(): + return Response({"result": "ماشین دارای بار فعال میباشد"}, status=status.HTTP_403_FORBIDDEN) + + kill_house_cars = KillHouseADDCAR.objects.filter(driver=car, trash=False) + if kill_house_cars: + for add_car in kill_house_cars: + add_car.trash = True + add_car.save() + + car.trash = True + car.save() + return Response('ماشین با موفقیت حذف شد', status=status.HTTP_200_OK) + + +class KillHouseDriverTotalDashboardViewSet(viewsets.ModelViewSet): + queryset = KillHouseDriver.objects.all() + serializer_class = KillHouseDriverSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + + if request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(trash=False, user=request.user) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + kill_house_drivers = KillHouseDriver.objects.filter(archive=False, pk__in=KillHouseADDCAR.objects.filter( + Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False, + archive=False).values_list( + 'driver__id', flat=True), trash=False) + active = kill_house_drivers.filter(pk__in=KillHouseADDCAR.objects.filter( + Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False, + active_state=True, archive=False).values_list('driver__id', flat=True)) + inactive = kill_house_drivers.filter(pk__in=KillHouseADDCAR.objects.filter( + Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False, + active_state=False, archive=False).values_list('driver__id', flat=True)) + suspended = 0 + + else: + kill_house_drivers = KillHouseDriver.objects.filter(trash=False, archive=False) + + active = kill_house_drivers.filter(pk__in=KillHouseADDCAR.objects.filter( + Q(kill_house__isnull=False) | Q(kill_house__isnull=True, driver__type='rental'), trash=False, + active_state=True, archive=False).values_list('driver__id', flat=True)) + inactive = kill_house_drivers.filter(pk__in=KillHouseADDCAR.objects.filter( + Q(kill_house__isnull=False) | Q(kill_house__isnull=True, driver__type='rental'), trash=False, + active_state=False, archive=False).values_list('driver__id', flat=True)) + suspended = kill_house_drivers.exclude(pk__in=KillHouseADDCAR.objects.filter( + Q(kill_house__isnull=False) | Q(kill_house__isnull=True, driver__type='rental'), + trash=False, archive=False).values_list('driver__id', flat=True)) + suspended = len(suspended) + + rental = kill_house_drivers.filter(type='rental') + exclusive = kill_house_drivers.filter(type='exclusive') + + result = { + "total": len(kill_house_drivers), + "exclusive": len(exclusive), + "rental": len(rental), + "active": len(active), + "inactive": len(inactive), + "suspended": suspended, + } + + return Response(result, status=status.HTTP_200_OK) + + +# ویوست مربوط به اضافه کردن خودرو به کشتارگاه +class KillHouseADDCARViewSet(viewsets.ModelViewSet): + queryset = KillHouseADDCAR.objects.all() + serializer_class = KillHouseADDCARSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به اضافه کردن خودرو به کشتارگاه + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + driver = KillHouseDriver.objects.get(key=request.data['driver_key']) + request.data.pop('driver_key') + request.data.pop('kill_house_key') + if 'role' in request.data.keys(): + request.data.pop('role') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + if KillHouseADDCAR.objects.filter(kill_house=kill_house, driver=driver, trash=False): + return Response({"result": "already exist"}, status=status.HTTP_403_FORBIDDEN) + kill_house_car = serializer.create(validated_data=request.data) + kill_house_car.kill_house = kill_house + kill_house_car.driver = driver + kill_house_car.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع مربوط به نمایش خودروهای ثبت شده کشتارگاه + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + if 'kill_request_key' in request.GET: + kill_request = KillRequest.objects.get(key=request.GET['kill_request_key']) + list_car = [] + if 'key' in request.GET: + poultry_request = PoultryRequest.objects.get(key=request.GET['key']) + else: + poultry_request = None + if 'kill_house_key' in request.GET: + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + + if kill_house.killer == True: + if KillHouseADDCAR.objects.filter(kill_house=kill_house, trash=False, archive=False).exists(): + cars = KillHouseADDCAR.objects.filter( + Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), + trash=False, archive=False).order_by('driver__type') + else: + killer_kill_house = KillHouse.objects.get(key=kill_request.slaughter_house.key) + cars = KillHouseADDCAR.objects.filter( + Q(kill_house=killer_kill_house) | Q(kill_house__isnull=True, driver__type='rental'), + trash=False, archive=False).order_by('driver__type') + else: + cars = KillHouseADDCAR.objects.filter( + Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False, + archive=False).order_by( + 'driver__type') + + else: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + cars = KillHouseADDCAR.objects.filter( + Q(kill_house__in=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False, + archive=False).order_by( + 'driver__type') + # if poultry_request != None: + # send_date = poultry_request.send_date.date() + # list1 = [] + # kill_house_requests = KillHouseRequest.objects.filter(active_state='active') + # for kill_house_request in kill_house_requests: + # if kill_house_request.province_kill_request != None: + # date = kill_house_request.province_request.city_request_Poultry.poultry_request.send_date.date() + # if send_date.year == date.year and send_date.month == date.month and send_date.day == date.day: + # list1.append(kill_house_request) + # else: + # date2 = kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date.date() + # if send_date.year == date2.year and send_date.month == date2.month and send_date.day == date2.day: + # list1.append(kill_house_request) + # if len(list1) > 0: + # for kill_house_car in cars: + # list2 = [] + # i = 0 + # for request_car in list1: + # if i == len(list1): + # break + # if kill_house_car.driver.pelak == request_car.add_car.driver.pelak: + # dict1 = { + # "id": kill_house_car.id, + # "key": kill_house_car.key, + # "driver_name": kill_house_car.driver.driver_name, + # "driver_mobile": kill_house_car.driver.driver_mobile, + # "type_car": kill_house_car.driver.type_car, + # "pelak": kill_house_car.driver.pelak, + # "capocity": float(kill_house_car.driver.capocity), + # "weight_without_load": kill_house_car.driver.weight_without_load, + # "health_code": kill_house_car.driver.health_code, + # "busy": True + # } + # list2.append(dict1) + # i += 1 + # if len(list2) > 0: + # list_car.append(list2[0]) + # else: + # dict1 = { + # "id": kill_house_car.id, + # "key": kill_house_car.key, + # "driver_name": kill_house_car.driver.driver_name, + # "driver_mobile": kill_house_car.driver.driver_mobile, + # "type_car": kill_house_car.driver.type_car, + # "pelak": kill_house_car.driver.pelak, + # "capocity": float(kill_house_car.driver.capocity), + # "weight_without_load": kill_house_car.driver.weight_without_load, + # "health_code": kill_house_car.driver.health_code, + # "busy": False + # } + # list_car.append(dict1) + # return Response(list_car, status=status.HTTP_200_OK) + + for car in cars: + if car.active_state == True: + dict1 = { + "id": car.id, + "key": car.key, + "type": car.driver.type, + "driver_name": car.driver.driver_name, + "driver_mobile": car.driver.driver_mobile, + "type_car": car.driver.type_car, + "pelak": car.driver.pelak, + "capocity": float(car.driver.capocity), + "weight_without_load": car.driver.weight_without_load, + "health_code": car.driver.health_code, + } + list_car.append(dict1) + return Response(list_car, status=status.HTTP_200_OK) + + # تابع مربوط به حذف خودروهای ثبت شده کشتارگاه + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + car = KillHouseDriver.objects.get(key=request.GET["driver_key"]) + kill_house = KillHouse.objects.get(key=request.GET["kill_house_key"]) + if KillHouseRequest.objects.filter(active_state='active', add_car__driver=car, trash=False).exists(): + return Response({"result": "ماشین دارای بار فعال میباشد"}, status=status.HTTP_403_FORBIDDEN) + add_car = KillHouseADDCAR.objects.filter(driver=car, kill_house=kill_house, trash=False) + if add_car.count() > 0: + add_car = add_car.last() + add_car.trash = True + add_car.save() + return Response('ماشین با موفقیت حذف شد', status=status.HTTP_200_OK) + else: + return Response('مشکلی در حذف ماشین به وجود آمده است !', status=status.HTTP_403_FORBIDDEN) + + def update(self, request, pk=None, *args, **kwargs): + car = KillHouseADDCAR.objects.get(key=request.data["add_car_key"]) + request.data.pop('add_car_key') + serializer = self.serializer_class(car) + serializer.update(instance=car, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class AutomaticKillRequestViewSet(viewsets.ModelViewSet): + queryset = AutomaticKillRequest.objects.all() + serializer_class = AutomaticKillRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + # def create(self, request, *args, **kwargs): + # # refresh(request.user.id) + # state = request.data['active'] + # auomatic_kill_reqs = AutomaticKillRequest.objects.all() + # if auomatic_kill_reqs.count() > 0: + # auomatic_kill_reqs = auomatic_kill_reqs.last() + # auomatic_kill_reqs.active = state + # auomatic_kill_reqs.save() + # serializer_request = self.serializer_class(auomatic_kill_reqs) + # return Response(serializer_request.data, status=status.HTTP_200_OK) + # else: + # serializer = self.serializer_class(data=request.data) + # if serializer.is_valid(): + # auomatic_kill_reqs = serializer.create(validated_data=request.data) + # + # serializer_request = self.serializer_class(auomatic_kill_reqs) + # return Response(serializer_request.data, status=status.HTTP_201_CREATED) + + def create(self, request, *args, **kwargs): + try: + automatic_kill_req = AutomaticKillRequest.objects.latest('id') + except AutomaticKillRequest.DoesNotExist: + automatic_kill_req = None + + serializer = self.serializer_class(automatic_kill_req, data=request.data) + if serializer.is_valid(): + if automatic_kill_req: + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + else: + serializer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + else: + return Response(serializer.errors) + + +class KillRequestForPoultryViewSet(viewsets.ModelViewSet): + queryset = KillRequest.objects.all() + serializer_class = KillRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def update(self, request, pk=None, *args, **kwargs): + kill_req = KillRequest.objects.get(key=request.data['kill_req_key'], trash=False) + kill_req.remain_quantity_for_poultry += int(request.data['quantity_sum']) + kill_req.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +class DeleteDebtorsKillRequestsViewSet(viewsets.ModelViewSet): + queryset = KillRequest.objects.all() + serializer_class = KillRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def destroy(self, request, pk=None, *args, **kwargs): + today = datetime.now().date() + kill_requests = KillRequest.objects.filter(trash=False, recive_date__date=today, market=False) + for kill_request in kill_requests: + kill_house = kill_request.kill_house + kill_house_purchase = KillHousePurchaseRequest.objects.filter(limitation=True, + kill_house=kill_house).first() + if kill_house_purchase: + total_unpaid_wage = 0 + total_paid_wage = 0 + total_unpaid_wage = get_finance_info(kill_house)['total_price'] + 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_amount = total_unpaid_wage - total_paid_wage + if total_amount >= kill_house_purchase.limitation_number: + if not ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + kill_request__recive_date__date=today, + killhouse_user=kill_house).exists(): + kill_request.message = 'به علت بدهی اعلام نیاز حذف گردید' + kill_request.trash = True + kill_request.save() + + return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_200_OK) + + +# ویوست مربوط به ثبت درخواست کشتار از سمت کشتارگاه +class KillRequestViewSet(viewsets.ModelViewSet): + queryset = KillRequest.objects.all() + serializer_class = KillRequestSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillRequestFilterSet + filterset_fields = [ + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'slaughter_house__name', + 'export_country', + 'export_code', + 'direct_buying_code', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__unit_name', + ] + + # تابع مربوط به ثبت درخواست کشتار از سمت کشتارگاه + def create(self, request, *args, **kwargs): + total_unpaid_wage = 0 + total_paid_wage = 0 + + limitation_direct_purchase = LimitationForDirectPurchaseAndBarInformation.objects.filter( + trash=False, active=True).first() + is_in_limitation_range = False + + if limitation_direct_purchase and limitation_direct_purchase.start_time and limitation_direct_purchase.end_time: + current_time = datetime.now().time() + if limitation_direct_purchase.start_time <= current_time <= limitation_direct_purchase.end_time: + is_in_limitation_range = True + + if not is_in_limitation_range: + time_range = TimeRange.objects.filter(trash=False).first() + if time_range: + time = next( + (t for t in time_range.time_range if t.get("name") == "kill_request" and t.get("active", False)), + None) + if time: + start_hour = datetime.strptime(time.get("start", 0), "%H:%M:%S").time() + end_hour = datetime.strptime(time.get("end", 0), "%H:%M:%S").time() + current_hour = datetime.now().time().replace(second=0, microsecond=0) + if not (start_hour < current_hour < end_hour): + return Response( + {"result": "لطفا در ساعات مجاز برای ثبت درخواست اقدام نمایید!"}, + status=status.HTTP_403_FORBIDDEN) + if 'role' in request.data.keys() and request.data['role'] != None: + role = request.data['role'] + request.data.pop('role') + else: + role = None + if role != None and role == 'KillHouse': + now_request_date = datetime.now().date() + now = datetime.now().time() + now_hour = KillHouseHourLimit.objects.filter(trash=False).last() + if now_hour and 'poultry_key' not in request.data.keys(): + if now_hour.active == True: + request_date = datetime.strptime(request.data['recive_date'], '%Y-%m-%d %H:%M:%S').date() + if request_date.year >= now_request_date.year and request_date.month >= now_request_date.month and request_date.day > now_request_date.day: + pass + + else: + if now.hour >= now_hour.hour: + text = 'زمان ثبت درخواست کشتار درامروز تا ساعت {0} بوده است. شما میتوانید برای تاریخ های آینده درخواست ثبت نمایید ! '.format( + now_hour.hour) + if 'role' not in request.data.keys(): + return Response({'result': text}, status=status.HTTP_403_FORBIDDEN) + + killer_kill_house = None + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + request.data.pop('kill_house_key') + if kill_house.out_province == True: + return Response({ + "result": "امکان ثبت اعلام نیاز برای کشتارگاه خارج از استان وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + kill_house_purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first() + if kill_house_purchase: + if kill_house_purchase.allow == False: + return Response({ + "result": "شما مجاز به ثبت درخواست خرید نمیباشید جهت اطلاع با اتحادیه مرغ گوشتی استان خود تماس حاصل فرمایید"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house_purchase.limitation == True: + try: + recive_date = datetime.strptime(str(request.data['recive_date']), + '%Y-%m-%dT%H:%M:%S.%fZ').date() + except: + recive_date = datetime.strptime(str(request.data['recive_date']), '%Y-%m-%d %H:%M:%S').date() + total_unpaid_wage = get_finance_info(kill_house)['total_price'] + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=kill_house, status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + if kill_house_purchase.limitation_number <= total_unpaid_wage - total_paid_wage: + if not ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + kill_request__recive_date__date=recive_date, + trash=False, + state__in=('pending', 'accepted')).exists(): + return Response({ + "result": "به علت بدهی امکان ثبت درخواست وحود ندارد لطفا بدهی خود را در پنل کارمزد ها تسویه کنید"}, + status=status.HTTP_403_FORBIDDEN) + if kill_house.poultry_payment_limitation: + today_check_date = datetime.now().date() + if ProvinceKillRequest.objects.filter(Q(payment_deadline_date__date__lt=today_check_date, + extension_payment_deadline_date__isnull=True) | Q( + payment_deadline_date__date__lt=today_check_date, + extension_payment_deadline_date__date__lt=today_check_date), trash=False, temporary_trash=False, + return_to_province=False, + state__in=('pending', 'accepted'), payment_deadline_archive=False, + payment_deadline_state__in=('pending', 'rejected')).exists(): + return Response({ + "result": "به دلیل عدم تسویه با مرغدار شما مجاز به خرید نمی باشید لطفا اطلاعات پرداخت را در بخش تسویه حساب بارگزاری کنید!"}, + status=status.HTTP_403_FORBIDDEN) + if 'killer_kill_house_key' in request.data.keys(): + if request.data['killer_kill_house_key'] != None: + killer_kill_house = KillHouse.objects.get(key=request.data['killer_kill_house_key'], trash=False) + request.data.pop('killer_kill_house_key') + else: + request.data.pop('killer_kill_house_key') + cash = request.data['cash'] + credit = request.data['credit'] + low_weight = request.data['low_weight'] + high_weight = request.data['high_weight'] + credit = request.data['credit'] + request.data.pop('cash') + request.data.pop('credit') + request.data.pop('low_weight') + request.data.pop('high_weight') + poultry = None + hatching = None + if 'poultry_key' in request.data.keys(): + poultry = Poultry.objects.get(key=request.data['poultry_key']) + hatching = PoultryHatching.objects.get(key=request.data['hatching_key']) + request.data.pop('poultry_key') + request.data.pop('hatching_key') + if poultry.order_limit: + return Response({ + "result": "امکان ثبت کشتار برای مرغدار وجود ندارد جهت اطلاعات بیشتر بااتحادیه استان خود هماهنگ کنید!"}, + status=status.HTTP_403_FORBIDDEN) + if 'confirm_poultry_mobile' in request.data.keys() and len(request.data['confirm_poultry_mobile']) == 11: + + first_mobile_number = poultry.user.mobile + second_mobile_number = request.data['confirm_poultry_mobile'] + request.data.pop('confirm_poultry_mobile') + if first_mobile_number != second_mobile_number: + system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) + system_person = SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False) + if system_person: + return Response({"result": f'این شماره در سامانه به نام {system_person.first().fullname} است'}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + system_user_profile.user.username = second_mobile_number + system_user_profile.user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + + try: + recive_date = datetime.strptime(str(request.data['recive_date']), '%Y-%m-%dT%H:%M:%S.%fZ').date() + except: + recive_date = datetime.strptime(str(request.data['recive_date']), '%Y-%m-%d %H:%M:%S').date() + + if request.data['free_direct_buying'] == True: + + if kill_house.quota: + kill_house_info = calculate_governmental_quota(kill_house) + if kill_house_info == 'not_allowed': + return Response({"result": " امکان خرید آزاد تا تکمیل تعهد دولتی وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + age_range = ChickenAgeRange.objects.filter(trash=False).first() + if role and role not in ('AdminX', 'SuperAdmin'): + + if age_range.active == True: + chicken_age = (datetime.now().date() - hatching.date.date()).days + 1 + if chicken_age < age_range.minimum or chicken_age > age_range.maximum: + return Response( + {"result": "به علت استاندارد نبودن سن مرغ برای کشتار امکان ثبت درخواست وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + if kill_house.max_kill_limit and kill_house.total_kill_capacity > 0: + recive_date = datetime.strptime(str(request.data['recive_date']), '%Y-%m-%dT%H:%M:%S.%fZ').date() + + if kill_house.max_kill_limit and kill_house.total_kill_capacity > 0: + total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + killhouse_user=kill_house, + kill_request__recive_date__date=recive_date) + total_province_kill_requests_quantity = \ + total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + if kill_house.total_kill_capacity < total_province_kill_requests_quantity + int( + request.data['kill_capacity']): + return Response({"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + + dict1 = {} + dict2 = {} + if kill_house.ware_house_remaining_weight_limitation_status: + if kill_house.total_remain_warehouse_governmental_weight > kill_house.ware_house_remaining_weight_limitation: + return Response({ + "result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده انبار بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + + if kill_house.ware_house_remaining_percent_limitation_status: + if not check_kill_house_remain_limitation_weight(kill_house): + return Response({ + "result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده روزانه انبار بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_request = serializer.create(validated_data=request.data) + buying_verification = DirectBuyingVerification.objects.filter(trash=False).first() + price_confirmation = PriceConfirmation.objects.filter(trash=False).first() + price_confirmation = price_confirmation.poultry_status if price_confirmation else False + kill_request.kill_house = kill_house + free_sale_in_province = False if kill_request.free_direct_buying == False else True + kill_request.previous_kill_capacity = kill_request.kill_capacity + if poultry != None: + # hatching = PoultryHatching.objects.filter(trash=False, poultry=poultry).only('chicken_breed').first() + if 'payment_deadline_days' in request.data.keys(): + kill_request.payment_deadline_date = datetime.now() + timedelta( + days=request.data['payment_deadline_days']) + kill_request.payment_deadline = True + + kill_request.chicken_breed = hatching.chicken_breed + province_operator = SystemUserProfile.objects.filter(trash=False, role__name='ProvinceOperator').first() + kill_request.poultry = poultry + kill_request.poultry_hatching = hatching + mobile = poultry.user.mobile + poultry_name = poultry.user.fullname + code = str(random.randint(10000, 99000)) + kill_request.direct_buying_code = code + buyer = kill_request.kill_house.kill_house_operator.user.fullname + buyer_mobile = kill_request.kill_house.kill_house_operator.user.mobile + quantity = kill_request.kill_capacity + kill_place = kill_request.slaughter_house.name if kill_request.slaughter_house != None else kill_request.kill_house.name + date_str = str(kill_request.recive_date) + # if kill_request.recive_date.date().day == datetime.now().date().day: + try: + date = datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S.%f%z').date() + except: + date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + date = jdatetime.datetime.fromgregorian(year=date.year, month=date.month, + day=date.day).strftime( + '%Y-%m-%d') + date_list = reversed(date.split('-')) + separate = "-" + date = separate.join(date_list) + if kill_request.export_status == False: + pass + + # sms_direct_buying_sms = threading.Thread( + # target=direct_buying_code_sms, + # args=( + # mobile, buyer, buyer_mobile, quantity, kill_place, date, code)) + # sms_direct_buying_sms.start() + else: + export_country = kill_request.export_country + sms_export_sms = threading.Thread( + target=export_code_sms, + args=( + mobile, buyer, buyer_mobile, quantity, kill_place, date, export_country, + code, poultry_name, province_operator.mobile)) + sms_export_sms.start() + + # kill_request.remain_quantity_for_poultry = kill_request.kill_capacity + if killer_kill_house != None: + kill_request.slaughter_house = killer_kill_house + kill_request.remain_quantity = kill_request.kill_capacity + dict1.update({ + 'cash': cash, + 'credit': credit + }) + kill_request.buy_type = dict1 + dict2.update({ + 'low_weight': low_weight, + 'high_weight': high_weight + + }) + kill_request.weight_type = dict2 + if role != None: + kill_request.registrar = { + "role": role, + "full_name": user.fullname, + "date": str(kill_request.create_date) + } + kill_request.save() + permission_duirect_buying = AutomaticDirectBuyingPermission.objects.first() + if role == 'KillHouse': + if kill_request.poultry is None: + if SmsLicense.objects.filter(kill_request=True).exists(): + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + quantity = kill_request.kill_capacity + chicken_breed = kill_request.chicken_breed + date_str = kill_request.recive_date + try: + send_date = datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S.%f%z').date() + except: + send_date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + # send_date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + province = kill_request.kill_house.system_address.province.name + city = kill_request.kill_house.system_address.city.name + kill_house_name = kill_request.kill_house.name + province_operator_mobile = province_operator.user.mobile + province_operator_name = province_operator.user.fullname + sms_kill_request_province_sms = threading.Thread(target=kill_request_province_sms, + args=( + province_operator_mobile, kill_house_name, + quantity, + chicken_breed, + send_date, province, city)) + sms_kill_request_province_sms.start() + serializer_request = self.serializer_class(kill_request) + if price_confirmation: + kill_request.price_confirmation = True + kill_request.save() + return Response({"result": "درخواست شما با موفقیت برای استان ارسال شد."}, + status=status.HTTP_201_CREATED) + + else: + kill_request.remain_quantity = kill_request.kill_capacity + kill_request.province_state = 'accepted' + kill_request.final_accept = True + kill_request.save() + price = Pricing.objects.all() + if price.count() > 0: + price = price.last() + factor = KillRequestFactor( + kill_request=kill_request, + amount=round( + (kill_request.kill_capacity * kill_request.Index_weight) * price.live_chicken_price, + 0), + minimum_amount=round( + ((kill_request.kill_capacity * kill_request.Index_weight) * price.live_chicken_price) * ( + 70 / 100), + 0) + + ) + factor.save() + kill_request.factor_amount = factor.amount + kill_request.save() + if kill_request.poultry is None: + if SmsLicense.objects.filter(kill_request=True).exists(): + mobile = kill_request.kill_house.kill_house_operator.user.mobile + kill_house_name = kill_request.kill_house.name + sms_province_kill_request_accept_sms = threading.Thread( + target=province_kill_request_accept_sms, + args=( + kill_house_name,)) + sms_province_kill_request_accept_sms.start() + now = datetime.now().time().replace(second=0, microsecond=0) + if price_confirmation: + poultry_fullname = poultry.unit_name + # poultry_mobile = poultry.user.mobile + poultry_mobile = second_mobile_number if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile + quantity = kill_request.kill_capacity + chicken_breed = kill_request.chicken_breed + request_kill_house = kill_request.kill_house.name + date_str = kill_request.recive_date + clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0] + send_date = datetime.strptime(str(clean_date_str), '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + confirm_price_poultry_request = threading.Thread( + target=confirm_price_poultry_request_direct_buying_sms, + args=( + poultry_mobile, poultry_fullname, + quantity, chicken_breed, + send_date, + kill_request.free_direct_buying, + kill_request.amount, request_kill_house, + code)) + confirm_price_poultry_request.start() + kill_request.price_confirmation = True + kill_request.save() + return Response({"result": "درخواست شما با موفقیت ارسال شد."}, + status=status.HTTP_201_CREATED) + else: + if permission_duirect_buying.allow == True and not buying_verification.poultry_code_mandatory and permission_duirect_buying.start_time < \ + now < permission_duirect_buying.end_time: + poultry_requests = PoultryRequest.objects.filter(poultry=kill_request.poultry, + trash=False).order_by( + 'create_date') + if not hatching: + hatching = PoultryHatching.objects.filter(poultry=kill_request.poultry, state='pending', + archive=False, + allow_hatching='pending', trash=False).order_by( + 'id').last() + + poultry = Poultry.objects.get(key=kill_request.poultry.key, trash=False) + vet_farm = VetFarm.objects.filter(trash=False, poultry=poultry).first() + last_poultry_request = PoultryRequest.objects.all() + if last_poultry_request.count() > 0: + general_order_code = last_poultry_request.last().general_order_code + 1 + else: + general_order_code = 1 + + if poultry_requests.count() > 0: + order_code = poultry_requests.last().order_code + 1 + else: + order_code = int(str(poultry.user.base_order) + '0001') + city_operator = CityOperator.objects.filter(unit_name=poultry.city_operator, trash=False).last() + if not city_operator: + city_operator = CityOperator.objects.filter(unit_name='اتحادیه استان (فاقد تعاونی)', + trash=False).last() + if hatching.left_over < kill_request.kill_capacity: + return Response({"result": "تعداد جوجه در سالن کمتر از تعداد درخواستی است"}, + status=status.HTTP_403_FORBIDDEN) + + poultry_request = PoultryRequest( + hatching=hatching, + order_code=order_code, + general_order_code=general_order_code, + city_operator=city_operator, + poultry=poultry, + previous_quantity=kill_request.kill_capacity, + remain_quantity=kill_request.kill_capacity, + quantity=kill_request.kill_capacity, + first_quantity=kill_request.kill_capacity, + chicken_breed=hatching.chicken_breed, + Index_weight=kill_request.Index_weight, + state_process='accepted', + province_state='accepted', + direct_buying=True, + free_sale_in_province=free_sale_in_province, + send_date=kill_request.recive_date, + amount=kill_request.amount, + ) + poultry_request.save() + kill_request.poultry_request = poultry_request + if kill_request.export_status == True: + poultry_request.export = True + send_date_str = poultry_request.send_date + send_date_datetime = datetime.strptime(str(send_date_str), '%Y-%m-%dT%H:%M:%S.%fZ') + poultry_request.killing_age = (send_date_datetime.date() - hatching.date.date()).days + 1 + + poultry_request.state = { + "city_operator": city_operator.user.fullname, + "city_state": poultry_request.state_process, + "city_operator_mobile": city_operator.user.mobile, + "province_operator": "", + "province_state": "" + } + poultry_request.registrar = { + "role": role, + "fullname": user.fullname, + "date": str(poultry_request.create_date) + } + poultry_request.save() + + city_operator_check_request = CityOperatorCheckRequest( + city_operator_system=poultry_request.city_operator, + poultry_request=poultry_request, + state='accept', + province_accept=True, + province_state='accept', + allow_hatching=True + + ) + city_operator_check_request.save() + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + + check = ProvinceCheckOperatorRequest( + province_operator_system=province_operator, + poultry_request=poultry_request, + city_request_Poultry=city_operator_check_request, + quantity=poultry_request.quantity, + + state='accept', + ) + check.save() + wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first() + wage = wage_type.amount if wage_type.status == True else 0 + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, + trash=False) + province_killrequest = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + kill_request=kill_request, + province_request=check, + quantity=kill_request.kill_capacity, + total_killed_quantity=kill_request.kill_capacity, + total_killed_weight=int(kill_request.kill_capacity * poultry_request.Index_weight), + main_quantity=kill_request.kill_capacity, + wage=wage, + direct_buying=True, + total_wage_amount=wage * int(kill_request.kill_capacity * poultry_request.Index_weight), + ) + province_killrequest.save() + # fine = FinePermission.objects.filter(trash=False).first() + # time_for_fine = datetime.now() + # time_for_fine = time_for_fine.replace(second=0, microsecond=0).time() + # if fine.direct_buying: + # if fine.direct_buying_start_time < time_for_fine < fine.direct_buying_end_time: + # province_killrequest.direct_buying_fine = True + # province_killrequest.direct_buying_fine_amount = fine.direct_buying_fine_coefficient * province_killrequest.total_wage_amount + # province_killrequest.direct_buying_fine_coefficient = fine.direct_buying_fine_coefficient + create_update_chicken_commission_prices() + if wage_type and wage_type.status == True and percentages_wage_type: + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + province_killrequest.union_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.union_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'company': + province_killrequest.company_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.company_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'guilds': + province_killrequest.guilds_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.guilds_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'city': + province_killrequest.city_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.city_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'other': + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'wallet': + province_killrequest.wallet_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.wallet_share_percent = percentage_wage_type.percent + + else: + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + province_killrequest.save() + + tomorrow = datetime.now().date() + timedelta(days=1) + if not KillHouseWareHouse.objects.filter(kill_house=kill_request.kill_house, + date__date=tomorrow).exists(): + ware_house_date = datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day, + hour=1, + minute=12, second=20) + kill_house_ware_house = KillHouseWareHouse( + kill_house=kill_request.kill_house, + date=ware_house_date + ) + kill_house_ware_house.save() + kill_house_check = KillHouseCheckRequest( + province_kill_request=province_killrequest, + state='accepted' + ) + + kill_house_check.save() + province_killrequest.state = 'accepted' + if buying_verification.payment_deadline: + province_killrequest.payment_deadline = True + province_killrequest.payment_deadline_date = datetime.now() + timedelta( + days=request.data['payment_deadline_days']) + province_killrequest.save() + check.quantity = 0 + check.save() + + if poultry_request.export == True: + hatching.export_killed_weight += int( + kill_request.kill_capacity * poultry_request.Index_weight) + hatching.export_killed_quantity += kill_request.kill_capacity + + + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity += int( + kill_request.kill_capacity * poultry_request.Index_weight) + hatching.free_quantity += kill_request.kill_capacity + + else: + hatching.governmental_killed_quantity += int( + kill_request.kill_capacity * poultry_request.Index_weight) + hatching.governmental_quantity += kill_request.kill_capacity + hatching.killed_quantity += kill_request.kill_capacity + hatching.save() + poultry_request.remain_quantity = 0 + poultry_request.direct_buying_kill_place = kill_request.kill_house.name + poultry_request.direct_buying_buyer_info = { + "buyer_fullname": kill_request.kill_house.kill_house_operator.user.fullname, + "buyer_mobile": kill_request.kill_house.kill_house_operator.user.mobile, + } + poultry_request.save() + if kill_request.export_status == True: + kill_request.export_state = 'accepted' + kill_request.direct_buying_message = request.data['direct_buying_message'] + + else: + kill_request.direct_buying_state = 'accepted' + + kill_request.accept_reject_date = datetime.now() + + kill_request.save() + poultry_fullname = poultry.unit_name + # poultry_mobile = poultry.user.mobile + poultry_mobile = second_mobile_number if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile + quantity = kill_request.kill_capacity + chicken_breed = kill_request.chicken_breed + request_kill_house = kill_request.kill_house.name + date_str = kill_request.recive_date + if isinstance(date_str, str): + clean_date_str = date_str.split('.')[0] + clean_date_str = clean_date_str.replace('T', ' ') + clean_date_str = clean_date_str.replace('Z', '') + + send_date = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date() + + elif isinstance(date_str, datetime): + send_date = date_str.date() + # clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0] + # send_date = datetime.strptime(str(clean_date_str), '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + code = "-" + send_date = separate.join(date_list) + confirm_price_poultry_request = threading.Thread( + target=confirm_price_poultry_request_direct_buying_sms, + args=( + poultry_mobile, poultry_fullname, + quantity, chicken_breed, + send_date, + kill_request.free_direct_buying, + kill_request.amount, request_kill_house, + code)) + confirm_price_poultry_request.start() + bot_eitaa_for_each_province_kill_request(province_killrequest, vet_farm) + return Response({"result": "درخواست شما با موفقیت ارسال شد."}, + status=status.HTTP_201_CREATED) + else: + poultry_fullname = poultry.unit_name + # poultry_mobile = poultry.user.mobile + poultry_mobile = second_mobile_number if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile + quantity = kill_request.kill_capacity + chicken_breed = kill_request.chicken_breed + request_kill_house = kill_request.kill_house.name + date_str = kill_request.recive_date + if isinstance(date_str, str): + clean_date_str = date_str.split('.')[0] + clean_date_str = clean_date_str.replace('T', ' ') + clean_date_str = clean_date_str.replace('Z', '') + + send_date = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date() + + elif isinstance(date_str, datetime): + send_date = date_str.date() + # clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0] + # send_date = datetime.strptime(str(clean_date_str), '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + code = "-" + send_date = separate.join(date_list) + confirm_price_poultry_request = threading.Thread( + target=confirm_price_poultry_request_direct_buying_sms, + args=( + poultry_mobile, poultry_fullname, + quantity, chicken_breed, + send_date, + kill_request.free_direct_buying, + kill_request.amount, request_kill_house, + code)) + confirm_price_poultry_request.start() + return Response({"result": "درخواست شما با موفقیت به پنل تخصیص اضافه شد."}, + status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + if 'role' in request.GET: + if request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + if 'direct_buying' in request.GET: + from django.db.models import Value + kill_req_list = [] + # if request.GET['type'] == 'pending': + # querysets = KillRequest.objects.filter(kill_house__in=kill_house, recive_date__date__gte=date1, + # recive_date__date__lte=date2, poultry__isnull=False, + # direct_buying_state='pending', + # export_status=False,trash=False + # ).order_by( + # 'recive_date') + # else: + querysets = KillRequest.objects.filter(kill_house__in=kill_house, recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + direct_buying_state__in=( + 'accepted', 'rejected', 'deleted', 'pending'), + export_status=False, trash=False, market=False, + ).order_by( + Case( + When(direct_buying_state='pending', then=Value(0)), + default=Value(1) + ), + '-recive_date' # مرتب‌سازی بر اساس تاریخ بعد از مرتب‌سازی بر اساس حالت + ) + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=querysets + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=querysets) + kill_req_list = ps.filter() + querysets = [] if len(kill_req_list) == 0 else kill_req_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(querysets) + if page is not None: + serializer = KillRequestSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillRequestSerializer(querysets, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + if 'export' in request.GET: + kill_req_list = [] + if request.GET['type'] == 'pending': + querysets = KillRequest.objects.filter(kill_house__in=kill_house, recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + export_status=True, market=False, + export_state='pending' + ).order_by( + 'recive_date') + else: + querysets = KillRequest.objects.filter(kill_house__in=kill_house, recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + export_status=True, market=False, + export_state__in=( + 'accepted', 'rejected', 'deleted'), + ).order_by( + 'recive_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=querysets + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=querysets) + kill_req_list = ps.filter() + querysets = [] if len(kill_req_list) == 0 else kill_req_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(querysets) + if page is not None: + serializer = KillRequestSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillRequestSerializer(querysets, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + queryset_list = KillRequest.objects.filter(kill_house__in=kill_house, trash=False, market=False, + poultry__isnull=True).order_by( + 'recive_date') + querysets = [ + kill_request for kill_request in queryset_list + if date1 <= kill_request.recive_date.date() <= date2 + ] + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + + if 'direct_buying' in request.GET: + from django.db.models import Value + kill_req_list = [] + # if request.GET['type'] == 'pending': + # querysets = KillRequest.objects.filter( + # recive_date__date__gte=date1, + # recive_date__date__lte=date2, poultry__isnull=False, + # direct_buying_state='pending', + # export_status=False,trash=False + # ).order_by( + # 'recive_date') + # else: + querysets = KillRequest.objects.filter( + recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, market=False, + final_accept=True, + direct_buying_state__in=( + 'accepted', 'rejected', 'deleted', 'pending'), + export_status=False, trash=False + ).select_related( + 'poultry', 'kill_house', 'slaughter_house', 'poultry_hatching' + + ).order_by( + Case( + When(direct_buying_state='pending', then=Value(0)), + default=Value(1) + ), + '-recive_date' # مرتب‌سازی بر اساس تاریخ بعد از مرتب‌سازی بر اساس حالت + ) + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=querysets + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=querysets) + kill_req_list = ps.filter() + querysets = [] if len(kill_req_list) == 0 else kill_req_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(querysets) + if page is not None: + serializer = KillRequestForDirectBuyingTrueSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillRequestSerializer(querysets, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + if 'export' in request.GET: + kill_req_list = [] + if request.GET['type'] == 'pending': + querysets = KillRequest.objects.filter( + recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + export_status=True, market=False, + export_state='pending' + ).order_by( + 'recive_date') + else: + querysets = KillRequest.objects.filter( + recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + export_status=True, market=False, + export_state__in=( + 'accepted', 'rejected', 'deleted'), + ).order_by( + 'recive_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=querysets + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=querysets) + kill_req_list = ps.filter() + querysets = [] if len(kill_req_list) == 0 else kill_req_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(querysets) + if page is not None: + serializer = KillRequestSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillRequestSerializer(querysets, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + querysets_list = KillRequest.objects.filter( + trash=False, poultry__isnull=True).order_by('-recive_date') + # for queryset in querysets_list: + # if (now - queryset.recive_date.date()).days > 2: + # queryset.remain_quantity = 0 + # queryset.save() + + querysets = [ + queryset_list for queryset_list in querysets_list + if date1 <= queryset_list.recive_date.date() <= date2 + ] + elif 'poultry_key' in request.GET: + kill_requests = [] + today = datetime.now().date() + poultry = Poultry.objects.get(key=request.GET['poultry_key'], trash=False) + kill_requests = KillRequest.objects.filter(direct_buying_state__in=('pending', 'accepted'), market=False, + poultry=poultry, recive_date__date=today, trash=False) + serializer = KillRequestSerializer(kill_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + else: + if '0' in request.GET: + poultry_request = PoultryRequest.objects.get(key=request.GET['0']) + + queryset = KillRequest.objects.filter( + recive_date__year=poultry_request.send_date.year, + recive_date__month=poultry_request.send_date.month, + recive_date__day=poultry_request.send_date.day, + province_state='accepted', market=False, + # automatic=False, + trash=False, poultry__isnull=True).order_by('id') + result_list = [] + if len(poultry_request.kill_house_list) != 0: + querysets = [] + for item in poultry_request.kill_house_list: + parts = item.split("(") + name = parts[0].strip() + result_list.append(name) + for kill_house in result_list: + priority_requests = [] + remaining_requests = [] + for kill_request in queryset: + if kill_request.kill_house.name == kill_house: + priority_requests.append(kill_request) + kill_request.priority = True + kill_request.save() + else: + kill_request.priority = False + kill_request.save() + remaining_requests.append(kill_request) + for x in priority_requests: + if x in querysets: + pass + else: + querysets.append(x) + for y in remaining_requests: + if y in querysets: + pass + else: + querysets.append(y) + + + else: + + for kill_request in queryset: + kill_request.priority = False + kill_request.save() + querysets = queryset + + else: + querysets = [] + serializer = KillRequestSerializer(querysets, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع مربوط به حذف درخواست کشتارهای ثبت شده از سمت کشتارگاه + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + if 'role' in request.GET: + kill_request = KillRequest.objects.get(key=request.GET['kill_request_key']) + + limitation_direct_purchase = LimitationForDirectPurchaseAndBarInformation.objects.filter( + trash=False, active=True).first() + + if limitation_direct_purchase and limitation_direct_purchase.start_time and limitation_direct_purchase.end_time: + current_time = datetime.now().time() + if limitation_direct_purchase.start_time <= current_time <= limitation_direct_purchase.end_time: + record_create_time = kill_request.create_date.time() + if not ( + limitation_direct_purchase.start_time <= record_create_time <= limitation_direct_purchase.end_time): + return Response( + {"result": "شما فقط می‌توانید بارهایی که در بازه زمانی مجاز ثبت شده‌اند را حذف کنید!"}, + status=status.HTTP_403_FORBIDDEN) + if request.GET['role'] == 'KillHouse': + if kill_request.direct_buying_state != 'pending' and kill_request.export_status == False: + return Response({"result": "به علت تایید یا رد استان شما نمیتوانیددرخواست رو حذف کنید"}) + if kill_request.export_state != 'pending' and kill_request.export_status == True: + return Response({"result": "به علت تایید یا رد استان شما نمیتوانیددرخواست رو حذف کنید"}) + if kill_request.export_status == False: + kill_request.direct_buying_state = 'deleted' + else: + kill_request.export_state = 'deleted' + + kill_request.trash = True + kill_request.save() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + user = SystemUserProfile.objects.get(user=request.user) + kill_request = KillRequest.objects.get(id=pk) + if ProvinceKillRequest.objects.filter(kill_request=kill_request, trash=False).exists(): + return Response({"result": "error"}, status=status.HTTP_403_FORBIDDEN) + if SmsLicense.objects.filter(kill_request=True).exists(): + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + quantity = kill_request.kill_capacity + chicken_breed = kill_request.chicken_breed + date_str = str(kill_request.recive_date) + send_date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + province = kill_request.kill_house.system_address.province.name + city = kill_request.kill_house.system_address.city.name + kill_house_name = kill_request.kill_house.name + province_operator_mobile = province_operator.user.mobile + province_operator_name = province_operator.user.fullname + # kill_request_province_sms(province_operator_mobile, kill_house_name, quantity, chicken_breed, + # send_date, province, city) + + sms_kill_request_delete_province_sms = threading.Thread(target=kill_request_delete_province_sms, + args=( + province_operator_mobile, kill_house_name, + quantity, + chicken_breed, + send_date, province, city)) + sms_kill_request_delete_province_sms.start() + kill_request.trash = True + kill_request.save() + + return Response('request deleted', status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + if 'kill_request_key' in request.data.keys(): + kill_request_instance = KillRequest.objects.filter(key=request.data['kill_request_key'], + trash=False).first() + if kill_request_instance: + limitation_direct_purchase = LimitationForDirectPurchaseAndBarInformation.objects.filter( + trash=False, active=True).first() + + if limitation_direct_purchase and limitation_direct_purchase.start_time and limitation_direct_purchase.end_time: + current_time = datetime.now().time() + if limitation_direct_purchase.start_time <= current_time <= limitation_direct_purchase.end_time: + record_create_time = kill_request_instance.create_date.time() + if not ( + limitation_direct_purchase.start_time <= record_create_time <= limitation_direct_purchase.end_time): + return Response( + { + "result": "شما فقط می‌توانید بارهایی که در بازه زمانی مجاز ثبت شده‌اند را ویرایش کنید!"}, + status=status.HTTP_403_FORBIDDEN) + + if 'role' in request.data.keys(): + kill_request = KillRequest.objects.get(key=request.data['kill_request_key']) + if kill_request.trash: + return Response({"result": "به علت بدهی درخواست شما حذف گردید!"}, status=status.HTTP_403_FORBIDDEN) + if request.data['role'] == 'KillHouse': + if kill_request.direct_buying_state != 'pending': + return Response({"result": "به علت تایید یا رد استان شما نمیتوانیددرخواست رو ویرایش کنید"}) + request.data.pop('role') + request.data.pop('kill_request_key') + if 'input_direct_buying_code' in request.data.keys(): + if request.data['input_direct_buying_code'] != None or request.data['input_direct_buying_code'] != "": + if request.data['input_direct_buying_code'] != kill_request.direct_buying_code: + return Response({"result": "کد وارد شده صحیح نمی باشد"}, status=status.HTTP_403_FORBIDDEN) + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().time().replace(second=0, microsecond=0) + + free_sale_in_province = False if kill_request.free_direct_buying == False else True + + permission_duirect_buying = AutomaticDirectBuyingPermission.objects.first() + + if permission_duirect_buying.allow == True and permission_duirect_buying.start_time < \ + now < permission_duirect_buying.end_time: + # kill_request.kill_capacity = int(request.data['quantity']) + # kill_request.remain_quantity = int(request.data['quantity']) + # kill_request.save() + # request.data.pop('quantity') + poultry_requests = PoultryRequest.objects.filter(poultry__user=kill_request.poultry.user, + trash=False).order_by( + 'create_date') + + if kill_request.poultry_hatching: + hatching = kill_request.poultry_hatching + else: + + hatching = PoultryHatching.objects.filter(poultry=kill_request.poultry, state='pending', + archive=False, + allow_hatching='pending', trash=False).order_by( + 'id').last() + + poultry = Poultry.objects.get(key=kill_request.poultry.key, trash=False) + vet_farm = VetFarm.objects.filter(trash=False, poultry=poultry).first() + last_poultry_request = PoultryRequest.objects.all() + if last_poultry_request.count() > 0: + general_order_code = last_poultry_request.last().general_order_code + 1 + else: + general_order_code = 1 + + if poultry_requests.count() > 0: + order_code = poultry_requests.last().order_code + 1 + else: + order_code = int(str(poultry.user.base_order) + '0001') + city_operator = CityOperator.objects.filter(unit_name=poultry.city_operator, trash=False).last() + if not city_operator: + city_operator = CityOperator.objects.filter(unit_name='اتحادیه استان (فاقد تعاونی)', + trash=False).last() + if hatching.left_over < kill_request.kill_capacity: + return Response({"result": "تعداد جوجه در سالن کمتر از تعداد درخواستی است"}, + status=status.HTTP_403_FORBIDDEN) + + if kill_request.kill_house.max_kill_limit and kill_request.kill_house.total_kill_capacity > 0: + total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, + return_to_province=False, + archive_wage=False, + state__in=( + 'pending', 'accepted'), + killhouse_user=kill_request.kill_house, + kill_request__recive_date__date=kill_request.recive_date.date()) + total_province_kill_requests_quantity = \ + total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + if kill_request.kill_house.total_kill_capacity < total_province_kill_requests_quantity + kill_request.kill_capacity: + return Response( + {"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + + poultry_request = PoultryRequest( + hatching=hatching, + order_code=order_code, + general_order_code=general_order_code, + city_operator=city_operator, + poultry=poultry, + previous_quantity=kill_request.kill_capacity, + remain_quantity=kill_request.kill_capacity, + quantity=kill_request.kill_capacity, + first_quantity=kill_request.kill_capacity, + chicken_breed=hatching.chicken_breed, + Index_weight=kill_request.Index_weight, + state_process='accepted', + province_state='accepted', + direct_buying=True, + amount=kill_request.amount, + free_sale_in_province=free_sale_in_province, + send_date=kill_request.recive_date + ) + + poultry_request.save() + kill_request.poultry_request = poultry_request + poultry_prediction(poultry_request.poultry) + + if kill_request.export_status == True: + poultry_request.export = True + + send_date_str = poultry_request.send_date + + if isinstance(send_date_str, str): + # حذف میلی‌ثانیه و کاراکترهای اضافی + clean_date_str = send_date_str.split('.')[0] # حذف بخش .759000 + clean_date_str = clean_date_str.replace('T', ' ') # جایگزینی T با فاصله + clean_date_str = clean_date_str.replace('Z', '') # حذف Z اگر وجود دارد + + # تبدیل به تاریخ میلادی + send_date_datetime = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date() + + # اگر از قبل شی datetime است + elif isinstance(send_date_str, datetime): + send_date_datetime = send_date_str.date() + + # send_date_datetime = datetime.strptime(str(send_date_str), '%Y-%m-%dT%H:%M:%S.%fZ') + poultry_request.killing_age = (send_date_datetime - hatching.date.date()).days + 1 + + poultry_request.state = { + "city_operator": city_operator.user.fullname, + "city_state": poultry_request.state_process, + "city_operator_mobile": city_operator.user.mobile, + "province_operator": "", + "province_state": "" + } + poultry_request.registrar = { + "role": 'KillHouse', + "fullname": user.fullname, + "date": str(poultry_request.create_date) + } + poultry_request.save() + + city_operator_check_request = CityOperatorCheckRequest( + city_operator_system=poultry_request.city_operator, + poultry_request=poultry_request, + state='accept', + province_accept=True, + province_state='accept', + allow_hatching=True + + ) + city_operator_check_request.save() + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + + check = ProvinceCheckOperatorRequest( + province_operator_system=province_operator, + poultry_request=poultry_request, + city_request_Poultry=city_operator_check_request, + quantity=poultry_request.quantity, + + state='accept', + ) + check.save() + wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first() + wage = wage_type.amount if wage_type.status == True else 0 + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, + trash=False) + province_killrequest = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + kill_request=kill_request, + province_request=check, + quantity=kill_request.kill_capacity, + total_killed_quantity=kill_request.kill_capacity, + total_killed_weight=int(kill_request.kill_capacity * poultry_request.Index_weight), + main_quantity=kill_request.kill_capacity, + wage=wage, + direct_buying=True, + total_wage_amount=wage * int(kill_request.kill_capacity * poultry_request.Index_weight), + ) + province_killrequest.save() + # fine = FinePermission.objects.filter(trash=False).first() + # time_for_fine = datetime.now() + # time_for_fine = time_for_fine.replace(second=0, microsecond=0).time() + # if fine.direct_buying: + # if fine.direct_buying_start_time < time_for_fine < fine.direct_buying_end_time: + # province_killrequest.direct_buying_fine = True + # province_killrequest.direct_buying_fine_amount = ( + # fine.direct_buying_fine_coefficient - 1) * province_killrequest.total_wage_amount if fine.direct_buying_fine_coefficient > 1 else province_killrequest.total_wage_amount + # province_killrequest.direct_buying_fine_coefficient = fine.direct_buying_fine_coefficient + if wage_type and wage_type.status == True and percentages_wage_type: + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + province_killrequest.union_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.union_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'company': + province_killrequest.company_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.company_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'guilds': + province_killrequest.guilds_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.guilds_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'city': + province_killrequest.city_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.city_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'other': + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'wallet': + province_killrequest.wallet_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.wallet_share_percent = percentage_wage_type.percent + + else: + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + province_killrequest.save() + + tomorrow = datetime.now().date() + timedelta(days=1) + if not KillHouseWareHouse.objects.filter(kill_house=kill_request.kill_house, + date__date=tomorrow).exists(): + ware_house_date = datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day, hour=1, + minute=12, second=20) + kill_house_ware_house = KillHouseWareHouse( + kill_house=kill_request.kill_house, + date=ware_house_date + ) + kill_house_ware_house.save() + kill_house_check = KillHouseCheckRequest( + province_kill_request=province_killrequest, + state='accepted' + ) + + kill_house_check.save() + province_killrequest.state = 'accepted' + + if kill_request.payment_deadline: + province_killrequest.payment_deadline = True + province_killrequest.payment_deadline_date = kill_request.payment_deadline_date + province_killrequest.save() + check.quantity = 0 + check.save() + + if poultry_request.export == True: + hatching.export_killed_weight += int(kill_request.kill_capacity * poultry_request.Index_weight) + hatching.export_killed_quantity += kill_request.kill_capacity + + + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity += int(kill_request.kill_capacity * poultry_request.Index_weight) + hatching.free_quantity += kill_request.kill_capacity + + else: + hatching.governmental_killed_quantity += int( + kill_request.kill_capacity * poultry_request.Index_weight) + hatching.governmental_quantity += kill_request.kill_capacity + hatching.killed_quantity += kill_request.kill_capacity + hatching.save() + poultry_request.remain_quantity = 0 + poultry_request.direct_buying_kill_place = kill_request.kill_house.name + poultry_request.direct_buying_buyer_info = { + "buyer_fullname": kill_request.kill_house.kill_house_operator.user.fullname, + "buyer_mobile": kill_request.kill_house.kill_house_operator.user.mobile, + } + poultry_request.save() + if kill_request.export_status == True: + kill_request.export_state = 'accepted' + kill_request.direct_buying_message = request.data['direct_buying_message'] + + else: + kill_request.direct_buying_state = 'accepted' + + kill_request.accept_reject_date = datetime.now() + kill_request.automatic_accept = True + kill_request.input_direct_buying_code = request.data['input_direct_buying_code'] + kill_request.save() + bot_eitaa_for_each_province_kill_request(province_killrequest, vet_farm) + return Response({"result": "درخواست شما با موفقیت تایید و ارسال شد."}, + status=status.HTTP_201_CREATED) + if 'input_export_code' in request.data.keys(): + if request.data['input_export_code'] != None or request.data['input_export_code'] != "": + if request.data['input_export_code'] != kill_request.export_code: + return Response({"result": "کد وارد شده صحیح نمی باشد"}, status=status.HTTP_403_FORBIDDEN) + + if 'final_accept' in request.data.keys(): + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_request.final_accept = True + now = datetime.now().time().replace(second=0, microsecond=0) + price_confirmation = PriceConfirmation.objects.filter(trash=False).first() + price_confirmation = price_confirmation.poultry_status if price_confirmation else False + buying_verification = DirectBuyingVerification.objects.filter(trash=False).first() + + if buying_verification.poultry_code_mandatory: + poultry_fullname = kill_request.poultry.unit_name + poultry_mobile = kill_request.poultry.user.mobile if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile + quantity = kill_request.kill_capacity + chicken_breed = kill_request.chicken_breed + request_kill_house = kill_request.kill_house.name + date_str = kill_request.recive_date + # clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0] + + # send_date = datetime.strptime(str(date_str), '%Y-%m-%d %H:%M:%S').date() + # send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + # day=send_date.day).strftime('%Y-%m-%d') + # + # date_list = reversed(send_date.split('-')) + # separate = "-" + # send_date = separate.join(date_list) + + if isinstance(date_str, str): + clean_date_str = date_str.split('.')[0] + clean_date_str = clean_date_str.replace('T', ' ') + clean_date_str = clean_date_str.replace('Z', '') + + send_date = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date() + + elif isinstance(date_str, datetime): + send_date = date_str.date() + + jalali_date = jdatetime.date.fromgregorian( + year=send_date.year, + month=send_date.month, + day=send_date.day + ) + + formatted_jalali = jalali_date.strftime('%Y-%m-%d') + + date_parts = formatted_jalali.split('-') + send_date = '-'.join(reversed(date_parts)) + + confirm_price_poultry_request = threading.Thread( + target=confirm_price_poultry_request_direct_buying_sms, + args=( + poultry_mobile, poultry_fullname, + quantity, chicken_breed, + send_date, + kill_request.free_direct_buying, + kill_request.amount, request_kill_house, + kill_request.direct_buying_code)) + confirm_price_poultry_request.start() + kill_request.price_confirmation = price_confirmation + kill_request.save() + return Response({"result": "درخواست شما با موفقیت تایید و ارسال شد."}, + status=status.HTTP_201_CREATED) + else: + free_sale_in_province = False if kill_request.free_direct_buying == False else True + + permission_duirect_buying = AutomaticDirectBuyingPermission.objects.first() + + if permission_duirect_buying.allow == True and permission_duirect_buying.start_time < \ + now < permission_duirect_buying.end_time: + # kill_request.kill_capacity = int(request.data['quantity']) + # kill_request.remain_quantity = int(request.data['quantity']) + # kill_request.save() + # request.data.pop('quantity') + poultry_requests = PoultryRequest.objects.filter(poultry__user=kill_request.poultry.user, + trash=False).order_by( + 'create_date') + + if kill_request.poultry_hatching: + hatching = kill_request.poultry_hatching + else: + + hatching = PoultryHatching.objects.filter(poultry=kill_request.poultry, state='pending', + archive=False, + allow_hatching='pending', trash=False).order_by( + 'id').last() + # hatching = PoultryHatching.objects.filter(poultry=kill_request.poultry, state='pending', + # archive=False, + # allow_hatching='pending', trash=False).order_by( + # 'left_over').last() + + poultry = Poultry.objects.get(key=kill_request.poultry.key, trash=False) + vet_farm = VetFarm.objects.filter(trash=False, poultry=poultry).first() + last_poultry_request = PoultryRequest.objects.all() + if last_poultry_request.count() > 0: + general_order_code = last_poultry_request.last().general_order_code + 1 + else: + general_order_code = 1 + + if poultry_requests.count() > 0: + order_code = poultry_requests.last().order_code + 1 + else: + order_code = int(str(poultry.user.base_order) + '0001') + city_operator = CityOperator.objects.filter(unit_name=poultry.city_operator, trash=False).last() + if not city_operator: + city_operator = CityOperator.objects.filter(unit_name='اتحادیه استان (فاقد تعاونی)', + trash=False).last() + if hatching.left_over < kill_request.kill_capacity: + return Response({"result": "تعداد جوجه در سالن کمتر از تعداد درخواستی است"}, + status=status.HTTP_403_FORBIDDEN) + + if kill_request.kill_house.max_kill_limit and kill_request.kill_house.total_kill_capacity > 0: + total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, + return_to_province=False, + archive_wage=False, + state__in=( + 'pending', + 'accepted'), + killhouse_user=kill_request.kill_house, + kill_request__recive_date__date=kill_request.recive_date.date()) + total_province_kill_requests_quantity = \ + total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + if kill_request.kill_house.total_kill_capacity < total_province_kill_requests_quantity + kill_request.kill_capacity: + return Response( + {"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + + poultry_request = PoultryRequest( + hatching=hatching, + order_code=order_code, + general_order_code=general_order_code, + city_operator=city_operator, + poultry=poultry, + previous_quantity=kill_request.kill_capacity, + remain_quantity=kill_request.kill_capacity, + quantity=kill_request.kill_capacity, + first_quantity=kill_request.kill_capacity, + chicken_breed=hatching.chicken_breed, + Index_weight=kill_request.Index_weight, + state_process='accepted', + province_state='accepted', + direct_buying=True, + amount=kill_request.amount, + free_sale_in_province=free_sale_in_province, + send_date=kill_request.recive_date + ) + + poultry_request.save() + kill_request.poultry_request = poultry_request + poultry_prediction(poultry_request.poultry) + + if kill_request.export_status == True: + poultry_request.export = True + date_str = poultry_request.send_date + if isinstance(date_str, str): + # حذف میلی‌ثانیه و کاراکترهای اضافی + clean_date_str = date_str.split('.')[0] # حذف بخش .759000 + clean_date_str = clean_date_str.replace('T', ' ') # جایگزینی T با فاصله + clean_date_str = clean_date_str.replace('Z', '') # حذف Z اگر وجود دارد + + # تبدیل به تاریخ میلادی + send_date_datetime = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date() + + # اگر از قبل شی datetime است + elif isinstance(date_str, datetime): + send_date_datetime = date_str.date() + # send_date_datetime = datetime.strptime(str(send_date_str), '%Y-%m-%dT%H:%M:%S') + poultry_request.killing_age = (send_date_datetime - hatching.date.date()).days + 1 + + poultry_request.state = { + "city_operator": city_operator.user.fullname, + "city_state": poultry_request.state_process, + "city_operator_mobile": city_operator.user.mobile, + "province_operator": "", + "province_state": "" + } + poultry_request.registrar = { + "role": "KillHouse", + "fullname": user.fullname, + "date": str(poultry_request.create_date) + } + poultry_request.save() + + city_operator_check_request = CityOperatorCheckRequest( + city_operator_system=poultry_request.city_operator, + poultry_request=poultry_request, + state='accept', + province_accept=True, + province_state='accept', + allow_hatching=True + + ) + city_operator_check_request.save() + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + + check = ProvinceCheckOperatorRequest( + province_operator_system=province_operator, + poultry_request=poultry_request, + city_request_Poultry=city_operator_check_request, + quantity=poultry_request.quantity, + + state='accept', + ) + check.save() + wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first() + wage = wage_type.amount if wage_type.status == True else 0 + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, + trash=False) + province_killrequest = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + kill_request=kill_request, + province_request=check, + quantity=kill_request.kill_capacity, + total_killed_quantity=kill_request.kill_capacity, + total_killed_weight=int(kill_request.kill_capacity * poultry_request.Index_weight), + main_quantity=kill_request.kill_capacity, + wage=wage, + direct_buying=True, + total_wage_amount=wage * int(kill_request.kill_capacity * poultry_request.Index_weight), + ) + province_killrequest.save() + # fine = FinePermission.objects.filter(trash=False).first() + # time_for_fine = datetime.now() + # time_for_fine = time_for_fine.replace(second=0, microsecond=0).time() + # if fine.direct_buying: + # if fine.direct_buying_start_time < time_for_fine < fine.direct_buying_end_time: + # province_killrequest.direct_buying_fine = True + # province_killrequest.direct_buying_fine_amount = ( + # fine.direct_buying_fine_coefficient - 1) * province_killrequest.total_wage_amount if fine.direct_buying_fine_coefficient > 1 else province_killrequest.total_wage_amount + # province_killrequest.direct_buying_fine_coefficient = fine.direct_buying_fine_coefficient + if wage_type and wage_type.status == True and percentages_wage_type: + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + province_killrequest.union_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.union_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'company': + province_killrequest.company_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.company_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'guilds': + province_killrequest.guilds_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.guilds_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'city': + province_killrequest.city_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.city_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'other': + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'wallet': + province_killrequest.wallet_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.wallet_share_percent = percentage_wage_type.percent + + else: + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + province_killrequest.save() + + tomorrow = datetime.now().date() + timedelta(days=1) + if not KillHouseWareHouse.objects.filter(kill_house=kill_request.kill_house, + date__date=tomorrow).exists(): + ware_house_date = datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day, + hour=1, + minute=12, second=20) + kill_house_ware_house = KillHouseWareHouse( + kill_house=kill_request.kill_house, + date=ware_house_date + ) + kill_house_ware_house.save() + kill_house_check = KillHouseCheckRequest( + province_kill_request=province_killrequest, + state='accepted' + ) + + kill_house_check.save() + province_killrequest.state = 'accepted' + if kill_request.payment_deadline: + province_killrequest.payment_deadline = True + province_killrequest.payment_deadline_date = kill_request.payment_deadline_date + province_killrequest.save() + check.quantity = 0 + check.save() + + if poultry_request.export == True: + hatching.export_killed_weight += int( + kill_request.kill_capacity * poultry_request.Index_weight) + hatching.export_killed_quantity += kill_request.kill_capacity + + + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity += int( + kill_request.kill_capacity * poultry_request.Index_weight) + hatching.free_quantity += kill_request.kill_capacity + + else: + hatching.governmental_killed_quantity += int( + kill_request.kill_capacity * poultry_request.Index_weight) + hatching.governmental_quantity += kill_request.kill_capacity + hatching.killed_quantity += kill_request.kill_capacity + hatching.save() + poultry_request.remain_quantity = 0 + poultry_request.direct_buying_kill_place = kill_request.kill_house.name + poultry_request.direct_buying_buyer_info = { + "buyer_fullname": kill_request.kill_house.kill_house_operator.user.fullname, + "buyer_mobile": kill_request.kill_house.kill_house_operator.user.mobile, + } + poultry_request.save() + if kill_request.export_status == True: + kill_request.export_state = 'accepted' + kill_request.direct_buying_message = request.data['direct_buying_message'] + + else: + kill_request.direct_buying_state = 'accepted' + + kill_request.accept_reject_date = datetime.now() + kill_request.automatic_accept = True + + kill_request.save() + poultry_fullname = poultry.unit_name + poultry_mobile = poultry.user.mobile if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile + quantity = kill_request.kill_capacity + chicken_breed = kill_request.chicken_breed + request_kill_house = kill_request.kill_house.name + date_str = kill_request.recive_date + if isinstance(date_str, str): + clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0] + else: + clean_date_str = date_str.strftime('%Y-%m-%d %H:%M:%S') + send_date = datetime.strptime(str(clean_date_str), '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + code = "-" + send_date = separate.join(date_list) + confirm_price_poultry_request = threading.Thread( + target=confirm_price_poultry_request_direct_buying_sms, + args=( + poultry_mobile, poultry_fullname, + quantity, chicken_breed, + send_date, + kill_request.free_direct_buying, + kill_request.amount, request_kill_house, + code)) + confirm_price_poultry_request.start() + + bot_eitaa_for_each_province_kill_request(province_killrequest, vet_farm) + return Response({"result": "درخواست شما با موفقیت تایید و ارسال شد."}, + status=status.HTTP_201_CREATED) + + + + else: + poultry = Poultry.objects.get(key=kill_request.poultry.key, trash=False) + poultry_fullname = poultry.unit_name + poultry_mobile = poultry.user.mobile if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile + quantity = kill_request.kill_capacity + chicken_breed = kill_request.chicken_breed + request_kill_house = kill_request.kill_house.name + date_str = kill_request.recive_date + if isinstance(date_str, str): + clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0] + else: + clean_date_str = date_str.strftime('%Y-%m-%d %H:%M:%S') + send_date = datetime.strptime(str(clean_date_str), '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + code = "-" + send_date = separate.join(date_list) + confirm_price_poultry_request = threading.Thread( + target=confirm_price_poultry_request_direct_buying_sms, + args=( + poultry_mobile, poultry_fullname, + quantity, chicken_breed, + send_date, + kill_request.free_direct_buying, + kill_request.amount, request_kill_house, + code)) + confirm_price_poultry_request.start() + kill_request.save() + return Response({"result": "درخواست شما با موفقیت تایید و ارسال شد."}, + status=status.HTTP_201_CREATED) + kill_request.save() + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + serializer.update(instance=kill_request, validated_data=request.data) + return Response({"result": "با موفقیت ویرایش شد"}, status=status.HTTP_200_OK) + else: + return Response({"result": "در ثبت مقادیر مشکلی به وجود آمده است !"}, status=status.HTTP_403_FORBIDDEN) + + if 'previous_requests' in request.data.keys(): + now = datetime.now().date() + user = SystemUserProfile.objects.get(user=request.user) + querysets_list = KillRequest.objects.filter( + kill_house__system_address__province=user.province, + trash=False, remain_quantity__gt=0).order_by('-recive_date') + for queryset in querysets_list: + if (now - queryset.recive_date.date()).days > 2: + queryset.remain_quantity = 0 + queryset.save() + return Response({"result": "با موفقیت ثبت شد"}, + status=status.HTTP_200_OK) + + province_kill_request_quantity = 0 + kill_request = KillRequest.objects.get(key=request.data["kill_request_key"], trash=False) + request.data.pop('kill_request_key') + quantity = int(request.data['quantity']) + request.data.pop('quantity') + province_kill_requests = ProvinceKillRequest.objects.filter(kill_request=kill_request, trash=False) + if province_kill_requests.count() > 0: + + for province_kill_request in province_kill_requests: + province_kill_request_quantity += province_kill_request.main_quantity + if quantity < province_kill_request_quantity: + return Response({"result": "تعداد وارد شده از تعداد تخصیص داده شده کمتر است "}, + status=status.HTTP_403_FORBIDDEN) + if int(quantity) < kill_request.kill_capacity: + kill_request.remain_quantity -= kill_request.kill_capacity - int(quantity) + else: + kill_request.remain_quantity += int(quantity) - kill_request.kill_capacity + else: + kill_request.remain_quantity = int(quantity) + + kill_request.kill_capacity = int(quantity) + kill_request.save() + serializer = self.serializer_class(kill_request) + serializer.update(instance=kill_request, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillRequestFactorViewSet(viewsets.ModelViewSet): + queryset = KillRequestFactor.objects.all() + serializer_class = KillRequestFactorSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + user_profile = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_user = get_object_or_404(KillHouseOperator, user=user_profile) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_user) + + factor_list = KillRequestFactor.objects.filter(kill_request__kill_house__in=kill_house, trash=False).order_by( + 'id') + factors = [ + kill_request_factor for kill_request_factor in factor_list + if date1 <= kill_request_factor.kill_request.recive_date.date() <= date2 + ] + serializer = KillRequestFactorSerializer(factors, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + if 'state' in request.data: + if request.data['state'] == 'cancel': + factor = KillRequestFactor.objects.get(key=request.data['factor_key'], trash=False) + kill_request = KillRequest.objects.get(key=factor.kill_request.key) + kill_request.trash = True + kill_request.save() + factor.trash = True + factor.save() + return Response({"result": "done!"}, status=status.HTTP_200_OK) + + +class KillRequestFactorPaymentViewSet(viewsets.ModelViewSet): + queryset = KillRequestFactorPayment.objects.all() + serializer_class = KillRequestFactorPaymentSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + factor = KillRequestFactor.objects.get(key=request.data['factor_key'], trash=False) + kill_request = KillRequest.objects.get(key=factor.kill_request.key) + kill_house = KillHouse.objects.get(key=kill_request.kill_house.key) + request.data.pop('factor_key') + image = request.data['image'] + request.data.pop('image') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + factor_payment = serializer.create(validated_data=request.data) + factor_payment.kill_request_factor = factor + factor_payment.image = send_image_to_server(image) + factor_payment.remain_amount = float(request.data['amount']) + factor_payment.state = 'paid' + factor_payment.save() + factor.state = 'paid' + factor.save() + kill_request.payment_info = { + "amount": factor_payment.amount, + "total_amount": factor.amount, + "image": factor_payment.image, + "date": str(factor_payment.create_date) + } + kill_request.factor_deposit = factor_payment.amount + kill_request.save() + kill_house.wallet_amount += factor_payment.amount + kill_house.save() + + serializer_request = self.serializer_class(factor_payment) + return Response(serializer_request.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +def update_province_kill_request(): + wage = ShareOfAllocation.objects.all().last() + wage = wage.province_union if wage else 0 + for province_kill_request in ProvinceKillRequest.objects.all(): + province_request = ProvinceCheckOperatorRequest.objects.filter( + key=province_kill_request.province_request.key).last() + province_kill_request.total_amount = wage * ( + province_kill_request.main_quantity * province_request.poultry_request.Index_weight) + province_kill_request.save() + + +from django.db import models, transaction +from django.db.models import Sum, Count, F + + +# ... (previous code) + +class ReportingProvinceKillRequestsWageViewSet(viewsets.ModelViewSet): + queryset = ProvinceKillRequest.objects.all() + serializer_class = ProvinceKillRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + province_kill_requests = ProvinceKillRequest.objects.filter( + trash=False, return_to_province=False, state__in=('accepted', 'pending') + ).annotate( + total_quantity=Sum('total_killed_quantity'), + total_weight=Sum('total_killed_weight'), + total_amount_wage=Sum( + F('wage') * F('total_killed_weight')), + total_paid=Count('id', filter=models.Q(wage_pay=True, archive_by_province=False)), + total_unpaid=Count('id', filter=models.Q(wage_pay=False, archive_by_province=False)), + total_archive=Count('id', filter=models.Q(wage_pay=False, archive_by_province=True)), + # total_kill_houses=Count('kill_request__kill_house', distinct=True) + ) + + total_requests_buyers = province_kill_requests.values('kill_request__kill_house').distinct().count() + total_requests = province_kill_requests.count() + total_requests_quantity = province_kill_requests.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = province_kill_requests.aggregate(total=Sum('total_weight'))['total'] + total_requests_amount = province_kill_requests.aggregate(total=Sum('total_amount_wage'))['total'] + total_paid_requests = province_kill_requests.aggregate(total=Sum('total_paid'))['total'] + total_paid_requests_quantity = \ + province_kill_requests.filter(wage_pay=True).aggregate(total=Sum('total_quantity'))['total'] + total_paid_requests_weight = province_kill_requests.filter(wage_pay=True).aggregate(total=Sum('total_weight'))[ + 'total'] + total_paid_requests_amount = \ + province_kill_requests.filter(wage_pay=True).aggregate(total=Sum('total_amount_wage'))['total'] + total_unpaid_requests = province_kill_requests.aggregate(total=Sum('total_unpaid'))['total'] + total_unpaid_requests_quantity = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=False).aggregate( + total=Sum('total_quantity'))['total'] + total_unpaid_requests_weight = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=False).aggregate( + total=Sum('total_weight'))['total'] + total_unpaid_requests_amount = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=False).aggregate( + total=Sum('total_amount_wage'))['total'] + + total_archive_requests = province_kill_requests.aggregate(total=Sum('total_archive'))['total'] + total_archive_requests_quantity = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=True).aggregate( + total=Sum('total_quantity'))['total'] + total_archive_requests_weight = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=True).aggregate( + total=Sum('total_weight'))['total'] + total_archive_requests_amount = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=True).aggregate( + total=Sum('total_amount_wage'))['total'] + total_free_request = province_kill_requests.filter( + province_request__poultry_request__free_sale_in_province=True) + total_free_request_quantity = total_free_request.aggregate(total=Sum('total_quantity'))['total'] + total_free_request_weight = total_free_request.aggregate(total=Sum('total_weight'))['total'] + + total_government_request = province_kill_requests.filter( + province_request__poultry_request__free_sale_in_province=False) + total_government_request_quantity = total_government_request.aggregate(total=Sum('total_quantity'))['total'] + total_government_request_weight = total_government_request.aggregate(total=Sum('total_weight'))['total'] + + return Response({ + "total_requests_buyers": total_requests_buyers, + "total_requests": total_requests, + "total_requests_quantity": total_requests_quantity, + "total_requests_weight": total_requests_weight, + "total_requests_amount": total_requests_amount, + "total_paid_requests": total_paid_requests, + "total_paid_requests_quantity": total_paid_requests_quantity if total_paid_requests_quantity != None else 0, + "total_paid_requests_weight": total_paid_requests_weight if total_paid_requests_weight != None else 0, + "total_paid_requests_amount": total_paid_requests_amount if total_paid_requests_amount != None else 0, + "total_unpaid_requests": total_unpaid_requests, + "total_unpaid_requests_quantity": total_unpaid_requests_quantity, + "total_unpaid_requests_weight": total_unpaid_requests_weight, + "total_unpaid_requests_amount": total_unpaid_requests_amount, + "total_archive_requests": total_archive_requests, + "total_archive_requests_quantity": total_archive_requests_quantity, + "total_archive_requests_weight": total_archive_requests_weight, + "total_archive_requests_amount": total_archive_requests_amount, + "total_free_request": len(total_free_request), + "total_free_request_quantity": total_free_request_quantity, + "total_free_request_weight": total_free_request_weight, + "total_government_request": len(total_government_request), + "total_government_request_quantity": total_government_request_quantity, + "total_government_request_weight": total_government_request_weight, + + }, status=status.HTTP_200_OK) + + +def provincearchiveprovincekillrequestforwage(province_kill_request_list, message, role, user_fullname, date): + province_kill_requests = ProvinceKillRequest.objects.filter(key__in=province_kill_request_list, + trash=False) + for province_kill_request in province_kill_requests: + province_kill_request.archive_by_province = True + province_kill_request.archive_message = message + province_kill_request.archiver = { + "role": role, + "fullname": user_fullname, + "date": date, + } + province_kill_request.save() + + +# class ReportingProvinceKillRequestsWageViewSet(viewsets.ModelViewSet): +# queryset = ProvinceKillRequest.objects.all() +# serializer_class = ProvinceKillRequestSerializer +# permission_classes = [TokenHasReadWriteScope] +# +# def list(self, request, *args, **kwargs): +# total_requests_buyers = 0 +# total_requests = 0 +# total_requests_quantity = 0 +# total_requests_weight = 0 +# total_requests_amount = 0 +# total_paid_requests = 0 +# total_paid_requests_quantity = 0 +# total_paid_requests_weight = 0 +# total_paid_requests_amount = 0 +# total_unpaid_requests = 0 +# total_unpaid_requests_quantity = 0 +# total_unpaid_requests_weight = 0 +# total_unpaid_requests_amount = 0 +# province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('accepted', 'pending')) +# for province_kill_request in province_kill_requests: +# if province_kill_request.wage_pay == True: +# total_paid_requests +=1 +# total_paid_requests_quantity += province_kill_request.main_quantity +# total_paid_requests_weight += int(province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight) +# total_paid_requests_amount += int(province_kill_request.wage * (province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight)) +# else: +# +# total_unpaid_requests +=1 +# total_unpaid_requests_quantity += province_kill_request.main_quantity +# total_unpaid_requests_weight += int(province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight) +# total_unpaid_requests_amount += int(province_kill_request.wage * (province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight)) +# +# total_requests_buyers = len(province_kill_requests) +# total_requests = total_paid_requests + total_unpaid_requests +# total_requests_quantity = total_paid_requests_quantity + total_unpaid_requests_quantity +# total_requests_weight = total_paid_requests_weight + total_unpaid_requests_weight +# total_requests_amount = total_paid_requests_amount + total_unpaid_requests_amount +# +# +# return Response({ +# +# "total_requests_buyers":total_requests_buyers, +# "total_requests":total_requests, +# "total_requests_quantity" :total_requests_quantity, +# "total_requests_weight":total_requests_weight, +# "total_requests_amount":total_requests_amount, +# "total_paid_requests":total_paid_requests, +# "total_paid_requests_quantity":total_paid_requests_quantity, +# "total_paid_requests_weight":total_paid_requests_weight, +# "total_paid_requests_amount":total_paid_requests_amount, +# "total_unpaid_requests":total_unpaid_requests, +# "total_unpaid_requests_quantity":total_unpaid_requests_quantity, +# "total_unpaid_requests_weight":total_unpaid_requests_weight, +# "total_unpaid_requests_amount":total_unpaid_requests_amount, +# },status=status.HTTP_200_OK +# ) + + +# def auto_steward_allocation(kill_house_key, quantity, weight, date): +# kill_house = KillHouse.objects.get(key=kill_house_key, trash=False) +# stewards = Steward.objects.filter(guilds__steward=True, trash=False).order_by('id') +# stewards_list = [] +# allocatated_quantity = 0 +# kill_house_total_quantity = 0 +# for steward in stewards: +# if steward.centers_allocation != None: +# for center_allocation in steward.centers_allocation: +# if str(kill_house.key) == center_allocation['value']: +# kill_house_total_quantity += steward.allocation_limit +# stewards_list.append(steward) +# if len(stewards_list) > 0: +# for steward_list in stewards_list: +# allocatated_quantity = (steward_list.allocation_limit / kill_house_total_quantity) * quantity +# auto_allocation = StewardAllocation( +# kill_house=kill_house, +# steward=steward_list, +# number_of_carcasses=allocatated_quantity, +# real_number_of_carcasses=allocatated_quantity, +# weight_of_carcasses=int(allocatated_quantity * weight), +# real_weight_of_carcasses=int(allocatated_quantity * weight), +# type='auto', +# date=date +# ) +# auto_allocation.save() +class WalletWagePaymentViewSet(viewsets.ModelViewSet): + queryset = ProvinceKillRequest.objects.all() + serializer_class = ProvinceKillRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + # def update(self, request, *args, **kwargs): + # user = SystemUserProfile.objects.get(user=request.user, trash=False) + # province_kill_request_keys = [] + # for province_kill_request_key in request.data['province_kill_requests']: + # province_kill_request_keys.append(province_kill_request_key) + # province_kill_requests = ProvinceKillRequest.objects.filter( + # key__in=province_kill_request_keys).order_by('id') + # kill_house = KillHouse.objects.get(key=province_kill_requests.last().killhouse_user.key, trash=False) + # now = datetime.now() + # total_amount = 0 + # + # for province_kill_request in province_kill_requests: + # province_kill_request.wage_pay = True + # province_kill_request.wallet_pay = True + # province_kill_request.depositor = { + # "role": request.data['role'], + # "payer": user.fullname, + # "date": str(now), + # "payment_type": 'wallet', + # "tracking_code": '-', + # "refId": '-', + # "orderId": '-', + # "total_amount": province_kill_request.total_killed_weight * province_kill_request.wage + # } + # province_kill_request.save() + # total_amount += province_kill_request.total_killed_weight * province_kill_request.wage + # transaction = ExternalTransaction( + # amount=total_amount, + # type="withdraw", + # transaction_type="wallet", + # status='completed', + # kill_house_user=kill_house.kill_house_operator.user, + # creator=user, + # receiver=user, + # creator_role='KillHouse', + # receiver_role='ProvinceOperator', + # payer=kill_house.kill_house_operator.user.fullname, + # + # ) + # transaction.save() + # + # return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_200_OK) + + +# ویوست مربوط به تخصیص به کشتارگاه توسط استان +class ProvinceKillRequestViewSet(viewsets.ModelViewSet): + queryset = ProvinceKillRequest.objects.all() + serializer_class = ProvinceKillRequestSerializer + permission_classes = [TokenHasReadWriteScope] + filterset_class = ProvinceKillRequestNewFilterSet + + # تابع مربوط به تخصیص به کشتارگاه توسط استان + def create(self, request, *args, **kwargs): + wage = 0 + province_check = ProvinceCheckOperatorRequest.objects.get(key=request.data['province_check_request_key'], + trash=False) + if province_check.poultry_request.price_confirmation and not province_check.poultry_request.input_price_confirmation_code: + return Response({"result": "به علت عدم ورود کد احراز مرغدار امکان تخصیص وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + if province_check.poultry_request.freezing == True: + wage_type = WageType.objects.filter(en_name='province-kill-request-freezing', trash=False).first() + else: + + wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first() + if wage_type.status == True: + wage = wage_type.amount + time_range = TimeRange.objects.filter(trash=False).first() + if time_range: + time = next( + (t for t in time_range.time_range if + t.get("name") == "province_kill_request" and t.get("active", False)), None) + if time: + start_hour = datetime.strptime(time.get("start", 0), "%H:%M:%S").time() + end_hour = datetime.strptime(time.get("end", 0), "%H:%M:%S").time() + current_hour = datetime.now().time().replace(second=0, microsecond=0) + if not (start_hour < current_hour < end_hour): + return Response( + {"result": "لطفا در ساعات مجاز برای ثبت درخواست اقدام نمایید!"}, + status=status.HTTP_403_FORBIDDEN) + now = datetime.now().date() + kill_request = KillRequest.objects.get(key=request.data['kill_request_key'], trash=False) + if OperationLimitation.objects.all().first().province_allocation_limitation == True: + + if now != kill_request.recive_date.date(): + return Response({"result": "مغایرت در تاریخ اعلام نیاز کشتار گاه و تاریخ تخصیص به کشتارگاه !"}, + status=status.HTTP_403_FORBIDDEN) + kill_house = KillHouse.objects.get(id=kill_request.kill_house.id, trash=False) + poultry_request = PoultryRequest.objects.get(key=province_check.poultry_request.key) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + if hatching.left_over < int(request.data['quantity']): + return Response({"result": "تعداد تخصیص داده شده کمتر از تعداد موجود در سالن مرغدار است!"}, + status=status.HTTP_403_FORBIDDEN) + + request.data.pop('kill_request_key') + request.data.pop('province_check_request_key') + if poultry_request.send_date.year != kill_request.recive_date.year or poultry_request.send_date.month != kill_request.recive_date.month or poultry_request.send_date.day != kill_request.recive_date.day: + return Response({"result": "تاریخ درخواست کشتارها یکی نیست!"}, status=status.HTTP_403_FORBIDDEN) + if province_check.quantity == 0: + return Response("forbidden", status=status.HTTP_403_FORBIDDEN) + if int(request.data['quantity']) > kill_request.remain_quantity: + return Response({"result": "تعداد وارد شده از مانده سهمیه بیشتر است !"}, status=status.HTTP_403_FORBIDDEN) + if kill_house.max_kill_limit and kill_house.total_kill_capacity > 0: + total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + killhouse_user=kill_house, + kill_request__recive_date__date=kill_request.recive_date.date()) + total_province_kill_requests_quantity = \ + total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + + if kill_house.total_kill_capacity < total_province_kill_requests_quantity + int(request.data['quantity']): + return Response({"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + + if poultry_request.free_sale_in_province == True: + + if kill_house.quota: + kill_house_info = calculate_governmental_quota(kill_house) + if kill_house_info == 'not_allowed': + return Response({"result": " امکان خرید آزاد تا تکمیل تعهد دولتی وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + if kill_house.ware_house_remaining_weight_limitation_status: + if kill_house.total_remain_warehouse_governmental_weight > kill_house.ware_house_remaining_weight_limitation: + return Response({ + "result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده انبار بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + + if kill_house.ware_house_remaining_percent_limitation_status: + if not check_kill_house_remain_limitation_weight(kill_house): + return Response({ + "result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده روزانه انبار بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + + province_kills = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + province_request__city_request_Poultry__poultry_request_id=province_check.city_request_Poultry.poultry_request.id, + state__in=('pending', 'accepted'), trash=False) + if province_kills.count() > 0: + province = province_kills.last() + + if province.main_quantity == province.quantity: + province.total_killed_quantity += int(request.data['quantity']) + province.total_killed_weight += int(int(request.data['quantity']) * poultry_request.Index_weight) + province.quantity += int(request.data['quantity']) + province.main_quantity += int(request.data['quantity']) + kill_request.remain_quantity = kill_request.remain_quantity - int(request.data['quantity']) + kill_request.save() + province.save() + province_check.quantity -= int(request.data['quantity']) + province_check.save() + poultry_request.remain_quantity -= int(request.data['quantity']) + poultry_request.save() + if poultry_request.export == True: + hatching.export_killed_weight += int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity += int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity += int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.free_quantity += int(request.data['quantity']) + else: + hatching.governmental_killed_quantity += int( + int(request.data['quantity']) * poultry_request.Index_weight) + + hatching.governmental_quantity += int(request.data['quantity']) + hatching.save() + tomorrow = now + timedelta(days=1) + if not KillHouseWareHouse.objects.filter(kill_house=kill_house, date__date=tomorrow).exists(): + ware_house_date = datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day, hour=1, + minute=12, second=20) + kill_house_ware_house = KillHouseWareHouse( + kill_house=kill_house, + date=ware_house_date + ) + kill_house_ware_house.save() + province.total_wage_amount = province.total_killed_weight * province.wage + province.save() + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + + if wage_type and wage_type.status == True and percentages_wage_type: + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + province.union_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount) + province.union_share_percent = percentage_wage_type.percent + province.save() + elif percentage_wage_type.share_type.en_name == 'company': + province.company_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount) + province.company_share_percent = percentage_wage_type.percent + province.save() + + elif percentage_wage_type.share_type.en_name == 'guilds': + province.guilds_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount) + province.guilds_share_percent = percentage_wage_type.percent + province.save() + elif percentage_wage_type.share_type.en_name == 'city': + province.city_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount) + province.city_share_percent = percentage_wage_type.percent + province.save() + + elif percentage_wage_type.share_type.en_name == 'wallet': + province.wallet_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount) + province.wallet_share_percent = percentage_wage_type.percent + province.save() + + elif percentage_wage_type.share_type.en_name == 'other': + province.other_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount) + province.other_share_percent = percentage_wage_type.percent + province.save() + + else: + province.other_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount) + province.other_share_percent = percentage_wage_type.percent + province.save() + + return Response({"result": "object create"}, status=status.HTTP_201_CREATED) + + serializer = self.serializer_class(data=request.data) + + if serializer.is_valid(): + province_kill_request_list = [] + if hatching.left_over < int(request.data['quantity']): + return Response({"result": "تعداد تخصیص داده شده بیشتر از تعداد موجود در سالن مرغدار است!"}, + status=status.HTTP_403_FORBIDDEN) + province_kill_request = serializer.create(validated_data=request.data) + province_kill_request.kill_request = kill_request + province_kill_request.province_request = province_check + province_kill_request.wage = wage + province_kill_request.state = "pending" + if province_check.quantity < int(request.data['quantity']): + province_kill_request.quantity = province_check.quantity + province_kill_request.killhouse_user = kill_house + province_kill_request.main_quantity = int(request.data['quantity']) + province_kill_request.total_killed_quantity = province_kill_request.main_quantity + province_kill_request.total_killed_weight = int( + province_kill_request.main_quantity * poultry_request.Index_weight) + province_kill_request.total_wage_amount = province_kill_request.total_killed_weight * province_kill_request.wage + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + if wage_type and wage_type.status == True and percentages_wage_type: + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + province_kill_request.union_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.union_share_percent = percentage_wage_type.percent + elif percentage_wage_type.share_type.en_name == 'company': + province_kill_request.company_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.company_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'guilds': + province_kill_request.guilds_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.guilds_share_percent = percentage_wage_type.percent + elif percentage_wage_type.share_type.en_name == 'city': + province_kill_request.city_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.city_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'other': + province_kill_request.other_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.other_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'wallet': + province_kill_request.wallet_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.wallet_share_percent = percentage_wage_type.percent + + else: + province_kill_request.other_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.other_share_percent = percentage_wage_type.percent + province_kill_request.save() + + province_kill_request.save() + poultry_request.remain_quantity -= province_kill_request.main_quantity + poultry_request.save() + + province_check.quantity = province_check.quantity - int(int(request.data['quantity'])) + if province_check.quantity < 0 or province_check.quantity == 0: + province_check.quantity = 0 + province_check.province_show_kill_house = 'accepted' + province_check.save() + kill_request.remain_quantity -= province_kill_request.main_quantity + kill_request.save() + kill_house_request_serializer = self.serializer_class(province_kill_request) + dict1 = { + "kill_house_req_key": str(province_kill_request.key), + "kill_req_key": province_kill_request.kill_request.key, + "province_kill_request_state": province_kill_request.state, + "kill_house_name": province_kill_request.kill_request.kill_house.name, + "kill_house_user_name": province_kill_request.kill_request.kill_house.kill_house_operator.user.fullname, + "kill_house_user_city": province_kill_request.kill_request.kill_house.kill_house_operator.address.city.name, + "kill_house_mobile": province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": province_kill_request.quantity, + "fee": province_kill_request.fee, + "time": province_kill_request.kill_request.recive_time, + "date": province_kill_request.kill_request.recive_date, + } + + factor = KillRequestFactor.objects.filter(kill_request=kill_request) + if factor.count() > 0: + factor = factor.last() + if KillRequestFactorPayment.objects.filter(kill_request_factor=factor).exists(): + factor.state = 'paid' + else: + factor.state = 'unpaid' + factor.save() + province_kill_request_list.append(province_kill_request.key) + + if AutoAcceptProvinceKillRequest.objects.filter(allow=True).exists(): + kill_house_check = KillHouseCheckRequest( + province_kill_request=province_kill_request, + role="ProvinceOperator", + state="accepted" + + ) + province_kill_request.state = 'accepted' + kill_house_check.save() + province_kill_request.save() + if poultry_request.export == True: + hatching.export_killed_weight += int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity += int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity += int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.free_quantity += int(request.data['quantity']) + else: + hatching.governmental_killed_quantity += int( + int(request.data['quantity']) * poultry_request.Index_weight) + + hatching.governmental_quantity += int(request.data['quantity']) + hatching.save() + vet_farm = VetFarm.objects.filter(trash=False, poultry=hatching.poultry).first() + if SmsLicense.objects.filter(province_kill_request=True).exists(): + kill_house_name = kill_house.name + kill_house_mobile = kill_house.kill_house_operator.user.mobile + kill_house_second_mobile = kill_house.alternate_number + quantity = province_kill_request.quantity + sale_in_province = province_check.poultry_request.free_sale_in_province + amount = province_check.poultry_request.amount + chicken_breed = province_check.poultry_request.chicken_breed + poultry_name = province_check.poultry_request.poultry.unit_name + poultry_mobile = province_check.poultry_request.poultry.user.mobile + date_str = str(province_check.poultry_request.send_date) + send_date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + province = province_check.poultry_request.poultry.address.province.name + city = province_check.poultry_request.poultry.address.city.name + province_kill_request_to_kill_house_sms(kill_house_mobile, quantity, chicken_breed, send_date, + poultry_name, + poultry_mobile, province, city, sale_in_province, amount, + kill_house_name + ) + if kill_house_second_mobile != None: + province_kill_request_to_kill_house_sms_threading = threading.Thread( + target=province_kill_request_to_kill_house_sms, + args=( + kill_house_second_mobile, quantity, chicken_breed, send_date, + poultry_name, + poultry_mobile, province, city, sale_in_province, amount, + kill_house_name + )) + province_kill_request_to_kill_house_sms_threading.start() + if not KillHouseWareHouse.objects.filter(kill_house=kill_house, date__date=now).exists(): + ware_house_date = datetime(year=now.year, month=now.month, day=now.day, hour=1, minute=12, second=20) + kill_house_ware_house = KillHouseWareHouse( + kill_house=kill_house, + date=ware_house_date + ) + kill_house_ware_house.save() + if base_url_sms == 'ha': + poultry_name = province_kill_request.province_request.poultry_request.poultry.unit_name + poultry_mobile = province_kill_request.province_request.poultry_request.poultry.user.mobile + quantity = province_kill_request.main_quantity + Index_weight = province_kill_request.province_request.poultry_request.Index_weight + kill_house_name = province_kill_request.killhouse_user.name + kill_house_mobile = province_kill_request.killhouse_user.kill_house_operator.user.mobile + date_str = str( + province_kill_request.province_request.poultry_request.send_date) + send_date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + # city = province_kill_request.province_request.poultry_request.poultry.address.city.name + # vet_farm = VetFarm.objects.filter( + # poultry=province_kill_request.province_request.poultry_request.poultry).first() + # sms_allocation_for_vet_farm(poultry_name, poultry_mobile, + # quantity, Index_weight, kill_house_name, kill_house_mobile, city, send_date, + # vet_farm.vet.user.mobile) + create_update_chicken_commission_prices() + bot_eitaa_for_each_province_kill_request(province_kill_request, vet_farm) + return Response(dict1, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + # تابع مربوط به نمایش تخصیصات به کشتارگاها توسط استان + def list(self, request, *args, **kwargs): + now = datetime.now().date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + # refresh(request.user.id) + info_dict_list = [] + exclusive_killer = False + info_list = [] + province_kill_reqs = [] + + if 'role' in request.GET: + if request.GET['role'] == 'KillHouse': + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, + trash=False) + + if 'car' in request.GET: + if KillHousePercentage.objects.filter(kill_house_for_killer__in=kill_house, + kill_house__type='exclusive').exists(): + exclusive_killer = True + province_kill_reqs = ProvinceKillRequest.objects.filter( + Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house), + province_request__poultry_request__send_date__date__gte=date1, + province_request__poultry_request__send_date__date__lte=date2, + state='accepted', + return_to_province=False, + province_request__city_request_Poultry__poultry_request__final_state='pending', + trash=False, quantity__gt=0).order_by( + 'province_request__city_request_Poultry__poultry_request__send_date') + # province_kill_reqs = [ + # province_request for province_request in province_kill_req_lists + # if date1 <= province_request.province_request.poultry_request.send_date.date() <= date2 + # ] + elif 'id' in request.GET: + poultry_request = PoultryRequest.objects.get(id=int(request.GET['id'])) + province_kill_reqs = ProvinceKillRequest.objects.filter(state='accepted', + killhouse_user__in=kill_house, + province_request__city_request_Poultry__poultry_request=poultry_request, + province_request__city_request_Poultry__poultry_request__final_state='pending', + trash=False).order_by( + 'province_request__city_request_Poultry__poultry_request__send_date') + elif 'allocations' in request.GET: + if 'date1' in request.GET and 'date2' in request.GET: + trash = True if 'deleted_object' in request.GET else False + province_kill_requests = ProvinceKillRequest.objects.filter( + Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house), + trash=trash, + delete_message__isnull=False if trash else True, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, temporary_deleted=False + ).select_related( + 'province_request__poultry_request__poultry', + 'province_request__city_request_Poultry__poultry_request__poultry__user', + 'province_request__city_request_Poultry__poultry_request__poultry__user__city', + 'kill_request__kill_house', + 'kill_request__kill_house__kill_house_operator__user', + 'kill_request__kill_house__system_address__city' + ).values( + "province_request__poultry_request__order_code", + "province_request__poultry_request__amount", + "province_request__poultry_request__financial_operation", + "province_request__poultry_request__Index_weight", + "province_request__poultry_request__send_date", + "province_request__poultry_request__freezing", + "province_request__poultry_request__export", + "province_request__poultry_request__poultry__unit_name", + "province_request__poultry_request__poultry__user__fullname", + "province_request__city_request_Poultry__poultry_request__poultry__user__mobile", + "province_request__city_request_Poultry__poultry_request__poultry__user__city__name", + "province_request__poultry_request__quantity", + "kill_request__market", + "kill_request__kill_house__name", + "kill_request__kill_house__kill_house_operator__user__mobile", + "kill_request__kill_house__system_address__city__name", + "create_date", + "main_quantity", + "quantity", + "return_to_province", + "returner", + "key", + "state", + "kill_house_price", + "province_request__poultry_request__union", + "province_request__poultry_request__direct_buying", + "province_request__poultry_request__free_sale_in_province", + # "allocated_car_state" + ).order_by('province_request__poultry_request__send_date') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + province_kill_requests = province_kill_requests.filter( + build_query(self.filterset_class, value) + ) + province_kill_reqs_list_final_state = [] + for request_data in province_kill_requests: + allocated_car_state = True if request_data.get('main_quantity') != request_data.get( + 'quantity') else False + + internal_dict = { + "order_code": request_data.get('province_request__poultry_request__order_code'), + "freezing": request_data.get('province_request__poultry_request__freezing'), + "export": request_data.get('province_request__poultry_request__export'), + "amount": request_data.get('province_request__poultry_request__amount'), + "financial_operation": request_data.get( + 'province_request__poultry_request__financial_operation'), + "index_weight": request_data.get('province_request__poultry_request__Index_weight'), + "total_weight": request_data.get('main_quantity') * request_data.get( + 'province_request__poultry_request__Index_weight'), + "send_date": request_data.get('province_request__poultry_request__send_date'), + "poultry_unit_name": request_data.get( + 'province_request__poultry_request__poultry__unit_name'), + "poultry_full_name": request_data.get( + 'province_request__poultry_request__poultry__user__fullname'), + "poultry_mobile": request_data.get( + 'province_request__city_request_Poultry__poultry_request__poultry__user__mobile'), + "poultry_city": request_data.get( + 'province_request__city_request_Poultry__poultry_request__poultry__user__city__name'), + "poultry_quantity": request_data.get('province_request__poultry_request__quantity'), + "kill_house_name": request_data.get('kill_request__kill_house__name'), + "market": request_data.get('kill_request__market'), + "kill_house_mobile": request_data.get( + 'kill_request__kill_house__kill_house_operator__user__mobile'), + "kill_house_city": request_data.get( + 'kill_request__kill_house__system_address__city__name'), + "date_of_allocate": request_data.get('create_date'), + "allocated_quantity": request_data.get('main_quantity'), + "return_to_province": request_data.get('return_to_province'), + "returner": request_data.get('returner'), + "allocated_remain_quantity": request_data.get('quantity') if request_data.get( + 'return_to_province') == False else 0, + "province_kill_request_key": request_data.get('key'), + "allocated_state": request_data.get('state'), + "union": request_data.get('province_request__poultry_request__union'), + "direct_buying": request_data.get( + 'province_request__poultry_request__direct_buying'), + "allocated_car_state": allocated_car_state, + "free_sale_in_province": request_data.get( + 'province_request__poultry_request__free_sale_in_province'), + "kill_house_price": request_data.get('kill_house_price') + } + + province_kill_reqs_list_final_state.append(internal_dict) + return Response(province_kill_reqs_list_final_state, status=status.HTTP_200_OK) + elif 'allocated_car_state' in request.GET: + if 'date1' in request.GET and 'date2' in request.GET: + trash = True if 'deleted_object' in request.GET else False + province_kill_requests = ProvinceKillRequest.objects.filter( + Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house), + trash=trash, + delete_message__isnull=False if trash else True, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, temporary_deleted=False, first_car_allocated_quantity=0 + ).select_related( + 'province_request__poultry_request__poultry', + 'province_request__city_request_Poultry__poultry_request__poultry__user', + 'province_request__city_request_Poultry__poultry_request__poultry__user__city', + 'kill_request__kill_house', + 'kill_request__kill_house__kill_house_operator__user', + 'kill_request__kill_house__system_address__city' + ).values( + "province_request__poultry_request__order_code", + "province_request__poultry_request__amount", + "province_request__poultry_request__financial_operation", + "province_request__poultry_request__Index_weight", + "province_request__poultry_request__send_date", + "province_request__poultry_request__freezing", + "province_request__poultry_request__export", + "province_request__poultry_request__poultry__unit_name", + "province_request__poultry_request__poultry__user__fullname", + "province_request__city_request_Poultry__poultry_request__poultry__user__mobile", + "province_request__city_request_Poultry__poultry_request__poultry__user__city__name", + "province_request__poultry_request__quantity", + "kill_request__kill_house__name", + "kill_request__market", + "kill_request__kill_house__kill_house_operator__user__mobile", + "kill_request__kill_house__system_address__city__name", + "create_date", + "main_quantity", + "quantity", + "return_to_province", + "returner", + "key", + "state", + "kill_house_price", + "province_request__poultry_request__union", + "province_request__poultry_request__direct_buying", + "province_request__poultry_request__free_sale_in_province", + # "allocated_car_state" + ).order_by('province_request__poultry_request__send_date') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + province_kill_requests = province_kill_requests.filter( + build_query(self.filterset_class, value) + ) + province_kill_reqs_list_final_state = [] + for request_data in province_kill_requests: + allocated_car_state = True if request_data.get('main_quantity') != request_data.get( + 'quantity') else False + + internal_dict = { + "order_code": request_data.get('province_request__poultry_request__order_code'), + "freezing": request_data.get('province_request__poultry_request__freezing'), + "export": request_data.get('province_request__poultry_request__export'), + "amount": request_data.get('province_request__poultry_request__amount'), + "financial_operation": request_data.get( + 'province_request__poultry_request__financial_operation'), + "index_weight": request_data.get('province_request__poultry_request__Index_weight'), + "total_weight": request_data.get('main_quantity') * request_data.get( + 'province_request__poultry_request__Index_weight'), + "send_date": request_data.get('province_request__poultry_request__send_date'), + "poultry_unit_name": request_data.get( + 'province_request__poultry_request__poultry__unit_name'), + "poultry_full_name": request_data.get( + 'province_request__poultry_request__poultry__user__fullname'), + "poultry_mobile": request_data.get( + 'province_request__city_request_Poultry__poultry_request__poultry__user__mobile'), + "poultry_city": request_data.get( + 'province_request__city_request_Poultry__poultry_request__poultry__user__city__name'), + "poultry_quantity": request_data.get('province_request__poultry_request__quantity'), + "kill_house_name": request_data.get('kill_request__kill_house__name'), + "market": request_data.get('kill_request__market'), + "kill_house_mobile": request_data.get( + 'kill_request__kill_house__kill_house_operator__user__mobile'), + "kill_house_city": request_data.get( + 'kill_request__kill_house__system_address__city__name'), + "date_of_allocate": request_data.get('create_date'), + "allocated_quantity": request_data.get('main_quantity'), + "return_to_province": request_data.get('return_to_province'), + "returner": request_data.get('returner'), + "allocated_remain_quantity": request_data.get('quantity') if request_data.get( + 'return_to_province') == False else 0, + "province_kill_request_key": request_data.get('key'), + "allocated_state": request_data.get('state'), + "union": request_data.get('province_request__poultry_request__union'), + "direct_buying": request_data.get( + 'province_request__poultry_request__direct_buying'), + "allocated_car_state": allocated_car_state, + "free_sale_in_province": request_data.get( + 'province_request__poultry_request__free_sale_in_province'), + "kill_house_price": request_data.get('kill_house_price') + } + + province_kill_reqs_list_final_state.append(internal_dict) + return Response(province_kill_reqs_list_final_state, status=status.HTTP_200_OK) + else: + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__poultry_request__send_date__date__gte=date1, + province_request__poultry_request__send_date__date__lte=date2, killhouse_user__in=kill_house, + province_request__city_request_Poultry__poultry_request__final_state='pending', + trash=False, + state='pending', + dont_show_kill_house=False).select_related('province_request__poultry_request').order_by( + 'province_request__city_request_Poultry__poultry_request__send_date') + + # province_kill_reqs = [ + # province_request for province_request in province_kill_req_list + # if date1 <= province_request.province_request.poultry_request.send_date.date() <= date2 + # ] + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: + + if 'id' in request.GET: + poultry_request = PoultryRequest.objects.get(id=int(request.GET['id'])) + province_kill_reqs = ProvinceKillRequest.objects.filter(state='accepted', + province_request__city_request_Poultry__poultry_request=poultry_request, + trash=False).order_by( + 'province_request__city_request_Poultry__poultry_request__send_date') + elif 'allocations' in request.GET: + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + trash = True if 'deleted_object' in request.GET else False + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request__poultry__user__province=user.province, + trash=trash, + delete_message__isnull=False if trash else True, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, temporary_deleted=False + ).select_related( + 'province_request__poultry_request__poultry', + 'province_request__city_request_Poultry__poultry_request__poultry__user', + 'province_request__city_request_Poultry__poultry_request__poultry__user__city', + 'kill_request__kill_house', + 'kill_request__kill_house__kill_house_operator__user', + 'kill_request__kill_house__system_address__city' + ).values( + "province_request__poultry_request__order_code", + "province_request__poultry_request__amount", + "province_request__poultry_request__financial_operation", + "province_request__poultry_request__Index_weight", + "province_request__poultry_request__send_date", + "province_request__poultry_request__freezing", + "province_request__poultry_request__export", + "province_request__poultry_request__poultry__unit_name", + "province_request__poultry_request__poultry__user__fullname", + "province_request__city_request_Poultry__poultry_request__poultry__user__mobile", + "province_request__city_request_Poultry__poultry_request__poultry__user__city__name", + "province_request__poultry_request__quantity", + "kill_request__kill_house__name", + "kill_request__market", + "kill_request__kill_house__kill_house_operator__user__mobile", + "kill_request__kill_house__system_address__city__name", + "create_date", + "main_quantity", + "quantity", + "return_to_province", + "returner", + "key", + "state", + "kill_house_price", + "province_request__poultry_request__union", + "province_request__poultry_request__direct_buying", + "province_request__poultry_request__free_sale_in_province", + # "allocated_car_state" + ).order_by('province_request__poultry_request__send_date') + value = request.GET.get('value') + search = request.GET.get('filter') + if value and search == 'search': + if value != 'undefined' and value.strip(): + province_kill_requests = province_kill_requests.filter( + build_query(self.filterset_class, value) + ) + province_kill_reqs_list_final_state = [] + for request_data in province_kill_requests: + allocated_car_state = True if request_data.get('main_quantity') != request_data.get( + 'quantity') else False + + internal_dict = { + "order_code": request_data.get('province_request__poultry_request__order_code'), + "freezing": request_data.get('province_request__poultry_request__freezing'), + "export": request_data.get('province_request__poultry_request__export'), + "amount": request_data.get('province_request__poultry_request__amount'), + "financial_operation": request_data.get( + 'province_request__poultry_request__financial_operation'), + "index_weight": request_data.get('province_request__poultry_request__Index_weight'), + "total_weight": request_data.get('main_quantity') * request_data.get( + 'province_request__poultry_request__Index_weight'), + "send_date": request_data.get('province_request__poultry_request__send_date'), + "poultry_unit_name": request_data.get( + 'province_request__poultry_request__poultry__unit_name'), + "poultry_full_name": request_data.get( + 'province_request__poultry_request__poultry__user__fullname'), + "poultry_mobile": request_data.get( + 'province_request__city_request_Poultry__poultry_request__poultry__user__mobile'), + "poultry_city": request_data.get( + 'province_request__city_request_Poultry__poultry_request__poultry__user__city__name'), + "poultry_quantity": request_data.get('province_request__poultry_request__quantity'), + "kill_house_name": request_data.get('kill_request__kill_house__name'), + "market": request_data.get('kill_request__market'), + "kill_house_mobile": request_data.get( + 'kill_request__kill_house__kill_house_operator__user__mobile'), + "kill_house_city": request_data.get( + 'kill_request__kill_house__system_address__city__name'), + "date_of_allocate": request_data.get('create_date'), + "allocated_quantity": request_data.get('main_quantity'), + "return_to_province": request_data.get('return_to_province'), + "returner": request_data.get('returner'), + "allocated_remain_quantity": request_data.get('quantity') if request_data.get( + 'return_to_province') == False else 0, + "province_kill_request_key": request_data.get('key'), + "allocated_state": request_data.get('state'), + "union": request_data.get('province_request__poultry_request__union'), + "direct_buying": request_data.get( + 'province_request__poultry_request__direct_buying'), + "allocated_car_state": allocated_car_state, + "free_sale_in_province": request_data.get( + 'province_request__poultry_request__free_sale_in_province'), + "kill_house_price": request_data.get('kill_house_price') + } + + province_kill_reqs_list_final_state.append(internal_dict) + return Response(province_kill_reqs_list_final_state, status=status.HTTP_200_OK) + elif 'allocated_car_state' in request.GET: + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + trash = True if 'deleted_object' in request.GET else False + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request__poultry__user__province=user.province, + trash=trash, + delete_message__isnull=False if trash else True, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, temporary_deleted=False, first_car_allocated_quantity=0 + ).select_related( + 'province_request__poultry_request__poultry', + 'province_request__city_request_Poultry__poultry_request__poultry__user', + 'province_request__city_request_Poultry__poultry_request__poultry__user__city', + 'kill_request__kill_house', + 'kill_request__kill_house__kill_house_operator__user', + 'kill_request__kill_house__system_address__city' + ).values( + "province_request__poultry_request__order_code", + "province_request__poultry_request__amount", + "province_request__poultry_request__financial_operation", + "province_request__poultry_request__Index_weight", + "province_request__poultry_request__send_date", + "province_request__poultry_request__freezing", + "province_request__poultry_request__export", + "province_request__poultry_request__poultry__unit_name", + "province_request__poultry_request__poultry__user__fullname", + "province_request__city_request_Poultry__poultry_request__poultry__user__mobile", + "province_request__city_request_Poultry__poultry_request__poultry__user__city__name", + "province_request__poultry_request__quantity", + "kill_request__kill_house__name", + "kill_request__market", + "kill_request__kill_house__kill_house_operator__user__mobile", + "kill_request__kill_house__system_address__city__name", + "create_date", + "main_quantity", + "quantity", + "return_to_province", + "returner", + "key", + "state", + "kill_house_price", + "province_request__poultry_request__union", + "province_request__poultry_request__direct_buying", + "province_request__poultry_request__free_sale_in_province", + # "allocated_car_state" + ).order_by('province_request__poultry_request__send_date') + value = request.GET.get('value') + search = request.GET.get('filter') + if value and search == 'search': + if value != 'undefined' and value.strip(): + province_kill_requests = province_kill_requests.filter( + build_query(self.filterset_class, value) + ) + province_kill_reqs_list_final_state = [] + for request_data in province_kill_requests: + allocated_car_state = True if request_data.get('main_quantity') != request_data.get( + 'quantity') else False + + internal_dict = { + "order_code": request_data.get('province_request__poultry_request__order_code'), + "freezing": request_data.get('province_request__poultry_request__freezing'), + "export": request_data.get('province_request__poultry_request__export'), + "amount": request_data.get('province_request__poultry_request__amount'), + "financial_operation": request_data.get( + 'province_request__poultry_request__financial_operation'), + "index_weight": request_data.get('province_request__poultry_request__Index_weight'), + "total_weight": request_data.get('main_quantity') * request_data.get( + 'province_request__poultry_request__Index_weight'), + "send_date": request_data.get('province_request__poultry_request__send_date'), + "poultry_unit_name": request_data.get( + 'province_request__poultry_request__poultry__unit_name'), + "poultry_full_name": request_data.get( + 'province_request__poultry_request__poultry__user__fullname'), + "poultry_mobile": request_data.get( + 'province_request__city_request_Poultry__poultry_request__poultry__user__mobile'), + "poultry_city": request_data.get( + 'province_request__city_request_Poultry__poultry_request__poultry__user__city__name'), + "poultry_quantity": request_data.get('province_request__poultry_request__quantity'), + "kill_house_name": request_data.get('kill_request__kill_house__name'), + "market": request_data.get('kill_request__market'), + "kill_house_mobile": request_data.get( + 'kill_request__kill_house__kill_house_operator__user__mobile'), + "kill_house_city": request_data.get( + 'kill_request__kill_house__system_address__city__name'), + "date_of_allocate": request_data.get('create_date'), + "allocated_quantity": request_data.get('main_quantity'), + "return_to_province": request_data.get('return_to_province'), + "returner": request_data.get('returner'), + "allocated_remain_quantity": request_data.get('quantity') if request_data.get( + 'return_to_province') == False else 0, + "province_kill_request_key": request_data.get('key'), + "allocated_state": request_data.get('state'), + "union": request_data.get('province_request__poultry_request__union'), + "direct_buying": request_data.get( + 'province_request__poultry_request__direct_buying'), + "allocated_car_state": allocated_car_state, + "free_sale_in_province": request_data.get( + 'province_request__poultry_request__free_sale_in_province'), + "kill_house_price": request_data.get('kill_house_price') + } + + province_kill_reqs_list_final_state.append(internal_dict) + return Response(province_kill_reqs_list_final_state, status=status.HTTP_200_OK) + elif request.GET['role'] == 'KillHouseVet': + vet = Vet.objects.filter(user=user, trash=False) + if vet.count() > 0: + vet = vet.last() + kill_house_vet = KillHouseVet.objects.filter(vet=vet) + kill_house_vet = kill_house_vet.last() + + if 'id' in request.GET: + poultry_request = PoultryRequest.objects.get(id=int(request.GET['id'])) + province_kill_reqs = ProvinceKillRequest.objects.filter(state='accepted', + killhouse_user=kill_house_vet.kill_house, + province_request__city_request_Poultry__poultry_request=poultry_request, + trash=False).order_by( + 'province_request__city_request_Poultry__poultry_request__send_date') + else: + province_kill_reqs = ProvinceKillRequest.objects.filter(killhouse_user=kill_house_vet.kill_house, + trash=False).order_by( + 'province_request__city_request_Poultry__poultry_request__send_date') + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet) + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + if len(poultries) == 0: + return Response([], status=status.HTTP_200_OK) + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__poultry_request__poultry__in=poultries, + province_request__poultry_request__poultry__address__province=vet.user.province, + trash=False).order_by( + 'province_request__city_request_Poultry__poultry_request__send_date') + elif request.GET['role'] == 'VetSupervisor': + vet = VetSupervisor.objects.get(user=user, trash=False) + + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__poultry_request__poultry__address__province=vet.user.province, + trash=False).order_by( + 'province_request__city_request_Poultry__poultry_request__send_date') + + + else: + if 'state' in request.GET: + if request.GET['state'] == 'accepted': + province_kill_reqs = ProvinceKillRequest.objects.filter(state='accepted', trash=False) + else: + province_kill_reqs = ProvinceKillRequest.objects.filter(vet_state='accepted', trash=False) + if len(province_kill_reqs) == 0: + return Response(province_kill_reqs, status=status.HTTP_200_OK) + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + province_kill_reqs = province_kill_reqs.filter( + build_query(self.filterset_class, value) + ) + for province_kill_req in province_kill_reqs: + check_key = KillHouseCheckRequest.objects.filter(province_kill_request=province_kill_req) + if check_key.count() > 0: + check_key = check_key.last().key + else: + check_key = None + internal_dict_infos = { + "poultry_req_id": province_kill_req.province_request.city_request_Poultry.poultry_request.id, + "freezing": province_kill_req.province_request.city_request_Poultry.poultry_request.freezing, + "direct_buying": province_kill_req.province_request.city_request_Poultry.poultry_request.direct_buying, + "export": province_kill_req.province_request.city_request_Poultry.poultry_request.export, + "amount": province_kill_req.province_request.city_request_Poultry.poultry_request.amount, + "financial_operation": province_kill_req.province_request.city_request_Poultry.poultry_request.financial_operation, + "poultry_req_key": province_kill_req.province_request.city_request_Poultry.poultry_request.key, + "province_kill_req_key": province_kill_req.key, + "poultry_name": province_kill_req.province_request.city_request_Poultry.poultry_request.poultry.user.fullname, + "order_code": province_kill_req.province_request.city_request_Poultry.poultry_request.order_code, + "send_date": province_kill_req.province_request.city_request_Poultry.poultry_request.send_date, + "city": province_kill_req.province_request.city_request_Poultry.poultry_request.poultry.address.city.name, + "province": province_kill_req.province_request.city_request_Poultry.poultry_request.poultry.user.province.name, + "poultry_mobile": province_kill_req.province_request.city_request_Poultry.poultry_request.poultry.user.mobile, + "kill_house_key": province_kill_req.kill_request.kill_house.key, + "kill_house_check_key": check_key, + "kill_house_name": province_kill_req.kill_request.kill_house.name, + "kill_house_mobile": province_kill_req.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": province_kill_req.quantity if province_kill_req.return_to_province == False else 0, + "main_quantity": province_kill_req.main_quantity, + "time": province_kill_req.kill_request.recive_time, + "date": province_kill_req.kill_request.recive_date, + "age": ( + datetime.now() - province_kill_req.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1, + "province_kill_req": province_kill_req.key, + "return_to_province": province_kill_req.return_to_province, + "returner": province_kill_req.returner, + "kill_request_key": province_kill_req.kill_request.key, + "market": province_kill_req.kill_request.market, + "province_kill_state": province_kill_req.state, + "allocated_quantity": province_kill_req.main_quantity - province_kill_req.quantity, + "remain_quantity": province_kill_req.quantity, + "chicken_breed": province_kill_req.kill_request.chicken_breed, + "index_weight": province_kill_req.province_request.poultry_request.Index_weight, + "total_weight": province_kill_req.main_quantity * province_kill_req.province_request.poultry_request.Index_weight, + "province_kill_reviewer": province_kill_req.reviewer, + "province_kill_clearance_code": province_kill_req.clearance_code, + "exclusive_killer": exclusive_killer, + "kill_house_price": province_kill_req.kill_house_price, + "province_kill_request_key": province_kill_req.key, + "kill_house_assignments": "", + "free_sale_in_province": province_kill_req.province_request.poultry_request.free_sale_in_province, + + } + kill_house_check = KillHouseCheckRequest.objects.filter(province_kill_request=province_kill_req, + trash=False) + if kill_house_check: + kill_house_check = kill_house_check.last() + internal_dict_infos.update({ + "kill_house_check_key": kill_house_check.key, + }) + for kill_house_req_obj in KillHouseRequest.objects.filter( + province_kill_request=province_kill_req, trash=False): + internal_kill_house_request_dict_infos = { + "kill_house_req_key": kill_house_req_obj.key, + "kill_req_key": kill_house_req_obj.kill_request.key, + "barcod": kill_house_req_obj.bar_code, + "kill_house_state": kill_house_req_obj.state, + "kill_house_name": kill_house_req_obj.kill_request.kill_house.name, + "kill_house_user_name": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.fullname, + "kill_house_user_city": kill_house_req_obj.kill_request.kill_house.kill_house_operator.address.city.name, + "kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "cars": kill_house_req_obj.car, + "show_kill_house": kill_house_req_obj.show_kill_house, + "kill_house_message": kill_house_req_obj.kill_house_message, + } + + info_list.append(internal_kill_house_request_dict_infos) + + internal_dict_infos["kill_house_assignments"] = info_list + + info_dict_list.append(internal_dict_infos) + return Response(info_dict_list, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.data['role'] + request.data.pop('role') + if 'type' in request.data.keys(): + if request.data['type'] == 'archive': + user_fullname = user.fullname + date = str(datetime.now()) + archive_province_kill_request_wage_threading = threading.Thread( + target=provincearchiveprovincekillrequestforwage, + args=( + request.data['province_kill_request_list'], request.data['message'], role, user_fullname, date + )) + archive_province_kill_request_wage_threading.start() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + + elif request.data['type'] == 'return_archive': + user_fullname = user.fullname + date = str(datetime.now().date()) + province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key']) + province_kill_request.archive_by_province = False + if 'return_archive_message' in request.data.keys(): + province_kill_request.return_archive_message = request.data['return_archive_message'] + province_kill_request.returner = { + "fullname": user_fullname, + "date": date, + "role": role + } + province_kill_request.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + elif 'edit_allocation_quantity' in request.data.keys(): + wage = 0 + province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key'], + trash=False) + if province_kill_request.market: + return Response({"result": "امکان ویرایش برای تخصیصات پنل معاملات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key, + trash=False) + if poultry_request.freezing == True: + wage_type = WageType.objects.filter(en_name='province-kill-request-freezing', trash=False).first() + else: + + wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first() + if wage_type.status == True: + wage = wage_type.amount + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + if KillHouseRequest.objects.filter(trash=False, province_kill_request=province_kill_request).exists(): + return Response({"result": "برای این تخصیص بارایجاد شده است امکان ویرایش وجود ندارد"}, + status=status.HTTP_403_FORBIDDEN) + amount = province_kill_request.main_quantity + if request.data['quantity'] > amount: + different_amount = request.data['quantity'] - amount + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + province_request__poultry_request=poultry_request) + total_quantity = \ + province_kill_requests.aggregate(total=Sum('main_quantity'))['total'] or 0 + if different_amount + total_quantity > poultry_request.quantity: + return Response({"result": "تعداد وارد شده بیشتر از اعلام نیاز مرغدار است!"}, + status=status.HTTP_403_FORBIDDEN) + total_quantity_for_hatching = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + if different_amount + total_quantity_for_hatching > hatching.left_over: + return Response({"result": "تعداد وارد شده بیشتر از باقی مانده جوجه ریزی مرغدار است!"}, + status=status.HTTP_403_FORBIDDEN) + province_kill_requests_for_kill_request = ProvinceKillRequest.objects.filter(trash=False, + return_to_province=False, + kill_request=province_kill_request.kill_request) + total_quantity_for_kill_request = \ + province_kill_requests_for_kill_request.aggregate(total=Sum('main_quantity'))['total'] or 0 + if province_kill_request.kill_request.kill_capacity < total_quantity_for_kill_request + different_amount: + return Response({"result": "تعداد وارد شده بیشتر از اعلام نیاز کشتارگاه است!"}, + status=status.HTTP_403_FORBIDDEN) + province_kill_request.province_request.quantity -= different_amount + if province_kill_request.province_request.quantity < 0: + province_kill_request.province_request.quantity = 0 + province_kill_request.province_request.save() + province_kill_request.kill_request.remain_quantity = province_kill_request.kill_request.kill_capacity - total_quantity_for_kill_request + province_kill_request.kill_request.remain_quantity -= different_amount + province_kill_request.kill_request.save() + poultry_request.remain_quantity -= different_amount + poultry_request.save() + else: + province_kill_requests_for_kill_request = ProvinceKillRequest.objects.filter(trash=False, + return_to_province=False, + kill_request=province_kill_request.kill_request) + total_quantity_for_kill_request = \ + province_kill_requests_for_kill_request.aggregate(total=Sum('main_quantity'))['total'] or 0 + different_amount = amount - request.data['quantity'] + province_kill_request.province_request.quantity += different_amount + province_kill_request.province_request.save() + province_kill_request.kill_request.remain_quantity = province_kill_request.kill_request.kill_capacity - total_quantity_for_kill_request + province_kill_request.kill_request.remain_quantity += different_amount + province_kill_request.kill_request.save() + poultry_request.remain_quantity += different_amount + poultry_request.save() + + province_kill_request.main_quantity = int(request.data['quantity']) + province_kill_request.total_killed_quantity = province_kill_request.main_quantity + province_kill_request.total_killed_weight = int( + province_kill_request.main_quantity * poultry_request.Index_weight) + province_kill_request.total_wage_amount = province_kill_request.total_killed_weight * province_kill_request.wage + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + if wage_type and wage_type.status == True and percentages_wage_type: + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + province_kill_request.union_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.union_share_percent = percentage_wage_type.percent + elif percentage_wage_type.share_type.en_name == 'company': + province_kill_request.company_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.company_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'guilds': + province_kill_request.guilds_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.guilds_share_percent = percentage_wage_type.percent + elif percentage_wage_type.share_type.en_name == 'city': + province_kill_request.city_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.city_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'other': + province_kill_request.other_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.other_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'wallet': + province_kill_request.wallet_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.wallet_share_percent = percentage_wage_type.percent + + else: + province_kill_request.other_share = int( + (percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount) + province_kill_request.other_share_percent = percentage_wage_type.percent + province_kill_request.save() + + province_kill_request.save() + update_province_kill_requests(hatching) + poultry_prediction(hatching.poultry) + + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + else: + + province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key']) + request.data.pop('province_kill_request_key') + if 'kill_house_price' not in request.data.keys(): + if province_kill_request.prev_total_amount == None: + province_kill_request.prev_total_amount = province_kill_request.total_amount + province_kill_request.total_amount_editor = { + "role": role, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()) + } + province_kill_request.save() + serializer = self.serializer_class(province_kill_request) + serializer.update(instance=province_kill_request, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + if 'delete_allocation' in request.GET: + + province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key'], + trash=False) + if request.GET['role'] == 'KillHouse': + if province_kill_request.market: + return Response({ + "result": "امکان حذف برای تخصیص پنل معاملاتی وجود ندارد. در صورت نیاز به کاربر اتحادیه اطلاع دهید."}, + status=status.HTTP_403_FORBIDDEN) + + now = datetime.now() + now_time = now.time() + if now.date() != province_kill_request.kill_request.recive_date.date(): + return Response({"result": "با توجه به مغایرت تاریخ امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + if now_time.hour >= 16: + return Response({"result": "با توجه به اتمام زمان حذف مجاز امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + if province_kill_request.quantity != province_kill_request.main_quantity: + return Response({"result": "برای تخصیص ماشین ثبت شده امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key, + trash=False) + province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + if poultry_request.export == True: + hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity -= int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity -= province_kill_request.total_killed_weight + # hatching.free_killed_quantity -= int(province_kill_request.main_quantity * poultry_request.Index_weight) + hatching.free_quantity -= province_kill_request.total_killed_quantity + # hatching.free_quantity -= province_kill_request.main_quantity + else: + hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight + # hatching.governmental_killed_quantity -= int( + # province_kill_request.main_quantity * poultry_request.Index_weight) + + hatching.governmental_quantity -= province_kill_request.total_killed_quantity + # hatching.governmental_quantity -= province_kill_request.main_quantity + # hatching.killed_quantity -= province_kill_request.main_quantity + hatching.save() + + if poultry_request.remain_quantity > 0: + # province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + province_check.quantity += province_kill_request.main_quantity + province_check.save() + poultry_request.remain_quantity += province_kill_request.main_quantity + poultry_request.save() + else: + + # province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + province_check.quantity += province_kill_request.main_quantity + province_check.save() + poultry_request.remain_quantity += province_kill_request.main_quantity + poultry_request.save() + # poultry_request.quantity -= province_kill_request.quantity + # poultry_request.first_quantity -= province_kill_request.quantity + # poultry_request.previous_quantity -= province_kill_request.quantity + # poultry_request.save() + # if poultry_request.quantity == 0: + # poultry_request.trash = True + # poultry_request.save() + # hatching.left_over += province_kill_request.quantity + # hatching.state = 'pending' + # hatching.allow_hatching = 'pending' + # hatching.save() + kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key) + kill_request.remain_quantity += province_kill_request.main_quantity + if kill_request.market: + user = SystemUserProfile.objects.get(trash=False, user=request.user) + kill_request.market_state_message = { + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()) + } + kill_request.market_state = 'deleted' + else: + if kill_request.poultry_request: + kill_request.trash = True + kill_request.save() + province_kill_request.delete_message = request.GET['message'] + province_kill_request.trash = True + user = SystemUserProfile.objects.get(user=request.user, trash=False) + province_kill_request.returner = {"fullname": user.fullname, "mobile": user.mobile, + "date": str(datetime.now())} + province_kill_request.save() + bot_eitaa_for_each_delete_province_kill_request(province_kill_request) + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + elif 'return_allocation_quantity' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key'], + trash=False) + if province_kill_request.quantity == 0: + return Response({"result": "باقی مانده تخصیص صفر است امکان بازگشت تعداد وجود ندارد"}, + status=status.HTTP_403_FORBIDDEN) + amount = province_kill_request.quantity + + poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key, + trash=False) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + + if province_kill_request.main_quantity - province_kill_request.quantity == 0: + province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + province_check.quantity += province_kill_request.main_quantity + province_check.save() + poultry_request.remain_quantity += province_kill_request.main_quantity + poultry_request.save() + kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key) + kill_request.remain_quantity += province_kill_request.main_quantity + if kill_request.market: + kill_request.market_state = 'deleted' + user = SystemUserProfile.objects.get(trash=False, user=request.user) + kill_request.market_state_message = { + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()) + } + + else: + if kill_request.poultry_request: + kill_request.trash = True + kill_request.save() + if poultry_request.export == True: + hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity -= int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity -= province_kill_request.total_killed_weight + # hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight) + hatching.free_quantity -= province_kill_request.total_killed_quantity + # hatching.free_quantity -= amount + else: + hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight + # hatching.governmental_killed_quantity -= int(amount * poultry_request.Index_weight) + hatching.governmental_quantity -= province_kill_request.total_killed_quantity + # hatching.governmental_quantity -= amount + # hatching.killed_quantity -= amount + hatching.save() + # province_kill_request.trash = True + province_kill_request.quantity = 0 + province_kill_request.total_killed_quantity = 0 + province_kill_request.total_killed_weight = 0 + province_kill_request.return_to_province = True + province_kill_request.returner = {"fullname": user.fullname, "mobile": user.mobile, + "date": str(datetime.now())} + province_kill_request.save() + bot_eitaa_for_each_delete_province_kill_request(province_kill_request) + else: + + province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + province_check.quantity += province_kill_request.main_quantity - province_kill_request.quantity + province_check.save() + poultry_request.remain_quantity += province_kill_request.main_quantity - province_kill_request.quantity + poultry_request.save() + kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key) + kill_request.remain_quantity += province_kill_request.main_quantity - province_kill_request.quantity + kill_request.save() + if poultry_request.export == True: + hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity -= int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity -= int(( + province_kill_request.main_quantity - province_kill_request.quantity) * poultry_request.Index_weight) + # hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight) + hatching.free_quantity -= province_kill_request.total_killed_quantity + # hatching.free_quantity -= amount + else: + hatching.governmental_killed_quantity -= int(( + province_kill_request.main_quantity - province_kill_request.quantity) * poultry_request.Index_weight) + # hatching.governmental_killed_quantity -= int(amount * poultry_request.Index_weight) + hatching.governmental_quantity -= province_kill_request.main_quantity - province_kill_request.quantity + # hatching.governmental_quantity -= amount + # hatching.killed_quantity -= amount + hatching.save() + province_kill_request.main_quantity = province_kill_request.main_quantity - province_kill_request.quantity + province_kill_request.quantity = 0 + province_kill_request.save() + + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + queryset = ProvinceKillRequest.objects.get(key=request.GET['key']) + poultry_request = PoultryRequest.objects.get(key=queryset.province_request.poultry_request.key) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + check = KillHouseCheckRequest.objects.filter(province_kill_request=queryset, state='accepted') + if check.count() > 0: + return Response({"result": "can not delete"}, status=status.HTTP_403_FORBIDDEN) + province = ProvinceCheckOperatorRequest.objects.get(key=queryset.province_request.key) + province.quantity += queryset.quantity + province.save() + kill_request = KillRequest.objects.get(key=queryset.kill_request.key) + kill_request.remain_quantity += queryset.quantity + kill_request.save() + # queryset.delete() + poultry_request.remain_quantity += queryset.quantity + poultry_request.save() + if poultry_request.export == True: + hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity -= int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity -= queryset.total_killed_weight + # hatching.free_killed_quantity -= int(queryset.quantity * poultry_request.Index_weight) + hatching.free_quantity -= queryset.total_killed_quantity + else: + hatching.governmental_killed_quantity -= queryset.total_killed_weight + # hatching.governmental_killed_quantity -= int( + # queryset.quantity * poultry_request.Index_weight) + hatching.governmental_quantity -= queryset.total_killed_quantity + # hatching.killed_quantity -= queryset.total_killed_quantity + hatching.save() + bot_eitaa_for_each_delete_province_kill_request(queryset) + queryset.delete() + return Response(status=status.HTTP_200_OK) + + +class KillHouseWageForTotalDashbordViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseWageForTotalDashbordSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + serializer = self.get_serializer(kill_house) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProvinceKillRequestProvinceWageViewSet(viewsets.ModelViewSet): + queryset = ProvinceKillRequest.objects.all() + serializer_class = ProvinceKillRequestProvinceWageSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = ProvinceKillRequestFilterSet + filterset_fields = [ + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__poultry__address__city__name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'type' in request.GET: + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Company', 'Guilds', 'Supporter']: + if request.GET['type'] == 'unpaid': + if 'date1' in request.GET: + + if request.GET['role'] == 'ProvinceOperator': + province_kill_request = self.queryset.filter( + killhouse_user__key=request.GET['kill_house_key'], + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + union_share__gt=0, + trash=False).order_by('kill_request__recive_date') + elif request.GET['role'] == 'Company': + province_kill_request = self.queryset.filter( + killhouse_user__key=request.GET['kill_house_key'], + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + company_share__gt=0, + trash=False).order_by('kill_request__recive_date') + + elif request.GET['role'] == 'Guilds': + province_kill_request = self.queryset.filter( + killhouse_user__key=request.GET['kill_house_key'], + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + guilds_share__gt=0, + trash=False).order_by('kill_request__recive_date') + + elif request.GET['role'] in ['SuperAdmin', 'AdminX', 'Supporter']: + province_kill_request = self.queryset.filter( + killhouse_user__key=request.GET['kill_house_key'], + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).order_by('kill_request__recive_date') + else: + if request.GET['role'] == 'ProvinceOperator': + province_kill_request = self.queryset.filter( + killhouse_user__key=request.GET['kill_house_key'], + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + union_share__gt=0, + trash=False).order_by('kill_request__recive_date') + elif request.GET['role'] == 'Company': + province_kill_request = self.queryset.filter( + killhouse_user__key=request.GET['kill_house_key'], + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + company_share__gt=0, + trash=False).order_by('kill_request__recive_date') + + elif request.GET['role'] == 'Guilds': + province_kill_request = self.queryset.filter( + killhouse_user__key=request.GET['kill_house_key'], + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + guilds_share__gt=0, + trash=False).order_by('kill_request__recive_date') + + elif request.GET['role'] in ['SuperAdmin', 'AdminX', 'Supporter']: + province_kill_request = self.queryset.filter( + killhouse_user__key=request.GET['kill_house_key'], + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + trash=False).order_by('kill_request__recive_date') + + + else: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + if request.GET['type'] == 'unpaid': + if 'date1' in request.GET: + + province_kill_request = self.queryset.filter(killhouse_user__in=kill_house, + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).order_by('kill_request__recive_date') + else: + province_kill_request = self.queryset.filter(killhouse_user__in=kill_house, + state__in=('pending', 'accepted'), wage_pay=False, + archive_wage=False, + return_to_province=False, + trash=False).order_by('kill_request__recive_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=province_kill_request + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=province_kill_request) + province_kill_request = ps.filter() + else: + province_kill_request = province_kill_request + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(province_kill_request) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(province_kill_request, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# class ProvinceKillRequestProvinceWageViewSet(viewsets.ModelViewSet): +# queryset = ProvinceKillRequest.objects.all() +# serializer_class = ProvinceKillRequestProvinceWageSerializer +# pagination_class = CustomPagination +# permission_classes = [TokenHasReadWriteScope] +# filter_backends = [DjangoFilterBackend] +# filterset_class = ProvinceKillRequestFilterSet +# filterset_fields = [ +# 'province_request__poultry_request__chicken_breed', +# 'province_request__poultry_request__order_code', +# 'province_request__poultry_request__poultry__address__city__name', +# 'province_request__poultry_request__poultry__user__mobile', +# 'province_request__poultry_request__poultry__user__fullname', +# +# ] +# +# def list(self, request, *args, **kwargs): +# if 'type' in request.GET: +# if 'date1' in request.GET: +# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() +# +# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() +# +# if request.GET['role'] in ['ProvinceOperator', 'SuperAdmin']: +# if request.GET['type'] == 'unpaid': +# if 'date1' in request.GET: +# +# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'], +# state__in=('pending', 'accepted'), wage_pay=False, +# archive_by_province=False, +# return_to_province=False, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# trash=False).order_by('kill_request__recive_date') +# else: +# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'], +# state__in=('pending', 'accepted'), wage_pay=False, +# archive_by_province=False, +# return_to_province=False, +# trash=False).order_by('kill_request__recive_date') +# +# elif request.GET['type'] == 'archive': +# if 'date1' in request.GET: +# +# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'], +# state__in=('pending', 'accepted'), wage_pay=False, +# archive_by_province=True, +# return_to_province=False, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# trash=False).order_by('kill_request__recive_date') +# else: +# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'], +# state__in=('pending', 'accepted'), wage_pay=False, +# archive_by_province=True, +# return_to_province=False, +# +# trash=False).order_by('kill_request__recive_date') +# +# +# else: +# if 'date1' in request.GET: +# +# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'], +# state__in=('pending', 'accepted'), wage_pay=True, +# archive_by_province=False, +# return_to_province=False, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# trash=False).order_by('kill_request__recive_date') +# else: +# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'], +# state__in=('pending', 'accepted'), wage_pay=True, +# archive_by_province=False, +# return_to_province=False, +# trash=False).order_by('kill_request__recive_date') +# +# else: +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) +# +# if request.GET['type'] == 'unpaid': +# if 'date1' in request.GET: +# +# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house, +# state__in=('pending', 'accepted'), wage_pay=False, +# archive_by_province=False, +# return_to_province=False, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# trash=False).order_by('kill_request__recive_date') +# else: +# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house, +# state__in=('pending', 'accepted'), wage_pay=False, +# archive_by_province=False, +# return_to_province=False, +# trash=False).order_by('kill_request__recive_date') +# elif request.GET['type'] == 'archive': +# if 'date1' in request.GET: +# +# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house, +# state__in=('pending', 'accepted'), wage_pay=False, +# archive_by_province=True, +# return_to_province=False, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# trash=False).order_by('kill_request__recive_date') +# else: +# +# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house, +# state__in=('pending', 'accepted'), wage_pay=False, +# archive_by_province=True, +# return_to_province=False, +# trash=False).order_by('kill_request__recive_date') +# +# else: +# +# if 'date1' in request.GET: +# +# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house, +# state__in=('pending', 'accepted'), wage_pay=True, +# archive_by_province=False, +# return_to_province=False, +# kill_request__recive_date__date__gte=date1, +# kill_request__recive_date__date__lte=date2, +# trash=False).order_by('kill_request__recive_date') +# else: +# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house, +# state__in=('pending', 'accepted'), wage_pay=True, +# archive_by_province=False, +# return_to_province=False, +# trash=False).order_by('kill_request__recive_date') +# if 'search' in request.GET: +# if request.GET['search'] == 'filter': +# if request.GET['value'] != "": +# for item in self.filterset_fields: +# query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) +# if (self.filterset_class( +# data=query, +# queryset=province_kill_request +# ) +# ).filter(): +# ps = self.filterset_class(data=query, queryset=province_kill_request) +# province_kill_request = ps.filter() +# else: +# province_kill_request = province_kill_request +# +# page_size = request.query_params.get('page_size', None) +# if page_size: +# self.pagination_class.page_size = int(page_size) +# +# page = self.paginate_queryset(province_kill_request) +# if page is not None: +# serializer = self.get_serializer(page, many=True) +# return self.get_paginated_response(serializer.data) +# +# serializer = self.get_serializer(province_kill_request, many=True) +# return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به تایید یا رد تخصیص از سمت استان توسط کشتارگاه +class KillHouseCheckRequestViewSet(viewsets.ModelViewSet): + queryset = KillHouseCheckRequest.objects.all() + serializer_class = KillHouseCheckRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به تایید یا رد تخصیص از سمت استان توسط کشتارگاه + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + # role = request.data['role'] + province_kill_house_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key'], + trash=False) + kill_request = KillRequest.objects.get(id=province_kill_house_request.kill_request.id, trash=False) + request.data.pop('province_kill_request_key') + # request.data.pop('role') + province_check = ProvinceCheckOperatorRequest.objects.get(id=province_kill_house_request.province_request.id, + trash=False) + poultry_request = PoultryRequest.objects.get(key=province_check.poultry_request.key) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + if KillHouseCheckRequest.objects.filter(province_kill_request=province_kill_house_request, + trash=False).exists(): + return Response({'result': 'already exist'}, status=status.HTTP_403_FORBIDDEN) + kill_house_check_request = serializer.create(validated_data=request.data) + kill_house_check_request.province_kill_request = province_kill_house_request + + if kill_house_check_request.state == 'accepted': + province_kill_house_request.state = 'accepted' + province_kill_house_request.save() + # barcode = kill_house_request.bar_code + # driver_mobile = kill_house_request.car['driver_mobile'] + # driver_name = kill_house_request.car['driver_name'] + # quantity = kill_house_request.quantity + # kill_house = kill_house_request.kill_request.kill_house.name + # poultry = kill_house_request.province_request.city_request_Poultry.poultry_request.user.fullname + # province = kill_house_request.province_request.city_request_Poultry.poultry_request.user.address.province + # city = kill_house_request.province_request.city_request_Poultry.poultry_request.user.address.city + # address = kill_house_request.province_request.city_request_Poultry.poultry_request.user.address.address + # date = kill_house_request.province_request.city_request_Poultry.poultry_request.send_date.date() + # date = (str(jdatetime.datetime.fromgregorian(year=date.year, month=date.month, day=date.day).date())) + # time1 = kill_request.recive_time + # list1 = reversed(date.split('-')) + # s = "-" + # date1 = s.join(list1) + # time = reversed(kill_request.recive_time.split('-')) + # o = "-" + # time1 = o.join(time) + # driver_sms(driver_mobile, driver_name, quantity, poultry, barcode, province, city, address, date, + # time1, + # kill_house) + elif kill_house_check_request.state == 'rejected': + if poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity -= int( + province_kill_house_request.main_quantity * poultry_request.Index_weight) + hatching.free_killed_quantity -= province_kill_house_request.main_quantity + else: + hatching.governmental_killed_quantity -= int( + province_kill_house_request.main_quantity * poultry_request.Index_weight) + hatching.governmental_quantity -= province_kill_house_request.main_quantity + # hatching.killed_quantity -= province_kill_house_request.main_quantity + hatching.save() + province_kill_house_request.state = 'rejected' + province_kill_house_request.message = kill_house_check_request.message + province_kill_house_request.save() + province_check.quantity += province_kill_house_request.quantity + province_check.save() + # kill_request.cars.append(kill_house_request.car) + kill_request.remain_quantity += province_kill_house_request.quantity + kill_request.save() + poultry_request.remain_quantity += province_kill_house_request.quantity + poultry_request.save() + # kill_house_check_request.role = { + # "role": role, + # "name": user.fullname, + # "mobile": user.mobile + # } + kill_house_check_request.save() + if kill_house_check_request.state == 'accepted': + # if SmsLicense.objects.filter().exists(): + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + province_operator_mobile = province_operator.user.mobile + province_operator_name = province_operator.user.fullname + kill_house_name = kill_house_check_request.province_kill_request.kill_request.kill_house.name + kill_house_mobile = kill_house_check_request.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile + quantity = kill_house_check_request.province_kill_request.quantity + chicken_breed = kill_house_check_request.province_kill_request.province_request.poultry_request.chicken_breed + poultry_name = kill_house_check_request.province_kill_request.province_request.poultry_request.poultry.unit_name + poultry_mobile = kill_house_check_request.province_kill_request.province_request.poultry_request.poultry.user.mobile + Index_weight = kill_house_check_request.province_kill_request.province_request.poultry_request.Index_weight + date_str = str( + kill_house_check_request.province_kill_request.province_request.poultry_request.send_date) + send_date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + province = kill_house_check_request.province_kill_request.province_request.poultry_request.poultry.address.province.name + city = kill_house_check_request.province_kill_request.province_request.poultry_request.poultry.address.city.name + # kill_house_province_kill_request_accept_to_province_sms(province_operator_mobile, + # province_operator_name, quantity, + # chicken_breed, send_date, poultry_name, + # poultry_mobile, province, city, kill_house_name, + # + # ) + + kill_house_check_request_serializer = self.serializer_class(kill_house_check_request) + return Response(kill_house_check_request_serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + +class KillHouseWareHouseAcceptedKillHouseRequestViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def update(self, request, pk=None, *args, **kwargs): + kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False) + request.data.pop('kill_house_request_key') + kill_house = kill_house_request.killhouse_user + bar_date = kill_house_request.kill_request.recive_date.date() + timedelta(days=1) + now = datetime.now().date() + product = RolesProducts.objects.filter(parent_product__product_id=2, kill_house=kill_house).first() + if not product: + return Response( + {"result": "جهت افزایش موجودی محصول ابتدا محصول را برای کشتارگاه ثبت کنید! "}, + status=status.HTTP_403_FORBIDDEN) + if kill_house_request.date_of_ware_house: + if now != datetime.strptime(kill_house_request.date_of_ware_house, '%Y-%m-%d %H:%M:%S.%f').date(): + return Response( + {"result": "بازه زمانی ویرایش این بار به اتمام رسیده ! "}, + status=status.HTTP_403_FORBIDDEN) + input_weight = request.data['ware_house_accepted_real_weight'] if request.data[ + 'input_type'] == 'input_weight' else int( + kill_house_request.accepted_real_weight - ( + (kill_house_request.accepted_real_weight * request.data['loss_percent']) / 100)) + if kill_house_request.ware_house_accepted_real_weight > input_weight: + diffrence = kill_house_request.ware_house_accepted_real_weight - input_weight + if product.total_remain_weight - diffrence < 0: + return Response( + {"result": "به علت منفی شدن موجودی انبار امکان ویرایش وجود ندارد! "}, + status=status.HTTP_403_FORBIDDEN) + + if request.data['input_type'] == 'input_weight': + kill_house_request.ware_house_accepted_real_quantity = request.data['ware_house_accepted_real_quantity'] + kill_house_request.ware_house_accepted_real_weight = request.data['ware_house_accepted_real_weight'] + kill_house_request.weight_loss = request.data['loss_percent'] + else: + # kill_house_request.ware_house_accepted_real_quantity = int(kill_house_request.accepted_real_quantity - ( + # (kill_house_request.accepted_real_quantity * request.data['loss_percent']) / 100)) + kill_house_request.ware_house_accepted_real_quantity = kill_house_request.accepted_real_quantity + kill_house_request.ware_house_accepted_real_weight = int(kill_house_request.accepted_real_weight - ( + (kill_house_request.accepted_real_weight * request.data['loss_percent']) / 100)) + kill_house_request.weight_loss = request.data['loss_percent'] + poultry_prediction(kill_house_request.province_request.poultry_request.poultry) + + kill_house_request.ware_house_input_type = request.data['input_type'] + kill_house_request.ware_house_confirmation = True + kill_house_request.date_of_ware_house = str(datetime.now()) + govermental_commitment_percent = kill_house.in_province_governmental_selling_percent + free_commitment_percent = kill_house.in_province_free_selling_percent + if kill_house_request.province_request.poultry_request.free_sale_in_province: + kill_house_request.warehouse_commitment_weight = int( + (free_commitment_percent / 100) * kill_house_request.ware_house_accepted_real_weight) + else: + kill_house_request.warehouse_commitment_weight = int( + (govermental_commitment_percent / 100) * kill_house_request.ware_house_accepted_real_weight) + if 'input_warehouse' in request.data.keys(): + if request.data['input_warehouse'] == 'self': + kill_house_request.input_warehouse = kill_house_request.killhouse_user + else: + kill_house_request.input_warehouse = kill_house_request.killer + product = RolesProducts.objects.filter(parent_product__product_id=2, + kill_house=kill_house_request.killer).first() + + else: + kill_house_request.input_warehouse = kill_house_request.killhouse_user + + kill_house_request.save() + kill_house_requests_product_warehousing(product) + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +# ویوست مربوط به ایجاد درخواست کشتار توسط کشتارگاه بعد از تخصیص +class KillHouseRequestViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ایجاد درخواست کشتار توسط کشتارگاه بعد از تخصیص + def create(self, request, *args, **kwargs): + + limitation_direct_purchase = LimitationForDirectPurchaseAndBarInformation.objects.filter( + trash=False, active=True).first() + is_in_limitation_range = False + + if limitation_direct_purchase and limitation_direct_purchase.start_time and limitation_direct_purchase.end_time: + current_time = datetime.now().time() + if limitation_direct_purchase.start_time <= current_time <= limitation_direct_purchase.end_time: + is_in_limitation_range = True + + if not is_in_limitation_range: + time_range = TimeRange.objects.filter(trash=False).first() + if time_range: + time = next( + (t for t in time_range.time_range if + t.get("name") == "kill_house_request" and t.get("active", False)), + None) + if time: + start_hour = datetime.strptime(time.get("start", 0), "%H:%M:%S").time() + end_hour = datetime.strptime(time.get("end", 0), "%H:%M:%S").time() + current_hour = datetime.now().time().replace(second=0, microsecond=0) + if not (start_hour < current_hour < end_hour): + return Response( + {"result": "لطفا در ساعات مجاز برای ثبت درخواست اقدام نمایید!"}, + status=status.HTTP_403_FORBIDDEN) + real_car = None + killer_for_kill_house = None + if 'real_car_key' in request.data.keys(): + real_car = KillHouseADDCAR.objects.get(key=request.data['real_car_key'], trash=False) + request.data.pop('real_car_key') + date_time_of_now = datetime.now().date() + tomorrow = datetime.now().date() + timedelta(days=1) + role = request.data['role'] + request.data.pop('role') + dict1 = {} + try: + kill_house_auction_winner_key = request.data['winner_key'] + + kill_house_auction_winner = KillHouseRequestActionWinner.objects.get(key=kill_house_auction_winner_key, + trash=False) + kill_house = kill_house_auction_winner.kill_house_request_auction.kill_house + request.data.pop('winner_key') + + except: + kill_house_auction_winner = None + + try: + kill_house_check_key = request.data['kill_house_check_key'] + + kill_house_check = KillHouseCheckRequest.objects.get(key=kill_house_check_key, trash=False) + kill_house = kill_house_check.province_kill_request.kill_request.kill_house + request.data.pop('kill_house_check_key') + + except: + kill_house_check = None + if kill_house_check != None: + kill_house = KillHouse.objects.get(id=kill_house_check.province_kill_request.kill_request.kill_house.id, + trash=False) + kill_req = KillRequest.objects.get(id=kill_house_check.province_kill_request.kill_request.id, trash=False) + if OperationLimitation.objects.all().first().kill_house_allocation_limitation == True: + + if date_time_of_now != kill_req.recive_date.date(): + # if date_time_of_now > kill_req.recive_date.date() + timedelta(days=1): + return Response({"result": "مغایرت در تاریخ اعلام نیاز کشتار گاه و تاریخ تخصیص به خودرو !"}, + status=status.HTTP_403_FORBIDDEN) + province_request = ProvinceCheckOperatorRequest.objects.get( + id=kill_house_check.province_kill_request.province_request.id, trash=False) + province_kill_request = ProvinceKillRequest.objects.get(id=kill_house_check.province_kill_request.id, + trash=False) + if province_kill_request.market: + if province_kill_request.first_car_allocated_quantity > 0: + if province_kill_request.total_killed_quantity + request.data[ + 'quantity'] > province_kill_request.main_quantity: + return Response( + {"result": "مجموع حجم ماشین های ایجاد شده بیشتر از تخصیص داده شده از پنل معاملات میباشد"}, + status=status.HTTP_403_FORBIDDEN) + else: + if request.data['quantity'] > province_kill_request.main_quantity: + return Response( + {"result": "مجموع حجم ماشین های ایجاد شده بیشتر از تخصیص داده شده از پنل معاملات میباشد"}, + status=status.HTTP_403_FORBIDDEN) + poultry_request = PoultryRequest.objects.get(key=province_request.poultry_request.key) + poultry_hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + + user = province_request.city_request_Poultry.poultry_request.poultry.user + if province_kill_request.quantity == 0: + return Response({"result": "quantity is 0"}, status=status.HTTP_403_FORBIDDEN) + elif kill_house_auction_winner != None: + user = kill_house_auction_winner.kill_house_request_auction.poultry_request.poultry.user + kill_house = KillHouse.objects.get(id=kill_house_auction_winner.kill_house_request_auction.kill_house.id, + trash=False) + if 'killer_key' in request.data.keys(): + if request.data['killer_key'] != None: + killer_for_kill_house = KillHouse.objects.get(key=request.data['killer_key'], trash=False) + if kill_house.id != killer_for_kill_house.id: + kill_house_purchase = KillHousePurchaseRequest.objects.filter(limitation=True, + kill_house=killer_for_kill_house).first() + if kill_house_purchase: + total_unpaid_wage = 0 + total_paid_wage = 0 + + total_unpaid_wage = get_finance_info(killer_for_kill_house)['total_price'] + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=killer_for_kill_house, status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + total_amount = total_unpaid_wage - total_paid_wage + if total_amount >= kill_house_purchase.limitation_number: + return Response( + { + "result": "به علت بدهی کشتارکن اختصاصی امکان ایجاد بار برای کشتار کن امکان پذیر نیست!"}, + status=status.HTTP_403_FORBIDDEN) + request.data.pop('killer_key') + + car = request.data['car'] + add_car = KillHouseADDCAR.objects.get(key=car['key'], trash=False) + request.data.pop('car') + if request.data['quantity'] > (poultry_hatching.left_over + province_kill_request.main_quantity + ( + (poultry_hatching.quantity * 5) / 100)): + return Response({"result": "تعداد قطعه وارد شده بیشتراز مانده در سالن مرغدار است!"}, + status=status.HTTP_403_FORBIDDEN) + if kill_house.max_kill_limit and kill_house.total_kill_capacity > 0: + extra_bar_kill_percent = (kill_house.extra_bar_kill_percent / 100) * kill_house.total_kill_capacity + + total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + killhouse_user=kill_house, + first_car_allocated_quantity=0, + kill_request__recive_date__date=kill_req.recive_date.date()).exclude( + id=kill_house_check.province_kill_request.id) + + total_province_kill_requests_quantity_with_out_bar = \ + total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + + total_kill_house_requests = KillHouseRequest.objects.filter(trash=False, + archive_wage=False, + killhouse_user=kill_house, + kill_request__recive_date__date=kill_req.recive_date.date()) + total_kill_house_requests_quantity = \ + total_kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + + if ( + kill_house.total_kill_capacity + extra_bar_kill_percent) < total_kill_house_requests_quantity + \ + request.data['quantity'] + total_province_kill_requests_quantity_with_out_bar: + return Response({"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_request = serializer.create(validated_data=request.data) + kill_house_request.accepted_real_quantity = int(kill_house_request.quantity) + kill_house_request.accepted_real_weight = float( + kill_house_request.quantity) * kill_house_check.province_kill_request.province_request.poultry_request.Index_weight + if kill_house_check != None: + bar_code = KillHouseRequest.objects.filter( + province_request__city_request_Poultry__poultry_request__poultry__user=user, trash=False) + + else: + bar_code = KillHouseRequest.objects.filter( + kill_house_request_auction_winner__kill_house_request_auction__poultry_request__poultry__user=user, + trash=False) + if bar_code.count() > 0: + bar_code = bar_code.order_by( + 'create_date') + if bar_code.last().bar_code != None: + kill_house_request.bar_code = bar_code.last().bar_code + 1 + + else: + if kill_house_check != None: + kill_house_request.bar_code = int( + str(province_request.city_request_Poultry.poultry_request.order_code) + '0001') + else: + kill_house_request.bar_code = int( + str(kill_house_auction_winner.kill_house_request_auction.poultry_request.order_code) + '0001') + + if kill_house_check != None: + kill_house_request.kill_request = kill_req + kill_house_request.province_request = province_request + kill_house_request.fee = kill_house_check.province_kill_request.fee + kill_house_request.province_kill_request = province_kill_request + kill_house_request.amount = province_kill_request.kill_house_price + if kill_house_check.state == 'accepted': + kill_house_request.state = "accepted" + kill_house_request.save() + + else: + + kill_house_request.kill_house_request_auction_winner = kill_house_auction_winner + kill_house_request.state = "accepted" + kill_house_request.fee = kill_house_auction_winner.fee + kill_house_request.auction = True + kill_house_auction_winner.quantity -= int(kill_house_request.quantity) + kill_house_auction_winner.save() + kill_house_request.role = { + 'role': role, + 'name': user.fullname, + 'mobile': user.mobile + } + kill_house_request.save() + + kill_house_request.car = car + kill_house_request.add_car = add_car + if real_car != None: + kill_house_request.real_add_car = real_car + if killer_for_kill_house != None: + kill_house_request.killer = killer_for_kill_house + kill_house_request.killhouse_user = kill_house + kill_house_request.show_kill_house = "accepted" + kill_house_request.save() + province_kill_request.first_car_allocated_quantity += kill_house_request.quantity + province_kill_request.save() + + kill_house_request_serializer = self.serializer_class(kill_house_request) + + ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house, date__date=tomorrow).first() + if not ware_house: + ware_house = KillHouseWareHouse( + kill_house=kill_house, + date=tomorrow + ) + ware_house.save() + + update_kill_house_requests(province_kill_request, poultry_request) + update_province_kill_requests(poultry_hatching) + poultry_prediction(poultry_hatching.poultry) + vet_farm = VetFarm.objects.filter(trash=False, + poultry=kill_house_request.province_request.poultry_request.poultry).first() + if vet_farm: + car_allocation_vet_farm_sms(kill_house_request.kill_request.recive_date.date(), + kill_house_request.province_request.poultry_request.poultry.user.fullname, + kill_house_request.province_request.poultry_request.hatching.chicken_age, + kill_house_request.quantity, kill_house_request.add_car.driver.type_car, + kill_house_request.traffic_code, + kill_house_request.add_car.driver.pelak, + kill_house_request.kill_request.kill_house.name, + vet_farm.vet.user.mobile, + kill_house_request.province_request.poultry_request.amount, + kill_house_request.province_request.poultry_request.free_sale_in_province) + + if kill_house_check != None: + + dict1 = { + "kill_house_req_key": str(kill_house_request.key), + "kill_req_key": kill_house_request.kill_request.key, + "barcod": kill_house_request.bar_code, + "kill_house_state": kill_house_request.state, + "kill_house_name": kill_house_request.kill_request.kill_house.name, + "kill_house_user_name": kill_house_request.kill_request.kill_house.kill_house_operator.user.fullname, + "kill_house_user_city": kill_house_request.kill_request.kill_house.system_address.city.name, + "kill_house_mobile": kill_house_request.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_request.quantity, + "time": kill_house_request.kill_request.recive_time, + "date": kill_house_request.kill_request.recive_date, + "car": kill_house_request.car, + } + elif kill_house_auction_winner != None: + + dict1 = { + "kill_house_req_key": str(kill_house_request.key), + "barcod": kill_house_request.bar_code, + "kill_house_state": kill_house_request.state, + "kill_house_name": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_user_name": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.fullname, + "kill_house_user_city": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.system_address.city.name, + "kill_house_mobile": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_request.quantity, + "date": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date, + "car": kill_house_request.car, + } + + # ارسال بار به ایتای دامپزشک (فقط برای همدان و در ساعات 16 تا 23:59) + if base_url_for_sms_report == 'ha': + current_hour = datetime.now().hour + if 16 <= current_hour <= 23: + try: + send_single_bar_to_eitaa(kill_house_request) + except Exception as e: + pass + + return Response(dict1, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + # تابع مربوط به نمایش درخواست کشتار های ایجاد شده توسط کشتارگاه بعد از تخصیص + def list(self, request, *args, **kwargs): + from django.db.models import Q + info_dict = [] + info_list = [] + # refresh(request.user.id) + + if request.GET['operator'] == 'ProvinceOperator': + queryset = KillHouseRequest.objects.filter(trash=False).order_by('create_date') + serializer = KillHouseRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif request.GET['operator'] == 'VetSupervisor': + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + + querysets_list = KillHouseRequest.objects.filter( + vet_state__in=('pending', 'accepted'), + active_state__in=('active', 'inactive'), trash=False).order_by( + 'create_date') + queryset = [ + queryset_list for queryset_list in querysets_list + if date1 <= queryset_list.province_request.poultry_request.send_date.date() <= date2 + ] + if len(queryset) > 0: + info_list = [] + + for kill_house_req_obj in queryset: + kill_place = kill_house_req_obj.kill_request.kill_house.name if not kill_house_req_obj.kill_request.slaughter_house else kill_house_req_obj.kill_request.slaughter_house.name + real_car = None + if kill_house_req_obj.real_add_car != None: + real_car = { + "real_driver_name": kill_house_req_obj.real_add_car.driver.driver_name, + "real_driver_mobile": kill_house_req_obj.real_add_car.driver.driver_mobile, + "real_pelak": kill_house_req_obj.real_add_car.driver.pelak, + "real_type_car": kill_house_req_obj.real_add_car.driver.type_car + } + exclusive_killer = None + if kill_house_req_obj.killer != None: + exclusive_killer = { + "killer_name": kill_house_req_obj.killer.name, + "killer_mobile": kill_house_req_obj.killer.kill_house_operator.user.mobile, + "killer_fullname": kill_house_req_obj.killer.kill_house_operator.user.fullname, + } + vet_check_date = None + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_req_obj).first() + if vet_check: + vet_check_date = vet_check.create_date + if kill_house_req_obj.province_kill_request != None: + + internal_dict_infos = { + "poultry_request_id": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.id, + "poultry_request_key": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.key, + "chicken_breed": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.chicken_breed, + "index_weight": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.Index_weight, + "amount": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.amount, + "bar_amount": kill_house_req_obj.amount, + "poultry_name": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.fullname, + "poultry_mobile": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.mobile, + "send_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.send_date, + "create_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.create_date, + "poultry_request_quantity": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.quantity, + "poultry_city": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.city.name, + "poultry_province": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.province.name, + "barcod": kill_house_req_obj.bar_code, + "order_code": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.order_code, + "freezing": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.freezing, + "kill_house_name": kill_house_req_obj.kill_request.kill_house.name, + "kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "accepted_real_quantity": kill_house_req_obj.accepted_real_quantity, + "accepted_real_weight": kill_house_req_obj.accepted_real_weight, + "kill_house_request_key": kill_house_req_obj.key, + "clearance_code": kill_house_req_obj.clearance_code, + "vet_state": kill_house_req_obj.vet_state, + "traffic_code": kill_house_req_obj.traffic_code, + "driver_name": kill_house_req_obj.add_car.driver.driver_name, + "driver_mobile": kill_house_req_obj.add_car.driver.driver_mobile, + "pelak": kill_house_req_obj.add_car.driver.pelak, + "car_key": kill_house_req_obj.add_car.key, + "type_car": kill_house_req_obj.add_car.driver.type_car, + "real_car": real_car, + "killer": exclusive_killer, + "age": ( + datetime.now() - kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1, + + "vet_check_date": vet_check_date, + "first_weight": kill_house_req_obj.quantity * kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight, + "kill_place": kill_place, + "auction": "False" + } + elif kill_house_req_obj.kill_house_request_auction_winner != None: + + internal_dict_infos = { + "poultry_request_id": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.id, + "poultry_request_key": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.key, + "poultry_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.fullname, + "mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.mobile, + "city": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.city.name, + "province": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.province.name, + "send_date": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date, + "freezing": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.freezing, + "create_date": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.create_date, + "poultry_quantity": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.quantity, + "barcod": kill_house_req_obj.bar_code, + "kill_house_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "kill_house_request_key": kill_house_req_obj.key, + "auction": "True" + + } + + info_list.append(internal_dict_infos) + # info_dict.append(info_list) + return Response(info_list, status=status.HTTP_200_OK) + + elif request.GET['operator'] == 'KillHouseVet': + user = SystemUserProfile.objects.get(user=request.user, trash=False) + # vet = Vet.objects.get(user=user, trash=False) + kill_house_vet = KillHouseVet.objects.filter(vet__user=user, trash=False) + kill_house_list = kill_house_vet.values_list('kill_house', flat=True).distinct() + # for kill_house in kill_house_vet: + # kill_house_list.append(kill_house.kill_house) + + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + + queryset = KillHouseRequest.objects.filter( + Q(killhouse_user__in=kill_house_list) | Q( + kill_request__slaughter_house__in=kill_house_list), + province_request__poultry_request__send_date__date__gte=date1, + province_request__poultry_request__send_date__date__lte=date2, + vet_state__in=('pending', 'accepted'), + active_state__in=('active', 'inactive'), trash=False).order_by( + 'create_date') + # queryset = [ + # queryset_list for queryset_list in querysets_list + # if date1 <= queryset_list.province_request.poultry_request.send_date.date() <= date2 + # ] + if len(queryset) > 0: + info_dict = [] + info_list = [] + + for kill_house_req_obj in queryset: + kill_place = kill_house_req_obj.kill_request.kill_house.name if not kill_house_req_obj.kill_request.slaughter_house else kill_house_req_obj.kill_request.slaughter_house.name + vet_check_date = None + real_car = None + if kill_house_req_obj.real_add_car != None: + real_car = { + "real_driver_name": kill_house_req_obj.real_add_car.driver.driver_name, + "real_driver_mobile": kill_house_req_obj.real_add_car.driver.driver_mobile, + "real_pelak": kill_house_req_obj.real_add_car.driver.pelak, + "real_type_car": kill_house_req_obj.real_add_car.driver.type_car + } + exclusive_killer = None + if kill_house_req_obj.killer != None: + exclusive_killer = { + "killer_name": kill_house_req_obj.killer.name, + "killer_mobile": kill_house_req_obj.killer.kill_house_operator.user.mobile, + "killer_fullname": kill_house_req_obj.killer.kill_house_operator.user.fullname, + } + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_req_obj).first() + if vet_check: + vet_check_date = vet_check.create_date + if kill_house_req_obj.province_kill_request != None: + + internal_dict_infos = { + "poultry_request_id": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.id, + "poultry_request_key": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.key, + "chicken_breed": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.chicken_breed, + "index_weight": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.Index_weight, + "amount": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.amount, + "bar_amount": kill_house_req_obj.amount, + "poultry_name": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.fullname, + "poultry_mobile": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.mobile, + "send_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.send_date, + "freezing": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.freezing, + "create_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.create_date, + "poultry_request_quantity": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.quantity, + "poultry_city": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.city.name, + "poultry_province": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.province.name, + "barcod": kill_house_req_obj.bar_code, + "order_code": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.order_code, + "kill_house_name": kill_house_req_obj.kill_request.kill_house.name, + "kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "accepted_real_quantity": kill_house_req_obj.accepted_real_quantity, + "accepted_real_weight": kill_house_req_obj.accepted_real_weight, + "kill_house_request_key": kill_house_req_obj.key, + "clearance_code": kill_house_req_obj.clearance_code, + "vet_state": kill_house_req_obj.vet_state, + "traffic_code": kill_house_req_obj.traffic_code, + "driver_name": kill_house_req_obj.add_car.driver.driver_name, + "driver_mobile": kill_house_req_obj.add_car.driver.driver_mobile, + "pelak": kill_house_req_obj.add_car.driver.pelak, + "car_key": kill_house_req_obj.add_car.key, + "type_car": kill_house_req_obj.add_car.driver.type_car, + "real_car": real_car, + "killer": exclusive_killer, + "first_weight": kill_house_req_obj.quantity * kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight, + "age": ( + datetime.now() - kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1, + + "vet_check_date": vet_check_date, + "kill_place": kill_place, + "auction": "False" + } + elif kill_house_req_obj.kill_house_request_auction_winner != None: + + internal_dict_infos = { + "poultry_request_id": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.id, + "poultry_request_key": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.key, + "poultry_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.fullname, + "mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.mobile, + "city": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.city.name, + "province": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.province.name, + "send_date": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date, + "freezing": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.freezing, + "create_date": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.create_date, + "poultry_quantity": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.quantity, + "barcod": kill_house_req_obj.bar_code, + "kill_house_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "kill_house_request_key": kill_house_req_obj.key, + "auction": "True" + + } + + info_list.append(internal_dict_infos) + # info_dict.append(info_list) + return Response(info_list, status=status.HTTP_200_OK) + + elif request.GET['operator'] == 'KillHouse': + # info_dict = [] + info_list = [] + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + if 'role' in request.GET: + if request.GET['role'] == 'KillHouseVet': + vet = Vet.objects.filter(user=user, trash=False) + if vet.count() > 0: + kill_house_list = [] + vet = vet.last() + kill_house_vet = KillHouseVet.objects.filter(vet=vet, trash=False) + for k_vet in kill_house_vet: + kill_house_list.append(k_vet.kill_house) + # kill_house = KillHouse.objects.filter(key=kill_house_vet.kill_house.key, trash=False) + kill_house_allow_vet = KillHouseAllowVet.objects.filter(kill_house__in=kill_house_list) + + if kill_house_allow_vet.count() > 0: + + kill_house_allow_vet = kill_house_allow_vet.last() + if vet != None and kill_house_allow_vet.allow == False: + return Response(info_list) + + kill_requests_list = KillHouseRequest.objects.filter((Q(killhouse_user__in=kill_house_list) | Q( + kill_request__slaughter_house__in=kill_house_list)), + active_state__in=('active', 'inactive'), + trash=False) + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + kill_requests = [ + kill_request_list for kill_request_list in kill_requests_list + if date1 <= kill_request_list.kill_request.recive_date.date() <= date2 + ] + for kill_house_req_obj in kill_requests: + vet_check_date = None + real_car = None + if kill_house_req_obj.real_add_car != None: + real_car = { + "real_driver_name": kill_house_req_obj.real_add_car.driver.driver_name, + "real_driver_mobile": kill_house_req_obj.real_add_car.driver.driver_mobile, + "real_pelak": kill_house_req_obj.real_add_car.driver.pelak, + "real_type_car": kill_house_req_obj.real_add_car.driver.type_car + } + exclusive_killer = None + if kill_house_req_obj.killer != None: + exclusive_killer = { + "killer_name": kill_house_req_obj.killer.name, + "killer_mobile": kill_house_req_obj.killer.kill_house_operator.user.mobile, + "killer_fullname": kill_house_req_obj.killer.kill_house_operator.user.fullname, + } + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_req_obj).first() + if vet_check: + vet_check_date = vet_check.create_date + if kill_house_req_obj.province_kill_request != None: + check = KillHouseCheckRequest.objects.get( + province_kill_request=kill_house_req_obj.province_kill_request) + bar_info = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_req_obj) + if bar_info.count() > 0: + bar_info = bar_info.last() + assignment_info = { + "kill_house_assignment_key": bar_info.key, + "kill_house_weight_without_load": bar_info.car_weight_without_load, + "kill_house_weight_with_load": bar_info.car_weight_with_load, + "kill_house_image_without_load": bar_info.car_weight_without_load_image, + "kill_house_image_with_load": bar_info.car_weight_with_load_image, + "kill_house_net_weight": bar_info.net_weight, + "driver_name": bar_info.kill_house_request.add_car.driver.driver_name, + "pelak": bar_info.kill_house_request.add_car.driver.pelak, + "type_car": bar_info.kill_house_request.add_car.driver.type_car, + "kill_house_assignment_state": bar_info.state, + "real_quantity": bar_info.real_quantity, + + } + else: + assignment_info = None + + internal_dict_infos = { + "poultry_request_id": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.id, + "poultry_request_key": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.key, + "amount": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.amount, + "bar_amount": kill_house_req_obj.amount, + "poultry_name": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.fullname, + "poultry_mobile": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.mobile, + "send_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.send_date, + "freezing": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.freezing, + "create_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.create_date, + "poultry_request_quantity": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.quantity, + "poultry_city": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.city.name, + "poultry_province": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.province.name, + "barcod": kill_house_req_obj.bar_code, + "order_code": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.order_code, + "kill_house_name": kill_house_req_obj.kill_request.kill_house.name, + "kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "kill_house_request_key": kill_house_req_obj.key, + "vet_state": kill_house_req_obj.vet_state, + "traffic_code": kill_house_req_obj.traffic_code, + "driver_name": kill_house_req_obj.add_car.driver.driver_name, + "driver_mobile": kill_house_req_obj.add_car.driver.driver_mobile, + "pelak": kill_house_req_obj.add_car.driver.pelak, + "car_key": kill_house_req_obj.add_car.key, + "type_car": kill_house_req_obj.add_car.driver.type_car, + "real_car": real_car, + "killer": exclusive_killer, + "kill_house_check_key": check.key, + "bar_info": assignment_info, + "auction": "False", + "kill_house_create_date": kill_house_req_obj.create_date, + "accepted_real_quantity": kill_house_req_obj.accepted_real_quantity, + "accepted_real_weight": kill_house_req_obj.accepted_real_weight, + "vet_check_date": vet_check_date, + "first_weight": kill_house_req_obj.quantity * kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight, + + "age": ( + datetime.now() - kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1, + + } + + elif kill_house_req_obj.kill_house_request_auction_winner != None: + + internal_dict_infos = { + "poultry_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.fullname, + "poultry_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.mobile, + "barcod": kill_house_req_obj.bar_code, + "kill_house_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "cars": kill_house_req_obj.car, + "kill_house_request_key": kill_house_req_obj.key + } + + info_list.append(internal_dict_infos) + # info_dict.append(info_list) + return Response(info_list, status=status.HTTP_200_OK) + + else: + # kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + kill_request_car = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + active_state__in=('active', 'inactive'), + assignment_state_archive='pending', + trash=False).select_related('province_request__city_request_Poultry__poultry_request', + 'real_add_car__driver', 'killer', + 'kill_request__kill_house__kill_house_operator') + + # kill_request_car = [ + # kill_request for kill_request in kill_requests + # if date1 <= kill_request.kill_request.recive_date.date() <= date2 + # ] + for kill_house_req_obj in kill_request_car: + vet_check_date = None + real_car = None + if kill_house_req_obj.real_add_car != None: + real_car = { + "real_driver_name": kill_house_req_obj.real_add_car.driver.driver_name, + "real_driver_mobile": kill_house_req_obj.real_add_car.driver.driver_mobile, + "real_pelak": kill_house_req_obj.real_add_car.driver.pelak, + "real_type_car": kill_house_req_obj.real_add_car.driver.type_car + } + exclusive_killer = None + if kill_house_req_obj.killer != None: + exclusive_killer = { + "killer_name": kill_house_req_obj.killer.name, + "killer_mobile": kill_house_req_obj.killer.kill_house_operator.user.mobile, + "killer_fullname": kill_house_req_obj.killer.kill_house_operator.user.fullname, + } + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_req_obj).first() + if vet_check: + vet_check_date = vet_check.create_date + if kill_house_req_obj.province_kill_request != None: + check = KillHouseCheckRequest.objects.get( + province_kill_request=kill_house_req_obj.province_kill_request) + bar_info = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_req_obj) + if bar_info.count() > 0: + bar_info = bar_info.last() + assignment_info = { + "kill_house_assignment_key": bar_info.key, + "kill_house_weight_without_load": bar_info.car_weight_without_load, + "kill_house_weight_with_load": bar_info.car_weight_with_load, + "kill_house_image_without_load": bar_info.car_weight_without_load_image, + "kill_house_image_with_load": bar_info.car_weight_with_load_image, + "kill_house_net_weight": bar_info.net_weight, + "driver_name": bar_info.kill_house_request.add_car.driver.driver_name, + "pelak": bar_info.kill_house_request.add_car.driver.pelak, + "type_car": bar_info.kill_house_request.add_car.driver.type_car, + "kill_house_assignment_state": bar_info.state, + "real_quantity": bar_info.real_quantity, + + } + else: + assignment_info = None + + internal_dict_infos = { + "poultry_request_id": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.id, + "poultry_request_key": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.key, + "amount": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.amount, + "bar_amount": kill_house_req_obj.amount, + "poultry_name": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.fullname, + "poultry_mobile": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.mobile, + "send_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.send_date, + "freezing": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.freezing, + "create_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.create_date, + "poultry_request_quantity": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.quantity, + "poultry_city": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.city.name, + "poultry_province": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.province.name, + "barcod": kill_house_req_obj.bar_code, + "order_code": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.order_code, + "kill_house_name": kill_house_req_obj.kill_request.kill_house.name, + "kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "kill_house_request_key": kill_house_req_obj.key, + "vet_state": kill_house_req_obj.vet_state, + "traffic_code": kill_house_req_obj.traffic_code, + "driver_name": kill_house_req_obj.add_car.driver.driver_name, + "driver_mobile": kill_house_req_obj.add_car.driver.driver_mobile, + "pelak": kill_house_req_obj.add_car.driver.pelak, + "car_key": kill_house_req_obj.add_car.key, + "type_car": kill_house_req_obj.add_car.driver.type_car, + "real_car": real_car, + "killer": exclusive_killer, + "kill_house_check_key": check.key, + "free_sale_in_province": kill_house_req_obj.province_request.poultry_request.free_sale_in_province, + "bar_info": assignment_info, + "age": ( + datetime.now() - kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1, + + "auction": "False", + "kill_house_create_date": kill_house_req_obj.create_date, + "accepted_real_quantity": kill_house_req_obj.accepted_real_quantity, + "accepted_real_weight": kill_house_req_obj.accepted_real_weight, + "vet_check_date": vet_check_date, + "first_weight": kill_house_req_obj.quantity * kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight, + + } + + elif kill_house_req_obj.kill_house_request_auction_winner != None: + + internal_dict_infos = { + "poultry_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.fullname, + "poultry_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.mobile, + "barcod": kill_house_req_obj.bar_code, + "kill_house_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "cars": kill_house_req_obj.car, + "kill_house_request_key": kill_house_req_obj.key + } + + info_list.append(internal_dict_infos) + # info_dict.append(info_list) + return Response(info_list, status=status.HTTP_200_OK) + + # تابع مربوط به ویرایش درخواست کشتار های ایجاد شده توسط کشتارگاه بعد از تخصیص + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + now = datetime.now().date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_request = KillHouseRequest.objects.get(key=request.data['key'], trash=False) + + if 'traffic_code' in request.data.keys(): + if kill_house_request.clearance_code: + return Response( + {"result": "به علت وارد شدن کد قرنطینه، امکان ویرایش وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN + ) + + bar_date = kill_house_request.kill_request.recive_date.date() + if now != bar_date: + return Response( + {"result": "فقط بار همان روز قابل ویرایش است!"}, + status=status.HTTP_403_FORBIDDEN + ) + + if 'non_receipt' not in request.data.keys(): + if 'bar_document_status_key' in request.data.keys() and request.data['bar_document_status_key'] != None: + document_status = BarDocumentStatus.objects.get(key=request.data['bar_document_status_key']) + kill_house_request.bar_document_status = document_status + kill_house_request.save() + request.data.pop('bar_document_status_key') + + if 'quarantine_quantity' not in request.data.keys(): + role = request.data['role'] + if role == 'KillHouse' and now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1) \ + and 'traffic_code' in request.data.keys(): + return Response( + {"result": "تنها یک روز بعد از ثبت اطلاعات امکان تغییر وجود دارد!"}, + status=status.HTTP_403_FORBIDDEN) + request.data.pop('role') + kill_house_request.editor_traffic_code = { + "role": role, + "full_name": user.first_name, + "mobile": user.mobile + } + kill_house_request.save() + + # kill_house_request.assignment_state_archive = 'accepted' + # kill_house_request.save() + serializer = self.serializer_class(kill_house_request) + serializer.update(instance=kill_house_request, validated_data=request.data) + if kill_house_request.bar_document_status is not None and kill_house_request.bar_document_status.sms == True: + document_discrepancy_sms(kill_house_request.killhouse_user.killer, kill_house_request.killhouse_user.name, + kill_house_request.bar_code, kill_house_request.bar_document_status.title, + kill_house_request.killhouse_user.kill_house_operator.user.mobile, + kill_house_request.kill_request.recive_date.date()) + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع مربوط به حذف درخواست کشتار های ایجاد شده توسط کشتارگاه بعد از تخصیص + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + tomorrow = datetime.now().date() + timedelta(days=1) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'delete_bar' in request.GET: + + kill_house_req = KillHouseRequest.objects.get(key=request.GET['kill_house_request_key'], trash=False) + + if KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_req, trash=False).exists(): + return Response({"result": "به علت ورود اطلاعات بار امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + # if kill_house_req.vet_state == 'accepted' or kill_house_req.assignment_state_archive == 'True': + # return Response({"result": "به علت تایید تخلیه توسط دامپزشک امکان حذف وجود ندارد!"}, + # status=status.HTTP_403_FORBIDDEN) + province_kill_req = ProvinceKillRequest.objects.get(key=kill_house_req.province_kill_request.key, + trash=False) + kill_house_req.trash = True + kill_house_req.save() + province_kill_req.first_car_allocated_quantity -= kill_house_req.quantity + if province_kill_req.first_car_allocated_quantity < 0: + province_kill_req.first_car_allocated_quantity = 0 + province_kill_req.save() + # kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_req, + # trash=False) + + poultry_request = PoultryRequest.objects.get(key=province_kill_req.province_request.poultry_request.key, + trash=False) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + update_kill_house_requests(province_kill_req, poultry_request) + update_province_kill_requests(hatching) + poultry_prediction(hatching.poultry) + + + else: + kill_house_req = KillHouseRequest.objects.get(key=request.GET['kill_house_request_key'], trash=False) + if KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_req, trash=False).exists(): + return Response({"result": "به علت ورود اطلاعات بار امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + if kill_house_req.vet_state == 'accepted' or kill_house_req.clearance_code != None: + return Response({"result": "به علت وارد شدن کد قرنطینه امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + kill_house_req.trash = True + kill_house_req.save() + + if kill_house_req.kill_house_request_auction_winner != None: + kill_house_request_auction_winner = KillHouseRequestActionWinner.objects.get( + key=kill_house_req.kill_house_request_auction_winner.key) + kill_house_request_auction_winner.quantity += kill_house_req.quantity + kill_house_request_auction_winner.save() + else: + province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_req.province_kill_request.key, + trash=False) + province_kill_request.first_car_allocated_quantity -= kill_house_req.quantity + if province_kill_request.first_car_allocated_quantity < 0: + province_kill_request.first_car_allocated_quantity = 0 + province_kill_request.save() + # kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_request, + # trash=False) + poultry_request = PoultryRequest.objects.get( + key=province_kill_request.province_request.poultry_request.key, + trash=False) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + vet_farm = VetFarm.objects.filter(trash=False, + poultry=kill_house_req.province_request.poultry_request.poultry).first() + delete_car_allocation_vet_farm_sms(kill_house_req.kill_request.recive_date.date(), + kill_house_req.province_request.poultry_request.poultry.user.fullname, + kill_house_req.province_request.poultry_request.hatching.chicken_age, + kill_house_req.quantity, kill_house_req.add_car.driver.type_car, + kill_house_req.traffic_code, + kill_house_req.add_car.driver.pelak, + kill_house_req.kill_request.kill_house.name, + vet_farm.vet.user.mobile, + kill_house_req.province_request.poultry_request.amount, + kill_house_req.province_request.poultry_request.free_sale_in_province + ) + update_kill_house_requests(province_kill_request, poultry_request) + update_province_kill_requests(hatching) + poultry_prediction(hatching.poultry) + + kill_house_req.trash = True + if 'message' in request.GET: + message = request.GET['message'] + else: + message = 'حذف توسط کشتارگاه' + + kill_house_req.message = message + role = request.GET['role'] if 'role' in request.GET else 'KillHouse' + now = datetime.now() + kill_house_req.bar_remover = { + "full_name": user.fullname, + "role": role, + "mobile": user.mobile, + "date": str(now) + } + kill_house_req.save() + + ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house_req.killhouse_user, + date__date=tomorrow).first() + if ware_house: + ware_house.final_total_number_of_carcasses -= kill_house_req.accepted_real_quantity + ware_house.final_total_weight_of_carcasses -= kill_house_req.accepted_real_weight + ware_house.total_number_of_carcasses -= kill_house_req.accepted_real_quantity + ware_house.total_weight_of_carcasses -= kill_house_req.accepted_real_weight + ware_house.remain_total_number_of_carcasses -= kill_house_req.accepted_real_quantity + ware_house.remain_total_weight_of_carcasses -= kill_house_req.accepted_real_weight + ware_house.bar_quantity -= 1 + # ware_house.allocated_quantity -= kill_house_req.accepted_real_quantity + ware_house.bar_live_weight -= kill_house_req.accepted_real_weight + ware_house.number_of_carcasses -= kill_house_req.accepted_real_quantity + ware_house.save() + return Response("object deleted", status=status.HTTP_200_OK) + + +class UpdateKillHouseRequestViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def update(self, request, pk=None, *args, **kwargs): + now = datetime.now().date() + kill_house_request = KillHouseRequest.objects.get(key=request.data['key'], trash=False) + if 'traffic_code' in request.data.keys() or 'car_key' in request.data.keys(): + if kill_house_request.clearance_code: + return Response( + {"result": "به علت وارد شدن کد قرنطینه، امکان ویرایش وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN + ) + + bar_date = kill_house_request.kill_request.recive_date.date() + if now != bar_date: + return Response( + {"result": "فقط بار همان روز قابل ویرایش است!"}, + status=status.HTTP_403_FORBIDDEN + ) + if 'car_key' in request.data.keys(): + add_car = KillHouseADDCAR.objects.get(key=request.data['car_key'], trash=False) + kill_house_request.add_car = add_car + kill_house_request.car = { + "id": add_car.id, + "key": str(add_car.key), + "pelak": add_car.driver.pelak, + "capocity": add_car.driver.capocity, + "type_car": add_car.driver.type_car, + "driver_name": add_car.driver.driver_name, + "driver_mobile": add_car.driver.driver_mobile, + "weight_without_load": add_car.driver.weight_without_load, + } + kill_house_request.save() + request.data.pop('car_key') + + serializer = self.serializer_class(kill_house_request) + serializer.update(instance=kill_house_request, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseRequestPricingViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def update(self, request, pk=None, *args, **kwargs): + now = datetime.now() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_request = KillHouseRequest.objects.get(key=request.data['key'], trash=False) + role = request.data.get('role') + image = request.FILES.get('file') + if image: + file_url = upload_to_liara(image, image.name) + kill_house_request.image = file_url + if kill_house_request.price_registerar: + kill_house_request.price_editor = user.fullname + kill_house_request.price_editor_role = role + kill_house_request.price_editor_date = now + else: + kill_house_request.price_registerar = user.fullname + kill_house_request.price_registerar_role = role + kill_house_request.price_register_date = now + kill_house_request.save() + serializer = self.serializer_class(kill_house_request) + serializer.update(instance=kill_house_request, validated_data=request.data) + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +class KillHouseRequestForCompleteInformationViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestForBarManagementSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + # تابع مربوط به نمایش درخواست کشتار های ایجاد شده توسط کشتارگاه بعد از تخصیص + def list(self, request, *args, **kwargs): + kill_house_request_list = [] + now = datetime.now().date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + if request.GET['role'] == 'KillHouseVet': + kill_house_vet = KillHouseVet.objects.filter(vet__user=user, trash=False) + kill_house_list = kill_house_vet.values_list('kill_house', flat=True).distinct() + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user__in=kill_house_list) | Q( + kill_request__slaughter_house__in=kill_house_list), kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='pending', + non_receipt=False, + trash=False).order_by( + 'create_date') + + else: + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='pending', + non_receipt=False, + trash=False) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests) + kill_house_request_list = ps.filter() + kill_house_requests = [] if len(kill_house_request_list) == 0 else kill_house_request_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseRequestStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + permission_classes = [AllowAny] + serializer_class = KillHouseRequestSerializer + + def list(self, request, *args, **kwargs): + + now = timezone.now().date() + ten_days_ago = now - timedelta(days=int(request.GET['day'])) + + kill_house_requests_list = [] + + for day in range(int(request.GET['day']) + 1): + date = ten_days_ago + timedelta(days=day) + + total_quantites = KillHouseRequest.objects.filter( + kill_request__recive_date__date=date, + trash=False + ).aggregate(total_quantity=Sum('quantity'))['total_quantity'] or 0 + + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + total_quantity = total_quantites.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + total_quantity = total_quantites.filter( + province_request__poultry_request__poultry__address__city=user.city) + else: + total_quantity = total_quantites + else: + total_quantity = total_quantites + + kill_house_requests_list.append({"date": str(date), "quantity": total_quantity}) + + return Response(kill_house_requests_list) + + +class KillHouseRequestWeightStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + permission_classes = [AllowAny] + serializer_class = KillHouseRequestSerializer + + def list(self, request, *args, **kwargs): + + now = timezone.now().date() + ten_days_ago = now - timedelta(days=int(request.GET['day'])) + + kill_house_requests_list = [] + + for day in range(int(request.GET['day']) + 1): + date = ten_days_ago + timedelta(days=day) + total_weight = 0 + kill_house_requestes = KillHouseRequest.objects.filter( + kill_request__recive_date__date=date, + trash=False + ) + + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + kill_house_requests = kill_house_requestes.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + kill_house_requests = kill_house_requestes.filter( + province_request__poultry_request__poultry__address__city=user.city) + else: + kill_house_requests = kill_house_requestes + else: + kill_house_requests = kill_house_requestes + if kill_house_requests: + for kill_house_request in kill_house_requests: + kill_house_request_information = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_request).last() + if kill_house_request_information: + total_weight += kill_house_request_information.net_weight + else: + total_weight += kill_house_request.province_request.poultry_request.Index_weight * kill_house_request.quantity + + kill_house_requests_list.append({"date": str(date), "weight": total_weight}) + + return Response(kill_house_requests_list) + + +class KillHouseRequestChangeStateViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + keys = request.data['keys'] + request.data.pop('keys') + for key in keys: + kill_house_request = KillHouseRequest.objects.get(key=key, trash=False) + kill_house_request.show_kill_house = 'accepted' + kill_house_request.save() + return Response("objects updated", status=status.HTTP_200_OK) + + +class KillHouseAssignmentImagesViewSet(viewsets.ModelViewSet): + queryset = KillHouseAssignmentImages.objects.all() + serializer_class = KillHouseAssignmentImagesSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به وارد کردن اطلاعات بار توسط کشتارگاه + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + role = request.data['role'] + request.data.pop('role') + kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + request.data.pop('kill_house_key') + + try: + health_certificate_image = request.data['health_certificate_img'] + request.data.pop('health_certificate_img') + + except: + health_certificate_image = None + try: + national_card_image = request.data['national_card_image'] + except: + national_card_image = None + try: + birth_certificate_image = request.data['birth_certificate_image'] + except: + birth_certificate_image = None + try: + police_clearance_image = request.data['police_clearance_image'] + except: + police_clearance_image = None + try: + no_addiction_image = request.data['no_addiction_image'] + except: + no_addiction_image = None + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_images = KillHouseAssignmentImages.objects.filter(kill_house=kill_house) + if kill_house_images.count() > 0: + kill_house_images = kill_house_images.last() + else: + kill_house_images = serializer.create(validated_data=request.data) + if health_certificate_image != None: + kill_house_images.health_certificate_image = send_image_to_server(health_certificate_image) + if national_card_image != None: + kill_house_images.national_card_image = send_image_to_server(national_card_image) + if birth_certificate_image != None: + kill_house_images.birth_certificate_image = send_image_to_server(birth_certificate_image) + if police_clearance_image != None: + kill_house_images.police_clearance_image = send_image_to_server(police_clearance_image) + if no_addiction_image != None: + kill_house_images.no_addiction_image = send_image_to_server(no_addiction_image) + kill_house_images.save() + + kill_house_images_serializer = self.serializer_class(kill_house_images) + return Response(kill_house_images_serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + +class KillHouseAssignmentInformationForAggregateLoadViewSet(viewsets.ModelViewSet): + queryset = KillHouseAssignmentInformation.objects.all() + serializer_class = KillHouseAssignmentInformationSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + now = datetime.now().date() + user = SystemUserProfile.objects.get(user=request.user) + kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False) + province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_request.province_kill_request.key) + poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + kill_house_check = KillHouseCheckRequest.objects.get( + province_kill_request__key=kill_house_request.province_kill_request.key) + if OperationLimitation.objects.all().first().vet_check_kill_house_assignment_limitation == True: + if kill_house_request.vet_state == 'pending': + return Response({"result": "به علت عدم تایید تخلیه دامپزشک کشتارگاه امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + date_time_of_now = datetime.now().date() + if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True: + + if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1): + return Response({"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + role = request.data['role'] + request.data.pop('kill_house_request_key') + request.data.pop('role') + assignment_info = KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_request).first() + if not assignment_info: + assignment_info = KillHouseAssignmentInformation() + assignment_info.save() + + # serializer = self.serializer_class(data=request.data) + # if serializer.is_valid(): + # assignment_info = serializer.create(validated_data=request.data) + assignment_info.kill_house_check = kill_house_check + assignment_info.kill_house_request = kill_house_request + assignment_info.car_weight_with_load = int(request.data['net_weight']) + assignment_info.net_weight = int(request.data['net_weight']) + assignment_info.real_quantity = int(request.data['real_quantity']) + assignment_info.importer = { + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(now), + "role": role + } + assignment_info.save() + kill_house_request.accepted_real_weight = int(request.data['net_weight']) + kill_house_request.accepted_real_quantity = int(request.data['real_quantity']) + kill_house_request.accepted_assignment_real_quantity = int(request.data['net_weight']) + kill_house_request.accepted_assignment_real_weight = int(request.data['real_quantity']) + kill_house_request.save() + # kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_request, + # trash=False) + + update_kill_house_requests(province_kill_request, poultry_request) + update_province_kill_requests(hatching) + poultry_prediction(hatching.poultry) + + kill_house_request.accepted_real_weight = int(request.data['net_weight']) + kill_house_request.accepted_real_quantity = int(request.data['real_quantity']) + assignment_info.save() + if assignment_info.net_weight != 0 and assignment_info.real_quantity != 0 and assignment_info.car_weight_with_load_image != None: + kill_house_request.assignment_state_archive = 'True' + kill_house_request.save() + + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + + def update(self, request, pk=None, *args, **kwargs): + image = request.data['image'] + role = request.data['role'] + now = datetime.now() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15)) + image_url = send_image_to_server(image) + # upload_object_resize(image_data=image, bucket_name="profileimagedefault", + # object_name="{0}.jpg".format(str(ran))) + if 'bar_key' in request.data.keys(): + bar_key = request.data['bar_key'] + request.data.pop('bar_key') + kill_house_request = KillHouseRequest.objects.get(key=bar_key, trash=False) + kill_house_check = KillHouseCheckRequest.objects.get( + province_kill_request__key=kill_house_request.province_kill_request.key) + assignment_info = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=bar_key).first() + if OperationLimitation.objects.all().first().vet_check_kill_house_assignment_limitation == True: + if kill_house_request.vet_state == 'pending': + return Response({"result": "به علت عدم تایید تخلیه دامپزشک کشتارگاه امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + date_time_of_now = datetime.now().date() + if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True: + + if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1): + return Response( + {"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + if not assignment_info: + assignment_info = KillHouseAssignmentInformation(kill_house_check=kill_house_check, + kill_house_request=kill_house_request) + assignment_info.save() + # serializer = self.serializer_class(data=request.data) + # if serializer.is_valid(): + # assignment_info = serializer.create(validated_data=request.data) + # assignment_info.car_weight_with_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran)) + assignment_info.car_weight_with_load_image = image_url + assignment_info.importer = { + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(now), + "role": role + } + assignment_info.save() + kill_house_request = KillHouseRequest.objects.get(key=bar_key, trash=False) + if assignment_info.net_weight != 0 and assignment_info.real_quantity != 0 and assignment_info.car_weight_with_load_image != None: + kill_house_request.assignment_state_archive = 'True' + kill_house_request.save() + + else: + assingment_info_keys = request.data['bar_keys'] + request.data.pop('bar_keys') + for assingment_info_key in assingment_info_keys: + kill_house_request = KillHouseRequest.objects.get(key=assingment_info_key, trash=False) + kill_house_check = KillHouseCheckRequest.objects.get( + province_kill_request__key=kill_house_request.province_kill_request.key) + if OperationLimitation.objects.all().first().vet_check_kill_house_assignment_limitation == True: + if kill_house_request.vet_state == 'pending': + return Response( + {"result": "به علت عدم تایید تخلیه دامپزشک کشتارگاه امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + date_time_of_now = datetime.now().date() + if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True: + + if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1): + return Response( + {"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + assignment_info = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=assingment_info_key).first() + + if not assignment_info: + assignment_info = KillHouseAssignmentInformation(kill_house_check=kill_house_check, + kill_house_request=kill_house_request) + assignment_info.save() + + if assignment_info.car_weight_with_load_image == None: + # assignment_info.car_weight_with_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran)) + assignment_info.car_weight_with_load_image = image_url + assignment_info.importer = { + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(now), + "role": role + } + assignment_info.save() + kill_house_request = KillHouseRequest.objects.get(key=assignment_info.kill_house_request.key, + trash=False) + if assignment_info.net_weight != 0 and assignment_info.real_quantity != 0 and assignment_info.car_weight_with_load_image != None: + kill_house_request.assignment_state_archive = 'True' + kill_house_request.save() + + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_200_OK) + + +# class KillHouseAssignmentInformationForcompletedloadsViewSet(viewsets.ModelViewSet): +# queryset = KillHouseAssignmentInformation.objects.all() +# serializer_class = KillHouseAssignmentInformationSerializer +# permission_classes = [TokenHasReadWriteScope] +# +# def list(self, request, *args, **kwargs): +# # refresh(request.user.id) +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# now = datetime.now().date() +# date1 = datetime.strptime(str(request.GET['date1']), +# '%Y-%m-%d').date() if 'date1' in request.GET else now +# date2 = datetime.strptime(str(request.GET['date2']), +# '%Y-%m-%d').date() if 'date2' in request.GET else now +# province = user.province.name +# if request.GET['role'] in ('ProvinceFinancial', 'ProvinceOperator'): +# kill_house_assignments = KillHouseAssignmentInformation.objects.filter( +# Q(car_weight_with_load_image__isnull=False) | Q(car_weight_without_load_image__isnull=False), +# kill_house_request__killhouse_user__kill_house_operator__address__province__name=province, +# net_weight__gt=0, +# real_quantity__gt=0, +# kill_house_request__kill_request__recive_date__date__gte=date1, +# kill_house_request__kill_request__recive_date__date__lte=date2, +# trash=False).select_related( +# 'kill_house_request__province_request__poultry_request__hatching', +# 'kill_house_request__province_request__poultry_request__poultry', +# 'kill_house_request__province_request__poultry_request__poultry__user__city', +# 'kill_house_request__province_request__poultry_request__poultry__user__province', +# 'kill_house_request__province_request__poultry_request__poultry__user', +# +# 'kill_house_request__kill_request__kill_house', +# 'kill_house_request__kill_request__slaughter_house', +# 'kill_house_request__killhouse_user', +# 'kill_house_request__killhouse_user__kill_house_operator__user', +# 'kill_house_request__add_car__driver', +# 'kill_house_request__real_add_car__driver', +# ).values( +# "kill_house_request__province_request__poultry_request__poultry__user__province__name", +# "kill_house_request__province_request__poultry_request__poultry__user__city__name", +# "kill_house_request__province_request__poultry_request__poultry__user__fullname", +# "kill_house_request__province_request__poultry_request__poultry__user__mobile", +# "kill_house_request__province_request__poultry_request__poultry__unit_name", +# "kill_house_request__province_request__poultry_request__poultry__key", +# "kill_house_request__province_request__poultry_request__order_code", +# "kill_house_request__province_request__poultry_request__quantity", +# "kill_house_request__province_request__poultry_request__id", +# "kill_house_request__province_request__poultry_request__Index_weight", +# "kill_house_request__province_request__poultry_request__chicken_breed", +# "kill_house_request__province_request__poultry_request__create_date", +# "kill_house_request__province_request__poultry_request__send_date", +# "kill_house_request__province_request__poultry_request__cell_type", +# "kill_house_request__province_request__poultry_request__hatching__losses", +# "kill_house_request__province_request__poultry_request__hatching__date", +# "kill_house_request__killhouse_user", +# 'kill_house_request__kill_request__kill_house__name', +# 'kill_house_request__kill_request__slaughter_house__name', +# "kill_house_request__add_car__driver__driver_name", +# "kill_house_request__add_car__driver__driver_mobile", +# "kill_house_request__add_car__driver__type_car", +# "kill_house_request__add_car__driver__pelak", +# "kill_house_request__add_car__driver__health_code", +# "kill_house_request__real_add_car__driver__driver_name", +# "kill_house_request__real_add_car__driver__driver_mobile", +# "kill_house_request__real_add_car__driver__type_car", +# "kill_house_request__real_add_car__driver__pelak", +# "kill_house_request__real_add_car__driver__health_code", +# "kill_house_request__quantity", +# "kill_house_request__bar_code", +# "kill_house_request__quarantine_quantity", +# "kill_house_request__vet_state", +# "kill_house_request__assignment_state_archive", +# "kill_house_request__clearance_code", +# "kill_house_request__traffic_code", +# "kill_house_request__accepted_real_quantity", +# "kill_house_request__accepted_real_weight", +# "kill_house_request", +# "car_weight_without_load", +# "car_weight_without_load_image", +# "car_weight_with_load", +# "car_weight_with_load_image", +# "net_weight", +# "state", +# "real_quantity", +# "protest_time", +# +# # "allocated_car_state" +# ) +# else: +# if request.GET['role'] == 'KillHouse': +# operator = KillHouseOperator.objects.get(user=user, trash=False) +# kill_house = KillHouse.objects.filter(kill_house_operator=operator, trash=False) +# else: +# vet = Vet.objects.get(user=user) +# kill_house_vet = KillHouseVet.objects.filter(vet=vet, trash=False) +# kill_house_list = [kill_house.kill_house.key for kill_house in kill_house_vet] +# kill_house = KillHouse.objects.filter(key__in=kill_house_list) +# +# kill_house_assignments = KillHouseAssignmentInformation.objects.filter( +# # state='pending', +# Q(car_weight_with_load_image__isnull=False) | Q(car_weight_without_load_image__isnull=False), +# +# kill_house_request__killhouse_user__in=kill_house, +# # car_weight_with_load_image__isnull=False, +# net_weight__gt=0, +# real_quantity__gt=0, +# trash=False, +# kill_house_request__kill_request__recive_date__date__gte=date1, +# kill_house_request__kill_request__recive_date__date__lte=date2, +# unusual_casualties=False).select_related( +# 'kill_house_request__province_request__poultry_request__hatching', +# 'kill_house_request__province_request__poultry_request__poultry', +# 'kill_house_request__province_request__poultry_request__poultry__user__city', +# 'kill_house_request__province_request__poultry_request__poultry__user__province', +# 'kill_house_request__province_request__poultry_request__poultry__user', +# +# 'kill_house_request__kill_request__kill_house', +# 'kill_house_request__kill_request__slaughter_house', +# 'kill_house_request__killhouse_user', +# 'kill_house_request__killhouse_user__kill_house_operator__user', +# 'kill_house_request__add_car__driver', +# 'kill_house_request__real_add_car__driver', +# ).values( +# "kill_house_request__province_request__poultry_request__poultry__user__province__name", +# "kill_house_request__province_request__poultry_request__poultry__user__city__name", +# "kill_house_request__province_request__poultry_request__poultry__user__fullname", +# "kill_house_request__province_request__poultry_request__poultry__user__mobile", +# "kill_house_request__province_request__poultry_request__poultry__unit_name", +# "kill_house_request__province_request__poultry_request__poultry__key", +# "kill_house_request__province_request__poultry_request__order_code", +# "kill_house_request__province_request__poultry_request__quantity", +# "kill_house_request__province_request__poultry_request__id", +# "kill_house_request__province_request__poultry_request__Index_weight", +# "kill_house_request__province_request__poultry_request__chicken_breed", +# "kill_house_request__province_request__poultry_request__create_date", +# "kill_house_request__province_request__poultry_request__send_date", +# "kill_house_request__province_request__poultry_request__cell_type", +# "kill_house_request__province_request__poultry_request__hatching__losses", +# "kill_house_request__province_request__poultry_request__hatching__date", +# "kill_house_request__killhouse_user", +# 'kill_house_request__kill_request__kill_house__name', +# 'kill_house_request__kill_request__slaughter_house__name', +# "kill_house_request__add_car__driver__driver_name", +# "kill_house_request__add_car__driver__driver_mobile", +# "kill_house_request__add_car__driver__type_car", +# "kill_house_request__add_car__driver__pelak", +# "kill_house_request__add_car__driver__health_code", +# "kill_house_request__real_add_car__driver__driver_name", +# "kill_house_request__real_add_car__driver__driver_mobile", +# "kill_house_request__real_add_car__driver__type_car", +# "kill_house_request__real_add_car__driver__pelak", +# "kill_house_request__real_add_car__driver__health_code", +# "kill_house_request__quantity", +# "kill_house_request__bar_code", +# "kill_house_request__quarantine_quantity", +# "kill_house_request__vet_state", +# "kill_house_request__assignment_state_archive", +# "kill_house_request__clearance_code", +# "kill_house_request__traffic_code", +# "kill_house_request__accepted_real_quantity", +# "kill_house_request__accepted_real_weight", +# "kill_house_request", +# "car_weight_without_load", +# "car_weight_without_load_image", +# "car_weight_with_load", +# "car_weight_with_load_image", +# "net_weight", +# "state", +# "real_quantity", +# "protest_time", +# +# # "allocated_car_state" +# ) +# +# assignments_list_final_state = [] +# allocation = ShareOfAllocation.objects.all() +# if allocation.count() > 0: +# allocation = allocation.last().total +# else: +# allocation = 0 +# for request_data in kill_house_assignments: +# poultry_name_of_bank_user = None +# poultry_bank_name = None +# poultry_card = None +# poultry_account = None +# poultry_shaba = None +# province_name_of_bank_user = None +# province_bank_name = None +# province_card = None +# province_account = None +# province_shaba = None +# kill_house_vet = KillHouseVet.objects.filter( +# kill_house=request_data.get('kill_house_request__killhouse_user'), trash=False).select_related('vet__user').values( +# 'vet__user__fullname', +# 'vet__user__mobile', +# ) +# if kill_house_vet.count() > 0: +# kill_house_vet = kill_house_vet.last() +# kill_house_vet_name = kill_house_vet.get('vet__user__fullname') +# kill_house_vet_mobile = kill_house_vet.get('vet__user__mobile') +# if request_data.get('kill_house_request__kill_request__slaughter_house') != None: +# kill_place = request_data.get('kill_house_request__kill_request__slaughter_house__name') +# else: +# kill_place = request_data.get('kill_house_request__kill_request__kill_house__name') +# +# vet_check = VetCheckRequest.objects.filter( +# kill_house_request=request_data.get('kill_house_request'), trash=False).select_related('kill_house_request').values('kill_house_request','create_date').first() +# +# vet_check_date = vet_check.get('create_date') if vet_check else None +# poultry = Poultry.objects.filter( +# key=request_data.get('kill_house_request__province_request__poultry_request__poultry__key'), +# trash=False).select_related('user_bank_info').values( +# 'user_bank_info', +# 'user_bank_info__name_of_bank_user', +# 'user_bank_info__bank_name', +# 'user_bank_info__card', +# 'user_bank_info__account', +# 'user_bank_info__shaba', +# ).first() +# if poultry.get('user_bank_info') != None: +# poultry_name_of_bank_user = poultry.get('user_bank_info__name_of_bank_user') +# poultry_bank_name = poultry.get('user_bank_info__bank_name') +# poultry_card = poultry.get('user_bank_info__card') +# poultry_account = poultry.get('user_bank_info__account') +# poultry_shaba = poultry.get('user_bank_info__shaba') +# operator = ProvinceOperator.objects.filter(trash=False).select_related('user_bank_info').values( +# 'user_bank_info', +# 'user_bank_info__name_of_bank_user', +# 'user_bank_info__bank_name', +# 'user_bank_info__card', +# 'user_bank_info__account', +# 'user_bank_info__shaba', +# ) +# if operator.last().get('user_bank_info') != None: +# operator = operator.last() +# province_name_of_bank_user = operator.get('user_bank_info__name_of_bank_user') +# province_bank_name = operator.get('user_bank_info__bank_name') +# province_card = operator.get('user_bank_info__card') +# province_account = operator.get('user_bank_info__account') +# province_shaba = operator.get('user_bank_info__shaba') +# +# internal_dict = { +# "order_code": request_data.get('kill_house_request__province_request__poultry_request__order_code'), +# "poultry_province": request_data.get( +# 'kill_house_request__province_request__poultry_request__poultry__user__province__name'), +# "poultry_city": request_data.get( +# 'kill_house_request__province_request__poultry_request__poultry__user__city__name'), +# "poultry_fullname": request_data.get( +# 'kill_house_request__province_request__poultry_request__poultry__user__fullname'), +# "poultry_mobile": request_data.get( +# 'kill_house_request__province_request__poultry_request__poultry__user__mobile'), +# "poultry_name": request_data.get( +# 'kill_house_request__province_request__poultry_request__poultry__unit_name'), +# "poultry_key": request_data.get('kill_house_request__province_request__poultry_request__poultry__key'), +# "poultry_request_quantity": request_data.get( +# 'kill_house_request__province_request__poultry_request__quantity'), +# "poultry_request_id": request_data.get('kill_house_request__province_request__poultry_request__id'), +# "Index_weight": request_data.get('kill_house_request__province_request__poultry_request__Index_weight'), +# "chicken_breed": request_data.get( +# 'kill_house_request__province_request__poultry_request__chicken_breed'), +# "create_date": request_data.get('kill_house_request__province_request__poultry_request__create_date'), +# "send_date": request_data.get('kill_house_request__province_request__poultry_request__send_date'), +# "cell_type": request_data.get('kill_house_request__province_request__poultry_request__cell_type'), +# "losses": request_data.get('kill_house_request__province_request__poultry_request__hatching__losses'), +# "hatching__date": request_data.get( +# 'kill_house_request__province_request__poultry_request__hatching__date'), +# "driver_name": request_data.get('kill_house_request__add_car__driver__driver_name'), +# "driver_mobile": request_data.get('kill_house_request__add_car__driver__driver_mobile'), +# "type_car": request_data.get('kill_house_request__add_car__driver__type_car'), +# "pelak": request_data.get('kill_house_request__add_car__driver__pelak'), +# "health_code": request_data.get('kill_house_request__add_car__driver__health_code'), +# "real_driver_name": request_data.get('kill_house_request__real_add_car__driver__driver_name'), +# "real_driver_mobile": request_data.get('kill_house_request__real_add_car__driver__driver_mobile'), +# "real_type_car": request_data.get('kill_house_request__real_add_car__driver__type_car'), +# "real_pelak": request_data.get('kill_house_request__real_add_car__driver__pelak'), +# "real_health_code": request_data.get('kill_house_request__real_add_car__driver__health_code'), +# "quantity": request_data.get('kill_house_request__quantity'), +# "bar_code": request_data.get('kill_house_request__bar_code'), +# "quarantine_quantity": request_data.get('kill_house_request__quarantine_quantity'), +# "vet_state": request_data.get('kill_house_request__vet_state'), +# "assignment_state_archive": request_data.get('kill_house_request__assignment_state_archive'), +# "clearance_code": request_data.get('kill_house_request__clearance_code'), +# "traffic_code": request_data.get('kill_house_request__traffic_code'), +# "accepted_real_quantity": request_data.get('kill_house_request__accepted_real_quantity'), +# "accepted_real_weight": request_data.get('kill_house_request__accepted_real_weight'), +# "car_weight_without_load": request_data.get('car_weight_without_load'), +# "car_weight_without_load_image": request_data.get('car_weight_without_load_image'), +# "car_weight_with_load": request_data.get('car_weight_with_load'), +# "car_weight_with_load_image": request_data.get('car_weight_with_load_image'), +# "net_weight": request_data.get('net_weight'), +# "state": request_data.get('state'), +# "real_quantity": request_data.get('real_quantity'), +# "protest_time": request_data.get('protest_time'), +# "average_weight": request_data.get('net_weight') / request_data.get('real_quantity') , +# "first_weight": request_data.get('kill_house_request__quantity') * request_data.get('kill_house_request__province_request__poultry_request__Index_weight') , +# "poultry_name_of_bank_user": poultry_name_of_bank_user, +# "poultry_bank_name": poultry_bank_name, +# "poultry_card": poultry_card, +# "poultry_account": poultry_account, +# "poultry_shaba": poultry_shaba, +# "province_name_of_bank_user": province_name_of_bank_user, +# "province_bank_name": province_bank_name, +# "province_card": province_card, +# "province_account": province_account, +# "province_shaba": province_shaba, +# "kill_house_vet_name": kill_house_vet_name, +# "kill_house_vet_mobile": kill_house_vet_mobile, +# "kill_place": kill_place, +# "vet_check_date": vet_check_date, +# "allocation": allocation, +# +# } +# +# assignments_list_final_state.append(internal_dict) +# return Response(len(assignments_list_final_state), status=status.HTTP_200_OK) +class KillHouseAssignmentInformationForcompletedloadsViewSet(viewsets.ModelViewSet): + queryset = KillHouseAssignmentInformation.objects.all() + serializer_class = KillHouseAssignmentInformationForCompletedLoadsSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + province = user.province.name + if request.GET['role'] in ('ProvinceFinancial', 'ProvinceOperator'): + kill_house_assignments = KillHouseAssignmentInformation.objects.filter( + Q(car_weight_with_load_image__isnull=False) | Q(car_weight_without_load_image__isnull=False), + kill_house_request__killhouse_user__kill_house_operator__address__province__name=province, + net_weight__gt=0, + real_quantity__gt=0, + kill_house_request__kill_request__recive_date__date__gte=date1, + kill_house_request__kill_request__recive_date__date__lte=date2, + trash=False) + else: + if request.GET['role'] == 'KillHouse': + operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=operator, trash=False) + else: + vet = Vet.objects.get(user=user) + kill_house_vet = KillHouseVet.objects.filter(vet=vet, trash=False) + kill_house_list = [kill_house.kill_house.key for kill_house in kill_house_vet] + kill_house = KillHouse.objects.filter(key__in=kill_house_list) + + kill_house_assignments = KillHouseAssignmentInformation.objects.filter( + # state='pending', + Q(car_weight_with_load_image__isnull=False) | Q(car_weight_without_load_image__isnull=False), + + kill_house_request__killhouse_user__in=kill_house, + # car_weight_with_load_image__isnull=False, + net_weight__gt=0, + real_quantity__gt=0, + trash=False, + kill_house_request__kill_request__recive_date__date__gte=date1, + kill_house_request__kill_request__recive_date__date__lte=date2, + unusual_casualties=False) + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_assignments) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(kill_house_assignments, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به وارد کردن اطلاعات بار توسط کشتارگاه +class KillHouseAssignmentInformationViewSet(viewsets.ModelViewSet): + queryset = KillHouseAssignmentInformation.objects.all() + serializer_class = KillHouseAssignmentInformationSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'bar_code', + 'bar_document_status__title', + ] + + # تابع مربوط به وارد کردن اطلاعات بار توسط کشتارگاه + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + pic = [] + dict1 = {} + role = request.data['role'] + request.data.pop('role') + date_time_of_now = datetime.now().date() + kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False) + province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_request.province_kill_request.key) + if OperationLimitation.objects.all().first().vet_check_kill_house_assignment_limitation == True: + if kill_house_request.vet_state == 'pending': + return Response({"result": "به علت عدم تایید تخلیه دامپزشک کشتارگاه امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True: + if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1): + return Response({"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + # if kill_house_request.vet_state == 'pending': + # return Response({"result": "بار توسط دامپزشک تخلیه نشده است !"}, status=status.HTTP_403_FORBIDDEN) + if kill_house_request.province_kill_request != None: + kill_house_check = KillHouseCheckRequest.objects.get( + province_kill_request__key=kill_house_request.province_kill_request.key) + else: + kill_house_check = None + # if 'car_without_load_image' in request.data.keys() and 'car_with_load_image' in request.data.keys(): + # if request.data['car_without_load_image'] != None and request.data['car_with_load_image'] != None: + # car_without_load_image = request.data['car_without_load_image'] + # car_with_load_image = request.data['car_with_load_image'] + # pic.append(car_without_load_image) + # pic.append(car_with_load_image) + # request.data.pop('car_without_load_image') + # request.data.pop('car_with_load_image') + + if 'car_with_load_image' in request.data.keys(): + if request.data['car_with_load_image'] != None: + car_with_load_image = request.data['car_with_load_image'] + pic.append(car_with_load_image) + request.data.pop('car_with_load_image') + + request.data.pop('kill_house_request_key') + + if KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_request).exists(): + return Response({'result': 'already exist'}, status=status.HTTP_403_FORBIDDEN) + if 'killer_key' in request.data.keys(): + if request.data['killer_key'] != None: + killer = KillHouse.objects.get(key=request.data['killer_key']) + kill_house_request.killer = killer + request.data.pop('killer_key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + assignment_info = serializer.create(validated_data=request.data) + if kill_house_check != None: + assignment_info.kill_house_check = kill_house_check + assignment_info.kill_house_request = kill_house_request + if len(pic) > 0: + for p in pic: + ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15)) + # upload_object_resize(image_data=p, bucket_name="profileimagedefault", + # object_name="{0}.jpg".format(str(ran))) + # if p == car_without_load_image: + # assignment_info.car_weight_without_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format( + # str(ran)) + # # os.remove("{0}.jpg".format(str(ran))) + # else: + # assignment_info.car_weight_with_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran)) + assignment_info.car_weight_with_load_image = send_image_to_server(p) + # os.remove("{0}.jpg".format(str(ran))) + kill_house_request.assignment_state_archive = 'True' + kill_house_request.save() + if role == 'Poultry': + dict1.update({ + "Poultry": True, + "CityOperator": False, + "ProvinceOperator": False, + "ProvinceFinancial": False, + "KillHouse": False, + }) + elif role == 'CityOperator': + dict1.update({ + "Poultry": False, + "CityOperator": True, + "ProvinceOperator": False, + "ProvinceFinancial": False, + "KillHouse": False, + }) + elif role == 'ProvinceFinancial': + dict1.update({ + "Poultry": False, + "CityOperator": False, + "ProvinceOperator": False, + "ProvinceFinancial": True, + "KillHouse": False, + }) + elif role == 'ProvinceOperator': + dict1.update({ + "Poultry": False, + "CityOperator": False, + "ProvinceOperator": True, + "ProvinceFinancial": False, + "KillHouse": False, + }) + else: + dict1.update({ + "Poultry": False, + "CityOperator": False, + "ProvinceOperator": False, + "ProvinceFinancial": False, + "KillHouse": True, + }) + assignment_info.importer = dict1 + now = datetime.now() + houre = PercentageOfLosses.objects.all() + if houre.count() > 0: + houre = houre.last().houre + assignment_info.protest_time = now + timedelta(hours=int(houre)) + assignment_info.net_weight = float(assignment_info.car_weight_with_load) - float( + assignment_info.car_weight_without_load) + assignment_info.save() + kill_house_request.active_state = 'inactive' + poultry = PoultryRequest.objects.get( + key=kill_house_request.province_request.city_request_Poultry.poultry_request.key) + poultry.assignment = True + poultry.save() + kill_house_request.accepted_real_quantity = assignment_info.real_quantity + kill_house_request.accepted_real_weight = assignment_info.net_weight + kill_house_request.accepted_assignment_real_quantity = assignment_info.real_quantity + kill_house_request.accepted_assignment_real_weight = assignment_info.net_weight + kill_house_request.save() + hatching = PoultryHatching.objects.get(key=poultry.hatching.key) + update_kill_house_requests(province_kill_request, poultry) + update_province_kill_requests(hatching) + poultry_prediction(hatching.poultry) + kill_house_request.accepted_real_quantity = assignment_info.real_quantity + kill_house_request.accepted_real_weight = assignment_info.net_weight + kill_house_request.save() + assignment_info_serializer = self.serializer_class(assignment_info) + return Response(assignment_info_serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + # تابع مربوط به نمایش اطلاعات بار وارد شده توسط کشتارگاه + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + # user = SystemUserProfile.objects.get(user=request.user) + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house = [] + kill_house_requests_list = [] + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + for kill_house_vet in kill_house_vets: + kill_house.append(kill_house_vet.kill_house) + + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + + if request.GET['role'] in ['CityOperator', 'CityJahad', 'CityPoultry']: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + if 'without_bar_document' in request.GET and request.GET['without_bar_document'] == "true": + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='True', + bar_document_status__isnull=True, + non_receipt=False, + trash=False, province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + + ).order_by('-kill_request__recive_date') + else: + + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='True', + non_receipt=False, + trash=False, province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + + ).order_by('-kill_request__recive_date') + else: + if 'without_bar_document' in request.GET and request.GET['without_bar_document'] == "true": + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='True', + bar_document_status__isnull=True, + non_receipt=False, + trash=False, province_request__poultry_request__poultry__address__city=user.city + + ).order_by('-kill_request__recive_date') + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='True', + non_receipt=False, + trash=False, province_request__poultry_request__poultry__address__city=user.city + + ).order_by('-kill_request__recive_date') + + else: + + if 'without_bar_document' in request.GET and request.GET['without_bar_document'] == "true": + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='True', + bar_document_status__isnull=True, + non_receipt=False, + trash=False, + + ).order_by('-kill_request__recive_date') + else: + + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='True', + non_receipt=False, + trash=False, + + ).order_by('-kill_request__recive_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests) + kill_house_requests_list = ps.filter() + kill_house_requests = [] if len(kill_house_requests_list) == 0 else kill_house_requests_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع مربوط به نمایش اطلاعات بار وارد شده توسط کشتارگاه + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + role = request.data['role'] + request.data.pop('role') + kill_house_assignment = KillHouseAssignmentInformation.objects.get(key=request.data['key'], trash=False) + if kill_house_assignment.state == 'accepted': + return Response({"result": "به علت تایید اطلاعات از سمت استان امکان ویرایش وجود ندارد!"}) + kill_house_request = KillHouseRequest.objects.get(key=kill_house_assignment.kill_house_request.key) + province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_request.province_kill_request.key) + poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key) + date_time_of_now = datetime.now().date() + if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True: + + if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1): + return Response({"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + car_with_load_image = request.data['car_with_load_image'] + request.data.pop('key') + + request.data.pop('car_with_load_image') + if 'killer_key' in request.data.keys(): + if request.data['killer_key'] != None: + killer = KillHouse.objects.get(key=request.data['killer_key']) + kill_house_request.killer = killer + request.data.pop('killer_key') + + pic = [] + # if 'car_without_load_image' in request.data.keys(): + # car_without_load_image = request.data['car_without_load_image'] + # request.data.pop('car_without_load_image') + # pic.append(car_without_load_image) + pic.append(car_with_load_image) + + for p in pic: + ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15)) + # upload_object_resize(image_data=p, bucket_name="profileimagedefault", + # object_name="{0}.jpg".format(str(ran))) + # if p == car_without_load_image: + # kill_house_assignment.car_weight_without_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran)) + # # os.remove("{0}.jpg".format(str(ran))) + # + # else: + # kill_house_assignment.car_weight_with_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran)) + kill_house_assignment.car_weight_with_load_image = send_image_to_server(p) + # os.remove("{0}.jpg".format(str(ran))) + kill_house_assignment.state = 'pending' + if role == 'Poultry': + kill_house_assignment.poultry_update = True + elif role == 'CityOperator': + kill_house_assignment.city_update = True + elif role == 'ProvinceFinancial': + kill_house_assignment.province_update = True + + kill_house_assignment.state = 'pending' + kill_house_assignment.net_weight = request.data['car_weight_with_load'] - request.data[ + 'car_weight_without_load'] + kill_house_assignment.save() + kill_house_request.accepted_real_quantity = request.data['real_quantity'] + kill_house_request.accepted_real_weight = request.data['car_weight_with_load'] - request.data[ + 'car_weight_without_load'] + kill_house_request.accepted_assignment_real_quantity = int(request.data['real_quantity']) + kill_house_request.accepted_assignment_real_weight = request.data['car_weight_with_load'] - request.data[ + 'car_weight_without_load'] + kill_house_request.assignment_state_archive = 'True' + kill_house_request.save() + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + update_kill_house_requests(province_kill_request, poultry_request) + update_province_kill_requests(hatching) + poultry_prediction(hatching.poultry) + serializer = self.serializer_class(kill_house_assignment) + serializer.update(instance=kill_house_assignment, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به ایجاد و ویرایش و جذف و نمایش فاکتور از سمت استان برای کشتارگاه +class ProvinceFactorToKillHouseViewSet(viewsets.ModelViewSet): + queryset = ProvinceFactorToKillHouse.objects.all() + serializer_class = ProvinceFactorToKillHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + +# ویوست مربوط به ایجاد و ویرایش و جذف و نمایش نماینده دامپزشکی برای کشتارگاه +class VetViewSet(viewsets.ModelViewSet): + queryset = Vet.objects.all() + serializer_class = VetSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = VetFilterSet + pagination_class = CustomPagination + filterset_fields = [ + 'user__national_id', + 'user__base_order', + 'user__mobile', + + ] + + # تابع مربوط به ایجاد نماینده دامپزشکی برای کشتارگاه + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + + user = UserProfile.objects.get(key=request.data['user_key'], trash=False) + kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + request.data.pop('user_key') + request.data.pop('kill_house_key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + vet = serializer.create(validated_data=request.data) + vet.kill_house = kill_house + vet.user = user + vet.save() + vet_serializer = self.serializer_class(vet) + return Response(vet_serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + def retrieve(self, request, pk=None, *args, **kwargs): + + # refresh(request.user.id) + + if 'kill_house_info' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + vet = Vet.objects.get(user=user, trash=False) + kill_house_vet = KillHouseVet.objects.filter(vet=vet) + if kill_house_vet.count() > 0: + kill_house_vet = kill_house_vet.last() + profile_info = { + 'kill_house_name': kill_house_vet.kill_house.name, + 'kill_house_user': kill_house_vet.kill_house.kill_house_operator.user.fullname, + 'kill_house_mobile': kill_house_vet.kill_house.kill_house_operator.user.mobile, + 'kill_house_city': kill_house_vet.kill_house.kill_house_operator.user.city.name, + 'kill_house_province': kill_house_vet.kill_house.kill_house_operator.user.province.name, + } + return Response(profile_info, status=status.HTTP_200_OK) + + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + user_serializer = SystemUserProfileSerializer(user) + vet = Vet.objects.get(user=user, trash=False) + vet_serializer = VetSerializer(vet) + vet_farm = VetFarm.objects.filter(vet=vet, trash=False) + serializer = VetFarmSerializer(vet_farm, many=True) + kill_house_vet = KillHouseVet.objects.filter(vet=vet) + if kill_house_vet.count() > 0: + kill_house_vet_serializer = KillHouseVetSerializer(kill_house_vet.last()) + profile_info = { + # 'profile': user_serializer.data, + 'vet': vet_serializer.data, + 'kill_house_vet': kill_house_vet_serializer.data + } + else: + + profile_info = { + # 'profile': user_serializer.data, + 'vet': vet_serializer.data + # 'vet_farms':serializer.data + } + return Response(profile_info, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + value = request.GET.get('value') + search = request.GET.get('search') + vet_farm_flag = request.GET.get('vet_farm') + + excluded_ids = set() + if vet_farm_flag: + if vet_farm_flag == 'true': + excluded_ids = set(VetFarm.objects.filter(trash=False).values_list('vet__id', flat=True).distinct()) + elif vet_farm_flag == 'false': + excluded_ids = set( + KillHouseVet.objects.filter(trash=False).values_list('vet__id', flat=True).distinct()) + else: + vet_farm_ids = set(VetFarm.objects.filter(trash=False).values_list('vet__id', flat=True).distinct()) + kill_house_ids = set(KillHouseVet.objects.filter(trash=False).values_list('vet__id', flat=True).distinct()) + excluded_ids = vet_farm_ids.union(kill_house_ids) + + vets = Vet.objects.filter(trash=False) + if vet_farm_flag: + vets = vets.filter(id__in=excluded_ids) + else: + vets = vets.exclude(id__in=excluded_ids) + + if value and search == 'filter' and value.strip() and value != 'undefined': + vets = vets.filter(build_query(VetFarmAndKillHouseFilterSet, value)) + + page_size = request.query_params.get('page_size') + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(vets) + if page is not None: + serializer_class = ( + VetFarmListSerializer if vet_farm_flag == 'true' else VetKillHouseSerializer + if vet_farm_flag == 'false' else VetSerializer + ) + serializer = serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = VetKillHouseSerializer(vets, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseVetViewSet(viewsets.ModelViewSet): + queryset = KillHouseVet.objects.all() + serializer_class = KillHouseVetSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + if 'role' in request.data.keys(): + if request.data['role'] == 'ProvinceInspector' or request.data['role'] == 'ProvinceOperator': + user = SystemUserProfile.objects.get(key=request.data['user_key']) + vet = Vet.objects.get(user=user, trash=False) + request.data.pop('user_key') + request.data.pop('role') + + + else: + request.data.pop('role') + user = SystemUserProfile.objects.get(user=request.user) + vet = Vet.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.get(key=request.data['key']) + request.data.pop('key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_vet = serializer.create(validated_data=request.data) + kill_house_vet.vet = vet + kill_house_vet.kill_house = kill_house + kill_house_vet.save() + kill_house_vet_serializer = self.serializer_class(kill_house_vet) + return Response(kill_house_vet_serializer.data, status=status.HTTP_201_CREATED) + return Response({"result": "مشکلی پیش آمذه است !"}, status=status.HTTP_403_FORBIDDEN) + + def destroy(self, request, pk=None, *args, **kwargs): + try: + user = SystemUserProfile.objects.get(key=request.GET['user_key']) + vet = Vet.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.get(key=request.GET['key']) + kill_house_vet = KillHouseVet.objects.get(kill_house=kill_house, vet=vet, trash=False) + kill_house_vet.trash = True + kill_house_vet.save() + + return Response(status=status.HTTP_200_OK) + except: + return Response({"result": "مشکلی پیش آمده است !"}, status=status.HTTP_403_FORBIDDEN) + + +# ویوست مربوط به تایید یا رد بار رسیده به کشتارگاه توسط نماینده دامپزشکی +class VetCheckRequestViewSet(viewsets.ModelViewSet): + queryset = VetCheckRequest.objects.all() + serializer_class = VetCheckRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به تایید یا رد بار رسیده به کشتارگاه توسط نماینده دامپزشکی + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + vet = Vet.objects.get(user=user, trash=False) + kill_house_vet = KillHouseVet.objects.filter(vet=vet, trash=False).last() + kill_house_req = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False) + evacuation_permit = EvacuationPermit.objects.all().first() + if evacuation_permit: + if evacuation_permit.type == 'force': + if kill_house_req.clearance_code == None: + return Response( + {"result": "قبل از ورود کد قرنطینه توسط دامپزشک فارم امکان تایید تخلیه وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + if OperationLimitation.objects.all().first().kill_house_vet_limitation == True: + + if kill_house_req.assignment_state_archive == 'True': + return Response({"result": "به علت ورود اطلاعات بار امکان تایید تخلیه وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_req.province_kill_request.key, + trash=False) + if int(request.data['accepted_real_quantity']) > 0 and request.data['accepted_real_weight'] > 0: + kill_house_req.accepted_real_quantity = int(request.data['accepted_real_quantity']) + kill_house_req.accepted_real_weight = request.data['accepted_real_weight'] + kill_house_req.vet_accepted_real_quantity = int(request.data['accepted_real_quantity']) + kill_house_req.vet_accepted_real_weight = request.data['accepted_real_weight'] + kill_house_req.save() + + poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + request.data.pop('kill_house_request_key') + if 'accepted_real_quantity' in request.data.keys() and 'accepted_real_weight' in request.data.keys(): + if request.data['accepted_real_quantity'] != None and request.data['accepted_real_weight'] != None: + if int(request.data['accepted_real_quantity']) > 0 and request.data['accepted_real_weight'] > 0: + if kill_house_req.assignment_state_archive == 'pending' and kill_house_req.accepted_assignment_real_quantity == 0: + update_kill_house_requests(province_kill_request, poultry_request) + update_province_kill_requests(hatching) + poultry_prediction(hatching.poultry) + + # kill_house_req.accepted_real_quantity = int(request.data['accepted_real_quantity']) + kill_house_req.vet_accepted_real_quantity = int(request.data['accepted_real_quantity']) + + request.data.pop('accepted_real_quantity') + if 'accepted_real_weight' in request.data.keys(): + if request.data['accepted_real_weight'] != None: + # kill_house_req.accepted_real_weight = request.data['accepted_real_weight'] + kill_house_req.vet_accepted_real_weight = request.data['accepted_real_weight'] + request.data.pop('accepted_real_weight') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + vet_check = serializer.create(validated_data=request.data) + vet_check.kill_house_request = kill_house_req + if vet_check.state == 'accepted': + kill_house_req.vet_state = 'accepted' + kill_house_req.active_state = 'inactive' + kill_house_req.save() + else: + kill_house_req.vet_state = 'rejected' + kill_house_req.active_state = 'inactive' + kill_house_req.save() + + vet_check.kill_house_vet = kill_house_vet + vet_check.save() + vet_check_serializer = self.serializer_class(vet_check) + return Response(vet_check_serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + +# ویوست مربوط به ایجاد نمایش و ویرایش و حذف درخواست بورسی کشتارگاه +class KillHouseRequestExchangeViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequestExchange.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseRequestExchangeSerializer + + # تابع مربوط به ایجاد درخواست بورسی کشتارگاه + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = UserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.get(user=user, trash=False) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_request_exchange = serializer.create(validated_data=request.data) + kill_house_request_exchange.user = user + kill_house_request_exchange.kill_house = kill_house + kill_house_request_exchange.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +# ویوست مربوط به ایجاد نمایش و ویرایش و حذف درخواست بورسی رزرو شده کشتارگاه +class KillHouseRequestExchangeReserveViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequestExchangeReserve.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseRequestExchangeReserveSerializer + + # تابع مربوط به ایجاد درخواست بورسی رزرو شده کشتارگاه + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = UserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.get(user=user, trash=False) + poultry_exchange = PoultryRequestExchange.objects.get(key=request.data['key'], trash=False) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_request_exchange_reserve = serializer.create(validated_data=request.data) + kill_house_request_exchange_reserve.poultry_exchange = poultry_exchange + kill_house_request_exchange_reserve.kill_house = kill_house + kill_house_request_exchange_reserve.save() + poultry_exchange.state = 'reserved' + poultry_exchange.save() + + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +# ویوست مربوط به ایجاد نمایش و ویرایش و حذف درخواست بورسی رزرو شده کشتارگاه +class KillHouseRequestActionViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequestAction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseRequestActionSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.get(kill_house_operator__user=user, trash=False) + poultry_request = PoultryRequest.objects.get(key=request.data['key'], trash=False) + request.data.pop('key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_auction = serializer.create(validated_data=request.data) + kill_house_auction.kill_house = kill_house + kill_house_auction.poultry_request = poultry_request + kill_house_auction.date = datetime.now() + timedelta(minutes=10) + kill_house_auction.save() + kill_house_auction_serializer = self.serializer_class(kill_house_auction) + return Response(kill_house_auction_serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.get(kill_house_operator=kill_house_operator, trash=False) + queryset = KillHouseRequestAction.objects.filter(kill_house=kill_house, trash=False) + # queryset = WareHouseFactor.objects.all().order_by('-create_date') + serializer = KillHouseRequestActionSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + queryset = KillHouseRequestAction.objects.get(key__exact=request.GET["key"], trash=False) + now = datetime.now() + if now.hour <= queryset.date.hour and now.minute <= queryset.date.minute: + queryset.delete() + return Response({"result": "object deleted"}, status=status.HTTP_200_OK) + else: + return Response({"result": "object can not deleted"}, status=status.HTTP_403_FORBIDDEN) + + +# ویوست مربوط به ایجاد نمایش و ویرایش و حذف درخواست بورسی رزرو شده کشتارگاه +class KillHouseRequestActionWinnerViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequestActionWinner.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseRequestActionWinnerSerializer + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.get(kill_house_operator=kill_house_operator, trash=False) + queryset = KillHouseRequestActionWinner.objects.filter(kill_house_request_auction__kill_house=kill_house, + trash=False) + # queryset = WareHouseFactor.objects.all().order_by('-create_date') + serializer = KillHouseRequestActionWinnerSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به ایجاد نمایش و ویرایش و ... اضافه کردن ماشین به درخواست بورسی رزرو شده تایید شده کشتارگاه +class KillHouseRequestExchangeAddCarViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequestExchangeAddCar.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseRequestExchangeAddCarSerializer + + # تابع مربوط به اضافه کردن ماشین به درخواست بورسی رزرو شده تایید شده کشتارگاه + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + kill_house_reserve = KillHouseRequestExchangeReserve.objects.get(key=request.data['key'], trash=False) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_request_exchange_add_car = serializer.create(validated_data=request.data) + kill_house_request_exchange_add_car.kill_house_reserve = kill_house_reserve + kill_house_request_exchange_add_car.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +class DriverViewSet(viewsets.ModelViewSet): + queryset = KillHouseDriver.objects.all() + serializer_class = KillHouseDriverSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + """ + Show Driver Cars Information + """ + if 'my_car' in request.GET: + # get user object + userprofile = SystemUserProfile.objects.get( + user=request.user, trash=False + ) + # get driver object & cars information + # driver = self.queryset.get(user=userprofile, trash=False) + # cars_objects = driver.Kill_house_add_car + # serializer = KillHouseADDCARSerializer(cars_objects) + # return Response(serializer.data, status=status.HTTP_200_OK) + cars = KillHouseDriver.objects.filter(user=userprofile, trash=False) + # cars_objects = KillHouseADDCAR.objects.filter(driver=driver, trash=False) + # serializer = KillHouseADDCARSerializer(cars_objects, many=True) + serializer = KillHouseDriverSerializer(cars, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + # Show Driver Kill Requests Allocation + if 'my_allocations' in request.GET: + driver_allocations = [] + # get user object + userprofile = SystemUserProfile.objects.get( + user=request.user, trash=False + ) + # get driver object & cars information + # driver = self.queryset.get(user=userprofile, trash=False) + # cars_object = driver.Kill_house_add_car + kill_reqs = KillHouseRequest.objects.filter(add_car__driver__user=userprofile, trash=False) + # for item in kill_req: + # if str(cars_object.key) == item.car['key']: + # driver_allocations.append(item) + serializer = KillHouseRequestSerializer(kill_reqs, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + return Response("Enter The Parameter", status=status.HTTP_400_BAD_REQUEST) + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_driver = KillHouseDriver.objects.get(user=user, trash=False) + kill_house_driver_serializer = KillHouseDriverSerializer(kill_house_driver) + profile_info = { + 'profile': kill_house_driver_serializer.data, + } + return Response(profile_info, status=status.HTTP_200_OK) + + +class DriverRequestCancelViewSet(viewsets.ModelViewSet): + queryset = DriverRequestCancel.objects.all() + serializer_class = DriverRequestCancelSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False) + request.data.pop('kill_house_request_key') + add_car = KillHouseADDCAR.objects.get(key=request.data['Kill_house_add_car_key'], trash=False) + request.data.pop('Kill_house_add_car_key') + if KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_request).exists(): + return Response({"result": "can not cancel"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + driver_cancel = serializer.create(validated_data=request.data) + if kill_house_request.province_kill_request != None: + province_kill_request = ProvinceKillRequest.objects.get( + key=kill_house_request.province_kill_request.key, trash=False) + province_kill_request.quantity += kill_house_request.quantity + province_kill_request.save() + else: + kill_house_request_auction = KillHouseRequestActionWinner.objects.get( + key=kill_house_request.kill_house_request_auction_winner.key, trash=False) + kill_house_request_auction.quantity += kill_house_request.quantity + kill_house_request_auction.save() + driver_cancel.kill_house_request = kill_house_request + driver_cancel.Kill_house_add_car = add_car + driver_cancel.save() + kill_house_request.trash = True + kill_house_request.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +class KillHouseComplaintViewSet(viewsets.ModelViewSet): + queryset = KillHouseComplaint.objects.all() + serializer_class = KillHouseComplaintSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + role = request.data['role'] + request.data.pop('role') + image_list = [] + bar = KillHouseAssignmentInformation.objects.get(key=request.data['bar_key'], trash=False) + request.data.pop('bar_key') + percent = request.data['percent'] + request.data.pop('percent') + try: + images = request.data['image'] + request.data.pop('image') + except: + images = None + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + complaint = serializer.create(validated_data=request.data) + complaint.bar = bar + if images != None: + for image in images: + image_list.append(send_image_to_server(image)) + complaint.image = image_list + if percent != None: + complaint.percent = percent + complaint.save() + bar.unusual_casualties = True + bar.save() + if role == 'KillHouse': + kill_house = KillHouse.objects.get(kill_house_operator__user=user) + kill_house_name = kill_house.kill_house_operator.user.fullname + information = { + "role": role, + "kill_house_name": kill_house.name, + "kill_house_operator_name": kill_house_name, + "date": str(complaint.create_date) + } + + elif role == "KillHouseVet": + vet = Vet.objects.get(user=user) + kill_house_vet = KillHouseVet.objects.get(vet=vet) + kill_house_vet_name = kill_house_vet.vet.user.fullname + + information = { + "role": role, + "kill_house_vet": kill_house_vet_name, + "date": str(complaint.create_date) + } + + complaint.registrar = information + complaint.save() + + return Response(serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + if 'role' in request.GET: + killhousecomplaints = [] + if request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.get(user=user) + kill_house = KillHouse.objects.get(kill_house_operator=kill_house_operator) + killhousecomplaints = KillHouseComplaint.objects.filter( + bar__kill_house_request__killhouse_user=kill_house) + if killhousecomplaints.count() > 0: + serializer = KillHouseComplaintSerializer(killhousecomplaints, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif request.GET['role'] == 'KillHouseVet': + vet = Vet.objects.get(user=user) + kill_house_vet = KillHouseVet.objects.get(vet=vet) + kill_house = KillHouse.objects.get(key=kill_house_vet.kill_house.key) + killhousecomplaints = KillHouseComplaint.objects.filter( + bar__kill_house_request__killhouse_user=kill_house) + if killhousecomplaints.count() > 0: + serializer = KillHouseComplaintSerializer(killhousecomplaints, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + killhousecomplaints = KillHouseComplaint.objects.filter( + bar__kill_house_request__killhouse_user__system_address__province__id=user.province.id) + if killhousecomplaints.count() > 0: + serializer = KillHouseComplaintSerializer(killhousecomplaints, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(killhousecomplaints, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + # refresh(request.user.id) + Killhousecomplaint = KillHouseComplaint.objects.get(key=request.data['key']) + new_bar = KillHouseAssignmentInformation.objects.get(key=request.data['bar_key'], trash=False) + request.data.pop('key') + request.data.pop('bar_key') + percent = request.data['percent'] + new_title = request.data['title'] + new_image = request.data['image'] + new_percent = request.data['percent'] + new_message = request.data['message'] + + Killhousecomplaint.bar = new_bar + Killhousecomplaint.title = new_title + Killhousecomplaint.image = new_image + Killhousecomplaint.percent = new_percent + Killhousecomplaint.message = new_message + Killhousecomplaint.save() + + return Response(status=status.HTTP_200_OK) + + def destroy(self, request, *args, **kwargs): + # refresh(request.user.id) + Killhousecomplaint = KillHouseComplaint.objects.get(key=request.data['key']) + Killhousecomplaint.trash = True + Killhousecomplaint.save() + + return Response(status=status.HTTP_200_OK) + + +class CheckKillHouseComplaintViewSet(viewsets.ModelViewSet): + queryset = CheckKillHouseComplaint.objects.all() + serializer_class = CheckKillHouseComplaintSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + complaint = KillHouseComplaint.objects.get(key=request.data['complaint_key'], trash=False) + request.data.pop('complaint_key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + percent = PercentageOfLosses.objects.all() + if percent.count() > 0: + percent = percent.last() + else: + return Response('dont have PercentageOfLosses ', status=status.HTTP_403_FORBIDDEN) + + check = serializer.create(validated_data=request.data) + check.camplaint = complaint + if check.state == 'accepted': + bar = KillHouseAssignmentInformation.objects.get(key=complaint.bar.key) + complaint_percent = complaint.percent + if float(complaint_percent) > float(percent.percent): + main_percent = float(complaint_percent) - float(percent.percent) + bar.car_weight_with_load = float(bar.car_weight_with_load) - ( + (main_percent / 100) * (float(bar.car_weight_with_load))) + bar.net_weight = float(bar.net_weight) - ( + (main_percent / 100) * (float(bar.net_weight))) + bar.save() + province_factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__key=complaint.bar.key) + poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__key=complaint.bar.key) + + complaint.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors) + + +class KillHouseBarReportingViewSet(viewsets.ModelViewSet): + queryset = KillHouseAssignmentInformation.objects.all() + serializer_class = KillHouseAssignmentInformationSerializer + permission_classes = [AllowAny] + + def create(self, request, *args, **kwargs): + return Response(status=status.HTTP_401_UNAUTHORIZED) + + def update(self, request, *args, **kwargs): + return Response(status=status.HTTP_401_UNAUTHORIZED) + + def destroy(self, request, *args, **kwargs): + return Response(status=status.HTTP_401_UNAUTHORIZED) + + def partial_update(self, request, *args, **kwargs): + return Response(status=status.HTTP_401_UNAUTHORIZED) + + def list(self, request, *args, **kwargs): + total_list = [] + net_weight = 0 + api_key = request.GET['api_key'] + if api_key == PROJECT_API_KEY: + for kill_house in KillHouse.objects.filter(system_address__province__id=1): + internal_list = [] + + date_time = datetime.strptime(request.GET['date'], '%Y-%m-%d') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__killhouse_user=kill_house, create_date__year=date_time.year, + create_date__month=date_time.month, create_date__day=date_time.day) + if assignments.count() > 0: + + for assignment in assignments: + net_weight += assignment.net_weight + + internal_dict = { + + "date": date_time, + "weight": net_weight, + } + internal_list.append(internal_dict) + + kill_house_dict = { + "kill_house_name": kill_house.name, + "fullname": kill_house.kill_house_operator.user.fullname, + "mobile": kill_house.kill_house_operator.user.mobile, + "city": kill_house.system_address.city.name, + "province": kill_house.system_address.province.name, + "bar_info": internal_list, + } + total_list.append(kill_house_dict) + + return Response(total_list, status=status.HTTP_200_OK) + + +class CheckUnusualCasualtiesViewSet(viewsets.ModelViewSet): + queryset = CheckUnusualCasualties.objects.all() + serializer_class = CheckUnusualCasualtiesSerializer + permission_classes = [AllowAny] + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + # return Response(user.fullname) + kill_house_complaint = KillHouseComplaint.objects.get(key=request.data['key']) + request.data.pop('key') + bar_info = KillHouseAssignmentInformation.objects.get(key=kill_house_complaint.bar.key) + state = request.data['state'] + if state == "accepted": + percentage_losses = PercentageOfLosses.objects.all() + if percentage_losses.count() > 0: + percentage_losses = percentage_losses.last().percent + else: + return Response({"result": "enter percentage of losses"}, status=status.HTTP_403_FORBIDDEN) + weight = kill_house_complaint.bar.net_weight - (kill_house_complaint.bar.net_weight * ( + (kill_house_complaint.percent / 100) - (percentage_losses / 100))) + bar_info.weight_withs_losses = weight + bar_info.save() + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + unusualcasualties = serializer.create(validated_data=request.data) + unusualcasualties.complaint = kill_house_complaint + if unusualcasualties.state == 'accepted': + kill_house_complaint.state = 'accepted' + kill_house_complaint.save() + if unusualcasualties.state == 'rejected': + unusualcasualties.message = request.data['message'] + kill_house_complaint.state = 'rejected' + kill_house_complaint.message = request.data['message'] + kill_house_complaint.save() + unusualcasualties.save() + inter_dict = { + "operatorname": user.fullname, + "create_date": str(unusualcasualties.create_date), + "role": request.data['role'], + "state": unusualcasualties.state, + } + unusualcasualties.role = inter_dict + unusualcasualties.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + + +@api_view(["POST"]) +@csrf_exempt +@permission_classes([AllowAny]) +def make_kill_request(request): + user = SystemUserProfile.objects.get(user=request.user) + now = datetime.now().date() + for kill_house in KillHouse.objects.filter(system_address__province=user.province): + debt_amount = 0 + percentage = KillHousePercentage.objects.get(kill_house=kill_house) + total_poultry_request = TotalPoultryRequestQuantity.objects.filter(create_date__year=now.year, + create_date__month=now.month, + create_date__day=now.day).order_by('id') + first_average_weight = 0 + first_assignment_average_weight = 0 + seconde_average_weight = 0 + seconde_assignment_average_weight = 0 + all_assigntments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__killhouse_user=kill_house).order_by('id') + if all_assigntments.count() > 0: + for all_assigntment in all_assigntments: + first_assignment_average_weight += all_assigntment.net_weight / all_assigntment.real_quantity + first_average_weight += round(first_assignment_average_weight / all_assigntments.count(), 2) + four_all_assigntments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__killhouse_user=kill_house).order_by('id')[:4] + + for four_last_assingment in four_all_assigntments: + seconde_assignment_average_weight += four_last_assingment.net_weight / four_last_assingment.real_quantity + seconde_average_weight += round(seconde_assignment_average_weight / four_all_assigntments.count(), 2) + + if total_poultry_request.count() > 0: + total_poultry_request = total_poultry_request.last() + if total_poultry_request.input_quantity != 0: + percentage.quantity = int(((percentage.percent / 100) / 100) * total_poultry_request.input_quantity) + else: + percentage.quantity = int(((percentage.percent / 10000) * total_poultry_request.quantity)) + percentage.save() + poultry_factors = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__killhouse_user=kill_house, + paid_state='pending') + province_factors = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__killhouse_user=kill_house, + paid_state='pending') + if poultry_factors.count() > 0: + for poultry_factor in poultry_factors: + debt_amount += poultry_factor.total_price + if province_factors.count() > 0: + + for province_factor in province_factors: + debt_amount += province_factor.total_price + + kill_req = KillRequest( + kill_capacity=percentage.quantity, + remain_quantity=percentage.quantity, + recive_time='06 - 14', + recive_date=datetime.now(), + first_average_weight=seconde_average_weight, + second_average_weight=first_average_weight, + kill_house=kill_house + + ) + kill_req.save() + if debt_amount > 0: + kill_req.debt_amount = debt_amount + kill_req.debt = True + kill_req.save() + + return JsonResponse({"msg": "Done"}) + + +class KillHouseNewViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.select_related('kill_house_operator__user').filter(trash=False) + # queryset = KillHouse.objects.filter(trash=False) + serializer_class = KillHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + kill_houses = self.queryset.all() + + FullName = [kill_house.kill_house_operator.user.fullname for kill_house in kill_houses] + + return Response(FullName, status=status.HTTP_200_OK) + + +class KillHouseWareHouseViewSet(viewsets.ModelViewSet): + queryset = KillHouseWareHouse.objects.all() + serializer_class = KillHouseWareHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + now = datetime.now().date() + date = datetime.strptime(request.GET['date'], + '%Y-%m-%d').date() if 'date' in request.GET else now + if 'kill_house_key' in request.GET: + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + else: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + kill_house_ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house, + date__date=date, + trash=False).last() + + if kill_house_ware_house is None: + ware_house_date = datetime(year=date.year, month=date.month, day=date.day, hour=1, minute=12, second=20) + kill_house_ware_house = KillHouseWareHouse( + kill_house=kill_house, + date=ware_house_date + ) + kill_house_ware_house.save() + + bar_quantity = 0 + allocated_quantity = 0 + bar_live_weight = 0 + number_of_carcasses = 0 + update_number_of_carcasses = 0 + weight_of_carcasses = 0 + update_weight_of_carcasses = 0 + ave_weight_of_carcasses = 0 + free_number_of_carcasses = 0 + free_weight_of_carcasses = 0 + free_sale_number_of_carcasses = 0 + free_sale_weight_of_carcasses = 0 + free_bar_quantity = 0 + free_sale_bar_quantity = 0 + total_bar_quantity = 0 + total_number_of_carcasses = 0 + total_weight_of_carcasses = 0 + + # assingments = KillHouseAssignmentInformation.objects.filter(kill_house_request__killhouse_user=kill_house, + # state__in=('pending', 'accepted'), + # kill_house_request__kill_request__recive_date__year=date.year, + # kill_house_request__kill_request__recive_date__month=date.month, + # kill_house_request__kill_request__recive_date__day=date.day, + # trash=False).select_related('kill_house_request') + one_day_ago = date - timedelta(days=1) + + kill_house_requests = KillHouseRequest.objects.filter(killhouse_user=kill_house, + kill_request__recive_date__date=one_day_ago, + ware_house_confirmation=True, trash=False) + if kill_house_requests.count() > 0: + for kill_house_request in kill_house_requests: + bar_quantity += 1 + allocated_quantity += kill_house_request.accepted_real_quantity + bar_live_weight += kill_house_request.accepted_real_weight + number_of_carcasses += kill_house_request.ware_house_accepted_real_quantity + weight_of_carcasses += kill_house_request.ware_house_accepted_real_weight + # kill_house_loss_percentage = KillHousePercentageOfLosses.objects.all().last() + # if kill_house_loss_percentage: + # weight_of_carcasses += kill_house_request.accepted_real_weight - ( + # (kill_house_loss_percentage.percent / 100) * kill_house_request.accepted_real_weight) + # else: + # weight_of_carcasses += kill_house_request.accepted_real_weight - ( + # (25 / 100) * kill_house_request.accepted_real_weight) + + ave_weight_of_carcasses += weight_of_carcasses / number_of_carcasses + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, date__date=date, ware_house=True, + trash=False) + freezing_quantity = 0 + freezing_weight = 0 + freezing_bars = ColdHouseAllocations.objects.filter(kill_house_ware_house=kill_house_ware_house, + state__in=('pending', 'accepted'), date__date=date, + trash=False) + if len(freezing_bars) > 0: + for freezing_bar in freezing_bars: + freezing_quantity += freezing_bar.accepted_quantity if freezing_bar.accepted_quantity > 0 else freezing_bar.quantity + freezing_weight += freezing_bar.accepted_weight if freezing_bar.accepted_weight > 0 else freezing_bar.weight + if free_bars.count() > 0: + for free_bar in free_bars: + free_bar_quantity += 1 + free_number_of_carcasses += free_bar.number_of_carcasses + free_weight_of_carcasses += free_bar.weight_of_carcasses + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, + date__date=date, + trash=False) + if kill_house_free_sale_bar_info.count() > 0: + for kill_house_free_sale in kill_house_free_sale_bar_info: + free_sale_bar_quantity += 1 + free_sale_number_of_carcasses += kill_house_free_sale.number_of_carcasses + free_sale_weight_of_carcasses += kill_house_free_sale.weight_of_carcasses + + update_number_of_carcasses = kill_house_ware_house.updated_number_of_carcasses + update_weight_of_carcasses = kill_house_ware_house.updated_weight_of_carcasses + total_bar_quantity = bar_quantity + free_bar_quantity + free_sale_bar_quantity + total_number_of_carcasses = number_of_carcasses + free_number_of_carcasses + kill_house_ware_house.pre_cold_number_of_carcasses_to_ware_house + update_total_number_of_carcasses = update_number_of_carcasses + free_number_of_carcasses + kill_house_ware_house.pre_cold_number_of_carcasses_to_ware_house if update_number_of_carcasses > 0 else 0 + total_weight_of_carcasses = weight_of_carcasses + free_weight_of_carcasses + kill_house_ware_house.pre_cold_weight_of_carcasses_to_ware_house + update_total_weight_of_carcasses = update_weight_of_carcasses + free_weight_of_carcasses + kill_house_ware_house.pre_cold_weight_of_carcasses_to_ware_house if update_weight_of_carcasses > 0 else 0 + + kill_house_ware_house.bar_quantity = bar_quantity + kill_house_ware_house.allocated_quantity = allocated_quantity + kill_house_ware_house.bar_live_weight = bar_live_weight + kill_house_ware_house.number_of_carcasses = number_of_carcasses + kill_house_ware_house.update_number_of_carcasses = update_number_of_carcasses + kill_house_ware_house.weight_of_carcasses = weight_of_carcasses + kill_house_ware_house.update_weight_of_carcasses = update_weight_of_carcasses + kill_house_ware_house.ave_weight_of_carcasses = weight_of_carcasses / number_of_carcasses if number_of_carcasses > 0 else 0 + kill_house_ware_house.update_ave_weight_of_carcasses = update_weight_of_carcasses / update_number_of_carcasses if update_number_of_carcasses > 0 else 0 + kill_house_ware_house.free_bar_quantity = free_bar_quantity + kill_house_ware_house.number_of_free_carcasses = free_number_of_carcasses + kill_house_ware_house.free_weight_of_carcasses = free_weight_of_carcasses + kill_house_ware_house.free_sale_quantity = free_sale_number_of_carcasses + kill_house_ware_house.free_sale_weight = free_sale_weight_of_carcasses + kill_house_ware_house.total_bar_quantity = total_bar_quantity + kill_house_ware_house.freezing_quantity = freezing_quantity + kill_house_ware_house.freezing_weight = freezing_weight + kill_house_ware_house.total_number_of_carcasses = total_number_of_carcasses + kill_house_ware_house.update_total_number_of_carcasses = update_total_number_of_carcasses + kill_house_ware_house.total_weight_of_carcasses = total_weight_of_carcasses + kill_house_ware_house.update_total_weight_of_carcasses = update_total_weight_of_carcasses + if update_total_weight_of_carcasses == 0: + kill_house_ware_house.remain_total_weight_of_carcasses = total_weight_of_carcasses - kill_house_ware_house.allocated_total_weight_of_carcasses if kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house == 0 else 0 + else: + kill_house_ware_house.remain_total_weight_of_carcasses = update_total_weight_of_carcasses - kill_house_ware_house.allocated_total_weight_of_carcasses if kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house == 0 else 0 + if update_total_number_of_carcasses == 0: + kill_house_ware_house.remain_total_number_of_carcasses = total_number_of_carcasses - kill_house_ware_house.allocated_total_number_of_carcasses if kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house == 0 else 0 + else: + kill_house_ware_house.remain_total_number_of_carcasses = update_total_number_of_carcasses - kill_house_ware_house.allocated_total_number_of_carcasses if kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house == 0 else 0 + kill_house_ware_house.final_total_number_of_carcasses = kill_house_ware_house.update_total_number_of_carcasses if kill_house_ware_house.update_total_number_of_carcasses > 0 else kill_house_ware_house.total_number_of_carcasses + kill_house_ware_house.final_total_weight_of_carcasses = kill_house_ware_house.update_total_weight_of_carcasses if kill_house_ware_house.update_total_weight_of_carcasses > 0 else kill_house_ware_house.total_weight_of_carcasses + kill_house_ware_house.save() + + if 'state' in request.GET: + total_number_of_carcasses_temp = kill_house_ware_house.update_total_number_of_carcasses if kill_house_ware_house.update_total_number_of_carcasses > 0 else kill_house_ware_house.total_number_of_carcasses + total_weight_of_carcasses_temp = kill_house_ware_house.update_total_weight_of_carcasses if kill_house_ware_house.update_total_weight_of_carcasses > 0 else kill_house_ware_house.total_weight_of_carcasses + update_fields = { + "ware_house_key": kill_house_ware_house.key, + "total_number_of_carcasses": kill_house_ware_house.final_total_number_of_carcasses, + "pre_cold_number_of_carcasses_self_ware_house": kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house, + "pre_cold_weight_of_carcasses_self_ware_house": kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house, + "total_weight_of_carcasses": kill_house_ware_house.final_total_weight_of_carcasses, + "allocated_total_number_of_carcasses": kill_house_ware_house.allocated_total_number_of_carcasses, + "allocated_total_weight_of_carcasses": kill_house_ware_house.allocated_total_weight_of_carcasses, + "remain_total_number_of_carcasses": kill_house_ware_house.remain_total_number_of_carcasses, + "remain_total_weight_of_carcasses": kill_house_ware_house.remain_total_weight_of_carcasses, + "freezing_quantity": kill_house_ware_house.freezing_quantity, + "freezing_weight": kill_house_ware_house.freezing_weight, + "free_sale_quantity": kill_house_ware_house.free_sale_quantity, + "free_sale_weight": kill_house_ware_house.free_sale_weight, + "total_average_weight_of_carcasses": round( + kill_house_ware_house.final_total_weight_of_carcasses / kill_house_ware_house.final_total_number_of_carcasses, + 2) if kill_house_ware_house.final_total_number_of_carcasses > 0 else 0, + + } + return Response(update_fields, status=status.HTTP_200_OK) + + serializer = KillHouseWareHouseSerializer(kill_house_ware_house) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + ware_house = KillHouseWareHouse.objects.get(key=request.data['key']) + ware_house.updated_number_of_carcasses = int(request.data['updated_number_of_carcasses']) + ware_house.updated_weight_of_carcasses = request.data['updated_weight_of_carcasses'] + ware_house.total_weight_of_carcasses = request.data[ + 'updated_weight_of_carcasses'] + ware_house.free_weight_of_carcasses + ware_house.total_number_of_carcasses = int(request.data[ + 'updated_number_of_carcasses']) + ware_house.number_of_free_carcasses + ware_house.save() + serializer = self.serializer_class(ware_house) + serializer.update(instance=ware_house, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseWareHouseForDispensersViewSet(viewsets.ModelViewSet): + queryset = KillHouseWareHouse.objects.all() + serializer_class = KillHouseWareHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if request.GET['role'] in ('CityCommerce', 'CityJahad', 'CityPoultry', 'CityOperator'): + kill_house_ware_houses = KillHouseWareHouse.objects.filter(kill_house__system_address__city=user.city, + date__date__gte=date1, date__date__lte=date2, + trash=False) + else: + kill_house_ware_houses = KillHouseWareHouse.objects.filter(date__date__gte=date1, date__date__lte=date2, + trash=False) + result = { + "kill_houses": len(kill_house_ware_houses.values_list('kill_house', flat=True).distinct()), + + "total_number_of_carcasses": kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] or 0, + "total_weight_of_carcasses": kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] or 0, + "pre_cold_number_of_carcasses_self_ware_house": + kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_self_ware_house'))[ + 'total'] or 0, + "pre_cold_weight_of_carcasses_self_ware_house": + kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_self_ware_house'))[ + 'total'] or 0, + "allocated_total_number_of_carcasses": + kill_house_ware_houses.aggregate(total=Sum('allocated_total_number_of_carcasses'))['total'] or 0, + "allocated_total_weight_of_carcasses": + kill_house_ware_houses.aggregate(total=Sum('allocated_total_weight_of_carcasses'))['total'] or 0, + "remain_total_number_of_carcasses": + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))['total'] or 0, + "remain_total_weight_of_carcasses": + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))['total'] or 0, + "freezing_quantity": kill_house_ware_houses.aggregate(total=Sum('freezing_quantity'))['total'] or 0, + "freezing_weight": kill_house_ware_houses.aggregate(total=Sum('freezing_weight'))['total'] or 0, + "free_sale_quantity": kill_house_ware_houses.aggregate(total=Sum('free_sale_quantity'))['total'] or 0, + "free_sale_weight": kill_house_ware_houses.aggregate(total=Sum('free_sale_weight'))['total'] or 0 + } + + return Response(result, status=status.HTTP_200_OK) + + +class PreColdKillHouseWareHouseViewSet(viewsets.ModelViewSet): + queryset = KillHouseWareHouse.objects.all() + serializer_class = KillHouseWareHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + now = datetime.now().date() + kill_house_ware_house = KillHouseWareHouse.objects.get(key=request.data['ware_house_key']) + if kill_house_ware_house.date.date() != now: + return Response({"result": "به علت مغایرت تاریخ امکان پیش سرد وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + tomorrow = kill_house_ware_house.date + timedelta(days=1) + kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house = kill_house_ware_house.remain_total_number_of_carcasses + kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house = kill_house_ware_house.remain_total_weight_of_carcasses + kill_house_ware_house.remain_total_number_of_carcasses = 0 + kill_house_ware_house.remain_total_weight_of_carcasses = 0 + kill_house_ware_house.save() + tomorrow_kill_house_ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house_ware_house.kill_house, + date__date=tomorrow.date()).first() + if not tomorrow_kill_house_ware_house: + tomorrow_kill_house_ware_house = KillHouseWareHouse( + kill_house=kill_house_ware_house.kill_house, + date=kill_house_ware_house.date + timedelta(days=1) + ) + tomorrow_kill_house_ware_house.save() + tomorrow_kill_house_ware_house.final_total_number_of_carcasses += kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house + tomorrow_kill_house_ware_house.total_number_of_carcasses += kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house + tomorrow_kill_house_ware_house.final_total_weight_of_carcasses += kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house + tomorrow_kill_house_ware_house.total_weight_of_carcasses += kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house + tomorrow_kill_house_ware_house.remain_total_number_of_carcasses += kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house + tomorrow_kill_house_ware_house.remain_total_weight_of_carcasses += kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house + tomorrow_kill_house_ware_house.pre_cold_number_of_carcasses_to_ware_house = kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house + tomorrow_kill_house_ware_house.pre_cold_weight_of_carcasses_to_ware_house = kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house + tomorrow_kill_house_ware_house.save() + return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_201_CREATED) + + +class KillHouseFreeSaleBarInformationViewSet(viewsets.ModelViewSet): + queryset = KillHouseFreeSaleBarInformation.objects.all() + serializer_class = KillHouseFreeSaleBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFreeSaleBarInformationFilterSet + filterset_fields = [ + 'type_car', + 'pelak', + 'clearance_code', + 'kill_house__name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'buyer__fullname', + 'buyer__first_name', + 'buyer__last_name', + 'buyer__mobile', + 'buyer__unit_name', + 'buyer_name', + 'buyer_mobile', + 'province', + 'city', + + ] + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + now_time = datetime.now().time() + quota = request.data['quota'] + buyer = None + dispenser = request.data.pop('dispenser',None) + representative = request.data.pop('representative',None) + if 'kill_house_key' in request.data.keys(): + kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) + request.data.pop('kill_house_key') + elif 'buyer_key' in request.data.keys(): + kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() + buyer = OutProvinceCarcassesBuyer.objects.get(key=request.data['buyer_key']) + request.data.pop('buyer_key') + product = RolesProducts.objects.get(key=request.data['product_key']) + request.data.pop('product_key') + date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date() + production_date = datetime.strptime(str(request.data['production_date']), '%Y-%m-%d').date() + date = datetime(year=date.year, month=date.month, day=date.day, hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + production_date = datetime(year=production_date.year, month=production_date.month, day=production_date.day, + hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + request.data.pop('date') + request.data.pop('production_date') + if OperationLimitation.objects.all().first().kill_house_free_sale_limitation == True: + + if now != date.date(): + return Response({"result": "به علت مغایرت تاریخ امکان فروش بار وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + carcass_distribution = RestrictionCarcassDistribution.objects.filter(trash=False, + distribution_type='KillHouse', + allow=True, + out=True).first() + if carcass_distribution and datetime.now().time() > carcass_distribution.time: + return Response({"result": "لطفا در ساعات مجاز اقدام نمایید!"}, + status=status.HTTP_403_FORBIDDEN) + # ware_house = KillHouseWareHouse.objects.get(kill_house=kill_house, date__date=date) + # if request.data['weight_of_carcasses'] > ware_house.remain_total_weight_of_carcasses: + # return Response({"result": "تعداد یا مقدار وارد شده از موجودی انبار بیشتر است !"}, + # status=status.HTTP_403_FORBIDDEN) + kill_house_total_input_warehouse_governmental_weight = kill_house.total_input_warehouse_governmental_weight + kill_house_total_input_warehouse_free_weight = kill_house.total_input_warehouse_free_weight + + if request.data['sale_type'] == 'free': + quota = request.data['quota'] + if quota == 'governmental': + if not kill_house.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + if kill_house.total_input_warehouse_governmental_weight < ( + kill_house.total_selling_warehouse_governmental_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_input_warehouse_free_weight < ( + kill_house.total_selling_warehouse_free_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + free_sale_type = request.data['sale_type'] + if kill_house.governmental_selling_permission: + if free_sale_type == 'free': + if not kill_house.free_sale_form_governmental_quota: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + if kill_house.total_commitment_selling_out_province_governmental_weight > 0: + if kill_house.total_selling_out_province_governmental_weight + request.data[ + 'weight_of_carcasses'] > kill_house.total_commitment_selling_out_province_governmental_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if kill_house.free_selling_permission: + if kill_house.total_commitment_selling_in_province_free_weight > kill_house.total_selling_in_province_free_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if kill_house.total_commitment_selling_out_province_free_weight > 0: + if kill_house.total_selling_out_province_free_weight + request.data[ + 'weight_of_carcasses'] > kill_house.total_commitment_selling_out_province_free_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + ware_house_remain_weight = product.total_remain_weight + allocations_weight = StewardAllocation.objects.filter(trash=False, receiver_state__in=('pending', 'accepted'), + kill_house=kill_house, date__date=now).aggregate( + total=Sum('real_weight_of_carcasses'))['total'] or 0 + free_sales_weight = \ + KillHouseFreeSaleBarInformation.objects.filter(trash=False, kill_house=kill_house, + date__date=now).aggregate( + total=Sum('real_weight_of_carcasses'))['total'] or 0 + total_weight = ware_house_remain_weight + allocations_weight + free_sales_weight + free_sales_weight += request.data['weight_of_carcasses'] + + # if kill_house.in_province_selling_limitation and kill_house.in_province_selling_limitation_percent > 0: + # in_province_limitation_weight = int( + # total_weight * (kill_house.in_province_selling_limitation_percent / 100)) + # if allocations_weight < in_province_limitation_weight: + # return Response( + # {"result": "به دلیل عدم رعایت حداقل فروش/توزیع داخل استان امکان فروش به خارج استان وجود ندارد!"}, + # status=status.HTTP_403_FORBIDDEN) + # + # if kill_house.out_province_selling_limitation and kill_house.out_province_selling_limitation_percent > 0: + # max_out_province_limitation_weight = int( + # total_weight * (kill_house.out_province_selling_limitation_percent / 100)) + # if free_sales_weight > max_out_province_limitation_weight: + # return Response({"result": "سقف فروش به خارج استان امروز شما پر شده است!"}, + # status=status.HTTP_403_FORBIDDEN) + if KillHouseFreeSaleBarInformation.objects.filter(trash=False, clearance_code=request.data['clearance_code'], + quarantine_weight_of_carcasses__gt=0).exists(): + return Response({"result": "کد قرنطینه در سامانه ثبت شده است!"}, + status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_free_sale_bar_info = serializer.create(validated_data=request.data) + kill_house_free_sale_bar_info.kill_house = kill_house + if buyer is not None: + kill_house_free_sale_bar_info.buyer = buyer + kill_house_free_sale_bar_info.buyer_name = buyer.fullname + kill_house_free_sale_bar_info.buyer_mobile = buyer.mobile + kill_house_free_sale_bar_info.city = buyer.city + kill_house_free_sale_bar_info.province = buyer.province + + kill_house_free_sale_bar_info.date = date + kill_house_free_sale_bar_info.production_date = production_date + kill_house_free_sale_bar_info.product = product + kill_house_free_sale_bar_info.dispenser = dispenser if dispenser else None + kill_house_free_sale_bar_info.representative = representative if representative else None + kill_house_free_sale_bar_info.real_number_of_carcasses = kill_house_free_sale_bar_info.number_of_carcasses + kill_house_free_sale_bar_info.real_weight_of_carcasses = kill_house_free_sale_bar_info.weight_of_carcasses + # ware_house.allocated_total_number_of_carcasses += kill_house_free_sale_bar_info.number_of_carcasses + # ware_house.allocated_total_weight_of_carcasses += kill_house_free_sale_bar_info.weight_of_carcasses + # ware_house.save() + + wage = 0 + wage_type = WageType.objects.filter(en_name='carcasse-sell', trash=False).first() + if wage_type.status == True: + wage = wage_type.amount + kill_house_free_sale_bar_info.wage = wage + kill_house_free_sale_bar_info.total_wage_amount = wage * kill_house_free_sale_bar_info.real_weight_of_carcasses + + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + + if wage_type and wage_type.status == 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_sale_bar_info.union_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.union_share_percent = percentage_wage_type.percent + elif percentage_wage_type.share_type.en_name == 'company': + kill_house_free_sale_bar_info.company_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.company_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'guilds': + kill_house_free_sale_bar_info.guilds_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.guilds_share_percent = percentage_wage_type.percent + elif percentage_wage_type.share_type.en_name == 'city': + kill_house_free_sale_bar_info.city_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.city_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'wallet': + kill_house_free_sale_bar_info.wallet_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.wallet_share_percent = percentage_wage_type.percent + + else: + kill_house_free_sale_bar_info.other_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.other_share_percent = percentage_wage_type.percent + kill_house_free_sale_bar_info.save() + allow_register_code = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False, + active=True).first() + if allow_register_code: + number = random.randint(10000, 99000) + kill_house_free_sale_bar_info.registration_code = number + kill_house_free_sale_bar_info.system_registration_code = True + if int(allow_register_code.time) > 0: + kill_house_free_sale_bar_info.active_expire_date_time = True + kill_house_free_sale_bar_info.expire_date_time_registration_code = datetime.now() + timedelta( + minutes=int(allow_register_code.time)) + kill_house_free_sale_bar_info.save() + send_sms_for_sale_bar(kill_house_free_sale_bar_info) + get_gid_out_province(kill_house_free_sale_bar_info.id) + kill_house_free_sale_product_warehousing(product) + return Response(serializer.data, status=status.HTTP_201_CREATED) + # return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + kill_house_key = request.GET.get('kill_house_key') + if 'type' in request.GET: + role = request.GET['role'] + if date1: + date1 = datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.strptime(str(date2), '%Y-%m-%d').date() + + if role in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin', + 'ImprovingLivestock', 'AdminX', 'Supporter']: + if kill_house_key and kill_house_key != 'all': + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + kill_house__key=kill_house_key, + trash=False) + else: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + trash=False) + + + elif role in ['CityJahad', 'CityPoultry', 'CityOperator']: + + if kill_house_key and kill_house_key != 'all': + + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + date__date__gte=date1, + date__date__lte=date2, + kill_house__key=kill_house_key, + trash=False) + + else: + + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + + + + + else: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + + else: + if role in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin', + 'ImprovingLivestock', 'AdminX', 'Supporter']: + + if kill_house_key and kill_house_key != 'all': + + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + trash=False, kill_house__key=kill_house_key) + else: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + trash=False) + + + elif role in ['CityJahad', 'CityPoultry', 'CityOperator']: + if kill_house_key and kill_house_key != 'all': + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + trash=False, kill_house__key=kill_house_key) + else: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + trash=False) + + + + else: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + trash=False) + + if 'search' in request.GET: + kill_house_free_sale_bar_info_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_free_sale_bar_info + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_free_sale_bar_info) + kill_house_free_sale_bar_info_list = ps.filter() + kill_house_free_sale_bar_info = [] if len( + kill_house_free_sale_bar_info_list) == 0 else kill_house_free_sale_bar_info_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_free_sale_bar_info) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + else: + now = datetime.now().date() + date = datetime.strptime(str(request.GET['date']), + '%Y-%m-%d').date() if 'date' in request.GET else now + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key']) + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, + date__year=date.year, + date__month=date.month, + date__day=date.day, + trash=False) + + serializer = self.serializer_class(kill_house_free_sale_bar_info, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + free_sale_bar = KillHouseFreeSaleBarInformation.objects.get(key=request.data['key']) + product = free_sale_bar.product + kill_house = free_sale_bar.kill_house + if KillHouseFreeSaleBarInformation.objects.filter(trash=False, + clearance_code=request.data.get('clearance_code'), + quarantine_weight_of_carcasses__gt=0).exists() and 'register_code' not in request.data.keys(): + return Response({"result": "کد قرنطینه در سامانه ثبت شده است!"}, + status=status.HTTP_403_FORBIDDEN) + now = datetime.now().date() + if free_sale_bar.quota == 'governmental': + if free_sale_bar.kill_house.total_input_warehouse_governmental_weight < ( + ( + free_sale_bar.kill_house.total_selling_warehouse_governmental_weight - free_sale_bar.weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if free_sale_bar.kill_house.total_input_warehouse_free_weight < ( + (free_sale_bar.kill_house.total_selling_warehouse_free_weight - free_sale_bar.weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + allow_register_code = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False, + active=True).first() + if allow_register_code: + if 'register_code' in request.data.keys(): + code = request.data['register_code'] + if code != free_sale_bar.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + free_sale_bar.logged_registration_code = code + request.data.pop('register_code') + free_sale_bar.save() + serializer = self.serializer_class(free_sale_bar) + + serializer.update(instance=free_sale_bar, validated_data=request.data) + kill_house_free_sale_product_warehousing(product) + free_sale_bar.real_number_of_carcasses = free_sale_bar.number_of_carcasses + free_sale_bar.real_weight_of_carcasses = free_sale_bar.weight_of_carcasses + free_sale_bar.total_wage_amount = free_sale_bar.wage * free_sale_bar.real_weight_of_carcasses + free_sale_bar.save() + kill_house_free_sale_product_warehousing(product) + + union_percent = free_sale_bar.union_share_percent / 100 if free_sale_bar.union_share_percent > 0 else 0 + company_percent = free_sale_bar.company_share_percent / 100 if free_sale_bar.company_share_percent > 0 else 0 + guilds_percent = free_sale_bar.guilds_share_percent / 100 if free_sale_bar.guilds_share_percent > 0 else 0 + city_share_percent = free_sale_bar.city_share_percent / 100 if free_sale_bar.city_share_percent > 0 else 0 + wallet_share_percent = free_sale_bar.wallet_share_percent / 100 if free_sale_bar.wallet_share_percent > 0 else 0 + other_share_percent = free_sale_bar.other_share_percent / 100 if free_sale_bar.other_share_percent > 0 else 0 + free_sale_bar.union_share = int(union_percent * free_sale_bar.total_wage_amount) + free_sale_bar.company_share = int(company_percent * free_sale_bar.total_wage_amount) + free_sale_bar.guilds_share = int(guilds_percent * free_sale_bar.total_wage_amount) + free_sale_bar.city_share = int(city_share_percent * free_sale_bar.total_wage_amount) + free_sale_bar.wallet_share = int(wallet_share_percent * free_sale_bar.total_wage_amount) + free_sale_bar.other_share = int(other_share_percent * free_sale_bar.total_wage_amount) + + get_gid_out_province(free_sale_bar.id) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + free_sale_bar = KillHouseFreeSaleBarInformation.objects.get(key=request.GET['key']) + product = free_sale_bar.product + + # ware_house = KillHouseWareHouse.objects.get(kill_house=free_sale_bar.kill_house, + # date__date=free_sale_bar.date.date(), trash=False) + # + # if ware_house.allocated_total_number_of_carcasses != free_sale_bar.real_number_of_carcasses or ware_house.allocated_total_weight_of_carcasses != free_sale_bar.real_weight_of_carcasses: + # if ware_house.remain_total_number_of_carcasses < free_sale_bar.real_number_of_carcasses or ware_house.remain_total_weight_of_carcasses < free_sale_bar.real_weight_of_carcasses: + # return Response({"result": "به علت تخصیص بار به مباشرین و صنف ها امکان حذف بار وجود ندارد!"}, + # status=status.HTTP_403_FORBIDDEN) + free_sale_bar.trash = True + free_sale_bar.save() + kill_house_free_sale_product_warehousing(product) + + # + # ware_house.allocated_total_number_of_carcasses -= free_sale_bar.real_number_of_carcasses + # ware_house.allocated_total_weight_of_carcasses -= free_sale_bar.real_weight_of_carcasses + # ware_house.save() + + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class PosKillHouseFreeSaleBarInformationViewSet(viewsets.ModelViewSet): + queryset = KillHouseFreeSaleBarInformation.objects.all() + serializer_class = KillHouseFreeSaleBarInformationSerializer + permission_classes = [AllowAny] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFreeSaleBarInformationFilterSet + filterset_fields = [ + 'type_car', + 'pelak', + 'clearance_code', + 'kill_house__name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'buyer__fullname', + 'buyer__first_name', + 'buyer__last_name', + 'buyer__mobile', + 'buyer__unit_name', + 'buyer_name', + 'buyer_mobile', + 'province', + 'city', + + ] + + def create(self, request, *args, **kwargs): + # user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + now_time = datetime.now().time() + quota = request.data['quota'] + pos = POSMachine.objects.get(pos_id=request.data['pos-id'], trash=False) + kill_house = pos.kill_house + buyer = OutProvinceCarcassesBuyer.objects.get(key=request.data['buyer_key']) + request.data.pop('buyer_key') + product = RolesProducts.objects.get(key=request.data['product_key']) + request.data.pop('product_key') + request.data.pop('pos-id') + date = datetime.now() + # date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date() + production_date = datetime.strptime(str(request.data['production_date']), '%Y-%m-%d').date() + # date = datetime(year=date.year, month=date.month, day=date.day, hour=now_time.hour, + # minute=now_time.minute, + # second=now_time.second) + production_date = datetime(year=production_date.year, month=production_date.month, day=production_date.day, + hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + # request.data.pop('date') + request.data.pop('production_date') + if OperationLimitation.objects.all().first().kill_house_free_sale_limitation == True: + + if now != date.date(): + return Response({"result": "به علت مغایرت تاریخ امکان فروش بار وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + carcass_distribution = RestrictionCarcassDistribution.objects.filter(trash=False, + distribution_type='KillHouse', + allow=True, + out=True).first() + if carcass_distribution and datetime.now().time() > carcass_distribution.time: + return Response({"result": "لطفا در ساعات مجاز اقدام نمایید!"}, + status=status.HTTP_403_FORBIDDEN) + + if request.data['sale_type'] == 'free': + quota = request.data['quota'] + if quota == 'governmental': + if not kill_house.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + if kill_house.total_input_warehouse_governmental_weight < ( + kill_house.total_selling_warehouse_governmental_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_input_warehouse_free_weight < ( + kill_house.total_selling_warehouse_free_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + free_sale_type = request.data['sale_type'] + if kill_house.governmental_selling_permission: + if free_sale_type == 'free': + if not kill_house.free_sale_form_governmental_quota: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + if kill_house.total_commitment_selling_out_province_governmental_weight > 0: + if kill_house.total_selling_out_province_governmental_weight + request.data[ + 'weight_of_carcasses'] > kill_house.total_commitment_selling_out_province_governmental_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if kill_house.free_selling_permission: + if kill_house.total_commitment_selling_in_province_free_weight > kill_house.total_selling_in_province_free_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if kill_house.total_commitment_selling_out_province_free_weight > 0: + if kill_house.total_selling_out_province_free_weight + request.data[ + 'weight_of_carcasses'] > kill_house.total_commitment_selling_out_province_free_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + ware_house_remain_weight = product.total_remain_weight + allocations_weight = StewardAllocation.objects.filter(trash=False, receiver_state__in=('pending', 'accepted'), + kill_house=kill_house, date__date=now).aggregate( + total=Sum('real_weight_of_carcasses'))['total'] or 0 + free_sales_weight = \ + KillHouseFreeSaleBarInformation.objects.filter(trash=False, kill_house=kill_house, + date__date=now).aggregate( + total=Sum('real_weight_of_carcasses'))['total'] or 0 + total_weight = ware_house_remain_weight + allocations_weight + free_sales_weight + free_sales_weight += request.data['weight_of_carcasses'] + + if KillHouseFreeSaleBarInformation.objects.filter(trash=False, clearance_code=request.data['clearance_code'], + quarantine_weight_of_carcasses__gt=0).exists(): + return Response({"result": "کد قرنطینه در سامانه ثبت شده است!"}, + status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_free_sale_bar_info = serializer.create(validated_data=request.data) + kill_house_free_sale_bar_info.kill_house = kill_house + if buyer is not None: + kill_house_free_sale_bar_info.buyer = buyer + kill_house_free_sale_bar_info.buyer_name = buyer.fullname + kill_house_free_sale_bar_info.buyer_mobile = buyer.mobile + kill_house_free_sale_bar_info.city = buyer.city + kill_house_free_sale_bar_info.province = buyer.province + + kill_house_free_sale_bar_info.date = date + kill_house_free_sale_bar_info.production_date = production_date + kill_house_free_sale_bar_info.product = product + kill_house_free_sale_bar_info.real_number_of_carcasses = kill_house_free_sale_bar_info.number_of_carcasses + kill_house_free_sale_bar_info.real_weight_of_carcasses = kill_house_free_sale_bar_info.weight_of_carcasses + + wage = 0 + wage_type = WageType.objects.filter(en_name='carcasse-sell', trash=False).first() + if wage_type.status == True: + wage = wage_type.amount + kill_house_free_sale_bar_info.wage = wage + kill_house_free_sale_bar_info.total_wage_amount = wage * kill_house_free_sale_bar_info.real_weight_of_carcasses + + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + + if wage_type and wage_type.status == 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_sale_bar_info.union_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.union_share_percent = percentage_wage_type.percent + elif percentage_wage_type.share_type.en_name == 'company': + kill_house_free_sale_bar_info.company_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.company_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'guilds': + kill_house_free_sale_bar_info.guilds_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.guilds_share_percent = percentage_wage_type.percent + elif percentage_wage_type.share_type.en_name == 'city': + kill_house_free_sale_bar_info.city_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.city_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'wallet': + kill_house_free_sale_bar_info.wallet_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.wallet_share_percent = percentage_wage_type.percent + + else: + kill_house_free_sale_bar_info.other_share = int( + (percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount) + kill_house_free_sale_bar_info.other_share_percent = percentage_wage_type.percent + kill_house_free_sale_bar_info.save() + allow_register_code = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False, + active=True).first() + if allow_register_code: + number = random.randint(10000, 99000) + kill_house_free_sale_bar_info.registration_code = number + kill_house_free_sale_bar_info.system_registration_code = True + if int(allow_register_code.time) > 0: + kill_house_free_sale_bar_info.active_expire_date_time = True + kill_house_free_sale_bar_info.expire_date_time_registration_code = datetime.now() + timedelta( + minutes=int(allow_register_code.time)) + kill_house_free_sale_bar_info.save() + send_sms_for_sale_bar(kill_house_free_sale_bar_info) + get_gid_out_province(kill_house_free_sale_bar_info.id) + kill_house_free_sale_product_warehousing(product) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False) + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET['role'] + if date1: + date1 = datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.strptime(str(date2), '%Y-%m-%d').date() + + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=pos.kill_house, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=pos.kill_house, + trash=False) + + if 'search' in request.GET: + kill_house_free_sale_bar_info_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_free_sale_bar_info + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_free_sale_bar_info) + kill_house_free_sale_bar_info_list = ps.filter() + kill_house_free_sale_bar_info = [] if len( + kill_house_free_sale_bar_info_list) == 0 else kill_house_free_sale_bar_info_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_free_sale_bar_info) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(kill_house_free_sale_bar_info, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + free_sale_bar = KillHouseFreeSaleBarInformation.objects.get(key=request.data['key']) + product = free_sale_bar.product + kill_house = free_sale_bar.kill_house + if KillHouseFreeSaleBarInformation.objects.filter(trash=False, + clearance_code=request.data.get('clearance_code'), + quarantine_weight_of_carcasses__gt=0).exists(): + return Response({"result": "کد قرنطینه در سامانه ثبت شده است!"}, + status=status.HTTP_403_FORBIDDEN) + now = datetime.now().date() + + if free_sale_bar.quota == 'governmental': + if free_sale_bar.kill_house.total_input_warehouse_governmental_weight < ( + ( + free_sale_bar.kill_house.total_selling_warehouse_governmental_weight - free_sale_bar.weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if free_sale_bar.kill_house.total_input_warehouse_free_weight < ( + (free_sale_bar.kill_house.total_selling_warehouse_free_weight - free_sale_bar.weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + allow_register_code = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False, + active=True).first() + if allow_register_code: + if 'register_code' in request.data.keys(): + code = request.data['register_code'] + if code != free_sale_bar.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + free_sale_bar.logged_registration_code = code + request.data.pop('register_code') + free_sale_bar.save() + serializer = self.serializer_class(free_sale_bar) + + serializer.update(instance=free_sale_bar, validated_data=request.data) + kill_house_free_sale_product_warehousing(product) + free_sale_bar.real_number_of_carcasses = free_sale_bar.number_of_carcasses + free_sale_bar.real_weight_of_carcasses = free_sale_bar.weight_of_carcasses + free_sale_bar.total_wage_amount = free_sale_bar.wage * free_sale_bar.real_weight_of_carcasses + free_sale_bar.save() + kill_house_free_sale_product_warehousing(product) + + union_percent = free_sale_bar.union_share_percent / 100 if free_sale_bar.union_share_percent > 0 else 0 + company_percent = free_sale_bar.company_share_percent / 100 if free_sale_bar.company_share_percent > 0 else 0 + guilds_percent = free_sale_bar.guilds_share_percent / 100 if free_sale_bar.guilds_share_percent > 0 else 0 + city_share_percent = free_sale_bar.city_share_percent / 100 if free_sale_bar.city_share_percent > 0 else 0 + wallet_share_percent = free_sale_bar.wallet_share_percent / 100 if free_sale_bar.wallet_share_percent > 0 else 0 + other_share_percent = free_sale_bar.other_share_percent / 100 if free_sale_bar.other_share_percent > 0 else 0 + free_sale_bar.union_share = int(union_percent * free_sale_bar.total_wage_amount) + free_sale_bar.company_share = int(company_percent * free_sale_bar.total_wage_amount) + free_sale_bar.guilds_share = int(guilds_percent * free_sale_bar.total_wage_amount) + free_sale_bar.city_share = int(city_share_percent * free_sale_bar.total_wage_amount) + free_sale_bar.wallet_share = int(wallet_share_percent * free_sale_bar.total_wage_amount) + free_sale_bar.other_share = int(other_share_percent * free_sale_bar.total_wage_amount) + + get_gid_out_province(free_sale_bar.id) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + free_sale_bar = KillHouseFreeSaleBarInformation.objects.get(key=request.GET['key']) + product = free_sale_bar.product + free_sale_bar.trash = True + free_sale_bar.save() + kill_house_free_sale_product_warehousing(product) + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class KillHouseFreeSaleBarInformationDashboardViewSet(viewsets.ModelViewSet): + queryset = KillHouseFreeSaleBarInformation.objects.all() + serializer_class = KillHouseFreeSaleBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFreeSaleBarInformationFilterSet + filterset_fields = [ + 'type_car', + 'pelak', + 'clearance_code', + 'kill_house__name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'buyer__fullname', + 'buyer__first_name', + 'buyer__last_name', + 'buyer__mobile', + 'buyer__unit_name', + 'buyer_name', + 'buyer_mobile', + 'province', + 'city', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET['role'] + kill_house_key = request.GET.get('kill_house_key') + date1 = request.GET['date1'] + date2 = request.GET['date2'] + if date1: + date1 = datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.strptime(str(date2), '%Y-%m-%d').date() + if role in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin', + 'ImprovingLivestock', 'AdminX', 'Supporter']: + if date1: + ware_houses = KillHouseWareHouse.objects.filter(date__date__gte=date1, + date__date__lte=date2) + if kill_house_key and kill_house_key != 'all': + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + kill_house__key=kill_house_key, + trash=False) + else: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + trash=False) + else: + ware_houses = KillHouseWareHouse.objects.filter(trash=False) + + if kill_house_key and kill_house_key != 'all': + + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + kill_house__key=kill_house_key, + trash=False) + else: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + trash=False) + kill_houses = KillHouse.objects.filter(trash=False, + pk__in=kill_house_free_sale_bar_info.values_list('kill_house', + flat=True)) + buyers = len(kill_house_free_sale_bar_info.values_list('buyer', flat=True).distinct()) + + + + + elif role in ['CityJahad', 'CityPoultry', 'CityOperator']: + if date1: + + ware_houses = KillHouseWareHouse.objects.filter(kill_house__system_address__city=user.city, + date__date__gte=date1, + date__date__lte=date2) + + if kill_house_key and kill_house_key != 'all': + + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + date__date__gte=date1, + date__date__lte=date2, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + kill_house__key=kill_house_key, + trash=False) + else: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + date__date__gte=date1, + date__date__lte=date2, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + trash=False) + else: + ware_houses = KillHouseWareHouse.objects.filter(kill_house__system_address__city=user.city, trash=False) + if kill_house_key and kill_house_key != 'all': + + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + kill_house__key=kill_house_key, + trash=False) + else: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + trash=False) + kill_houses = KillHouse.objects.filter(trash=False, + pk__in=kill_house_free_sale_bar_info.values_list('kill_house', + flat=True)) + buyers = len(kill_house_free_sale_bar_info.values_list('buyer', flat=True).distinct()) + + + + + else: + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if date1: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_houses, + date__date__gte=date1, + date__date__lte=date2, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + trash=False) + else: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_houses, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + trash=False) + + buyers = len(kill_house_free_sale_bar_info.values_list('buyer', flat=True).distinct()) + + if 'search' in request.GET: + kill_house_free_sale_bar_info_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_free_sale_bar_info + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_free_sale_bar_info) + kill_house_free_sale_bar_info_list = ps.filter() + kill_house_free_sale_bar_info = [] if len( + kill_house_free_sale_bar_info_list) == 0 else kill_house_free_sale_bar_info_list + + if role == 'KillHouse': + result = { + "number_of_allocations": len(kill_house_free_sale_bar_info), + "number_of_buyers": buyers, + "total_number_of_allocation_carcasses": + kill_house_free_sale_bar_info.aggregate(total=Sum('number_of_carcasses'))['total'] or 0, + "total_weight_of_allocation_carcasses": + kill_house_free_sale_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0, + + } + + else: + result = { + "number_of_kill_houses": len(kill_houses), + "number_of_allocations": len(kill_house_free_sale_bar_info), + "number_of_buyers": buyers, + "total_number_of_allocation_carcasses": + kill_house_free_sale_bar_info.aggregate(total=Sum('number_of_carcasses'))['total'] or 0, + "total_weight_of_allocation_carcasses": int( + kill_house_free_sale_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0), + "remain_total_number_of_carcasses": + ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] or 0, + "remain_total_weight_of_carcasses": + ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] or 0, + + } + + return Response(result, status=status.HTTP_200_OK) + + +class KillHousebuyersDashboarForFreeSaleBarInformationdViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForKillHouseVetKillHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + role = request.GET['role'] + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + else: + kill_house = KillHouse.objects.filter(key=request.GET['kill_house_key'], kill_house_operator__user=user, + trash=False).first() + + buyers = OutProvinceCarcassesBuyer.objects.filter(Kill_house=kill_house, trash=False) + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, kill_house=kill_house) + + total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + result = { + "buyers": len(buyers), + "number_of_requests": len(free_sales), + "total_quantity": total_quantity, + "total_weight": total_weight, + } + return Response({"result": result}, status=status.HTTP_200_OK) + + +class KillHouseFreeBarInformationforWageTotalViewSet(viewsets.ModelViewSet): + queryset = KillHouseFreeBarInformation.objects.all() + serializer_class = KillHouseFreeBarInformationForWageTotalSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house__name', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + type = request.GET['type'] + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + else: + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key']) + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if request.GET['role'] == 'ProvinceOperator': + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, + buy_type=type, + date__date__gte=date1, + date__date__lte=date2, + union_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + elif request.GET['role'] == 'Company': + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, + buy_type=type, + date__date__gte=date1, + date__date__lte=date2, + company_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + elif request.GET['role'] == 'Guilds': + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, + buy_type=type, + date__date__gte=date1, + date__date__lte=date2, + guilds_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + else: + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, + buy_type=type, + date__date__gte=date1, + date__date__lte=date2, + archive_wage=False, + trash=False).order_by('id') + + else: + if request.GET['role'] == 'ProvinceOperator': + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, + buy_type=type, + union_share__gt=0, + trash=False).order_by('id') + elif request.GET['role'] == 'Company': + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, + buy_type=type, + company_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + elif request.GET['role'] == 'Guilds': + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, + buy_type=type, + guilds_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + else: + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, + buy_type=type, + archive_wage=False, + trash=False).order_by('id') + + if 'search' in request.GET: + kill_house_free_bar_info_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_free_bar_info + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_free_bar_info) + kill_house_free_bar_info_list = ps.filter() + kill_house_free_bar_info = [] if len( + kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_free_bar_info) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(kill_house_free_bar_info, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseFreeBarInformationViewSet(viewsets.ModelViewSet): + queryset = KillHouseFreeBarInformation.objects.all() + serializer_class = KillHouseFreeBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house__name', + 'poultry_name', + 'poultry_mobile', + 'province', + 'bar_code', + 'city', + 'driver_name', + 'driver_mobile', + 'bar_clearance_code', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + + ] + + def create(self, request, *args, **kwargs): + killer = None + now_time = datetime.now().time() + dispenser = request.data.pop('dispenser',None) + representative = request.data.pop('representative',None) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + free_commitment_percent = kill_house.out_province_free_buying_commitment_percent + if 'bar_clearance_code' in request.data.keys(): + if KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=request.data[ + 'bar_clearance_code']).exists(): + return Response({'result': 'کد قرنطینه قبلا در سامانه ثبت شده است!'}, status=status.HTTP_403_FORBIDDEN) + if 'product_key' not in request.data.keys(): + return Response({'result': 'لطفا محصول را انتخاب کنید!'}, status=status.HTTP_403_FORBIDDEN) + product = RolesProducts.objects.get(key=request.data['product_key']) + request.data.pop('product_key') + if 'killer_key' in request.data.keys() and request.data['killer_key'] != None: + killer = KillHouse.objects.get(key=request.data['killer_key']) + request.data.pop('killer_key') + + try: + image = request.data['bar_image'] + request.data.pop('bar_image') + except: + image = None + date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date() + date = datetime(year=date.year, month=date.month, day=date.day, hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + request.data.pop('date') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + kill_house_free_bar_info = serializer.create(validated_data=request.data) + if image != None: + kill_house_free_bar_info.bar_image = send_image_to_server(image) + kill_house_free_bar_info.kill_house = kill_house + kill_house_free_bar_info.date = date + if kill_house_free_bar_info.buy_type == 'carcass': + kill_house_free_bar_info.warehouse_commitment_weight = int( + (free_commitment_percent / 100) * int(kill_house_free_bar_info.weight_of_carcasses)) + + kill_house_free_bar_info.ware_house = True + if killer: + if killer.killer and killer.type == 'public': + kill_house_free_bar_info.kill_house = killer + kill_house_free_bar_info.public_killer = kill_house + kill_house_free_bar_info.input_warehouse = killer + product = RolesProducts.objects.get(kill_house=killer, trash=False) + else: + kill_house_free_bar_info.exclusive_killer = killer + kill_house_free_bar_info.input_warehouse = killer + product = RolesProducts.objects.get(kill_house=killer, trash=False) + + else: + kill_house_free_bar_info.input_warehouse = kill_house + kill_house_free_bar_info.product = product + kill_house_free_bar_info.dispenser = dispenser if dispenser else None + kill_house_free_bar_info.representative = representative if representative else None + 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.status == 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.register_date = 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 == 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() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + type = request.GET.get('type') + date_type = request.GET.get('date_type') + bar_state = request.GET.get('bar_state') + kill_house_free_bar_info_list = [] + role = request.GET.get('role') + kill_houses = None + order_by_type = '-date' + + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if date_type: + if date_type == 'buy': + + filters = { + 'register_date__date__gte': date1, + 'register_date__date__lte': date2, + 'trash': False, + 'temporary_trash': False, + 'temporary_deleted': False, + 'calculate_status': True + } + else: + order_by_type = '-date' + filters = { + 'date__date__gte': date1, + 'date__date__lte': date2, + 'trash': False, + 'temporary_trash': False, + 'temporary_deleted': False, + 'calculate_status': True + } + else: + filters = { + 'register_date__date__gte': date1, + 'register_date__date__lte': date2, + 'trash': False, + 'temporary_trash': False, + 'temporary_deleted': False, + 'calculate_status': True + } + else: + filters = { + 'trash': False, + 'temporary_trash': False, + 'temporary_deleted': False, + 'calculate_status': True + } + + if type: + filters['buy_type'] = type + if type == 'live': + if bar_state: + if bar_state == 'entered': + filters['weight_of_carcasses__gt'] = 0 + else: + filters['weight_of_carcasses'] = 0 + if kill_houses is not None: + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + Q(kill_house__in=kill_houses) | Q(exclusive_killer__in=kill_houses) | Q(public_killer__in=kill_houses), + **filters).order_by(order_by_type) + else: + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_free_bar_info + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_free_bar_info) + kill_house_free_bar_info_list = ps.filter() + kill_house_free_bar_info = [] if len( + kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_free_bar_info) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_house_free_bar_info, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + free_bar = KillHouseFreeBarInformation.objects.get(key=request.data['key']) + # product = free_bar.product + + if 'live_weight' in request.data.keys(): + if int(request.data['live_weight']) < free_bar.weight_of_carcasses: + return Response( + {"result": "مقدار وارد شده کمتر از وزن لاشه است! "}, + status=status.HTTP_403_FORBIDDEN) + + if 'bar_clearance_code' in request.data.keys(): + existing_bar = KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=request.data[ + 'bar_clearance_code']).exclude(id=free_bar.id).first() + if existing_bar: + if existing_bar.register_type == 'automatic': + existing_bar.trash = True + existing_bar.save() + else: + return Response({'result': 'کد قرنطینه قبلا در سامانه ثبت شده است!'}, + status=status.HTTP_403_FORBIDDEN) + if 'number_of_carcasses' in request.data.keys(): + now = datetime.now().date() + if OperationLimitation.objects.all().first().kill_house_input_bar_limitation == True: + + if now != free_bar.date.date(): + return Response({"result": "به علت وجود مفایرت در تاریخ ثبت امکان ویرایش وجود ندارد! "}, + status=status.HTTP_403_FORBIDDEN) + + # ware_house = KillHouseWareHouse.objects.filter(kill_house=free_bar.kill_house, + # date__date=free_bar.date.date(), trash=False).first() + # allocation = StewardAllocation.objects.filter(ware_house=ware_house, trash=False) + # + # if len(allocation) > 0: + # if OperationLimitation.objects.all().first().kill_house_input_bar_limitation == True: + # return Response( + # {"result": "به علت وجود تخصیص به مباشر یا صنف برای امروز امکان ویرایش وجود ندارد! "}, + # status=status.HTTP_403_FORBIDDEN) + if 'return_entered_bar' in request.data.keys(): + free_bar.weight_of_carcasses = 0 + free_bar.number_of_carcasses = 0 + free_bar.entered_message = None + free_bar.ware_house = False + if 'bar_image' in request.data.keys(): + if request.data['bar_image'] != " ": + free_bar.bar_image = send_image_to_server(request.data['bar_image']) + free_bar.save() + request.data.pop('bar_image') + if 'kill_house_vet_state' in request.data.keys(): + free_bar.date_of_accept_reject = datetime.now() + free_bar.acceptor_rejector = user.fullname + if 'killer_key' in request.data.keys() and request.data['killer_key'] != None and request.data[ + 'killer_key'] != '': + exclusive_killer = KillHouse.objects.filter(trash=False, key=request.data['killer_key']).first() + if exclusive_killer.killer and exclusive_killer.type == 'public': + if not free_bar.public_killer: + free_bar.public_killer = free_bar.kill_house + free_bar.kill_house = exclusive_killer + free_bar.input_warehouse = exclusive_killer + if free_bar.exclusive_killer: + free_bar.exclusive_killer = None + else: + free_bar.exclusive_killer = exclusive_killer + free_bar.input_warehouse = exclusive_killer + if free_bar.public_killer: + free_bar.kill_house = free_bar.public_killer + free_bar.public_killer = None + request.data.pop('killer_key') + serializer = self.serializer_class(free_bar) + serializer.update(instance=free_bar, validated_data=request.data) + free_commitment_percent = free_bar.kill_house.out_province_free_buying_commitment_percent + free_bar.total_wage_amount = free_bar.wage * int( + free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int(free_bar.weight_of_carcasses) + free_bar.warehouse_commitment_weight = int((free_commitment_percent / 100) * int(free_bar.weight_of_carcasses)) + if free_bar.exclusive_killer: + product = RolesProducts.objects.get(kill_house=free_bar.exclusive_killer, trash=False) + free_bar.product = product + free_bar.save() + kill_house_free_buying_product_warehousing(free_bar.product) + union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0 + company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0 + guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0 + city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0 + wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0 + other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0 + free_bar.union_share = int(union_percent * free_bar.total_wage_amount) + free_bar.company_share = int(company_percent * free_bar.total_wage_amount) + free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount) + free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount) + free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount) + free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount) + free_bar.save() + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + free_bar = KillHouseFreeBarInformation.objects.get(trash=False, key=request.GET['key']) + free_bar.trash = True + free_bar.save() + product = free_bar.product + kill_house_free_buying_product_warehousing(product) + + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class ParentCompanyKillHouseFreeBarInformationViewSet(viewsets.ModelViewSet): + queryset = KillHouseFreeBarInformation.objects.all() + serializer_class = KillHouseFreeBarInformationSerializer + permission_classes = [AllowAny] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house__name', + 'poultry_name', + 'poultry_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'bar_clearance_code', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + + ] + + def list(self, request, *args, **kwargs): + type = request.GET.get('type') + date_type = request.GET.get('date_type') + bar_state = request.GET.get('bar_state') + kill_house_free_bar_info_list = [] + role = request.GET.get('role') + kill_houses = None + order_by_type = '-create_date' + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if date_type: + if date_type == 'buy': + + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + order_by_type = '-date' + filters = { + 'date__date__gte': date1, + 'date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False + } + + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + + if type: + filters['buy_type'] = type + if type == 'live': + if bar_state: + if bar_state == 'entered': + filters['weight_of_carcasses__gt'] = 0 + else: + filters['weight_of_carcasses'] = 0 + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_free_bar_info + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_free_bar_info) + kill_house_free_bar_info_list = ps.filter() + kill_house_free_bar_info = [] if len( + kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_free_bar_info) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_house_free_bar_info, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseRequestForBarManagementViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestForBarManagementSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'bar_code', + 'traffic_code', + 'clearance_code' + ] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + breed_list = [] + city_list = [] + quantity_list = [] + total_list = [] + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'role' in request.GET: + if request.GET['role'] == 'Poultry': + if 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__user=user, awaiting_payment=True, + trash=False, out=False).order_by('-send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__user=user, inspector='pending', + trash=False, out=False).order_by('-send_date') + else: + now = datetime.now().date() + + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + + queryset_lists = PoultryRequest.objects.filter(poultry__user=user, + final_state__in=('pending', 'archive'), + trash=False, out=False).order_by('-send_date') + queryset = [ + queryset_list for queryset_list in queryset_lists + if date1 <= queryset_list.send_date.date() <= date2 + ] + elif request.GET['role'] == 'VetSupervisor': + + if 'check' in request.GET: + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'search' in request.GET: + if 'deleted_requests' in request.GET: + + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=True, temporary_trash=False, temporary_deleted=False, + message__isnull=False + ).select_related('kill_request') + else: + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + non_receipt=False, + trash=False + ).select_related('kill_request') + + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests_list + + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests_list) + kill_house_requests = ps.filter() + else: + kill_house_requests = kill_house_requests_list + else: + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + non_receipt=False, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + if 'check' in request.GET: + kill_house_requests = [] + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'search' in request.GET: + if 'deleted_requests' in request.GET: + aggregate_permission = VetFarmAggregatePermission.objects.filter( + trash=False).first() + if aggregate_permission and aggregate_permission.allow == True: + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultries, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultries, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + aggregate_permission = VetFarmAggregatePermission.objects.filter( + trash=False).first() + if aggregate_permission and aggregate_permission.allow == True: + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultries, + non_receipt=False, + trash=False + ).select_related('kill_request').order_by( + 'province_request__poultry_request__poultry', 'killhouse_user') + else: + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultries, + non_receipt=False, + trash=False + ).select_related('kill_request') + + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests_list + + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests_list) + kill_house_requests = ps.filter() + else: + kill_house_requests = kill_house_requests_list + else: + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultries, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultries, + non_receipt=False, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + + elif 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__in=poultries, + poultry__address__province=user.province, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__in=poultries, + poultry__address__province=user.province, + inspector='pending', + trash=False, out=False).order_by('send_date') + else: + queryset = PoultryRequest.objects.filter(poultry__in=poultries, + poultry__address__province=user.province, + final_state__in=('pending', 'archive'), + trash=False, out=False).order_by('send_date') + else: + queryset = [] + + elif request.GET['role'] == 'ProvinceInspector': + if 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + inspector='pending', + trash=False, out=False).order_by('send_date') + # elif 'out' in request.GET: + + else: + + if 'date' in request.GET: + date = datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.now() + + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, + send_date__year=date.year, send_date__month=date.month, + send_date__day=date.day + ).order_by('-send_date') + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + + if 'check' in request.GET: + kill_house_requests = [] + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'search' in request.GET: + if 'deleted_requests' in request.GET: + + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + non_receipt=False, + trash=False + ).select_related('kill_request') + + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests_list + + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests_list) + kill_house_requests = ps.filter() + else: + kill_house_requests = kill_house_requests_list + else: + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + non_receipt=False, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + + # list1 = [] + # for c in CityUnit.objects.filter(city__name=user.city.name, trash=False): + # list1.append(c.name) + elif 'waiting' in request.GET: + # queryset = PoultryRequest.objects.filter(poultry__address__city__name__in=list1, + # awaiting_payment=True, + # trash=False).order_by('send_date') + + queryset = PoultryRequest.objects.filter(city_operator=city_operator, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + # queryset = PoultryRequest.objects.filter(poultry__address__city__name__in=list1, + # inspector='pending', + # trash=False).order_by('send_date') + queryset = PoultryRequest.objects.filter(city_operator=city_operator, + inspector='pending', + trash=False, out=False).order_by('send_date') + else: + # queryset = PoultryRequest.objects.filter(poultry__address__city__name__in=list1, + # trash=False).order_by( + # 'send_date') + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + queryset_list = PoultryRequest.objects.filter(poultry__city_operator=city_operator.unit_name, + trash=False, out=False, final_state='pending', + ).order_by('send_date') + queryset = [ + poultry_req for poultry_req in queryset_list + if date1 <= poultry_req.send_date.date() <= date2 + ] + + elif request.GET['role'] in ['CityCommerce', 'CityVet', 'CityJahad', 'CityPoultry']: + if 'check' in request.GET: + kill_house_requests = [] + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'search' in request.GET: + + if 'deleted_requests' in request.GET: + + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__city=user.city, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__city=user.city, + non_receipt=False, + trash=False + ).select_related('kill_request') + + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests_list + + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests_list) + kill_house_requests = ps.filter() + else: + kill_house_requests = kill_house_requests_list + else: + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__city=user.city, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__city=user.city, + non_receipt=False, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif request.GET['role'] == 'LiveStockSupport': + if 'check' in request.GET: + kill_house_requests = [] + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'search' in request.GET: + + if 'deleted_requests' in request.GET: + + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__freezing=True, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__freezing=True, + non_receipt=False, + trash=False + ).select_related('kill_request') + + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests_list + + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests_list) + kill_house_requests = ps.filter() + else: + kill_house_requests = kill_house_requests_list + else: + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__freezing=True, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__freezing=True, + non_receipt=False, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + elif request.GET['role'] == 'ProvinceFinancial': + if 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + inspector='pending', + trash=False, out=False).order_by('send_date') + elif 'all' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + assignment=True, + final_state='pending', + trash=False, out=False).order_by('send_date') + else: + if 'date' in request.GET: + date = datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.now() + + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, + send_date__year=date.year, send_date__month=date.month, + send_date__day=date.day + ).order_by('-send_date') + elif request.GET['role'] in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor', 'SuperAdmin', 'AdminX', + 'ImprovingLivestock', 'Supporter']: + if 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + inspector='pending', + trash=False, out=False).order_by('send_date') + elif 'out' in request.GET: + if 'date' in request.GET: + date = datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.now() + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + send_date__year=date.year, send_date__month=date.month, + send_date__day=date.day, + trash=False, out=True).order_by('-send_date') + elif 'check' in request.GET: + kill_house_requests = [] + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'search' in request.GET: + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=True, temporary_trash=False, temporary_deleted=False + # message__isnull=False + ).select_related('kill_request') + else: + if 'without_quarantine_code_state' in request.GET and request.GET[ + 'without_quarantine_code_state'] == 'true': + kill_house_requests = KillHouseRequest.objects.filter( + clearance_code__isnull=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + quarantine_quantity__isnull=True, + quarantine_code_state__isnull=True, + non_receipt=False, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).select_related('kill_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + # (Q(trash=False) | Q(trash=True, clearance_code__isnull=False, + # temporary_trash=False, temporary_deleted=False)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + non_receipt=False, + province_request__poultry_request__poultry__address__province=user.province, + + trash=False + ).select_related('kill_request') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + kill_house_requests = kill_house_requests.filter( + build_query(DashboardEnterLoadInformationFilterSet, value) + ) + else: + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=True, + # message__isnull=False + ).select_related('kill_request') + else: + if 'without_quarantine_code_state' in request.GET and request.GET[ + 'without_quarantine_code_state'] == 'true': + kill_house_requests = KillHouseRequest.objects.filter( + clearance_code__isnull=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + quarantine_quantity__isnull=True, + quarantine_code_state__isnull=True, + non_receipt=False, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).select_related('kill_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + # (Q(trash=False) | Q(trash=True, clearance_code__isnull=False)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + non_receipt=False, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).select_related('kill_request') + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'date1' in request.GET and 'date2' in request.GET: + + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + queryset_lists = PoultryRequest.objects.filter(poultry__address__province=user.province, + trash=False, out=False, + ).order_by('-send_date') + + queryset = [ + queryset_list for queryset_list in queryset_lists + if date1 <= queryset_list.send_date.date() <= date2 + ] + + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # queryset_list = PoultryRequest.objects.filter(poultry__address__province=user.province, + # trash=False, out=False, + # ).order_by('-send_date') + # + # queryset = [] + # queryset = [ + # poultry_req for poultry_req in queryset_list + # if date1 <= poultry_req.send_date.date() <= date2 + # ] + else: + if 'date' in request.GET: + date = datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.now() - timedelta(days=2) + + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, + send_date__year__gte=date.year, + send_date__month__gte=date.month, + send_date__day__gte=date.day + ).order_by('-send_date') + + elif request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + if 'check' in request.GET: + kill_house_requests = [] + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'search' in request.GET: + + if 'deleted_requests' in request.GET: + + kill_house_requests_list = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house) | Q(killer__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=True, temporary_trash=False, temporary_deleted=False + # message__isnull=False + ).select_related('kill_request') + else: + kill_house_requests_list = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house) | Q(killer__in=kill_house)), + # (Q(trash=False) | Q(trash=True, clearance_code__isnull=False, temporary_trash=False, + # temporary_deleted=False)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + non_receipt=False, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).select_related('kill_request') + + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests_list + + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests_list) + kill_house_requests = ps.filter() + else: + kill_house_requests = kill_house_requests_list + else: + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house) | Q(killer__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=True, temporary_trash=False, temporary_deleted=False + # message__isnull=False + ).select_related('kill_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house) | Q(killer__in=kill_house)), + # (Q(trash=False) | Q(trash=True, clearance_code__isnull=False, temporary_trash=False, + # temporary_deleted=False)), + + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + non_receipt=False, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).select_related('kill_request') + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + if 'date' in request.GET: + date = datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.now() + + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, + send_date__year=date.year, send_date__month=date.month, + send_date__day=date.day + ).order_by('-send_date') + + else: + + if 'type' in request.GET: + if request.GET['type'] == 'auction': + queryset = [] + poultry_req_auctions = PoultryRequestAuction.objects.filter(state='active', + trash=False).order_by( + 'fee').order_by( + 'create_date') + for poultry_req_auction in poultry_req_auctions: + queryset.append( + PoultryRequest.objects.get(id=poultry_req_auction.poultry_request.id, auction=True)) + + serializer = PoultryRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ParentCompanyKillHouseRequestForBarManagementViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestForBarManagementSerializer + pagination_class = CustomPagination + permission_classes = [AllowAny] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'bar_code', + 'traffic_code', + 'clearance_code' + ] + + def list(self, request, *args, **kwargs): + + kill_house_requests = [] + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'search' in request.GET: + + if 'deleted_requests' in request.GET: + + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=True, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + else: + if 'without_quarantine_code_state' in request.GET and request.GET[ + 'without_quarantine_code_state'] == 'true': + kill_house_requests_list = KillHouseRequest.objects.filter( + clearance_code__isnull=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + quarantine_quantity__isnull=True, + quarantine_code_state__isnull=True, + + ).select_related('kill_request') + else: + kill_house_requests_list = KillHouseRequest.objects.filter( + (Q(trash=False) | Q(trash=True, clearance_code__isnull=False, temporary_trash=False, + temporary_deleted=False)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ).select_related('kill_request') + + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests_list + + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests_list) + kill_house_requests = ps.filter() + else: + kill_house_requests = kill_house_requests_list + else: + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=True, + ).select_related('kill_request') + else: + if 'without_quarantine_code_state' in request.GET and request.GET[ + 'without_quarantine_code_state'] == 'true': + kill_house_requests = KillHouseRequest.objects.filter( + clearance_code__isnull=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + quarantine_quantity__isnull=True, + quarantine_code_state__isnull=True, + ).select_related('kill_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(trash=False) | Q(trash=True, clearance_code__isnull=False)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ).select_related('kill_request') + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseRequestForBarManagementWageViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestForBarManagementSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + def list(self, request, *args, **kwargs): + if request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(user=request.user) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False) + + else: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + trash=False) + + else: + + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'ProvinceOperator': + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_kill_request__union_share__gt=0, + trash=False) + elif request.GET['role'] == 'Company': + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_kill_request__company_share__gt=0, + trash=False) + + elif request.GET['role'] == 'Guilds': + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_kill_request__guilds_share__gt=0, + trash=False) + else: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False) + + else: + if request.GET['role'] == 'ProvinceOperator': + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + province_kill_request__union_share__gt=0, + trash=False) + elif request.GET['role'] == 'Company': + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + province_kill_request__company_share__gt=0, + trash=False) + + elif request.GET['role'] == 'Guilds': + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + province_kill_request__guilds_share__gt=0, + trash=False) + else: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + trash=False) + + if 'search' in request.GET: + kill_house_request_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests) + kill_house_request_list = ps.filter() + kill_house_requests = [] if len(kill_house_request_list) == 0 else kill_house_request_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseRequestForAggregateLoadsViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestForBarManagementSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + # user = SystemUserProfile.objects.get(user=request.user) + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house = [] + kill_house_requests_list = [] + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + for kill_house_vet in kill_house_vets: + kill_house.append(kill_house_vet.kill_house) + + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + + if request.GET['role'] in ['CityOperator', 'CityJahad', 'CityPoultry']: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='pending', + non_receipt=False, + trash=False, province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + + ).order_by('-kill_request__recive_date') + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='pending', + non_receipt=False, + trash=False, province_request__poultry_request__poultry__address__city=user.city + + ).order_by('-kill_request__recive_date') + + else: + + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='pending', + non_receipt=False, + trash=False, + + ).order_by('-kill_request__recive_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests) + kill_house_requests_list = ps.filter() + kill_house_requests = [] if len(kill_house_requests_list) == 0 else kill_house_requests_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillingInformationDiscrepancyReportViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestLetterForProvinceVetSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province), + trash=False).select_related( + 'user').first() + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultry_requests = PoultryRequest.objects.filter(poultry__address__province=user.province, + poultry__city_operator=city_operator.unit_name, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, + out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date').annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')), + total_remain_quantity=Sum('remain_quantity'), + total_remain_weight=Sum(F('remain_quantity') * F('Index_weight')), + + ) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultry_requests = PoultryRequest.objects.filter(poultry__address__province=user.province, + poultry__address__city=user.city, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, + out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date').annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')), + total_remain_quantity=Sum('remain_quantity'), + total_remain_weight=Sum(F('remain_quantity') * F('Index_weight')), + + ) + else: + poultry_requests = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, + out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date').annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')), + total_remain_quantity=Sum('remain_quantity'), + total_remain_weight=Sum(F('remain_quantity') * F('Index_weight')), + + ) + poultry_request_total_quantity = poultry_requests.aggregate(total=Sum('total_quantity'))['total'] + poultry_request_total_weight = poultry_requests.aggregate(total=Sum('total_weight'))['total'] + poultry_request_total_remain_quantity = poultry_requests.aggregate(total=Sum('total_remain_quantity'))['total'] + poultry_request_remain_weight = poultry_requests.aggregate(total=Sum('total_remain_weight'))['total'] + + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request__poultry_request__in=poultry_requests, trash=False, + state__in=('pending', 'accepted')).annotate( + total_quantity=Sum('main_quantity'), + total_weight=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight')), + ) + + province_kill_requests_total_quantity = province_kill_requests.aggregate(total=Sum('total_quantity'))['total'] + province_kill_requests_total_weight = province_kill_requests.aggregate(total=Sum('total_weight'))['total'] + + province_kill_requests_with_left_over = ProvinceKillRequest.objects.filter( + province_request__poultry_request__in=poultry_requests, trash=False, + state__in=('pending', 'accepted'), quantity__gt=0) + province_kill_requests_serializer = ProvinceKillRequestForKillingInformationDiscrepancyReportSerializer( + province_kill_requests_with_left_over, many=True) + # if 'role' in request.GET: + # if request.GET['role'] == 'ProvinceSupervisor': + # last_date = datetime(2024, 4, 14, 7, 33).date() + # if date2 > last_date and date1 <= last_date: + # kill_house_request_without_clearance_code = KillHouseRequest.objects.filter( + # province_kill_request__in=province_kill_requests, kill_request__recive_date__date__gte=date1, + # kill_request__recive_date__date__lte=last_date, clearance_code__isnull=True, trash=False) + # + # kill_house_request_diffrent_quarantine_quantity = KillHouseRequest.objects.filter( + # Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')), + # province_kill_request__in=province_kill_requests, clearance_code__isnull=False, + # quarantine_quantity__isnull=False, trash=False) + # kill_house_request_without_vet_check = KillHouseRequest.objects.filter( + # province_kill_request__in=province_kill_requests, kill_request__recive_date__date__gte=date1, + # kill_request__recive_date__date__lte=last_date, vet_state='pending', trash=False) + # kill_house_request_without_bar_info = KillHouseRequest.objects.filter( + # province_kill_request__in=province_kill_requests, kill_request__recive_date__date__gte=date1, + # kill_request__recive_date__date__lte=last_date, vet_state='accepted', + # assignment_state_archive='pending', + # trash=False) + # kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter( + # Q(quantity__gt=F('vet_accepted_real_quantity')) | Q( + # quantity__lt=F('vet_accepted_real_quantity')) | Q( + # quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q( + # vet_accepted_real_quantity__gt=F('accepted_real_quantity')) | Q( + # vet_accepted_real_quantity__lt=F('accepted_real_quantity')), + # # kill_request__recive_date__date__gte=date1, + # # kill_request__recive_date__date__lte=last_date, + # province_kill_request__in=province_kill_requests, vet_state='accepted', + # assignment_state_archive='True', + # trash=False) + # elif date2 > last_date and date1 > last_date: + # kill_house_request_without_clearance_code = [] + # kill_house_request_without_vet_check = [] + # kill_house_request_without_bar_info = [] + # kill_house_request_diffrent_quarantine_quantity = KillHouseRequest.objects.filter( + # Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')), + # province_kill_request__in=province_kill_requests, clearance_code__isnull=False, + # quarantine_quantity__isnull=False, trash=False) + # kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter( + # Q(quantity__gt=F('vet_accepted_real_quantity')) | Q( + # quantity__lt=F('vet_accepted_real_quantity')) | Q( + # quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q( + # vet_accepted_real_quantity__gt=F('accepted_real_quantity')) | Q( + # vet_accepted_real_quantity__lt=F('accepted_real_quantity')), + # province_kill_request__in=province_kill_requests, vet_state='accepted', + # assignment_state_archive='True', + # trash=False) + # else: + # + # kill_house_request_without_clearance_code = KillHouseRequest.objects.filter( + # province_kill_request__in=province_kill_requests, clearance_code__isnull=True, trash=False) + # + # kill_house_request_diffrent_quarantine_quantity = KillHouseRequest.objects.filter( + # Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')), + # province_kill_request__in=province_kill_requests, clearance_code__isnull=False, + # quarantine_quantity__isnull=False, trash=False) + # kill_house_request_without_vet_check = KillHouseRequest.objects.filter( + # province_kill_request__in=province_kill_requests, vet_state='pending', trash=False) + # kill_house_request_without_bar_info = KillHouseRequest.objects.filter( + # province_kill_request__in=province_kill_requests, vet_state='accepted', + # assignment_state_archive='pending', + # trash=False) + # kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter( + # Q(quantity__gt=F('vet_accepted_real_quantity')) | Q( + # quantity__lt=F('vet_accepted_real_quantity')) | Q( + # quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q( + # vet_accepted_real_quantity__gt=F('accepted_real_quantity')) | Q( + # vet_accepted_real_quantity__lt=F('accepted_real_quantity')), + # province_kill_request__in=province_kill_requests, vet_state='accepted', + # assignment_state_archive='True', + # trash=False) + # else: + kill_house_request_without_clearance_code = KillHouseRequest.objects.filter( + province_kill_request__in=province_kill_requests, clearance_code__isnull=True, trash=False) + + kill_house_request_diffrent_quarantine_quantity = KillHouseRequest.objects.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')), + province_kill_request__in=province_kill_requests, clearance_code__isnull=False, + quarantine_quantity__isnull=False, trash=False) + kill_house_request_without_vet_check = KillHouseRequest.objects.filter( + province_kill_request__in=province_kill_requests, vet_state='pending', trash=False) + kill_house_request_without_bar_info = KillHouseRequest.objects.filter( + province_kill_request__in=province_kill_requests, + assignment_state_archive='pending', + trash=False) + + kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter( + Q(quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')), + province_kill_request__in=province_kill_requests, + assignment_state_archive='True', + trash=False) + + # kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter( + # Q(quantity__gt=F('vet_accepted_real_quantity')) | Q(quantity__lt=F('vet_accepted_real_quantity')) | Q( + # quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q( + # vet_accepted_real_quantity__gt=F('accepted_real_quantity') | Q(vet_accepted_real_quantity__lt=F('accepted_real_quantity'))), + # province_kill_request__in=province_kill_requests, vet_state='accepted', assignment_state_archive='True', + # trash=False) + + # kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter( + # Q(quantity__gt=F('vet_accepted_real_quantity')) | Q(quantity__lt=F('vet_accepted_real_quantity')) | Q( + # quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q( + # vet_accepted_real_quantity__gt=F('accepted_real_quantity')) | Q( + # vet_accepted_real_quantity__lt=F('accepted_real_quantity')), + # province_kill_request__in=province_kill_requests, vet_state='accepted', assignment_state_archive='True', + # trash=False) + + kill_house_request_without_clearance_code_serializer = KillHouseRequestForBarManagementSerializer( + kill_house_request_without_clearance_code, many=True) + kill_house_request_diffrent_quarantine_quantitye_serializer = KillHouseRequestForBarManagementSerializer( + kill_house_request_diffrent_quarantine_quantity, many=True) + kill_house_request_without_vet_check_serializer = KillHouseRequestForBarManagementSerializer( + kill_house_request_without_vet_check, many=True) + kill_house_request_without_bar_info_serializer = KillHouseRequestForBarManagementSerializer( + kill_house_request_without_bar_info, many=True) + kill_house_request_diffrent_bar_info_serializer = KillHouseRequestForDiffrentBarInfoSerializer( + kill_house_request_diffrent_bar_info, many=True) + + return Response({ + "part_one": { + "total_requests": poultry_requests.count(), + "poultry_request_total_quantity": poultry_request_total_quantity if poultry_request_total_quantity != None else 0, + "poultry_request_total_weight": poultry_request_total_weight if poultry_request_total_weight != None else 0, + "province_kill_requests_total_quantity": province_kill_requests_total_quantity if province_kill_requests_total_quantity != None else 0, + "province_kill_requests_total_weight": province_kill_requests_total_weight if province_kill_requests_total_weight != None else 0, + "poultry_request_total_remain_quantity": poultry_request_total_remain_quantity if poultry_request_total_remain_quantity != None else 0, + "poultry_request_remain_weight": poultry_request_remain_weight if poultry_request_remain_weight != None else 0, + "operator_fullname": province_operator.user.fullname, + "operator_mobile": province_operator.user.mobile, + "role": "ProvinceOperator", + }, + "part_two": province_kill_requests_serializer.data, + "part_three": kill_house_request_without_clearance_code_serializer.data, + "part_seven": kill_house_request_diffrent_quarantine_quantitye_serializer.data, + "part_four": kill_house_request_without_vet_check_serializer.data, + "part_five": kill_house_request_without_bar_info_serializer.data, + "part_six": kill_house_request_diffrent_bar_info_serializer.data, + }) + + +class PoultryRequestForTotalInformationInTableViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + kill_house_requests_queryset = KillHouseRequest.objects.all() + serializer_class = PoultryRequestForTotalInformationInTableSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryRequestFilterSet + filterset_fields = poultry_request_new_fields + kill_house_requests_filter_class = KillHouseRequestFilterSet + kill_house_requests_filterset_fields = kill_house_request_filterset_fields + + def list(self, request, *args, **kwargs): + poultry_requests_for_search = [] + kill_house_request_for_search = [] + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'clearance_code' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + clearance_code__isnull=request.GET[ + 'clearance_code']).select_related( + 'province_request__poultry_request') + + poultry_requests = PoultryRequest.objects.filter( + pk__in=kill_house_requests.values('province_request__poultry_request'), + poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + elif 'assignment' in request.GET: + kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive=request.GET[ + 'assignment']).select_related( + 'province_request__poultry_request') + + poultry_requests = PoultryRequest.objects.filter( + pk__in=kill_house_requests.values('province_request__poultry_request'), + poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + + + elif 'discharge' in request.GET: + if request.GET['discharge'] == 'pending': + kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + vet_state='pending', + assignment_state_archive='pending').select_related( + 'province_request__poultry_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(vet_state='pending') | Q(vet_state='pending', assignment_state_archive='True')), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, ).select_related( + 'province_request__poultry_request') + + poultry_requests = PoultryRequest.objects.filter( + pk__in=kill_house_requests.values('province_request__poultry_request'), + poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + + else: + poultry_requests = PoultryRequest.objects.filter( + poultry__address__province=user.province, + # state_process__in=('pending', 'accepted'), + # province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__in=poultry_requests) + + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=poultry_requests + + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=poultry_requests) + poultry_requests_for_search = ps.filter() + + poultry_requests = [] if len(poultry_requests_for_search) == 0 else poultry_requests_for_search + + for item in self.kill_house_requests_filterset_fields: + kill_house_request_query = QueryDict('{0}={1}'.format(item, request.GET['value'])) + if (self.kill_house_requests_filter_class( + data=kill_house_request_query, + queryset=kill_house_requests + + ) + ).filter(): + ks = self.kill_house_requests_filter_class(data=kill_house_request_query, + queryset=kill_house_requests) + kill_house_request_for_search = ks.filter() + kill_house_requests = [] if len(kill_house_request_for_search) == 0 else kill_house_request_for_search + if len(kill_house_requests) > 0: + for kill_house_request in kill_house_requests: + if kill_house_request.province_request.poultry_request not in poultry_requests: + poultry_requests.append(kill_house_request.province_request.poultry_request) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry_requests) + if page is not None: + serializer = PoultryRequestForTotalInformationInTableSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = PoultryRequestForTotalInformationInTableSerializer(poultry_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryRequestForTotalInformationViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + kill_house_requests_queryset = KillHouseRequest.objects.all() + serializer_class = PoultryRequestForTotalInformationSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryRequestFilterSet + filterset_fields = poultry_request_new_fields + kill_house_requests_filter_class = KillHouseRequestFilterSet + kill_house_requests_filterset_fields = kill_house_request_filterset_fields + + def list(self, request, *args, **kwargs): + poultry_requests_for_search = [] + kill_house_request_for_search = [] + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'clearance_code' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + clearance_code__isnull=request.GET[ + 'clearance_code']).select_related( + 'province_request__poultry_request') + + poultry_requests = PoultryRequest.objects.filter( + pk__in=kill_house_requests.values('province_request__poultry_request'), + poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + elif 'assignment' in request.GET: + kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive=request.GET[ + 'assignment']).select_related( + 'province_request__poultry_request') + + poultry_requests = PoultryRequest.objects.filter( + pk__in=kill_house_requests.values('province_request__poultry_request'), + poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + + + elif 'discharge' in request.GET: + if request.GET['discharge'] == 'pending': + kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + vet_state='pending', + assignment_state_archive='pending').select_related( + 'province_request__poultry_request') + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(vet_state='pending') | Q(vet_state='pending', assignment_state_archive='True')), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, ).select_related( + 'province_request__poultry_request') + + poultry_requests = PoultryRequest.objects.filter( + pk__in=kill_house_requests.values('province_request__poultry_request'), + poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + + else: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultry_requests = PoultryRequest.objects.filter( + poultry__address__province=user.province, + poultry__city_operator=city_operator.unit_name, + # final_state='pending', + trash=False, + # out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultry_requests = PoultryRequest.objects.filter( + poultry__address__city=user.city, + # final_state='pending', + trash=False, + # out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + elif request.GET['role'] == 'LiveStockSupport': + poultry_requests = PoultryRequest.objects.filter( + poultry__address__province=user.province, + freezing=True, + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + poultry__address__province=user.province, + # final_state='pending', + trash=False, + # out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date') + kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__in=poultry_requests) + + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=poultry_requests + + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=poultry_requests) + poultry_requests_for_search = ps.filter() + + poultry_requests = [] if len(poultry_requests_for_search) == 0 else poultry_requests_for_search + + for item in self.kill_house_requests_filterset_fields: + kill_house_request_query = QueryDict('{0}={1}'.format(item, request.GET['value'])) + if (self.kill_house_requests_filter_class( + data=kill_house_request_query, + queryset=kill_house_requests + + ) + ).filter(): + ks = self.kill_house_requests_filter_class(data=kill_house_request_query, + queryset=kill_house_requests) + kill_house_request_for_search = ks.filter() + kill_house_requests = [] if len(kill_house_request_for_search) == 0 else kill_house_request_for_search + if len(kill_house_requests) > 0: + for kill_house_request in kill_house_requests: + if kill_house_request.province_request.poultry_request not in poultry_requests: + poultry_requests.append(kill_house_request.province_request.poultry_request) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry_requests) + if page is not None: + serializer = PoultryRequestForTotalInformationSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = PoultryRequestForTotalInformationSerializer(poultry_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class GeneralPoultryRequestLetterReportViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestLetterForProvinceVetSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + if request.GET['type'] == 'broadcast': + date_one_day_ago = date - timedelta(days=1) + else: + date_one_day_ago = date + + poultry_requests_first_letter = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date=date_one_day_ago + ).order_by('-send_date') + serializer_poultry_requests_first_letter = PoultryRequestForKillingInformationSerializer( + poultry_requests_first_letter, many=True) + poultry_requests_seconde_letter = PoultryRequest.objects.filter(send_date__date=date_one_day_ago, + quantity__gt=F('remain_quantity'), + trash=False) + serializer_poultry_requests_seconde_letter = PoultryRequestLetterForProvinceVetSerializer( + poultry_requests_seconde_letter, many=True) + + kill_house_requests_third_letter_part_two = KillHouseRequest.objects.filter( + Q(vet_state='accepted') | Q(assignment_state_archive='True'), + kill_request__recive_date__date=date_one_day_ago, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).only('accepted_real_quantity', 'accepted_real_weight') + kill_house_requests_third_letter_part_two_quantity = \ + kill_house_requests_third_letter_part_two.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] + kill_house_requests_third_letter_part_two_weight = \ + kill_house_requests_third_letter_part_two.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] + kill_house_requests_third_letter_part_three = KillHouseRequest.objects.filter( + clearance_code__isnull=False, + kill_request__recive_date__date=date_one_day_ago, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).only('accepted_real_quantity', 'accepted_real_weight') + + # total_weight = kill_house_requests_third_letter.aggregate(total=Sum('accepted_real_weight'))[ + # 'total'] + # total_quantity = kill_house_requests_third_letter.aggregate(total=Sum('accepted_real_quantity'))[ + # 'total'] + + kill_house_requests_third_letter = KillHouseRequest.objects.filter( + kill_request__recive_date__date=date_one_day_ago, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).select_related('kill_request') + kill_house_requests_third_letter_quantity = kill_house_requests_third_letter.aggregate(total=Sum('quantity'))[ + 'total'] + kill_house_requests_third_letter_weight = kill_house_requests_third_letter.aggregate( + total=Sum(F('accepted_real_weight') * F('province_request__poultry_request__Index_weight')))[ + 'total'] + serializer_kill_house_requests_third_letter = KillHouseRequestForBarManagementSerializer( + kill_house_requests_third_letter, many=True) + + province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), + kill_request__recive_date__date=date_one_day_ago).select_related( + 'killhouse_user') + kill_houses = KillHouse.objects.filter( + pk__in=province_kill_requests.values('killhouse_user') + ) + kill_house_ware_houses = KillHouseWareHouse.objects.filter(kill_house__in=kill_houses, date__date=date) + steward_allocations = StewardAllocation.objects.filter( + system_registration_code=True, + ware_house__in=kill_house_ware_houses, trash=False, + date__date=date).order_by('id') + + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + allocated_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('allocated_total_number_of_carcasses'))['total'] + allocated_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('allocated_total_weight_of_carcasses'))['total'] + remain_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))['total'] + remain_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))['total'] + + province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), + kill_request__recive_date__date=date_one_day_ago).select_related( + 'killhouse_user') + kill_houses = KillHouse.objects.filter( + pk__in=province_kill_requests.values('killhouse_user') + ) + + serializer_kill_house_requests_fourth_part_two = KillHouseForAutomaticStewardAllocationSerializer(kill_houses, + context={ + 'request': request}, + many=True) + + allocations = StewardAllocation.objects.filter(trash=False, system_registration_code=True, + date__date=date).order_by('id') + real_number_of_carcasses = \ + allocations.aggregate(total=Sum('real_number_of_carcasses'))['total'] + real_weight_of_carcasses = \ + allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] + serializer_kill_house_requests_fourth_part_three = StewardAllocationSerializer(allocations, many=True) + + return Response({ + "serializer_poultry_requests_first_letter": serializer_poultry_requests_first_letter.data, + "serializer_poultry_requests_seconde_letter": serializer_poultry_requests_seconde_letter.data, + "serializer_kill_house_requests_third_letter": serializer_kill_house_requests_third_letter.data, + "kill_house_requests_third_letter_quantity": kill_house_requests_third_letter_quantity if kill_house_requests_third_letter_quantity != None else 0, + "kill_house_requests_third_letter_weight": int( + kill_house_requests_third_letter_weight) if kill_house_requests_third_letter_weight != None else 0, + "serializer_kill_house_requests_third_letter_part_two": len(kill_house_requests_third_letter_part_two), + "kill_house_requests_third_letter_part_two_quantity": kill_house_requests_third_letter_part_two_quantity if kill_house_requests_third_letter_part_two_quantity != None else 0, + "kill_house_requests_third_letter_part_two_weight": kill_house_requests_third_letter_part_two_weight if kill_house_requests_third_letter_part_two_weight != None else 0, + "serializer_kill_house_requests_third_letter_part_three": len(kill_house_requests_third_letter_part_three), + "serializer_kill_house_requests_fourth_part_one": { + "buyers": len(kill_house_ware_houses), + "allocations": len(steward_allocations), + "total_number_of_carcasses": total_number_of_carcasses if total_number_of_carcasses != None else 0, + "total_weight_of_carcasses": total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + "allocated_total_number_of_carcasses": allocated_total_number_of_carcasses if allocated_total_number_of_carcasses != None else 0, + "allocated_total_weight_of_carcasses": allocated_total_weight_of_carcasses if allocated_total_weight_of_carcasses != None else 0, + "remain_total_number_of_carcasses": remain_total_number_of_carcasses if remain_total_number_of_carcasses != None else 0, + "remain_total_weight_of_carcasses": remain_total_weight_of_carcasses if remain_total_weight_of_carcasses != None else 0, + }, + "serializer_kill_house_requests_fourth_part_two": serializer_kill_house_requests_fourth_part_two.data, + "serializer_kill_house_requests_fourth_part_three": serializer_kill_house_requests_fourth_part_three.data, + "serializer_kill_house_requests_fourth_part_fourth": real_number_of_carcasses if real_number_of_carcasses != None else 0, + "serializer_kill_house_requests_fourth_part_fifth": real_weight_of_carcasses if real_weight_of_carcasses != None else 0, + "serializer_kill_house_requests_fourth_part_sixth": len(allocations), + }) + + +class StewardGuildsAllocationsForStatisticalProfileViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + serializer_class = StewardAllocationSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + allocations = StewardAllocation.objects.filter(trash=False, system_registration_code=True, + date__date=date).order_by('id') + real_number_of_carcasses = \ + allocations.aggregate(total=Sum('real_number_of_carcasses'))['total'] + real_weight_of_carcasses = \ + allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] + serializer_kill_house_requests_fourth_part_three = StewardAllocationSerializer(allocations, many=True) + + return Response({ + "real_number_of_carcasses": real_number_of_carcasses if real_number_of_carcasses != None else 0, + "real_weight_of_carcasses": real_weight_of_carcasses if real_weight_of_carcasses != None else 0, + "allocations": len(allocations), + }) + + +# kill_house_requests=KillHouseRequest.objects.filter(killhouse_user__id=5,trash=True,clearance_code__isnull=False,message__isnull=True) +# for kill_house_request in kill_house_requests: +# kill_house_request.message='عدم ارسال راننده توسط کشتارگاه' +# kill_house_request.bar_remover={ +# "date": str(kill_house_request.create_date.date()), +# "role":"KillHouse", +# "mobile": "09143488339", +# "full_name": "حامد صمدی" +# } +# kill_house_request.save() + + +class DetailOfKillingViewSet(viewsets.ViewSet): + permission_classes = [TokenHasReadWriteScope] + + def hatching_55_90_data(self, request): + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user__user=request.user) + hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, left_over__gt=F('quantity') * 0.1, + chicken_age__range=(55, 90), + poultry__city_operator=city_operator.unit_name, ).order_by( + 'id') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, left_over__gt=F('quantity') * 0.1, + chicken_age__range=(55, 90), + poultry__user__city=user.city).order_by('id') + else: + hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, left_over__gt=F('quantity') * 0.1, + chicken_age__range=(55, 90)).order_by('id') + else: + hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, left_over__gt=F('quantity') * 0.1, + chicken_age__range=(55, 90)).order_by('id') + min_list = [] + + all_poultry_hatching_quantity = hatching_between_50_70.aggregate(total=Sum('quantity'))['total'] + all_poultry_hatching_killed_quantity = hatching_between_50_70.aggregate(total=Sum('killed_quantity'))['total'] + all_poultry_hatching_left_over = hatching_between_50_70.aggregate(total=Sum('left_over'))['total'] + all_left_over_ninty_percent = \ + hatching_between_50_70.aggregate(total=Sum(F('quantity') * 90 / 100) - Sum(F('killed_quantity')))['total'] + archive_hatch = hatching_between_50_70.filter(archive=True, allow_hatching='True') + active_hatch = hatching_between_50_70.filter(archive=False, allow_hatching='pending') + archive_hatching_quantity = \ + archive_hatch.aggregate(total=Sum('quantity'))['total'] + left_over_active_hatch = \ + active_hatch.aggregate(total=Sum('quantity'))['total'] or 0 + for poultry_hatching in hatching_between_50_70: + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + min_list = sorted(min_list) + all_total_commitment = hatching_between_50_70.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = hatching_between_50_70.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = hatching_between_50_70.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + + return { + 'poultry': len(hatching_between_50_70), + 'hatching_quantity': all_poultry_hatching_quantity, + 'len_archive_hatching': len(archive_hatch), + 'archive_hatching_quantity': archive_hatching_quantity, + 'len_active_hatching': len(active_hatch), + 'active_hatching_quantity': left_over_active_hatch, + 'hatching_killed_quantity': all_poultry_hatching_killed_quantity, + 'hatching_killed_weight': int(all_total_killed_weight), + 'hatching_left_over': all_poultry_hatching_left_over, + 'hatching_left_over_ninty_percent': all_left_over_ninty_percent, + 'min_age': min_list[0] if len(min_list) > 0 else None, + 'max_age': min_list[len(min_list) - 1] if len(min_list) > 0 else None, + 'total_commitment': all_total_commitment, + 'governmental_quantity': all_governmental_quantity, + 'governmental_weight': int(all_governmental_killed_quantity), + 'free_quantity': all_free_quantity, + 'free_weight': all_free_killed_quantity, + 'out_province_killed_quantity': all_out_province_killed_quantity, + 'out_province_killed_weight': all_out_province_killed_weight + } + + def get_kill_house_for_detail(self, kill_req): + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=kill_req.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + all_quantity = kill_req.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + all_weighte = kill_req.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + all_governmental_quantity = \ + kill_req.filter(province_request__poultry_request__free_sale_in_province=False).aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + all_governmental_weight = \ + kill_req.filter(province_request__poultry_request__free_sale_in_province=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + all_free_quantity = kill_req.filter(province_request__poultry_request__free_sale_in_province=True).aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + all_free_weight = kill_req.filter(province_request__poultry_request__free_sale_in_province=True).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + all_age = [] + + if kill_req: + for kill in kill_req: + # weight = kill.get('quantity') * kill.get( + # 'province_kill_request__province_request__poultry_request__Index_weight') + # all_weighte += weight + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + # difference_bars = kill_req.filter( + # Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')),quarantine_quantity__gt=0) + # + # + # final_real_quantity=-0 + # difference_bar = len(difference_bars) + # greater_bars_quantity = difference_bars.filter(quantity__gt=F('quarantine_quantity')) + # real_greater_bars_quantity = (greater_bars_quantity.aggregate(total=Sum('quarantine_quantity'))['total'] or 0 ) - (greater_bars_quantity.aggregate(total=Sum('quantity'))['total'] or 0 ) + # less_bars_quantity = difference_bars.filter(quantity__lt=F('quarantine_quantity')) + # real_less_bars_quantity = (less_bars_quantity.aggregate(total=Sum('quarantine_quantity'))['total'] or 0 ) - (less_bars_quantity.aggregate(total=Sum('quantity'))['total'] or 0 ) + # + # final_real_quantity = real_greater_bars_quantity + real_less_bars_quantity if real_greater_bars_quantity > 0 else (-1 * real_greater_bars_quantity) + real_less_bars_quantity + + difference_bars = kill_req.filter( + Q(accepted_real_quantity__gt=F('quarantine_quantity')) | Q( + accepted_real_quantity__lt=F('quarantine_quantity')), quarantine_quantity__gt=0) + + final_real_quantity = -0 + difference_bar = len(difference_bars) + greater_bars_quantity = difference_bars.filter(accepted_real_quantity__gt=F('quarantine_quantity')) + real_greater_bars_quantity = (greater_bars_quantity.aggregate(total=Sum('quarantine_quantity'))[ + 'total'] or 0) - ( + greater_bars_quantity.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0) + less_bars_quantity = difference_bars.filter(accepted_real_quantity__lt=F('quarantine_quantity')) + real_less_bars_quantity = (less_bars_quantity.aggregate(total=Sum('quarantine_quantity'))['total'] or 0) - ( + less_bars_quantity.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0) + + final_real_quantity = real_greater_bars_quantity + real_less_bars_quantity if real_greater_bars_quantity > 0 else ( + -1 * real_greater_bars_quantity) + real_less_bars_quantity + + hasnt_code = kill_req.filter(clearance_code__isnull=True) + all_quarantine_quantity_hasnt_code = hasnt_code.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + has_code = kill_req.filter(clearance_code__isnull=False) + all_quarantine_quantity_has_code = has_code.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + has_qarantine = kill_req.filter(quarantine_quantity__isnull=False) + all_has_qarantine = has_qarantine.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + all_age1 = sorted(all_age) + + return { + 'poultry_request': len(poultry_request), + 'poultry_request_quantity': total_requests_quantity if total_requests_quantity != None else 0, + 'poultry_request_weight': int(total_requests_weight) if total_requests_weight != None else 0, + 'min_age': all_age1[0] if len(all_age1) > 0 else '-', + 'max_age': all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + 'avg_age': int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + 'len_kill_request': len(kill_req), + 'kill_request_quantity': all_quantity if all_quantity != None else 0, + 'kill_request_weight': int(all_weighte), + 'avg_weight': round(all_weighte / all_quantity, 1) if all_weighte > 0 and all_quantity > 0 else 0, + 'len_kill_request_has_code': len(has_code), + 'quantity_of_kill_request_has_code': all_quarantine_quantity_has_code if all_quarantine_quantity_has_code != None else 0, + 'len_kill_request_has_quarantine': len(has_qarantine), + 'quantity_of_kill_request_has_quarantine': all_has_qarantine if all_has_qarantine != None else 0, + 'len_kill_request_has_not_code': len(hasnt_code), + 'quantity_of_kill_request_has_not_code': all_quarantine_quantity_hasnt_code if all_quarantine_quantity_hasnt_code != None else 0, + 'difference_bar': difference_bar, + 'final_real_quantity': final_real_quantity, + 'all_governmental_quantity': all_governmental_quantity, + 'all_governmental_weight': all_governmental_weight, + 'all_free_quantity': all_free_quantity, + 'all_free_weight': all_free_weight, + + } + + def steward_ware_house_total_report_daily_broad_cast(self, steward): + number_of_steward1 = Steward.objects.filter( + pk__in=steward.values('steward') + ) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + steward_ware_house__in=steward, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + guild_allocations1 = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild1 = guild_allocations1.values('guilds').distinct().count() if guild_allocations1 else 0 + + total_number_of_free_carcasses1 = steward.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] or 0 + total_free_weight_of_carcasses1 = steward.aggregate(total=Sum('weight_of_free_carcasses'))[ + 'total'] or 0 + total_number_of_carcasses1 = steward.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight_of_carcasses1 = steward.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + final_total_number_of_carcasses1 = \ + steward.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + final_total_weight_of_carcasses1 = \ + steward.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_remain_quantity1 = \ + steward.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] or 0 + + total_remain_weight1 = \ + steward.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] or 0 + + total_allocated_quantity1 = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + + total_allocated_weight1 = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_accepted_allocated_quantity1 = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] or 0 + + total_accepted_allocated_weight1 = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] or 0 + + return { + "buyers": len(number_of_steward1), + "incoming_quantity_of_cold_house": 0, + "incoming_weight_of_cold_house": 0, + "total_pre_cold_quantity": 0, + "total_pre_cold_weight": 0, + "total_number_of_free_carcasses": total_number_of_free_carcasses1, + "total_free_weight_of_carcasses": total_free_weight_of_carcasses1, + "total_number_of_carcasses": total_number_of_carcasses1, + "total_weight_of_carcasses": int(total_weight_of_carcasses1), + "final_total_number_of_carcasses": final_total_number_of_carcasses1, + "final_total_weight_of_carcasses": int(final_total_weight_of_carcasses1), + "total_allocated_quantity": total_allocated_quantity1, + "total_allocated_weight": int(total_allocated_weight1), + "total_accepted_allocated_quantity": total_accepted_allocated_quantity1, + "total_accepted_allocated_weight": int(total_accepted_allocated_weight1), + "total_remain_quantity": total_remain_quantity1, + "total_remain_weight": int(total_remain_weight1), + "number_of_guild": number_of_guild1, + } + + def kill_house_ware_house_total_report_daily_broad_cast(self, kill): + number_of_kill_houses = KillHouse.objects.filter( + pk__in=kill.values('kill_house') + ) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill, receiver_state__in=('pending', 'accepted'), trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + total_pre_cold_quantity = \ + kill.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[ + 'total'] or 0 + total_pre_cold_weight = \ + kill.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[ + 'total'] or 0 + total_number_of_free_carcasses = kill.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] or 0 + total_free_weight_of_carcasses = kill.aggregate(total=Sum('free_weight_of_carcasses'))[ + 'total'] or 0 + total_number_of_carcasses = kill.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight_of_carcasses = kill.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + final_total_number_of_carcasses = \ + kill.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] or 0 + final_total_weight_of_carcasses = \ + kill.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] or 0 + + total_remain_quantity = \ + kill.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] or 0 + + total_remain_weight = \ + kill.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] or 0 + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] or 0 + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] or 0 + + return { + "buyers": len(number_of_kill_houses), + "incoming_quantity_of_cold_house": 0, + "incoming_weight_of_cold_house": 0, + "total_pre_cold_quantity": total_pre_cold_quantity, + "total_pre_cold_weight": int(total_pre_cold_weight), + "total_number_of_free_carcasses": total_number_of_free_carcasses, + "total_free_weight_of_carcasses": int(total_free_weight_of_carcasses), + "total_number_of_carcasses": total_number_of_carcasses, + "total_weight_of_carcasses": int(total_weight_of_carcasses), + "final_total_number_of_carcasses": final_total_number_of_carcasses, + "final_total_weight_of_carcasses": int(final_total_weight_of_carcasses), + "total_allocated_quantity": total_allocated_quantity, + "total_allocated_weight": int(total_allocated_weight), + "total_accepted_allocated_quantity": total_accepted_allocated_quantity, + "total_accepted_allocated_weight": int(total_accepted_allocated_weight), + "total_remain_quantity": total_remain_quantity, + "total_remain_weight": int(total_remain_weight), + "number_of_guild": number_of_guild, + "number_of_steward": number_of_steward, + } + + def list(self, request, *args, **kwargs): + now = datetime.now().date() + + date1 = datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + if 'role' in request.GET: + + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user__user=request.user) + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(trash=False) | Q(trash=True, clearance_code__isnull=False), + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + + 'province_request__poultry_request', + 'add_car__driver', + ).only('province_request', 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date').values( + 'province_request', + 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True, + out_province_request_cancel=False, + province_state='accepted', + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2) + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(trash=False) | Q(trash=True, clearance_code__isnull=False), + province_request__poultry_request__poultry__user__city=user.city, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + + 'province_request__poultry_request', + 'add_car__driver', + ).only('province_request', 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date').values( + 'province_request', + 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True, + out_province_request_cancel=False, + poultry__user__city=user.city, + province_state='accepted', + send_date__date__gte=date1, + send_date__date__lte=date2) + else: + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(trash=False) | Q(trash=True, clearance_code__isnull=False), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + + 'province_request__poultry_request', + 'add_car__driver', + ).only('province_request', 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date').values( + 'province_request', + 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True, + out_province_request_cancel=False, + province_state='accepted', + send_date__date__gte=date1, + send_date__date__lte=date2) + else: + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(trash=False) | Q(trash=True, clearance_code__isnull=False), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + + 'province_request__poultry_request', + 'add_car__driver', + ).only('province_request', 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date').values( + 'province_request', + 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True, + out_province_request_cancel=False, + province_state='accepted', + send_date__date__gte=date1, + send_date__date__lte=date2) + + kill_req = self.get_kill_house_for_detail(filtered_kill_reqs) + + filtered_kill_reqs_not_code_but_have_assigment = filtered_kill_reqs.filter( + Q(assignment_state_archive='True', vet_state='pending') + | Q(vet_state='accepted'), clearance_code__isnull=True) + + bar_government = filtered_kill_reqs.filter( + province_request__poultry_request__free_sale_in_province=False) + + accepted_real_quantity_bar_government = bar_government.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + accepted_real_wight_bar_government = bar_government.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) or 0 + + bar_government_quarantine_quantity = bar_government.filter(quarantine_quantity__isnull=False) + + accepted_real_quantity_bar_government_quarantine_quantity = bar_government_quarantine_quantity.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + + bar_free = filtered_kill_reqs.filter(province_request__poultry_request__free_sale_in_province=True) + accepted_real_quantity_bar_free = bar_free.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight_bar_free = bar_free.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + bar_free_quarantine_quantity = bar_free.filter(quarantine_quantity__isnull=False) + + accepted_real_quantity_bar_free_quarantine_quantity = bar_free_quarantine_quantity.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + + bar_free_has_code = len(bar_free.filter(clearance_code__isnull=False)) + + quantity_out_true_poultry_request = out_true_poultry_request.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + + bar_complete_with_kill_house_and_vet = filtered_kill_reqs.filter( + trash=False) + bar_complete_with_vet = filtered_kill_reqs.filter( + vet_state='accepted') + accepted_real_quantity_with_kill_house_and_vet = bar_complete_with_kill_house_and_vet.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight_with_kill_house_and_vet = bar_complete_with_kill_house_and_vet.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + all_vet_accepted_real_quantity_with_kill_house_and_vet = bar_complete_with_vet.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_weight_with_kill_house_and_vet = bar_complete_with_vet.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + bar_complete_with_kill_house = filtered_kill_reqs.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_no_code = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight_no_code = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + if accepted_real_wight_with_kill_house_and_vet != None: + less_25 = (accepted_real_wight_with_kill_house_and_vet * 75) / 100 + else: + less_25 = 0 + + filtered_kill_reqs_not_assigment_all = filtered_kill_reqs.filter( + assignment_state_archive='pending', vet_state='pending') + + accepted_real_quantity_not_assigment_all = filtered_kill_reqs_not_assigment_all.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + accepted_real_wight_not_assigment_all = filtered_kill_reqs_not_assigment_all.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) or 0 + + filtered_kill_reqs_havent_kill_house = filtered_kill_reqs.filter( + assignment_state_archive='pending' + , vet_state='accepted') + + accepted_real_quantity_havent_kill_house = filtered_kill_reqs_havent_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight_havent_kill_house = filtered_kill_reqs_havent_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + accepted_real_weight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) or 0 + accepted_real_quantity_final1 = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + accepted_real_weight_final1 = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) or 0 + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1, + date__date__lte=date2, trash=False) + + kill_house_data = self.kill_house_ware_house_total_report_daily_broad_cast(kill_house_ware_houses) + + steward_ware_houses = StewardWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(weight_of_free_carcasses__gt=0), date__date__gte=date1, + date__date__lte=date2, trash=False) + + steward = self.steward_ware_house_total_report_daily_broad_cast(steward_ware_houses) + return Response({ + 'age55_age90': self.hatching_55_90_data(request), + 'kill_request': kill_req, + 'free_and_government_kill_request': { + 'len_government': len(bar_government), + 'quantity_government': accepted_real_quantity_bar_government, + 'weight_government': int(accepted_real_wight_bar_government), + 'len_government_quarantine_quantity': len(bar_government_quarantine_quantity), + 'real_quantity_bar_government_quarantine_quantity': accepted_real_quantity_bar_government_quarantine_quantity, + 'len_free': len(bar_free), + 'quantity_free': accepted_real_quantity_bar_free, + 'weight_free': accepted_real_wight_bar_free, + 'len_free_quarantine_quantity': len(bar_free_quarantine_quantity), + 'real_quantity_bar_free_quarantine_quantity': accepted_real_quantity_bar_free_quarantine_quantity, + 'len_free_has_code': bar_free_has_code, + 'len_out_kill_request': len(out_true_poultry_request), + 'quantity_out_kill_request': quantity_out_true_poultry_request, + }, + 'complete_kill_request': { + 'len_complete_with_kill_house_and_vet': len(bar_complete_with_kill_house_and_vet), + 'quantity_with_kill_house_and_vet': accepted_real_quantity_with_kill_house_and_vet, + 'weight_with_kill_house_and_vet': int(accepted_real_wight_with_kill_house_and_vet), + "avg_weight": round( + accepted_real_wight_with_kill_house_and_vet / accepted_real_quantity_with_kill_house_and_vet, + 1) if accepted_real_wight_with_kill_house_and_vet > 0 else 0, + 'less_25': int(less_25), + 'len_complete_with_vet': len(bar_complete_with_vet), + 'quantity_complete_with_vet': all_vet_accepted_real_quantity_with_kill_house_and_vet, + 'weight_complete_with_vet': int(all_vet_accepted_real_weight_with_kill_house_and_vet), + 'len_complete_with_kill_house': len(bar_complete_with_kill_house), + 'quantity_final_kill_house': accepted_real_quantity_final, + 'weight_final_kill_house': int(accepted_real_wight_final), + 'len_kill_reqs_has_not_code': len(filtered_kill_reqs_not_code_but_have_assigment), + 'quantity_kill_reqs_has_not_code': accepted_real_quantity_no_code, + 'weight_kill_reqs_has_not_code': int(accepted_real_wight_no_code), + }, + 'kill_request_has_not_assigment': { + 'len_kill_reqs_not_assigment': len(filtered_kill_reqs_not_assigment_all), + 'quantity_kill_reqs_not_assigment': accepted_real_quantity_not_assigment_all, + 'weight_kill_reqs_not_assigment': int(accepted_real_wight_not_assigment_all), + 'len_kill_request_has_not_complete': len(filtered_kill_reqs_havent_kill_house), + 'quantity_kill_request_has_not_complete': accepted_real_quantity_havent_kill_house, + 'weight_kill_request_has_not_complete': int(accepted_real_wight_havent_kill_house), + }, + 'final_quantity_and_weight': { + 'final_quantity': accepted_real_quantity_final1, + 'final_weight': int(accepted_real_weight_final1), + }, + 'kill_house_ware_house_total_report_daily_broad_cast': kill_house_data, + 'steward_ware_house_total_report_daily_broad_cast': steward + + }) + + +class ComprehensiveReportOfTheSlaughterhouseViewSet(viewsets.ViewSet): + permission_classes = [AllowAny] + + def all_kill_request(self, date1, date2): + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ).order_by( + '-create_date').select_related( + 'province_request__poultry_request__hatching', 'province_request__poultry_request').only( + 'province_kill_request__province_request__poultry_request__Index_weight', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'ware_house_accepted_real_quantity') + + all_kill_req_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + + weight = filtered_kill_reqs.aggregate( + total_quantity=Sum( + F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[ + 'total_quantity'] or 0 + + all_kill_req_quantity_reciver = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + all_kill_req_weight_reciver = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity') or 0 + + return { + "quantity_of_create_bar": all_kill_req_quantity, + "weight_of_create_bar": int(weight), + "quantity_of_receive_bar": all_kill_req_quantity_reciver, + "weight_of_receive_bar": int(all_kill_req_weight_reciver), + "weight_with_twenty_five_percent_receive": int( + (all_kill_req_weight_reciver * 75) / 100) if all_kill_req_weight_reciver > 0 else 0, + "quantity_warehouse": all_ware_house_accepted_real_quantity, + "weight_warehouse": int(all_ware_house_accepted_real_weight), + "quantity_percent_warehouse": int( + all_ware_house_accepted_real_quantity * 100 / all_kill_req_quantity_reciver) if all_ware_house_accepted_real_quantity > 0 else 0, + "weight_percent_warehouse": int( + all_ware_house_accepted_real_weight * 100 / all_kill_req_weight_reciver) if all_ware_house_accepted_real_weight > 0 else 0, + "quantity_percent_receive": int( + all_kill_req_quantity_reciver * 100 / all_kill_req_quantity) if all_kill_req_quantity_reciver > 0 else 0, + "weight_percent_receive": int( + (all_kill_req_weight_reciver * 100) / weight) if all_kill_req_weight_reciver > 0 else 0 + } + + def general_broadcast_information(self, tomorrow_date1, tomorrow_date2, filtered_kill_reqs, kill_free_info): + + number_of_kill_house = filtered_kill_reqs.values( + 'killhouse_user').distinct().count() if filtered_kill_reqs else 0 + + all_quantity_out_false = filtered_kill_reqs.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + + weight = filtered_kill_reqs.aggregate( + total_quantity=Sum( + F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[ + 'total_quantity'] or 0 + all_quantity_out_true = kill_free_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + all_weight_out_true = kill_free_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=tomorrow_date1, + date__date__lte=tomorrow_date2, trash=False) + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] or 0 + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] or 0 + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] or 0 + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] or 0 + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] or 0 + + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] or 0 + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, + trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + return { + "number_of_buyer": number_of_kill_house, + "quantity_of_kill_request_in_province": all_quantity_out_false, + "weight_of_kill_request_in_province": int(weight), + "quantity_of_kill_request_out_province": all_quantity_out_true, + "weight_of_kill_request_out_province": int(all_weight_out_true), + "quantity_carcasses": final_total_number_of_carcasses, + "weight_carcasses": int(final_total_weight_of_carcasses), + "allocated_quantity": total_allocated_quantity, + "allocated_weight": int(total_allocated_weight), + "accepted_allocated_quantity": total_accepted_allocated_quantity, + "accepted_allocated_weight": int(total_accepted_allocated_weight), + "remain_quantity": total_remain_quantity, + "remain_weight": int(total_remain_weight), + "percent_warehouse": int(( + total_allocated_quantity * 100) / final_total_number_of_carcasses) if total_allocated_quantity and final_total_number_of_carcasses > 0 else 0, + "number_of_stewards": number_of_steward, + "number_of_giulds": number_of_guild, + "date1": tomorrow_date1, + "date2": tomorrow_date2, + + } + + def kill_request_and_broadcast(self, tomorrow_date1, tomorrow_date2, filtered_kill_reqs, kill_free_info): + list1 = [] + kill_houses = KillHouse.objects.filter(trash=False).select_related('kill_house_operator__user__city').exclude( + out_province=True) + for kill_house in kill_houses: + kill_free_information = kill_free_info.filter(kill_house=kill_house) + tomorrow_kill_request = filtered_kill_reqs.filter(killhouse_user=kill_house) + if tomorrow_kill_request: + tomorrow_kill_request_not_assigment = tomorrow_kill_request.filter(assignment_state_archive='pending', + vet_state='accepted') + all_kill_req_quantity = tomorrow_kill_request.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + + all_kill_req_quantity_reciver = tomorrow_kill_request.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + all_kill_req_weight_reciver = tomorrow_kill_request.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_quantity = tomorrow_kill_request.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + + weight = tomorrow_kill_request.aggregate( + total_quantity=Sum( + F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[ + 'total_quantity'] or 0 + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=tomorrow_date1, + date__date__lte=tomorrow_date2, kill_house=kill_house, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] or 0 + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] or 0 + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] or 0 + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] or 0 + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] or 0 + + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] or 0 + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, + trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + all_kill_req_quantity_not_assigment = tomorrow_kill_request_not_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + all_kill_req_weight_not_assigment = tomorrow_kill_request_not_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + all_quantity_out_true = kill_free_information.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + all_weight_out_true = kill_free_information.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + twenty_five_percent = (int(all_kill_req_weight_reciver) * 75) / 100 + reciver_percent = int( + int(all_kill_req_quantity_reciver) * 100) / all_kill_req_quantity if all_kill_req_quantity_reciver > 0 else 0 + lashe_25_percent = int( + final_total_number_of_carcasses * 100 / all_kill_req_quantity_reciver) if final_total_number_of_carcasses > 0 else 0 + weight_lashe_25_percent = int( + final_total_weight_of_carcasses * 100 / all_kill_req_weight_reciver) if final_total_weight_of_carcasses > 0 else 0 + remain_percent = int(( + total_remain_quantity * 100) / all_ware_house_accepted_real_quantity) if total_remain_quantity and all_ware_house_accepted_real_quantity > 0 else 0 + all_num = number_of_steward + number_of_guild + hasnt_code = len( + tomorrow_kill_request.filter(assignment_state_archive='True', clearance_code__isnull=True)) + percent_hasnt_code = round(hasnt_code * 100 / len(tomorrow_kill_request)) if len( + tomorrow_kill_request) > 0 else 0 + has_code = len( + tomorrow_kill_request.filter(assignment_state_archive='pending', clearance_code__isnull=False)) + percent_has_code = round(has_code * 100 / len(tomorrow_kill_request)) if len( + tomorrow_kill_request) > 0 else 0 + + has_assignment = len( + tomorrow_kill_request.filter(assignment_state_archive='True')) + percent_has_assignment = round(has_assignment * 100 / len(tomorrow_kill_request)) if len( + tomorrow_kill_request) > 0 else 0 + hasnt_assignment = len( + tomorrow_kill_request.filter(assignment_state_archive='pending')) + percent_hasnt_assignment = round(hasnt_assignment * 100 / len(tomorrow_kill_request)) if len( + tomorrow_kill_request) > 0 else 0 + accepeted_bar = len( + tomorrow_kill_request.filter(bar_document_status__title='بدون مشکل')) + percent_accepeted_bar = round(accepeted_bar * 100 / has_assignment) if has_assignment > 0 else 0 + diffrent_bar = len( + tomorrow_kill_request.filter(bar_document_status__title='مغایرت دارد')) + percent_diffrent_bar = round(diffrent_bar * 100 / has_assignment) if has_assignment > 0 else 0 + no_quality = len( + tomorrow_kill_request.filter(bar_document_status__title='فاقد کیفیت')) + percent_no_quality = round(no_quality * 100 / has_assignment) if has_assignment > 0 else 0 + low_quality = len( + tomorrow_kill_request.filter(bar_document_status__title='کیفیت پایین')) + percent_low_quality = round(low_quality * 100 / has_assignment) if has_assignment > 0 else 0 + dict_1 = { + "name": kill_house.name, + "city": kill_house.kill_house_operator.user.city.name, + "kill_req_quantity": all_kill_req_quantity, + "kill_req_weight": int(weight), + "quantity_receiver": all_kill_req_quantity_reciver, + "weight_receiver": int(all_kill_req_weight_reciver), + "twenty_five_percent_weight": int(twenty_five_percent), + "receiver_percent": reciver_percent, + "quantity_of_carcasses": final_total_number_of_carcasses, + "weight_of_carcasses": int(final_total_weight_of_carcasses), + "quantity_of_lashe_percent": lashe_25_percent, + "weight_of_lashe_percent": int(weight_lashe_25_percent), + "quantity_out_province": all_quantity_out_true, + "weight_out_province": int(all_weight_out_true), + "total_number_of_carcasses": final_total_number_of_carcasses, + "total_weight_of_carcasses": int(final_total_weight_of_carcasses), + "allocated_quantity": total_allocated_quantity, + "allocated_weight": int(total_allocated_weight), + "accepted_allocated_quantity": total_accepted_allocated_quantity, + "accepted_allocated_weight": int(total_accepted_allocated_weight), + "remain_quantity": total_remain_quantity, + "remain_weight": int(total_remain_weight), + "remain_percent": remain_percent, + "steward_and_guild": all_num, + "len_kill_req_not_complete": len(tomorrow_kill_request_not_assigment), + "quantity_kill_req_not_complete": all_kill_req_quantity_not_assigment, + "weight_kill_req_not_complete": int(all_kill_req_weight_not_assigment), + "len_hasnt_code": hasnt_code, + "percent_hasnt_code": percent_hasnt_code, + "len_has_code": has_code, + "percent_has_code": percent_has_code, + "has_assignment": has_assignment, + "percent_has_assignment": percent_has_assignment, + "accepeted_bar": accepeted_bar, + "percent_accepeted_bar": percent_accepeted_bar, + "diffrent_bar": diffrent_bar, + "percent_diffrent_bar": percent_diffrent_bar, + "no_quality": no_quality, + "percent_no_quality": percent_no_quality, + "low_quality": low_quality, + "percent_low_quality": percent_low_quality, + "hasnt_assignment": hasnt_assignment, + "percent_hasnt_assignment": percent_hasnt_assignment, + + } + list1.append(dict_1) + return list1 + + def list(self, request): + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + + tomorrow_date1 = date1 + timedelta(days=1) + tomorrow_date2 = date2 + timedelta(days=1) + + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry').only( + 'killhouse_user', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'ware_house_accepted_real_weight', + 'ware_house_accepted_real_quantity', + 'killhouse_user__kill_house_operator__user__city__name') + + kill_free_info = KillHouseFreeBarInformation.objects.filter(trash=False, date__date__gte=tomorrow_date1, + date__date__lte=tomorrow_date2).only( + 'weight_of_carcasses', 'number_of_carcasses') + kill_request = self.all_kill_request(date1, date2) + general_broadcast_informations = self.general_broadcast_information(tomorrow_date1, tomorrow_date2, + filtered_kill_reqs, kill_free_info) + kill_request_and_broadcasts = self.kill_request_and_broadcast(tomorrow_date1, tomorrow_date2, + filtered_kill_reqs, kill_free_info) + + return Response({ + "all_kill_request": kill_request, + "general_broadcast_informations": general_broadcast_informations, + "kill_request_and_broadcast": kill_request_and_broadcasts + } + ) + + +class DetailOfKillingDashboardView(viewsets.ViewSet): + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = DashboardEnterLoadInformationFilterSet + + def list(self, request, *args, **kwargs): + now = datetime.now().date() + + date1 = datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + value = request.GET.get('value') + search = request.GET.get('search') + if request.GET.get('type') == 'assignment': + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + calculate_status=True, + non_receipt=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, assignment_state_archive='True').order_by( + '-create_date').select_related( + 'killhouse_user', + 'province_request__poultry_request', + 'add_car__driver', + ).only('province_request', 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date').values( + 'province_request', + 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + else: + + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + calculate_status=True, + non_receipt=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', + 'province_request__poultry_request', + 'add_car__driver', + ).only('province_request', 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date').values( + 'province_request', + 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + user = SystemUserProfile.objects.get(user=request.user) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_request = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False).last() + if vet: + poultry_set = set() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + for vet_farm in vet_farms: + poultry_set.add(vet_farm.poultry) + poultries = list(poultry_set) + filtered_kill_request = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries + ) + + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_kill_request = filtered_kill_request.filter( + province_request__poultry_request__poultry__address__city=user.city) + elif request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + filtered_kill_request = filtered_kill_request.filter( + killhouse_user=kill_house) + elif request.GET['role'] == 'KillHouseVet': + kill_house = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house') + filtered_kill_request = filtered_kill_request.filter( + (Q(killhouse_user__id__in=kill_house) | Q(kill_request__slaughter_house__id__in=kill_house))) + else: + if request.GET.get('without_quarantine_code_state') == 'true': + filtered_kill_request = filtered_kill_request.filter( + clearance_code__isnull=False, + quarantine_quantity__isnull=True, + quarantine_code_state__isnull=True, + ) + elif request.GET.get('without_bar_document') == "true": + filtered_kill_request = filtered_kill_request.filter( + assignment_state_archive='True', + bar_document_status__isnull=True, + ) + else: + filtered_kill_request = filtered_kill_request + + if value and search == 'filter': + if value != 'undefined' and value.strip(): + filtered_kill_request = filtered_kill_request.filter( + build_query(self.filterset_class, value) + ) + + ware_house_bars = filtered_kill_request.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = filtered_kill_request.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + detail_of_killing = DetailOfKillingViewSet() + bars = dict(list(detail_of_killing.get_kill_house_for_detail(filtered_kill_request).items())[3:]) + dict1 = {**bars, + 'len_complete_with_vet': 0, + 'quantity_complete_with_vet': 0, + 'weight_complete_with_vet': 0, + 'ware_house_bars': len(ware_house_bars), + 'ware_house_bars_quantity': ware_house_bars_quantity, + 'ware_house_bars_weight': ware_house_bars_weight, + 'ware_house_bars_weight_lose': ware_house_bars_weight_lose / len( + ware_house_bars) if ware_house_bars else 0, + 'len_complete_with_kill_house': len(bar_complete_with_kill_house), + 'quantity_final_kill_house': accepted_real_quantity_final, + 'weight_final_kill_house': int(accepted_real_wight_final), + + } + return Response(dict1) + + +class ParentCompanyDetailOfKillingDashboardView(viewsets.ViewSet): + permission_classes = [AllowAny] + filter_backends = [DjangoFilterBackend] + filterset_class = DashboardEnterLoadInformationFilterSet + + def list(self, request, *args, **kwargs): + now = datetime.now().date() + + date1 = datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + value = request.GET.get('value') + search = request.GET.get('search') + if request.GET.get('type') == 'assignment': + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, assignment_state_archive='True').order_by( + '-create_date').select_related( + 'killhouse_user', + 'province_request__poultry_request', + 'add_car__driver', + ).only('province_request', 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date').values( + 'province_request', + 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + else: + + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', + 'province_request__poultry_request', + 'add_car__driver', + ).only('province_request', 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date').values( + 'province_request', + 'province_request__poultry_request', + + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + if request.GET.get('without_quarantine_code_state') == 'true': + filtered_kill_request = filtered_kill_request.filter( + clearance_code__isnull=False, + quarantine_quantity__isnull=True, + quarantine_code_state__isnull=True, + ) + elif request.GET.get('without_bar_document') == "true": + filtered_kill_request = filtered_kill_request.filter( + assignment_state_archive='True', + bar_document_status__isnull=True, + ) + else: + filtered_kill_request = filtered_kill_request + + if value and search == 'filter': + if value != 'undefined' and value.strip(): + filtered_kill_request = filtered_kill_request.filter( + build_query(self.filterset_class, value) + ) + + ware_house_bars = filtered_kill_request.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = filtered_kill_request.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + detail_of_killing = DetailOfKillingViewSet() + bars = dict(list(detail_of_killing.get_kill_house_for_detail(filtered_kill_request).items())[3:]) + dict1 = {**bars, + 'len_complete_with_vet': 0, + 'quantity_complete_with_vet': 0, + 'weight_complete_with_vet': 0, + 'ware_house_bars': len(ware_house_bars), + 'ware_house_bars_quantity': ware_house_bars_quantity, + 'ware_house_bars_weight': ware_house_bars_weight, + 'ware_house_bars_weight_lose': ware_house_bars_weight_lose / len( + ware_house_bars) if ware_house_bars else 0, + 'len_complete_with_kill_house': len(bar_complete_with_kill_house), + 'quantity_final_kill_house': accepted_real_quantity_final, + 'weight_final_kill_house': int(accepted_real_wight_final), + + } + return Response(dict1) + + +class SlaughterHouseTransactionViewSet(viewsets.ModelViewSet): + queryset = SlaughterHouseTransaction.objects.all() + serializer_class = SlaughterHouseTransactionSerializer + permission_classes = [TokenHasReadWriteScope] + + +class KillHouseWageDashbordInWeightViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseWageSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.get(user=user) + kill_houses = KillHouse.objects.filter(kill_house_operator=kill_house_operator, out_province=False, + trash=False) + # kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator,out_province=False,trash=False).first() + # serializer = self.serializer_class(kill_house) + + else: + kill_houses = KillHouse.objects.filter(out_province=False, trash=False) + serializer = self.serializer_class(kill_houses, many=True) + + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalWageInformationExclusiveKillerViewset(viewsets.ModelViewSet): + queryset = KillRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = TotalWageInformationKillHouseExclusiveKillerSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + kill_house_key = request.GET.get('kill_house_key') + if kill_house_key: + kill_house = KillHouse.objects.filter(key=kill_house_key, trash=False).first() + else: + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + serializer = self.serializer_class(kill_house).data + return Response(serializer, status=status.HTTP_200_OK) + + +class PoultryRequestLetterForProvinceVetViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestLetterForProvinceVetSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + + if 'order_code' in request.GET: + poultry_request = PoultryRequest.objects.get(order_code=int(request.GET['order_code']), trash=False) + serializer = PoultryRequestLetterForProvinceVetSerializer(poultry_request) + else: + date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + poultry_requests = PoultryRequest.objects.filter(send_date__date=date, + quantity__gt=F('remain_quantity'), + trash=False) + serializer = PoultryRequestLetterForProvinceVetSerializer(poultry_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProvinceRequestLetterForProvinceViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseLetterForProvinceSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + # user=SystemUserProfile.objects.get(user=request.user,trash=False) + date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + + province_kill_requests = ProvinceKillRequest.objects.filter(kill_request__recive_date__date=date, trash=False, + state__in=('pending', 'accepted'), + return_to_province=False) + kill_houses = KillHouse.objects.filter(pk__in=province_kill_requests.values_list('killhouse_user', flat=True)) + serializer = self.serializer_class(kill_houses, many=True, context={'date': date}) + if WageType.objects.filter(en_name='poultry-sell-out-province', status=True).exists(): + poultry_requests = PoultryRequest.objects.filter(send_date__date=date, out=True, + out_province_request_cancel=False, + trash=False, state_process='accepted', + province_state='accepted', wage_pay=True) \ + .select_related('hatching', 'poultry', 'poultry__address__city', 'poultry__address__province', + 'poultry__user') \ + .order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter(send_date__date=date, out=True, + out_province_request_cancel=False, + trash=False, state_process='accepted', + province_state='accepted') \ + .select_related('hatching', 'poultry', 'poultry__address__city', 'poultry__address__province', + 'poultry__user') \ + .order_by('-send_date') + + poultry_out = PoultryRequestoutProvinceSerializer(poultry_requests, many=True) + dict1 = { + 'allocation': serializer.data, + 'out_province': poultry_out.data, + } + return Response(dict1, status=status.HTTP_200_OK) + + +class KillHousetestSerializer: + pass + + +class KillHouseFortestViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHousetestSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + serializer = self.get_serializer(kill_houses, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class DeleteKillHouseRequest(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.filter(trash=False) + serializer_class = KillHouseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def destroy(self, request, *args, **kwargs): + kill_house_request = KillHouseRequest.objects.get(trash=False, bar_code=request.GET['bar_code']) + if kill_house_request.assignment_state_archive == 'True': + kill_house_assignment = KillHouseAssignmentInformation.objects.get(kill_house_request=kill_house_request) + kill_house_assignment.trash = True + kill_house_assignment.save() + + kill_house_request.trash = True + kill_house_request.save() + update_kill_house_requests(kill_house_request.province_kill_request, + kill_house_request.province_request.poultry_request) + update_province_kill_requests(kill_house_request.province_request.poultry_request.hatching) + poultry_prediction(kill_house_request.province_request.poultry_request.hatching) + + if kill_house_request.ware_house_confirmation == True: + product = RolesProducts.objects.filter(trash=False, kill_house=kill_house_request.killhouse_user).first() + kill_house_requests_product_warehousing(product) + + return Response({'result': 'Success'}, status=status.HTTP_200_OK) + + +class DashboardEnterLoadInformationView(viewsets.ViewSet): + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = DashboardEnterLoadInformationFilterSet + + def list(self, request, *args, **kwargs): + now = datetime.now().date() + date1 = datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + value = request.GET.get('value') + search = request.GET.get('search') + user = SystemUserProfile.objects.get(user=request.user) + kill_house = [] + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + for kill_house_vet in kill_house_vets: + kill_house.append(kill_house_vet.kill_house) + + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + + if request.GET['role'] in ['CityOperator', 'CityJahad', 'CityPoultry']: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='pending', + non_receipt=False, + trash=False, province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + + ).order_by('-kill_request__recive_date') + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='pending', + non_receipt=False, + trash=False, province_request__poultry_request__poultry__address__city=user.city + + ).order_by('-kill_request__recive_date') + + else: + + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + assignment_state_archive='pending', + non_receipt=False, + trash=False, + + ).order_by('-kill_request__recive_date') + + if value and search == 'filter': + if value != 'undefined' and value.strip(): + kill_house_requests = kill_house_requests.filter( + build_query(self.filterset_class, value) + ) + + first_quantity = kill_house_requests.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + + first_weight = kill_house_requests.aggregate( + total_quantity=Sum(F('province_request__poultry_request__Index_weight') * F('quantity'))).get( + 'total_quantity') or 0 + vet_accepted_real_quantity = kill_house_requests.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + vet_accepted_real_weight = kill_house_requests.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + + dict1 = { + "lenKillHouseRequest": len(kill_house_requests), + 'firstQuantity': first_quantity, + 'firstWeight': int(first_weight), + 'vetAcceptedRealQuantity': vet_accepted_real_quantity, + 'vetAcceptedRealWeight': vet_accepted_real_weight, + } + return Response(dict1) + + +class DashboardDeleteBarView(viewsets.ViewSet): + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = DashboardEnterLoadInformationFilterSet + + def list(self, request, *args, **kwargs): + now = datetime.now().date() + date1 = datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + value = request.GET.get('value') + search = request.GET.get('search') + user = SystemUserProfile.objects.get(user=request.user) + kill_house_requests_list = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, trash=True, temporary_trash=False, + temporary_deleted=False).select_related('kill_request') + if request.GET['role'] == 'VetSupervisor': + kill_house_requests_list = kill_house_requests_list.filter( + province_request__poultry_request__poultry__address__province=user.province, + + ) + + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + + kill_house_requests_list = kill_house_requests_list.filter( + province_request__poultry_request__poultry__in=poultries, + ).select_related('kill_request') + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + kill_house_requests_list = kill_house_requests_list.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + + ).select_related('kill_request') + + elif request.GET['role'] in ['CityCommerce', 'CityVet', 'CityJahad', 'CityPoultry']: + kill_house_requests_list = kill_house_requests_list.filter( + + province_request__poultry_request__poultry__address__city=user.city, + + ).select_related('kill_request') + + elif request.GET['role'] == 'LiveStockSupport': + kill_house_requests_list = kill_house_requests_list.filter( + + province_request__poultry_request__freezing=True, + + ).select_related('kill_request') + + elif request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + kill_house_requests_list = kill_house_requests_list.filter( + (Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house) | Q(killer__in=kill_house)), + + province_request__poultry_request__poultry__address__province=user.province, + ).select_related('kill_request') + + else: + kill_house_requests_list = kill_house_requests_list.filter( + + province_request__poultry_request__poultry__address__province=user.province, + ).select_related('kill_request') + + if value and search == 'filter': + if value != 'undefined' and value.strip(): + kill_house_requests_list = kill_house_requests_list.filter( + build_query(self.filterset_class, value) + ) + + first_quantity = kill_house_requests_list.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + + first_weight = kill_house_requests_list.aggregate( + total_quantity=Sum(F('province_request__poultry_request__Index_weight') * F('quantity'))).get( + 'total_quantity') or 0 + len_has_code = len(kill_house_requests_list.filter(clearance_code__isnull=False)) + len_hasnt_code = len(kill_house_requests_list.filter(clearance_code__isnull=True)) + kill_house = kill_house_requests_list.values_list('kill_request__kill_house', flat=True).distinct() + + dict1 = { + "lenKillHouseRequest": len(kill_house_requests_list), + 'firstQuantity': first_quantity, + 'firstWeight': int(first_weight), + 'lenHasCode': len_has_code, + 'lenHasntCode': len_hasnt_code, + 'lenKillHouse': len(kill_house), + } + return Response(dict1) + + +class DahsnoardProvinceKillRequestViewSet(viewsets.ModelViewSet): + queryset = ProvinceKillRequest.objects.all() + serializer_class = ProvinceKillRequestSerializer + permission_classes = [TokenHasReadWriteScope] + filterset_class = ProvinceKillRequestNewFilterSet + + # تابع مربوط به نمایش تخصیصات به کشتارگاها توسط استان + def list(self, request, *args, **kwargs): + now = datetime.now().date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + if request.GET['role'] == 'KillHouse': + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, + trash=False) + + trash = True if 'deleted_object' in request.GET else False + province_kill_requests = ProvinceKillRequest.objects.filter(Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house), + trash=trash, + delete_message__isnull=False if trash else True, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, temporary_deleted=False, + ).select_related( + 'province_request__poultry_request').order_by( + 'province_request__city_request_Poultry__poultry_request__send_date') + else: + trash = True if 'deleted_object' in request.GET else False + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request__poultry__user__province=user.province, + trash=trash, + delete_message__isnull=False if trash else True, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, temporary_trash=False, temporary_deleted=False, + ).select_related( + 'province_request__poultry_request__poultry', + 'province_request__city_request_Poultry__poultry_request__poultry__user', + 'province_request__city_request_Poultry__poultry_request__poultry__user__city', + 'kill_request__kill_house', + 'kill_request__kill_house__kill_house_operator__user', + 'kill_request__kill_house__system_address__city' + ).order_by('province_request__poultry_request__send_date') + if 'allocated_car_state' in request.GET: + province_kill_requests = province_kill_requests.filter(first_car_allocated_quantity=0) + value = request.GET.get('value') + search = request.GET.get('filter') + if value and search == 'search': + if value != 'undefined' and value.strip(): + province_kill_requests = province_kill_requests.filter( + build_query(self.filterset_class, value) + ) + kill_requests = KillHouseRequest.objects.filter(province_kill_request__in=province_kill_requests, trash=False) + accepted_province_kill_requests = province_kill_requests.filter(state='accepted') + pending_province_kill_requests = province_kill_requests.filter(state='pending') + rejected_province_kill_requests = province_kill_requests.filter(state='rejected') + + quantity = province_kill_requests.aggregate( + total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity') or 0 + weight = province_kill_requests.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity') or 0 + + accepted_quantity = accepted_province_kill_requests.aggregate( + total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity') or 0 + pending_quantity = pending_province_kill_requests.aggregate( + total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity') or 0 + rejected_quantity = rejected_province_kill_requests.aggregate( + total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity') or 0 + has_car = province_kill_requests.filter(first_car_allocated_quantity__gt=0) + has_car_quantity = has_car.aggregate( + total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity') or 0 + has_car_weight = has_car.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity') or 0 + hasnt_car = province_kill_requests.filter(first_car_allocated_quantity=0) + hasnt_car_quantity = hasnt_car.aggregate( + total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity') or 0 + hasnt_car_weight = hasnt_car.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity') or 0 + real_quantity = kill_requests.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + real_weight = kill_requests.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + internal_dict_infos = { + "lenProvinceRequest": len(province_kill_requests), + "quantity": quantity, + "weight": int(weight), + "acceptedProvinceKillRequests": len(accepted_province_kill_requests), + "acceptedProvinceKillRequestsQuantity": accepted_quantity, + "pendingProvinceKillRequests": len(pending_province_kill_requests), + "pendingProvinceKillRequestsQuantity": pending_quantity, + "rejectedProvinceKillRequests": len(rejected_province_kill_requests), + "rejectedProvinceKillRequestsQuantity": rejected_quantity, + "lenHasCar": len(has_car), + "hasCarQuantity": has_car_quantity, + "hasCarWeight": has_car_weight, + "lenKillRequests": len(kill_requests), + "realQuantity": real_quantity, + "realWeight": real_weight, + "lenHasntCar": len(hasnt_car), + "hasntCarQuantity": hasnt_car_quantity, + "hasntCarWeight": hasnt_car_weight, + } + + return Response(internal_dict_infos, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.data['role'] + request.data.pop('role') + if 'type' in request.data.keys(): + if request.data['type'] == 'archive': + user_fullname = user.fullname + date = str(datetime.now()) + archive_province_kill_request_wage_threading = threading.Thread( + target=provincearchiveprovincekillrequestforwage, + args=( + request.data['province_kill_request_list'], request.data['message'], role, user_fullname, date + )) + archive_province_kill_request_wage_threading.start() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + + elif request.data['type'] == 'return_archive': + user_fullname = user.fullname + date = str(datetime.now().date()) + province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key']) + province_kill_request.archive_by_province = False + if 'return_archive_message' in request.data.keys(): + province_kill_request.return_archive_message = request.data['return_archive_message'] + province_kill_request.returner = { + "fullname": user_fullname, + "date": date, + "role": role + } + province_kill_request.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + + else: + + province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key']) + if province_kill_request.prev_total_amount == None: + province_kill_request.prev_total_amount = province_kill_request.total_amount + province_kill_request.total_amount_editor = { + "role": role, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()) + } + province_kill_request.save() + serializer = self.serializer_class(province_kill_request) + serializer.update(instance=province_kill_request, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + if 'delete_allocation' in request.GET: + province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key'], + trash=False) + if province_kill_request.quantity != province_kill_request.main_quantity: + return Response({"result": "برای تخصیص ماشین ثبت شده امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key, + trash=False) + province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + if poultry_request.export == True: + hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity -= int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity -= province_kill_request.total_killed_weight + # hatching.free_killed_quantity -= int(province_kill_request.main_quantity * poultry_request.Index_weight) + hatching.free_quantity -= province_kill_request.total_killed_quantity + # hatching.free_quantity -= province_kill_request.main_quantity + else: + hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight + # hatching.governmental_killed_quantity -= int( + # province_kill_request.main_quantity * poultry_request.Index_weight) + + hatching.governmental_quantity -= province_kill_request.total_killed_quantity + # hatching.governmental_quantity -= province_kill_request.main_quantity + # hatching.killed_quantity -= province_kill_request.main_quantity + hatching.save() + + if poultry_request.remain_quantity > 0: + # province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + province_check.quantity += province_kill_request.main_quantity + province_check.save() + poultry_request.remain_quantity += province_kill_request.main_quantity + poultry_request.save() + else: + + # province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + province_check.quantity += province_kill_request.main_quantity + province_check.save() + poultry_request.remain_quantity += province_kill_request.main_quantity + poultry_request.save() + # poultry_request.quantity -= province_kill_request.quantity + # poultry_request.first_quantity -= province_kill_request.quantity + # poultry_request.previous_quantity -= province_kill_request.quantity + # poultry_request.save() + # if poultry_request.quantity == 0: + # poultry_request.trash = True + # poultry_request.save() + # hatching.left_over += province_kill_request.quantity + # hatching.state = 'pending' + # hatching.allow_hatching = 'pending' + # hatching.save() + kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key) + kill_request.remain_quantity += province_kill_request.main_quantity + kill_request.save() + province_kill_request.delete_message = request.GET['message'] + province_kill_request.trash = True + province_kill_request.save() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + elif 'return_allocation_quantity' in request.GET: + + province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key'], + trash=False) + if province_kill_request.quantity == 0: + return Response({"result": "باقی مانده تخصیص صفر است امکان بازگشت تعداد وجود ندارد"}, + status=status.HTTP_403_FORBIDDEN) + amount = province_kill_request.quantity + + poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key, + trash=False) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + + if province_kill_request.main_quantity - province_kill_request.quantity == 0: + province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + province_check.quantity += province_kill_request.main_quantity + province_check.save() + poultry_request.remain_quantity += province_kill_request.main_quantity + poultry_request.save() + # kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key) + # kill_request.remain_quantity += province_kill_request.main_quantity + # kill_request.save() + if poultry_request.export == True: + hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity -= int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity -= province_kill_request.total_killed_weight + # hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight) + hatching.free_quantity -= province_kill_request.total_killed_quantity + # hatching.free_quantity -= amount + else: + hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight + # hatching.governmental_killed_quantity -= int(amount * poultry_request.Index_weight) + hatching.governmental_quantity -= province_kill_request.total_killed_quantity + # hatching.governmental_quantity -= amount + # hatching.killed_quantity -= amount + hatching.save() + # province_kill_request.trash = True + province_kill_request.quantity = 0 + province_kill_request.total_killed_quantity = 0 + province_kill_request.total_killed_weight = 0 + province_kill_request.return_to_province = True + province_kill_request.save() + else: + + province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + province_check.quantity += province_kill_request.main_quantity - province_kill_request.quantity + province_check.save() + poultry_request.remain_quantity += province_kill_request.main_quantity - province_kill_request.quantity + poultry_request.save() + # kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key) + # kill_request.remain_quantity += province_kill_request.main_quantity - province_kill_request.quantity + # kill_request.save() + if poultry_request.export == True: + hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity -= int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity -= int(( + province_kill_request.main_quantity - province_kill_request.quantity) * poultry_request.Index_weight) + # hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight) + hatching.free_quantity -= province_kill_request.total_killed_quantity + # hatching.free_quantity -= amount + else: + hatching.governmental_killed_quantity -= int(( + province_kill_request.main_quantity - province_kill_request.quantity) * poultry_request.Index_weight) + # hatching.governmental_killed_quantity -= int(amount * poultry_request.Index_weight) + hatching.governmental_quantity -= province_kill_request.main_quantity - province_kill_request.quantity + # hatching.governmental_quantity -= amount + # hatching.killed_quantity -= amount + hatching.save() + province_kill_request.main_quantity = province_kill_request.main_quantity - province_kill_request.quantity + province_kill_request.quantity = 0 + province_kill_request.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + queryset = ProvinceKillRequest.objects.get(key=request.GET['key']) + poultry_request = PoultryRequest.objects.get(key=queryset.province_request.poultry_request.key) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + check = KillHouseCheckRequest.objects.filter(province_kill_request=queryset, state='accepted') + if check.count() > 0: + return Response({"result": "can not delete"}, status=status.HTTP_403_FORBIDDEN) + province = ProvinceCheckOperatorRequest.objects.get(key=queryset.province_request.key) + province.quantity += queryset.quantity + province.save() + kill_request = KillRequest.objects.get(key=queryset.kill_request.key) + kill_request.remain_quantity += queryset.quantity + kill_request.save() + # queryset.delete() + poultry_request.remain_quantity += queryset.quantity + poultry_request.save() + if poultry_request.export == True: + hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight) + hatching.export_killed_quantity -= int(request.data['quantity']) + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity -= queryset.total_killed_weight + # hatching.free_killed_quantity -= int(queryset.quantity * poultry_request.Index_weight) + hatching.free_quantity -= queryset.total_killed_quantity + else: + hatching.governmental_killed_quantity -= queryset.total_killed_weight + # hatching.governmental_killed_quantity -= int( + # queryset.quantity * poultry_request.Index_weight) + hatching.governmental_quantity -= queryset.total_killed_quantity + # hatching.killed_quantity -= queryset.total_killed_quantity + hatching.save() + queryset.delete() + + return Response(status=status.HTTP_200_OK) + + +class DashboardKillHouseFreeBarInformationViewSet(viewsets.ModelViewSet): + queryset = KillHouseFreeBarInformation.objects.all() + serializer_class = KillHouseFreeBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = DashboardKillHouseFreeBarInformationFilterSet + + def list(self, request, *args, **kwargs): + value = request.GET.get('value') + search = request.GET.get('search') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + type = request.GET['type'] + if request.GET['role'] in ['KillHouse', 'KillHouseVet']: + if request.GET['role'] == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + Q(kill_house__in=kill_houses) | Q(exclusive_killer__in=kill_houses) | Q(public_killer__in=kill_houses), + buy_type=type, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + trash=False).order_by('-date') + else: + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + buy_type=type, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + trash=False).order_by('-date') + + if date1: + kill_house_free_bar_info = kill_house_free_bar_info.filter(register_date__date__gte=date1, + register_date__date__lte=date2) + + if value and search == 'filter': + if value != 'undefined' and value.strip(): + kill_house_free_bar_info = kill_house_free_bar_info.filter( + build_query(self.filterset_class, value) + ) + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + if type == 'live': + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0) + + entered_quantity = entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + entered_live_weight = entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + entered_number_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + entered_weight_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0) + + not_entered_quantity = not_entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + not_entered_live_weight = not_entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + not_entered_number_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + not_entered_weight_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + result = { + 'total_bars': len(kill_house_free_bar_info), + 'total_bars_quantity': quantity, + 'total_bars_live_Weight': live_weight, + 'total_bars_numberOfCarcasses': number_of_carcasses, + 'total_bars_weightOfCarcasses': weight_of_carcasses, + + 'entered_total_bars': len(entered_bars), + 'entered_total_bars_quantity': entered_quantity, + 'entered_total_bars_live_Weight': entered_live_weight, + 'entered_total_bars_numberOfCarcasses': entered_number_of_carcasses, + 'entered_total_bars_weightOfCarcasses': entered_weight_of_carcasses, + + 'not_entered_total_bars': len(not_entered_bars), + 'not_entered_total_bars_quantity': not_entered_quantity, + 'not_entered_total_bars_live_Weight': not_entered_live_weight, + 'not_entered_total_bars_numberOfCarcasses': not_entered_number_of_carcasses, + 'not_entered_total_bars_weightOfCarcasses': not_entered_weight_of_carcasses, + + } + else: + result = { + 'total_bars': len(kill_house_free_bar_info), + 'total_bars_quantity': quantity, + 'total_bars_live_Weight': live_weight, + 'total_bars_numberOfCarcasses': number_of_carcasses, + 'total_bars_weightOfCarcasses': weight_of_carcasses, + } + return Response(result, status=status.HTTP_200_OK) + + +class ParentCopmanyDashboardKillHouseFreeBarInformationViewSet(viewsets.ModelViewSet): + queryset = KillHouseFreeBarInformation.objects.all() + serializer_class = KillHouseFreeBarInformationSerializer + permission_classes = [AllowAny] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = DashboardKillHouseFreeBarInformationFilterSet + + def list(self, request, *args, **kwargs): + + type = request.GET['type'] + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + buy_type=type, + trash=False).order_by('-date') + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + if type == 'live': + quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0) + + entered_quantity = entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + entered_live_weight = entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + entered_number_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + entered_weight_of_carcasses = entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0) + + not_entered_quantity = not_entered_bars.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + not_entered_live_weight = not_entered_bars.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + not_entered_number_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + not_entered_weight_of_carcasses = not_entered_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + result = { + 'total_bars': len(kill_house_free_bar_info), + 'total_bars_quantity': quantity, + 'total_bars_live_Weight': live_weight, + 'total_bars_numberOfCarcasses': number_of_carcasses, + 'total_bars_weightOfCarcasses': weight_of_carcasses, + + 'entered_total_bars': len(entered_bars), + 'entered_total_bars_quantity': entered_quantity, + 'entered_total_bars_live_Weight': entered_live_weight, + 'entered_total_bars_numberOfCarcasses': entered_number_of_carcasses, + 'entered_total_bars_weightOfCarcasses': entered_weight_of_carcasses, + + 'not_entered_total_bars': len(not_entered_bars), + 'not_entered_total_bars_quantity': not_entered_quantity, + 'not_entered_total_bars_live_Weight': not_entered_live_weight, + 'not_entered_total_bars_numberOfCarcasses': not_entered_number_of_carcasses, + 'not_entered_total_bars_weightOfCarcasses': not_entered_weight_of_carcasses, + + } + else: + result = { + 'total_bars': len(kill_house_free_bar_info), + 'total_bars_quantity': quantity, + 'total_bars_live_Weight': live_weight, + 'total_bars_numberOfCarcasses': number_of_carcasses, + 'total_bars_weightOfCarcasses': weight_of_carcasses, + } + return Response(result, status=status.HTTP_200_OK) + + +class DashboardKillRequestViewSet(viewsets.ModelViewSet): + queryset = KillRequest.objects.all() + serializer_class = KillHouseFreeBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = DashboardKillRequestFilterSet + + def list(self, request, *args, **kwargs): + value = request.GET.get('value') + search = request.GET.get('search') + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + querysets = KillRequest.objects.filter( + recive_date__date__gte=date1, + recive_date__date__lte=date2, poultry__isnull=False, + trash=False).order_by( + 'recive_date') + if request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + querysets = querysets.filter(kill_house__in=kill_house).order_by('recive_date') + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']: + if 'direct_buying' in request.GET: + querysets = querysets.filter(market=False, + final_accept=True, + direct_buying_state__in=( + 'accepted', 'rejected', 'deleted', 'pending'), + export_status=False, trash=False + ) + if 'export' in request.GET: + if request.GET['type'] == 'pending': + querysets = querysets.filter(export_status=True, + export_state='pending' + ) + else: + querysets = querysets.filter(export_status=True, + export_state__in=( + 'accepted', 'rejected', 'deleted'), + ) + + if value and search == 'filter': + if value != 'undefined' and value.strip(): + querysets = querysets.filter( + build_query(self.filterset_class, value) + ) + quantity = querysets.aggregate( + total_quantity=Sum('kill_capacity')).get( + 'total_quantity') or 0 + free_direct_buying_true_quantity = querysets.aggregate( + total_quantity=Sum('kill_capacity', filter=Q(free_direct_buying=True))).get( + 'total_quantity') or 0 + free_direct_buying_false_quantity = querysets.aggregate( + total_quantity=Sum('kill_capacity', filter=Q(free_direct_buying=False))).get( + 'total_quantity') or 0 + left_over = querysets.aggregate( + total_quantity=Sum('remain_quantity')).get( + 'total_quantity') or 0 + amount = querysets.aggregate( + total_quantity=Avg('amount')).get( + 'total_quantity') or 0 + index_wight = querysets.aggregate( + total_quantity=Avg('Index_weight')).get( + 'total_quantity') or 0 + dict1 = { + 'lenKillRequest': querysets.count(), + 'lenKillRequestHasFreeDirectBuying': querysets.filter(free_direct_buying=True).count(), + 'lenKillRequestHasntFreeDirectBuying': querysets.filter(free_direct_buying=False).count(), + 'quantity': quantity, + 'leftOver': left_over, + 'remainQuantity': quantity - left_over, + 'amount': amount, + 'indexWight': index_wight, + 'freeDirectBuyingTrueQuantity': free_direct_buying_true_quantity, + 'freeDirectBuyingFalseQuantity': free_direct_buying_false_quantity, + + } + return Response(dict1, status=status.HTTP_200_OK) + + +class InputBarsForKillHouseViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestForInputBarsSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + def list(self, request, *args, **kwargs): + quota = request.GET.get('quota') + if quota == 'governmental': + quota_filter = {'province_request__poultry_request__free_sale_in_province': False} + elif quota == 'free': + quota_filter = {'province_request__poultry_request__free_sale_in_province': True} + else: + quota_filter = None + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if request.GET['type'] == 'entered': + + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date') + else: + + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ware_house_confirmation=False, non_receipt=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date') + else: + + if request.GET['type'] == 'entered': + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=True, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date') + else: + + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=False, non_receipt=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date') + + if quota_filter: + kill_house_requests = kill_house_requests.filter(**quota_filter) + + if 'search' in request.GET: + kill_house_requests_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests) + kill_house_requests_list = ps.filter() + kill_house_requests = [] if len(kill_house_requests_list) == 0 else kill_house_requests_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class InputBarsForKillHouseDashboardViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestForInputBarsSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + role = request.GET.get('role') + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if role in ('Steward', 'Guild'): + guild = Guilds.objects.get(user=user, active=True, trash=False) + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + allocations = StewardAllocation.objects.filter( + Q(to_steward=guild) | Q(to_guilds=guild), date__date__gte=date1, date__date__lte=date2, + trash=False, calculate_status=True, system_registration_code=True) + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward=guild) | Q(to_guilds=guild), + trash=False, calculate_status=True, system_registration_code=True) + entered_allocations = allocations.filter(receiver_state='accepted') + not_entered_allocations = allocations.filter(receiver_state='pending') + rejected_allocations = allocations.filter(receiver_state='rejected') + total_allocations_quantity = allocations.filter(receiver_state__in=('pending', 'accepted')).aggregate( + total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + total_allocations_weight = allocations.filter(receiver_state__in=('pending', 'accepted')).aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_entered_allocations_quantity = \ + entered_allocations.aggregate(total=Sum('real_number_of_carcasses'))['total'] or 0 + total_entered_allocations_weight = \ + entered_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + total_not_entered_allocations_quantity = \ + not_entered_allocations.aggregate(total=Sum('real_number_of_carcasses'))['total'] or 0 + total_not_entered_allocations_weight = \ + not_entered_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + total_rejected_allocations_quantity = \ + rejected_allocations.aggregate(total=Sum('real_number_of_carcasses'))['total'] or 0 + total_rejected_allocations_weight = \ + rejected_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + result = { + "total_bars": len(allocations), + "total_bars_quantity": total_allocations_quantity, + "total_bars_weight": total_allocations_weight, + "total_entered_bars": len(entered_allocations), + "total_entered_bars_quantity": total_entered_allocations_quantity, + "total_entered_bars_weight": total_entered_allocations_weight, + "total_not_entered_bars": len(not_entered_allocations), + "total_not_entered_bars_quantity": total_not_entered_allocations_quantity, + "total_not_entered_kill_house_requests_weight": total_not_entered_allocations_weight, + "total_rejected_bars": len(rejected_allocations), + "total_rejected_bars_quantity": total_rejected_allocations_quantity, + "total_rejected_bars_weight": total_rejected_allocations_weight, + } + + else: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + trash=False, calculate_status=True).order_by('-kill_request__recive_date') + entered_kill_house_requests = kill_house_requests.filter(ware_house_confirmation=True) + not_entered_kill_house_requests = kill_house_requests.filter(ware_house_confirmation=False) + total_kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + total_kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + total_entered_kill_house_requests_quantity = \ + entered_kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + total_entered_kill_house_requests_weight = \ + entered_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + total_entered_kill_house_requests_carcasses = \ + entered_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_quantity'))['total'] or 0 + total_entered_kill_house_requests_carcasses_weight = \ + entered_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_weight'))['total'] or 0 + total_not_entered_kill_house_requests_quantity = \ + not_entered_kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + total_not_entered_kill_house_requests_weight = \ + not_entered_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + + result = { + "total_bars": len(kill_house_requests), + "total_bars_quantity": total_kill_house_requests_quantity, + "total_bars_weight": total_kill_house_requests_weight, + "total_entered_bars": len(entered_kill_house_requests), + "total_entered_bars_quantity": total_entered_kill_house_requests_quantity, + "total_entered_bars_weight": total_entered_kill_house_requests_weight, + "total_entered_bars_carcasses": total_entered_kill_house_requests_carcasses, + "total_entered_bars_carcasses_weight": total_entered_kill_house_requests_carcasses_weight, + "total_not_entered_bars": len(not_entered_kill_house_requests), + "total_not_entered_bars_quantity": total_not_entered_kill_house_requests_quantity, + "total_not_entered_kill_house_requests_weight": total_not_entered_kill_house_requests_weight, + } + + return Response(result, status=status.HTTP_200_OK) + + +class BarDifferenceRequestViewSet(viewsets.ModelViewSet): + queryset = BarDifferenceRequest.objects.all() + serializer_class = BarDifferenceRequestSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = BarDifferenceRequestFilterSet + filterset_fields = [ + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'hatching__poultry__user__fullname', + 'hatching__poultry__user__mobile' + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET.get('role') + state = request.GET.get('state') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + filters = { + 'trash': False, + } + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + filters['kill_house'] = kill_house + if state == 'pending': + filters['state'] = 'pending' + else: + filters['state__in'] = ('accepted', 'rejected') + + if date1: + filters['create_date__date__gte'] = date1 + filters['create_date__date__lte'] = date2 + + bar_requests = BarDifferenceRequest.objects.filter(**filters).order_by('-id') + + if 'search' in request.GET: + bar_requests_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=bar_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=bar_requests) + bar_requests_list = ps.filter() + bar_requests = [] if len(bar_requests_list) == 0 else bar_requests_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(bar_requests) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(bar_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + hatching = PoultryHatching.objects.get(key=request.data['hatching_key'], trash=False) + kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + images = None + acceptor_images = None + request.data.pop('hatching_key') + request.data.pop('kill_house_key') + if 'images' in request.data.keys(): + images = request.data['images'] + request.data.pop('images') + + if 'acceptor_images' in request.data.keys(): + acceptor_images = request.data['acceptor_images'] + request.data.pop('acceptor_images') + image_list = [] + acceptor_image_list = [] + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + bar_request = serializer.create(validated_data=request.data) + bar_request.hatching = hatching + bar_request.kill_house = kill_house + bar_request.register_fullname = user.fullname + bar_request.register_mobile = user.mobile + bar_request.weight = int(bar_request.quantity) * bar_request.hatching.poultry.real_killing_ave_weight + + if images != None: + for image in images: + image_list.append(send_image_to_server(image)) + + bar_request.violation_image = image_list + + if acceptor_images != None: + for acceptor_image in acceptor_images: + acceptor_image_list.append(send_image_to_server(acceptor_image)) + + bar_request.acceptor_image = acceptor_image_list + + bar_request.save() + send_sms_for_bar_difference_request(kill_house.kill_house_operator.user.mobile, request.data['quantity'], + hatching.poultry.unit_name) + send_ticket_for_bar_difference_request(user, kill_house.kill_house_operator.user, request.data['quantity'], + hatching.poultry.unit_name) + serializer_request = self.serializer_class(bar_request) + return Response(serializer_request.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def update(self, request, pk=None, *args, **kwargs): + bar_request = BarDifferenceRequest.objects.get(key=request.data['bar_key']) + request.data.pop('bar_key') + if 'kill_house_check' in request.data.keys(): + request.data.pop('kill_house_check') + if request.data['state'] == 'accepted': + user = SystemUserProfile.objects.get(user=request.user, trash=False) + bar_request.acceptor_fullname = user.fullname + bar_request.acceptor_mobile = user.mobile + bar_request.acceptor_date = datetime.now() + # bar_request.weight = bar_request.quantity * bar_request.hatching.poultry.real_killing_ave_weight + bar_request.hatching.bar_difference_request_quantity += bar_request.quantity + bar_request.hatching.bar_difference_request_weight += bar_request.weight + bar_request.hatching.save() + bar_request.save() + + if 'images' in request.data.keys(): + images = request.data['images'] + request.data.pop('images') + image_list = [] + if images != None: + for image in images: + image_list.append(send_image_to_server(image)) + + bar_request.violation_image = image_list + if 'acceptor_images' in request.data.keys(): + acceptor_images = request.data['acceptor_images'] + request.data.pop('acceptor_images') + acceptor_images_list = [] + if acceptor_images != None: + for acceptor_image in acceptor_images: + acceptor_images_list.append(send_image_to_server(acceptor_image)) + + bar_request.acceptor_image = acceptor_images_list + serializer = self.serializer_class(bar_request) + serializer.update(instance=bar_request, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + bar_request = BarDifferenceRequest.objects.get(key=request.GET['bar_key'], trash=False) + if bar_request.state == 'accepted': + bar_request.hatching.bar_difference_request_quantity -= bar_request.quantity + bar_request.hatching.bar_difference_request_weight -= bar_request.weight + bar_request.hatching.save() + bar_request.trash = True + bar_request.save() + return Response({"result": "با موفقیت حذف شد."}, + status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def get_hatching_kill_ingo(request): + hatching = PoultryHatching.objects.get(key=request.GET['hatching_key']) + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key']) + + total_quantity = 0 + total_weight = 0 + Province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=False, + state__in=('pending', 'accepted'), + return_to_province=False, + province_request__poultry_request__hatching=hatching) + first_total_quantity = \ + Province_kill_requests.aggregate(total=Sum('main_quantity'))[ + 'total'] or 0 + + total_quantity = \ + Province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_weight = \ + Province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + + difference_quantity = first_total_quantity - total_quantity + # kill_house_requests = KillHouseRequest.objects.filter(Q(killhouse_user=obj.kill_house) | Q(killer=obj.kill_house),trash=False, + # province_request__poultry_request__hatching=obj.hatching) + # + # + # total_quantity +=\ + # kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + # 'total'] or 0 + # total_weight +=\ + # kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + # 'total'] or 0 + + result = { + "first_total_quantity": first_total_quantity, + "total_quantity": total_quantity, + "difference_quantity": difference_quantity, + "total_weight": total_weight, + } + + return Response(result, + status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def dashboard_monitoring_bar_and_killing(request): + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else now + kill_house_free_bar = KillHouseFreeBarInformation.objects.filter(Q(date__date__gte=date1, + date__date__lte=date2, + buy_type='carcass') | Q( + create_date__date__gte=date1, create_date__date__lte=date2, buy_type='live'), + trash=False, + archive_wage=False, + ).only( + 'quantity', + 'live_weight', + 'number_of_carcasses', + 'weight_of_carcasses', + 'send_date', + 'type', + 'out' + ) + + kill_house_free_bar_aggregates = kill_house_free_bar.aggregate( + total_quantity_live=Sum('quantity', filter=Q(buy_type='live')), + total_weight_live=Sum('live_weight', filter=Q(buy_type='live')), + total_count=Count('id', filter=Q(buy_type='live')), + total_weight=Sum('weight_of_carcasses', filter=Q(buy_type='live')), + total_count_carcass=Count('id', filter=Q(buy_type='carcass')), + total_weight_carcass=Sum('weight_of_carcasses', filter=Q(buy_type='carcass')), + total_quantity_carcass=Sum('number_of_carcasses', filter=Q(buy_type='carcass')), + + ) + + if kill_house_free_bar_aggregates['total_quantity_live'] != 0: + ratio = round( + ((kill_house_free_bar_aggregates['total_weight_live'] or 0) / ( + kill_house_free_bar_aggregates['total_quantity_live'] + or 0)) + , 1) if (kill_house_free_bar_aggregates['total_quantity_live'] or 0) > 0 else 0 + else: + ratio = 0 + + province_kill_request = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), + wage_pay=False, + archive_wage=False, + return_to_province=False, + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2). \ + select_related('province_request__poultry_request').only( + 'total_killed_quantity', + 'province_request__poultry_request__Index_weight', + ) + + province_kill_request_aggregates = province_kill_request.aggregate( + total_count=Count('id', filter=Q(first_car_allocated_quantity=0)), + total_quantity=Sum('total_killed_quantity', filter=Q(first_car_allocated_quantity=0)), + total_index_weight=Avg('province_request__poultry_request__Index_weight', + filter=Q(first_car_allocated_quantity=0)), + total_count_new=Count('id'), + total_quantity_new=Sum('total_killed_quantity'), + total_weight_new=Sum('total_killed_weight'), + total_index_weight_new=Avg('province_request__poultry_request__Index_weight'), + + ) + + poultry_request = PoultryRequest.objects.filter( + trash=False, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + out_province_request_cancel=False, + temporary_trash=False, + temporary_deleted=False, send_date__date__gte=date1, + send_date__date__lte=date2 + ).only( + 'quantity', + 'Index_weight', + ).annotate( + item_weight=F('Index_weight') * F('quantity') + ) + + poultry_request_aggregates = poultry_request.aggregate( + total_count=Count('id', filter=Q(out=True)), + total_quantity=Sum('quantity', filter=Q(out=True)), + total_ave_weight=Avg('Index_weight', filter=Q(out=True)), + total_weight=Sum('item_weight', filter=Q(out=True)), + total_count_killing=Count('id'), + total_quantity_killing=Sum('quantity'), + total_ave_weight_killing=Avg('Index_weight'), + total_weight_killing=Sum('item_weight') + ) + + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + temporary_trash=False, + temporary_deleted=False, kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).select_related('province_kill_request__province_request__poultry_request__Index_weight').only( + 'quantity', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'accepted_real_weight', + 'accepted_real_quantity', + ) + + kill_house_request_aggregates = kill_house_request.aggregate( + total_count=Count('id'), + total_quantity=Sum('accepted_real_quantity'), + total_quantity_has_quarantine=Sum('accepted_real_quantity', filter=Q(quarantine_quantity__gt=0)), + total_count_has_quarantine=Count('id', filter=Q(quarantine_quantity__gt=0)), + total_weight=Sum('accepted_real_weight'), + total_ave_weight=Avg('province_kill_request__province_request__poultry_request__Index_weight'), + total_ave_age=Avg('province_kill_request__province_request__poultry_request__hatching__chicken_age'), + total_quarantine=Count('id', filter=Q(quarantine_quantity__gt=0)), + total_quarantine_quantity=Sum('quarantine_quantity', filter=Q(quarantine_quantity__gt=0)), + total_quarantine_discharge_confirmation=Count('id', filter=Q(quarantine_quantity__gt=0, + assignment_state_archive='True')), + total_quarantine_discharge_confirmation_quantity=Sum('accepted_real_quantity', + filter=Q(quarantine_quantity__gt=0, + assignment_state_archive='True')), + + ) + + province_request_count = province_kill_request_aggregates['total_count_new'] or 0 + province_request_quantity = province_kill_request_aggregates['total_quantity_new'] or 0 + province_request_weight = province_kill_request_aggregates['total_weight_new'] or 0 + total_free_sell_count = kill_house_free_bar_aggregates['total_count'] or 0 + total_free_sell_quantity = kill_house_free_bar_aggregates['total_quantity_live'] or 0 + total_free_sell_weight = kill_house_free_bar_aggregates['total_weight_live'] or 0 + avgWeight = round( + (province_request_weight + total_free_sell_weight) / (province_request_quantity + total_free_sell_quantity), + 1) if (province_request_quantity + total_free_sell_quantity) > 0 else 0 + + result_dict = { + 'freeLiveBar': { + 'count': kill_house_free_bar_aggregates['total_count'] or 0, + 'quantity': kill_house_free_bar_aggregates['total_quantity_live'] or 0, + 'weight': kill_house_free_bar_aggregates['total_weight_live'] or 0, + 'weightCarcass': kill_house_free_bar_aggregates['total_weight_carcass'] or 0, + 'avgWeight': ratio, + }, + 'provinceKillRequestWithoutBar': { + 'count': province_kill_request_aggregates['total_count'] or 0, + 'quantity': province_kill_request_aggregates['total_quantity'] or 0, + 'indexWeight': round((province_kill_request_aggregates['total_index_weight'] or 0), 1), + }, + 'outLiveBar': { + 'count': poultry_request_aggregates['total_count'] or 0, + 'quantity': poultry_request_aggregates['total_quantity'] or 0, + 'weight': poultry_request_aggregates['total_weight'] or 0, + 'avgWeight': round((poultry_request_aggregates['total_ave_weight'] or 0), 1), + + }, + 'bar': { + 'count': kill_house_request_aggregates['total_count'] or 0, + 'count_has_quarantine': kill_house_request_aggregates['total_count_has_quarantine'] or 0, + 'quantity': kill_house_request_aggregates['total_quantity'] or 0, + 'quantity_has_quarantine': kill_house_request_aggregates['total_quantity_has_quarantine'] or 0, + 'weight': kill_house_request_aggregates['total_weight'] or 0, + 'avgWeight': round((kill_house_request_aggregates['total_ave_weight'] or 0), 1), + 'avgAge': int(kill_house_request_aggregates['total_ave_age'] or 0), + + 'total_quarantine': kill_house_request_aggregates['total_quarantine'] or 0, + 'total_quarantine_quantity': kill_house_request_aggregates['total_quarantine_quantity'] or 0, + 'total_quarantine_discharge_confirmation': kill_house_request_aggregates[ + 'total_quarantine_discharge_confirmation'] or 0, + 'total_quarantine_discharge_confirmation_quantity': kill_house_request_aggregates[ + 'total_quarantine_discharge_confirmation_quantity'] or 0, + + }, + 'killingInfo': { + 'count': province_request_count + total_free_sell_count, + 'quantity': province_request_quantity + total_free_sell_quantity, + 'weight': province_request_weight + total_free_sell_weight, + 'avgWeight': avgWeight, + }, + 'buyFreeCarcasses': { + 'count': kill_house_free_bar_aggregates['total_count_carcass'] or 0, + 'quantity': kill_house_free_bar_aggregates['total_quantity_carcass'] or 0, + 'weight': kill_house_free_bar_aggregates['total_weight_carcass'] or 0, + } + + } + return Response(result_dict, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def dashboarad_bar_for_kill_house(request): + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + user = SystemUserProfile.objects.get(user=request.user) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user=kill_house) | Q( + kill_request__slaughter_house=kill_house) | Q(killer=kill_house)), + (Q(trash=False) | Q(trash=True, clearance_code__isnull=False, temporary_trash=False, + temporary_deleted=False)), + + province_request__poultry_request__poultry__address__province=user.province, + ).select_related('kill_request') + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house_requests = kill_house_requests.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2) + + if 'search' in request.GET: + kill_house_request_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_house_requests) + kill_house_request_list = ps.filter() + kill_house_requests = [] if len(kill_house_request_list) == 0 else kill_house_request_list + kill_house_requests_aggregate = kill_house_requests.aggregate( + first_quantity=Sum('quantity'), + first_weight=Sum('quantity') * Avg('province_request__poultry_request__Index_weight'), + first_index_weight=Avg('province_request__poultry_request__Index_weight'), + accepted_real_quantity=Sum('accepted_real_quantity'), + accepted_real_weight=Sum('accepted_real_weight'), + assignment_state_archive_pending=Count('id', filter=Q(assignment_state_archive='pending')), + assignment_state_archive_accepted=Count('id', filter=Q(assignment_state_archive='accepted')), + clearance_code_count=Count('id', filter=Q(clearance_code__isnull=False)), + + ) + + result_dict = { + 'count': kill_house_requests.count(), + 'firstQuantity': kill_house_requests_aggregate['first_quantity'] or 0, + 'firstWeight': int(kill_house_requests_aggregate['first_weight'] or 0), + 'firstIndexWeight': round((kill_house_requests_aggregate['first_index_weight'] or 0), 1), + 'acceptedRealQuantity': kill_house_requests_aggregate['accepted_real_quantity'] or 0, + 'acceptedRealWeight': int(kill_house_requests_aggregate['accepted_real_weight'] or 0), + 'finalIndexWeight': round((kill_house_requests_aggregate['accepted_real_weight'] or 0) / + (kill_house_requests_aggregate['accepted_real_quantity'] or 0), 1) + if (kill_house_requests_aggregate['accepted_real_quantity'] or 0) > 0 else 0, + 'assignmentStateArchivePending': kill_house_requests_aggregate['assignment_state_archive_pending'] or 0, + 'assignmentStateArchiveAccepted': kill_house_requests_aggregate['assignment_state_archive_accepted'] or 0, + 'clearanceCodeCount': kill_house_requests_aggregate['clearance_code_count'] or 0, + + } + return Response(result_dict, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def dashboard_bar_difference_request(request): + filterset_class = BarDifferenceRequestFilterSet + filterset_fields = [ + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'hatching__poultry__user__fullname', + 'hatching__poultry__user__mobile' + ] + user = SystemUserProfile.objects.get(user=request.user, trash=False) + # if request.GET['role'] == 'KillHouse': + # kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + # 'system_address__province').first() + # if request.GET['state'] == 'pending': + # bar_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, + # state='pending').order_by('id') + # else: + # bar_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, + # state__in=('accepted', 'rejected')).order_by('id') + # else: + # if request.GET['state'] == 'pending': + # bar_requests = BarDifferenceRequest.objects.filter(trash=False, state='pending').order_by('id') + # else: + # bar_requests = BarDifferenceRequest.objects.filter(trash=False, + # state__in=('accepted', 'rejected')).order_by('id') + + role = request.GET.get('role') + state = request.GET.get('state') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + filters = { + 'trash': False, + } + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + filters['kill_house'] = kill_house + if state == 'pending': + filters['state'] = 'pending' + else: + filters['state__in'] = ('accepted', 'rejected') + + if date1: + filters['create_date__date__gte'] = date1 + filters['create_date__date__lte'] = date2 + + bar_requests = BarDifferenceRequest.objects.filter(**filters).order_by('-id') + + if 'search' in request.GET: + bar_requests_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=bar_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=bar_requests) + bar_requests_list = ps.filter() + bar_requests = [] if len(bar_requests_list) == 0 else bar_requests_list + + serializer = BarDifferenceRequestSerializer(bar_requests, many=True) + + bar_info_list = [item['bar_info'] for item in serializer.data] + + difference_quantity = sum(item["first_total_quantity"] for item in bar_info_list) - \ + sum(item["total_quantity"] for item in bar_info_list) + + bar_requests_aggregate = bar_requests.aggregate( + count=Count('id'), + weight=Sum('weight'), + quantity=Sum('quantity'), + ) + + result_dict = { + 'count': bar_requests_aggregate['count'] or 0, + 'weight': bar_requests_aggregate['weight'] or 0, + 'quantity': bar_requests_aggregate['quantity'] or 0, + "firstTotalQuantity": sum(item["first_total_quantity"] for item in bar_info_list), + "totalQuantity": sum(item["total_quantity"] for item in bar_info_list), + "differenceQuantity": difference_quantity, + "totalWeight": sum(item["total_weight"] for item in bar_info_list), + } + + return Response(result_dict, status=status.HTTP_200_OK) + + +class KillHousePerformanceDashboardViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + 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, trash=False).exclude(id__in=kill_house_ids).order_by( + 'id') + + serializer = KillHouseForPerformanceDashboardSerializer(kill_houses, many=True, + context={'date1': date1, 'date2': date2, }) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class NonReceiptKillHouseRequestViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseRequestForBarManagementSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house = [] + kill_house_requests_list = [] + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + for kill_house_vet in kill_house_vets: + kill_house.append(kill_house_vet.kill_house) + + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + + if request.GET['role'] in ['CityOperator', 'CityJahad', 'CityPoultry']: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + main_non_receipt=True, + non_receipt=True, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + + ).order_by('-kill_request__recive_date') + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + main_non_receipt=True, + non_receipt=True, + province_request__poultry_request__poultry__address__city=user.city + + ).order_by('-kill_request__recive_date') + + else: + + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + main_non_receipt=True, + non_receipt=True + + ).order_by('-kill_request__recive_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests) + kill_house_requests_list = ps.filter() + kill_house_requests = [] if len(kill_house_requests_list) == 0 else kill_house_requests_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now() + role = request.data.get('role') + message = request.data.get('message') + state = request.data.get('state') + key = request.data.get('key') + kill_house_request = KillHouseRequest.objects.get(key=key) + if kill_house_request.assignment_state_archive == 'True': + return Response({"result": "به دلیل وارد کردن اطلاعات بار امکان ثبت عدم وصول وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + kill_house_request.non_receipt_state = state + kill_house_request.message = message + kill_house_request.bar_remover = { + "full_name": user.fullname, + "role": role, + "mobile": user.mobile, + "date": str(now) + } + kill_house_request.trash = True if state == 'accepted' else False + kill_house_request.save() + if state == 'accepted': + update_kill_house_requests(kill_house_request.province_kill_request, + kill_house_request.province_request.poultry_request) + update_province_kill_requests(kill_house_request.province_request.poultry_request.hatching) + + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + +class ReturnNonReceiptKillHouseRequestViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseRequestForBarManagementSerializer + + def update(self, request, *args, **kwargs): + key = request.data.get('key') + kill_house_request = KillHouseRequest.objects.get(key=key) + trash = kill_house_request.trash + if kill_house_request.non_receipt_return: + return Response({"result": "عدم وصول برای این بار قبلا ثبت و لغو گردیده!"}) + kill_house_request.trash = False + kill_house_request.non_receipt = request.data['non_receipt'] + kill_house_request.non_receipt_return = request.data['non_receipt_return'] + kill_house_request.non_receipt_return_message = request.data['non_receipt_return_message'] + kill_house_request.save() + if trash: + update_kill_house_requests(kill_house_request.province_kill_request, + kill_house_request.province_request.poultry_request) + update_province_kill_requests(kill_house_request.province_request.poultry_request.hatching) + + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_200_OK) + + +class DirectBuyingPaymentViewSet(viewsets.ModelViewSet): + queryset = DirectBuyingPayment.objects.all() + serializer_class = DirectBuyingPaymentSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = DirectBuyingPaymentFilterSet + filterset_fields = [ + + 'province_kill_request__kill_request__kill_house__name', + 'province_kill_request__kill_request__kill_house__kill_house_operator__user__fullname', + 'province_kill_request__kill_request__kill_house__kill_house_operator__user__first_name', + 'province_kill_request__kill_request__kill_house__kill_house_operator__user__last_name', + 'province_kill_request__kill_request__kill_house__kill_house_operator__user__mobile', + + ] + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key']) + now = datetime.now() + image = request.data.pop('image', None) + request.data.pop('province_kill_request_key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + payment = serializer.create(validated_data=request.data) + payment.province_kill_request = province_kill_request + payment.date = now + payment.payment_registrar = user.fullname + payment.payment_registrar_mobile = user.mobile + payment.image = send_image_to_server(image) + payment.save() + + return Response(serializer.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key']) + filter = {'trash': False, 'province_kill_request': province_kill_request} + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1: + filter['date1'] = datetime.strptime(str(date1), '%Y-%m-%d').date() + filter['date2'] = datetime.strptime(str(date2), '%Y-%m-%d').date() + payments = DirectBuyingPayment.objects.filter(**filter) + + if 'search' in request.GET: + payments_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=payments + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=payments) + payments_list = ps.filter() + payments = [] if len( + payments_list) == 0 else payments_list + + if request.GET.get('page'): + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(payments) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(payments, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + payment = DirectBuyingPayment.objects.get(key=request.data['key']) + image = request.data.pop('image', None) + if image: + payment.image = send_image_to_server(image) + payment.save() + serializer = self.serializer_class(payment) + serializer.update(instance=payment, validated_data=request.data) + + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + payment = DirectBuyingPayment.objects.get(key=request.GET['key']) + payment.trash = True + payment.save() + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class ProvinceKillRequestDirectBuyingViewSet(viewsets.ModelViewSet): + queryset = ProvinceKillRequest.objects.all() + serializer_class = ProvinceKillRequestForDirectBuyingSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = ProvinceKillRequestFilterSet + filterset_fields = [ + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__poultry__address__city__name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + state = request.GET.get('status') + filter = { + 'trash': False, + 'payment_deadline': True, + 'return_to_province': False, + 'payment_deadline_archive': False if state == 'active' else True, + } + if date1: + filter['kill_request__recive_date__date__gte'] = datetime.strptime(date1, '%Y-%m-%d').date() + filter['kill_request__recive_date__date__lte'] = datetime.strptime(date2, '%Y-%m-%d').date() + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() + filter['killhouse_user'] = kill_house + + elif role in ('CityJahad', 'CityOperator', 'CityCommerce', 'CityVet', 'CitySupervisor', 'CityPoultry'): + filter['kill_request__poultry__address__city'] = user.city + + province_kill_requests = ProvinceKillRequest.objects.filter(**filter).select_related('kill_request', + 'kill_request__poultry_hatching', + 'kill_request__poultry').only( + 'kill_request', 'kill_request__poultry_hatching', 'kill_request__poultry').order_by('payment_deadline_date') + + if 'search' in request.GET: + province_kill_requests_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=province_kill_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=province_kill_requests) + province_kill_requests_list = ps.filter() + province_kill_requests = [] if len( + province_kill_requests_list) == 0 else province_kill_requests_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(province_kill_requests) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(province_kill_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + province_kill_request = ProvinceKillRequest.objects.get(key=request.data['key']) + check = request.data.pop('check', None) + archive = request.data.pop('archive', None) + if 'final_accept' in request.data.keys(): + role = request.data.pop('role', None) + if request.data['final_accept'] == True: + province_kill_request.payment_deadline_state = 'checking' if role == 'KillHouse' else 'accepted' + province_kill_request.final_accept_registrar = user.fullname + province_kill_request.final_accept_registrar_mobile = user.mobile + province_kill_request.final_accept_date = datetime.now() + if role != 'KillHouse': + province_kill_request.payment_deadline_checker_fullname = user.fullname + province_kill_request.payment_deadline_checker_mobile = user.mobile + province_kill_request.payment_deadline_check_date = datetime.now() + province_kill_request.payment_deadline_archive_message = 'تایید و تسویه کامل' + province_kill_request.payment_deadline_archive = True + province_kill_request.save() + if check: + state = request.data.pop('state', None) + province_kill_request.payment_deadline_checker_fullname = user.fullname + province_kill_request.payment_deadline_checker_mobile = user.mobile + province_kill_request.payment_deadline_check_date = datetime.now() + province_kill_request.payment_deadline_archive = True if state == 'accepted' else False + province_kill_request.payment_deadline_state = state + + if province_kill_request.payment_deadline_state == 'rejected': + province_kill_request.final_accept = False + if archive: + province_kill_request.payment_deadline_checker_fullname = user.fullname + province_kill_request.payment_deadline_checker_mobile = user.mobile + province_kill_request.payment_deadline_check_date = datetime.now() + province_kill_request.payment_deadline_archive = True + province_kill_request.payment_deadline_state = 'archive' + + if 'extension_payment_deadline_days' in request.data.keys(): + province_kill_request.extension_payment_deadline_date = province_kill_request.payment_deadline_date + timedelta( + days=request.data['extension_payment_deadline_days']) + province_kill_request.kill_request.extension_payment_deadline_days = request.data[ + 'extension_payment_deadline_days'] + province_kill_request.kill_request.extension_payment_deadline_date = province_kill_request.extension_payment_deadline_date + province_kill_request.kill_request.save() + + province_kill_request.save() + serializer = self.serializer_class(province_kill_request) + serializer.update(instance=province_kill_request, validated_data=request.data) + + return Response(serializer.data, status=status.HTTP_200_OK) + + +class MarketKillRequestViewSet(viewsets.ModelViewSet): + queryset = KillRequest.objects.all() + serializer_class = KillRequestForDirectBuyingSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillRequestFilterSet + filterset_fields = [ + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'poultry_request__chicken_breed', + 'poultry_request__order_code', + 'poultry_request__poultry__address__city__name', + 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__user__fullname', + + ] + + def calculate_province_kill_request_wage(self, kill_request): + province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=kill_request.poultry_request) + + wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first() + wage = wage_type.amount if wage_type.status == True else 0 + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, + trash=False) + province_killrequest = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + kill_request=kill_request, + province_request=province_check, + quantity=kill_request.kill_capacity, + total_killed_quantity=kill_request.kill_capacity, + total_killed_weight=int(kill_request.kill_capacity * kill_request.poultry_request.Index_weight), + main_quantity=kill_request.kill_capacity, + wage=wage, + market=True, + payment_deadline=True, + payment_deadline_days=kill_request.payment_deadline_days, + payment_deadline_date=kill_request.payment_deadline_date, + state='accepted', + kill_house_price=kill_request.amount, + total_wage_amount=wage * int(kill_request.kill_capacity * kill_request.poultry_request.Index_weight), + ) + province_killrequest.save() + kill_house_check = KillHouseCheckRequest( + province_kill_request=province_killrequest, + state='accepted' + ) + + kill_house_check.save() + vet_farm = VetFarm.objects.filter(trash=False, + poultry=province_killrequest.province_request.poultry_request.poultry).first() + bot_eitaa_for_each_province_kill_request(province_killrequest, vet_farm) + if wage_type and wage_type.status == True and percentages_wage_type: + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + province_killrequest.union_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.union_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'company': + province_killrequest.company_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.company_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'guilds': + province_killrequest.guilds_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.guilds_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'city': + province_killrequest.city_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.city_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'other': + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'wallet': + province_killrequest.wallet_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.wallet_share_percent = percentage_wage_type.percent + + else: + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + province_killrequest.save() + + def create(self, request, *args, **kwargs): + total_unpaid_wage = 0 + total_paid_wage = 0 + user = SystemUserProfile.objects.get(trash=False, user=request.user) + now = datetime.now() + 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, trash=False).exclude( + id__in=kill_house_ids).order_by('id', 'killer') + kill_house_for_killer = None + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + if kill_house.ware_house_remaining_weight_limitation_status: + if kill_house.total_remain_warehouse_governmental_weight > kill_house.ware_house_remaining_weight_limitation: + return Response({ + "result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده انبار بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + + if kill_house.ware_house_remaining_percent_limitation_status: + if not check_kill_house_remain_limitation_weight(kill_house): + return Response({ + "result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده روزانه انبار بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + with transaction.atomic(): + poultry_request = PoultryRequest.objects.select_for_update().get(key=request.data['poultry_request_key']) + if poultry_request.free_sale_in_province == True: + + if kill_house.quota: + kill_house_info = calculate_governmental_quota(kill_house) + if kill_house_info == 'not_allowed': + return Response({"result": " امکان خرید آزاد تا تکمیل تعهد دولتی وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + index_weight_category = IndexWeightCategory.objects.filter(trash=False, name='سبک').first() + light_max_value = index_weight_category.max_value if index_weight_category else 0 + if kill_house.market_buying_limitation: + kill_house_info = market_kill_request_share_quantity(kill_house, total_kill_houses=kill_houses) + kill_house_share = kill_house_info['kill_house_today_share'] + kill_house_buying = kill_house_info['kill_house_market_kill_requests_quantity'] + request.data[ + 'kill_capacity'] + if kill_house.market_light_capacity: + total_remain_light_weight = kill_house_info['total_remain_poultry_requests_quantity_light_weight'] + kill_house_market_kill_requests_quantity_light_weight = kill_house_info[ + 'kill_house_market_kill_requests_quantity_light_weight'] + real_kill_house_market_kill_requests_quantity_light_weight = kill_house_info['light_real_quantity'] + if poultry_request.Index_weight >= light_max_value: + if real_kill_house_market_kill_requests_quantity_light_weight > 0: + if total_remain_light_weight > real_kill_house_market_kill_requests_quantity_light_weight: + if real_kill_house_market_kill_requests_quantity_light_weight > kill_house_market_kill_requests_quantity_light_weight: + return Response({"result": "الویت با خرید و تکمیل نهایی سهمیه سبک می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if total_remain_light_weight > kill_house_market_kill_requests_quantity_light_weight: + return Response({"result": "الویت با خرید و تکمیل نهایی سهمیه سبک می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + + if kill_house_share - kill_house_buying < 0: + return Response({"result": "حجم خریداری شده از سهمیه شما بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + kill_request = KillRequest.objects.filter(trash=False, poultry_request=poultry_request, + kill_house=kill_house, + market_final_accept=False).first() + # if poultry_request.remain_quantity < request.data['kill_capacity']: + # return Response({"result": "حجم وارد شده از باقی مانده قابل فروش بیشتر است !"}, + # status=status.HTTP_403_FORBIDDEN) + market_requests_quantity = KillRequest.objects.filter(poultry_request=poultry_request, trash=False, + market_state__in=('pending', 'accepted'), + market=True).aggregate( + total=Sum('kill_capacity'))['total'] or 0 + if market_requests_quantity + request.data['kill_capacity'] > poultry_request.quantity: + return Response({"result": "باقی مانده اعلام نیاز مرغدار کمتر از درخواست شماست!"}, + status=status.HTTP_403_FORBIDDEN) + + kill_house_purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first() + total_unpaid_wage = get_finance_info(kill_house)['total_price'] + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=kill_house, status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + if kill_house_purchase.limitation == True: + + if kill_house_purchase.limitation_number <= total_unpaid_wage - total_paid_wage: + if not ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + kill_request__recive_date__date=now.date(), + trash=False, + state__in=('pending', 'accepted')).exists(): + return Response({ + "result": "به علت بدهی امکان ثبت درخواست وحود ندارد لطفا بدهی خود را در پنل کارمزد ها تسویه کنید"}, + status=status.HTTP_403_FORBIDDEN) + + if kill_request: + kill_request.kill_capacity += request.data['kill_capacity'] + kill_request.remain_quantity += request.data['kill_capacity'] + kill_request.save() + market_poultry_request_remain_quantity(kill_request.poultry_request) + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + request.data.pop('poultry_request_key') + if kill_house.killer and kill_house.type == 'public': + percentage = KillHousePercentage.objects.filter(trash=False, kill_house=kill_house, + kill_house_for_killer__isnull=False).first() + kill_house_for_killer = percentage.kill_house_for_killer + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + market_kill_request = serializer.create(validated_data=request.data) + market_kill_request.kill_house = kill_house + market_kill_request.poultry_request = poultry_request + market_kill_request.poultry_hatching = poultry_request.hatching + market_kill_request.poultry = poultry_request.poultry + market_kill_request.recive_date = now + market_kill_request.chicken_breed = poultry_request.chicken_breed + market_kill_request.remain_quantity = market_kill_request.kill_capacity + market_kill_request.amount = poultry_request.amount + market_kill_request.Index_weight = poultry_request.Index_weight + market_kill_request.market = True + market_kill_request.payment_deadline = True + if kill_house_for_killer: + market_kill_request.slaughter_house = kill_house_for_killer + market_kill_request.market_expire_date_time = now + timedelta( + minutes=30) if market_code_state else now + timedelta(minutes=5) + if market_code_state: + market_kill_request.market_code_status = True + market_kill_request.payment_deadline_date = datetime.now() + timedelta( + days=request.data['payment_deadline_days']) + market_kill_request.save() + market_poultry_request_remain_quantity(market_kill_request.poultry_request) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + from django.db.models import Value + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + role = request.GET.get('role') + poultry_request_key = request.GET.get('poultry_request_key') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + # filter = { + # 'trash': False, + # 'market': True, + # } + filter = { + 'market': True + } + if date1: + filter['recive_date__date__gte'] = date1 + filter['recive_date__date__lte'] = date2 + + else: + filter['recive_date__date'] = now + + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() + filter['kill_house'] = kill_house + + elif role in ('CityJahad', 'CityOperator', 'CityCommerce', 'CityVet', 'CitySupervisor', 'CityPoultry'): + filter['poultry__address__city'] = user.city + state_type = request.GET.get('type') + + if state_type and state_type != 'all': + filter['market_state'] = state_type + + if state_type in ('pending', 'accepted', 'rejected'): + filter['trash'] = False + elif state_type == 'deleted': + filter['trash'] = True + + if poultry_request_key: + filter['poultry_request__key'] = poultry_request_key + + kill_requests = KillRequest.objects.filter(**filter).select_related('poultry_hatching', 'poultry').only( + 'poultry_hatching', 'poultry').order_by( + Case( + When(market_state='pending', then=Value(0)), + default=Value(1) + ), + '-create_date' + ) + + if 'search' in request.GET: + kill_requests_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_requests) + kill_requests_list = ps.filter() + kill_requests = [] if len( + kill_requests_list) == 0 else kill_requests_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_requests) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(kill_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + kill_request = KillRequest.objects.get(key=request.data['key']) + if kill_request.trash: + return Response({"result": "درخواست شما توسط کاربر حذف گردید!"}, status=status.HTTP_403_FORBIDDEN) + + if 'check' in request.data.keys(): + state = request.data['market_state'] + if state == 'accepted': + self.calculate_province_kill_request_wage(kill_request) + request.data.pop('check') + + if 'market_final_accept' in request.data.keys(): + # market_poultry_request_remain_quantity(kill_request.poultry_request) + poultry_request = kill_request.poultry_request + # market_requests_quantity = KillRequest.objects.filter(poultry_request=poultry_request, trash=False, + # market_state__in=('pending', 'accepted'), market=True, + # market_final_accept=True).aggregate( + # total=Sum('kill_capacity'))['total'] or 0 + # if market_requests_quantity + kill_request.kill_capacity > poultry_request.quantity: + # return Response({"result": "باقی مانده اعلام نیاز مرغدار کمتر از درخواست شماست!"}, + # status=status.HTTP_403_FORBIDDEN) + if market_code_state: + code = str(random.randint(10000, 99000)) + kill_request.market_code = code + kill_request.save() + market_sms = threading.Thread( + target=send_sms_fro_kill_request_market, + args=( + kill_request,)) + + market_sms.start() + kill_request.remain_quantity -= kill_request.kill_capacity + kill_request.save() + if 'kill_capacity' in request.data.keys(): + 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, trash=False).exclude( + id__in=kill_house_ids).order_by('id', 'killer') + if kill_request.kill_house.market_buying_limitation: + kill_house_info = market_kill_request_share_quantity(kill_request.kill_house, + total_kill_houses=kill_houses) + kill_house_share = kill_house_info['kill_house_today_share'] + kill_house_today_left_share = kill_house_info['kill_house_today_left_share'] + kill_house_buying = kill_house_info['kill_house_market_kill_requests_quantity'] + request.data[ + 'kill_capacity'] + if (kill_house_today_left_share + kill_request.kill_capacity) < request.data['kill_capacity']: + return Response({"result": "حجم خریداری شده از سهمیه شما بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + if kill_request.poultry_request.remain_quantity + kill_request.kill_capacity < request.data[ + 'kill_capacity']: + return Response({"result": "حجم وارد شده از باقی مانده قابل فروش بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + kill_request.remain_quantity = request.data['kill_capacity'] + if 'payment_deadline_days' in request.data.keys(): + kill_request.payment_deadline_date = datetime.now() + timedelta( + days=request.data['payment_deadline_days']) + if 'input_market_code' in request.data.keys(): + if request.data['input_market_code'] != kill_request.market_code: + return Response({"result": "کد وارد شده صحیح نمی باشد!"}, status=status.HTTP_403_FORBIDDEN) + kill_request.input_market_code = request.data['input_market_code'] + self.calculate_province_kill_request_wage(kill_request) + kill_request.market_state = 'accepted' + kill_request.save() + serializer = self.serializer_class(kill_request) + serializer.update(instance=kill_request, validated_data=request.data) + market_poultry_request_remain_quantity(kill_request.poultry_request) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(trash=False, user=request.user) + kill_request = KillRequest.objects.get(key=request.GET["key"]) + kill_request.trash = True + kill_request.market_state_message = { + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()) + } + kill_request.market_state = 'deleted' + kill_request.save() + market_poultry_request_remain_quantity(kill_request.poultry_request) + return Response(' با موفقیت حذف شد', status=status.HTTP_200_OK) + + +class MarketKillHouseViewSet(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseForCommonlyUsedSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__mobile', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name' + + ] + + def list(self, request, *args, **kwargs): + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by( + 'id', 'killer') + + if 'search' in request.GET: + kill_house_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_house_list = ps.filter() + kill_houses = [] if len( + kill_house_list) == 0 else kill_house_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(kill_houses, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + kill_house = KillHouse.objects.get(key=request.data['key']) + serializer = self.serializer_class(kill_house) + serializer.update(instance=kill_house, validated_data=request.data) + + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseMarketInfoViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseMarketInfoSerializer + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__mobile', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name' + + ] + + def get(self, request): + role = request.GET.get('role') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + 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, trash=False).exclude( + id__in=kill_house_ids).order_by('id', 'killer') + if role == 'KillHouse': + user = SystemUserProfile.objects.get(trash=False, user=request.user) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + serializer = self.serializer_class(kill_house, + context={'date1': date1, 'date2': date2, 'kill_houses': kill_houses}) + + else: + if 'search' in request.GET: + kill_house_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_house_list = ps.filter() + kill_houses = [] if len( + kill_house_list) == 0 else kill_house_list + + serializer = self.serializer_class(kill_houses, many=True, + context={'date1': date1, 'date2': date2, 'kill_houses': kill_houses}) + + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseMarketInfoDashboardViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__mobile', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name' + + ] + + def get(self, request): + today = datetime.now().date() + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1: + total_poultry_requests_quantity = ( + PoultryRequest.objects.filter( + send_date__date__gte=date1, + send_date__date__lte=date2, + state_process='accepted', + province_state='accepted', + final_state__in=('pending', 'accepted'), + temporary_trash=False, + trash=False, + out=False, + market=True, + ).aggregate(total=Sum('quantity'))['total'] or 0 + ) + + else: + total_poultry_requests_quantity = ( + PoultryRequest.objects.filter( + send_date__date=today, + state_process='accepted', + province_state='accepted', + final_state__in=('pending', 'accepted'), + temporary_trash=False, + trash=False, + out=False, + market=True, + ).aggregate(total=Sum('quantity'))['total'] or 0 + ) + + exclusive_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, + trash=False + ).exclude(id__in=exclusive_kill_house_ids).order_by('id', 'killer') + + if 'search' in request.GET: + kill_house_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_house_list = ps.filter() + kill_houses = [] if len( + kill_house_list) == 0 else kill_house_list + + dashboard_data = { + "kill_house_today_share": 0, + "market_light_share": 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, + "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, + } + + for kill_house in kill_houses: + if date1: + info = market_kill_request_share_quantity(kill_house, date1, date2, total_kill_houses=kill_houses) + else: + info = market_kill_request_share_quantity(kill_house, total_kill_houses=kill_houses) + for key in dashboard_data: + dashboard_data[key] += info.get(key, 0) or 0 + + result = {"total_poultry_requests_quantity": total_poultry_requests_quantity, **dashboard_data} + + return Response(result, status=200) + + +def make_fine_for_requests_cron(): + now = datetime.now().date() + fine = FinePermission.objects.filter(trash=False).first() + + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, temporary_trash=False, + return_to_province=False, + kill_request__recive_date__date__lt=now, + first_car_allocated_quantity=0, + state__in=('pending', 'accepted')).select_related( + 'province_request__poultry_request__hatching') + if province_kill_requests: + for province_kill_request in province_kill_requests: + hatching = province_kill_request.province_request.poultry_request.hatching + province_kill_request.fine = True + province_kill_request.fine_amount = fine.in_province_allocations_fine_coefficient * province_kill_request.total_wage_amount + province_kill_request.fine_coefficient = fine.in_province_allocations_fine_coefficient + if province_kill_request.market: + province_kill_request.kill_request.market_state = 'deleted' + province_kill_request.kill_request.save() + province_kill_request.delete_message = "حذف تخصیص و اعمال جریمه به دلیل عدم ثبت خودرو در بازه مشخص" + province_kill_request.trash = True + province_kill_request.save() + update_province_kill_requests(hatching) + + kill_house_requests = KillHouseRequest.objects.filter( + Q(assignment_state_archive='pending') | Q(ware_house_confirmation=False), fine=False, trash=False, + kill_request__recive_date__date__lt=now, + temporary_trash=False).select_related('province_kill_request', 'province_request__poultry_request', + 'province_request__poultry_request__hatching') + empty_info_bars = kill_house_requests.filter(assignment_state_archive='pending', ware_house_confirmation=False) + not_completed_bars = kill_house_requests.filter(assignment_state_archive='pending', ware_house_confirmation=True) + not_entered_bars = kill_house_requests.filter(assignment_state_archive='True', ware_house_confirmation=False) + + if empty_info_bars: + for empty_info_bar in empty_info_bars: + poultry_request = empty_info_bar.province_request.poultry_request + hatching = empty_info_bar.province_request.poultry_request.hatching + province_kill_request = empty_info_bar.province_kill_request + empty_info_bar.fine = True + empty_info_bar.fine_amount = ( + fine.in_province_bars_fine_coefficient * empty_info_bar.accepted_real_weight) * province_kill_request.wage + empty_info_bar.fine_coefficient = fine.in_province_bars_fine_coefficient + empty_info_bar.message = 'لغو بار و اعمال جریمه به علت عدم تکمبل اطلاعات و ورود به انبار' + empty_info_bar.bar_remover = { + "date": str(datetime.now()), + "role": "system", + "mobile": "-", + "full_name": "system" + } + empty_info_bar.trash = True + empty_info_bar.save() + update_kill_house_requests(province_kill_request, poultry_request) + update_province_kill_requests(hatching) + + if not_completed_bars: + for not_completed_bar in not_completed_bars: + province_kill_request = not_completed_bar.province_kill_request + + not_completed_bar.fine = True + not_completed_bar.fine_amount = ( + fine.in_province_bars_fine_coefficient * not_completed_bar.accepted_real_weight) * province_kill_request.wage + not_completed_bar.fine_coefficient = fine.in_province_bars_fine_coefficient + not_completed_bar.message = 'اعمال جریمه به علت عدم تکمبل اطلاعات' + not_completed_bar.save() + + if not_entered_bars: + for not_entered_bar in not_entered_bars: + province_kill_request = not_entered_bar.province_kill_request + + not_entered_bar.ware_house_accepted_real_quantity = not_entered_bar.accepted_real_quantity + not_entered_bar.ware_house_accepted_real_weight = int(not_entered_bar.accepted_real_weight - ( + (not_entered_bar.accepted_real_weight * 25) / 100)) + not_entered_bar.weight_loss = 25 + poultry_prediction(not_entered_bar.province_request.poultry_request.poultry) + + not_entered_bar.ware_house_input_type = "loss_weight" + not_entered_bar.ware_house_confirmation = True + not_entered_bar.date_of_ware_house = str(datetime.now()) + not_entered_bar.fine = True + not_entered_bar.fine_amount = ( + fine.in_province_bars_fine_coefficient * not_entered_bar.accepted_real_weight) * province_kill_request.wage + not_entered_bar.fine_coefficient = fine.in_province_bars_fine_coefficient + not_entered_bar.message = 'اعمال جریمه به علت عدم ورود به انبار' + not_entered_bar.save() + product = RolesProducts.objects.filter(parent_product__product_id=2, + kill_house=not_entered_bar.killhouse_user).first() + kill_house_requests_product_warehousing(product) + + +# class KillHouseSalesInformationViewSet(APIView): +# permission_classes = [TokenHasReadWriteScope] +# +# def get(self, request): +# date1 = request.GET.get('date1') +# date2 = request.GET.get('date2') +# key = request.GET.get('key') +# kill_house = KillHouse.objects.get(key=key, trash=False) +# kill_house_request_filter = { +# 'killhouse_user': kill_house, +# 'ware_house_confirmation': True, +# 'trash': False, +# 'calculate_status': True, +# } +# kill_house_free_buying_bar_filter = { +# 'kill_house': kill_house, +# 'trash': False, +# 'calculate_status': True, +# } +# kill_house_allocation_filter = { +# 'trash': False, +# 'calculate_status': True, +# } +# +# kill_house_free_sale_bars_filter = { +# 'trash': False, +# 'calculate_status': True, +# } +# if date1: +# kill_house_request_filter['kill_request__recive_date__date__gte'] = datetime.strptime(date1, +# '%Y-%m-%d').date() - timedelta( +# days=1) +# kill_house_request_filter['kill_request__recive_date__date__lte'] = datetime.strptime(date2, +# '%Y-%m-%d').date() - timedelta( +# days=1) +# kill_house_free_buying_bar_filter['date__date__gte'] = date1 +# kill_house_free_buying_bar_filter['date__date__lte'] = date2 +# kill_house_allocation_filter['date__date__gte'] = date1 +# kill_house_allocation_filter['date__date__lte'] = date2 +# kill_house_free_sale_bars_filter['date__date__gte'] = date1 +# kill_house_free_sale_bars_filter['date__date__lte'] = date2 +# +# kill_house_requests = KillHouseRequest.objects.filter(**kill_house_request_filter) +# kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter( +# **kill_house_free_buying_bar_filter).exclude(entered_message='ورود به انبار مجازی') +# kill_house_allocations = StewardAllocation.objects.filter( +# Q(kill_house=kill_house) | Q(to_kill_house=kill_house), **kill_house_allocation_filter) +# kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(**kill_house_free_sale_bars_filter) +# +# kill_house_requests_aggregates = kill_house_requests.aggregate( +# total_count=Count('id'), +# total_governmental_weight=Sum('ware_house_accepted_real_weight', +# filter=Q(province_request__poultry_request__free_sale_in_province=False)), +# total_free_weight=Sum('ware_house_accepted_real_weight', +# filter=Q(province_request__poultry_request__free_sale_in_province=True)), +# ) +# +# kill_house_free_buying_bars_aggregates = kill_house_free_buying_bars.aggregate( +# total_count=Count('id'), +# total_weight=Sum('weight_of_carcasses'), +# ) +# +# kill_house_allocations_aggregates = kill_house_allocations.aggregate( +# total_count=Count('id'), +# total_receive_governmental_weight=Sum('receiver_real_weight_of_carcasses', +# filter=Q(approved_price_status=True, receiver_state='accepted', +# kill_house__isnull=True, to_cold_house__isnull=True)), +# total_receive_free_weight=Sum('receiver_real_weight_of_carcasses', +# filter=Q(approved_price_status=False, receiver_state='accepted', +# kill_house__isnull=True, to_cold_house__isnull=True)), +# total_allocated_governmental_weight=Sum('receiver_real_weight_of_carcasses', +# filter=Q(approved_price_status=False, receiver_state='accepted', +# kill_house__isnull=False, to_cold_house__isnull=True)), +# total_allocated_free_weight=Sum('receiver_real_weight_of_carcasses', +# filter=Q(approved_price_status=False, receiver_state='accepted', +# kill_house__isnull=False, to_cold_house__isnull=True)), +# +# ) +# kill_house_free_sale_bars_aggregates = kill_house_free_sale_bars.aggregate( +# total_count=Count('id'), +# total_governmental_weight=Sum('real_weight_of_carcasses', +# filter=Q(sale_type='governmental')), +# total_free_weight=Sum('real_weight_of_carcasses', +# filter=Q(sale_type='free')), +# ) +# +# result = { +# "kill_house_request_governmental_weight": kill_house_requests_aggregates['total_governmental_weight'] or 0, +# "kill_house_request_free_weight": kill_house_requests_aggregates['total_free_weight'] or 0, +# "kill_house_free_buying_bars_weight": kill_house_free_buying_bars_aggregates['total_weight'] or 0, +# "total_receive_governmental_weight": kill_house_allocations_aggregates[ +# 'total_receive_governmental_weight'] or 0, +# "total_receive_free_weight": kill_house_allocations_aggregates['total_receive_free_weight'] or 0, +# "total_in_allocated_governmental_weight": kill_house_allocations_aggregates[ +# 'total_allocated_governmental_weight'] or 0, +# "total_in_allocated_free_weight": kill_house_allocations_aggregates['total_allocated_free_weight'] or 0, +# "total_out_allocated_free_weight": kill_house_free_sale_bars_aggregates['total_governmental_weight'] or 0, +# "total_out_free_weight": kill_house_free_sale_bars_aggregates['total_free_weight'] or 0, +# } +# +# return Response(result, status=200) +class KillHouseSalesInformationViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() + + kill_house_requests = KillHouseRequest.objects.filter( + input_warehouse=kill_house, + temporary_trash=False, + temporary_deleted=False, + trash=False, calculate_status=True, warehouse=True) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(input_warehouse=kill_house, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, + warehouse=True).exclude( + entered_message='ورود به انبار مجازی') + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, warehouse=True) + kill_house_allocations = StewardAllocation.objects.filter(kill_house=kill_house, trash=False, + receiver_state__in=('pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True, warehouse=True) + + segmentations = PosSegmentation.objects.filter(kill_house=kill_house, trash=False, warehouse=True) + cold_house_allocations = StewardAllocation.objects.filter( + kill_house=kill_house, + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False, + warehouse=True) + total_entered_kill_house_requests_carcasses_governmental_weight = \ + kill_house_requests.filter(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=False).aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + total_entered_kill_house_requests_carcasses_free_weight = \ + kill_house_requests.filter(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=True).aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + total_entered_kill_house_free_bar_carcasses_weight = \ + kill_house_free_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_kill_house_free_sale__bar_carcasses_weight = \ + kill_house_free_Sale_bar_informations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_kill_house_free_sale__bar_carcasses_governmental_weight = \ + kill_house_free_Sale_bar_informations.filter(quota='governmental').aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_free_sale__bar_carcasses_free_weight = \ + kill_house_free_Sale_bar_informations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_allocations_weight = \ + kill_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_allocations_governmental_weight = \ + kill_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_kill_house_allocations_free_weight = \ + kill_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + segmentations_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_governmental_weight = \ + segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_free_weight = \ + segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + + cold_house_allocations_weight = \ + cold_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + cold_house_allocations_governmental_weight = \ + cold_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + cold_house_allocations_free_weight = \ + cold_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + pos_allocated_weight_info = transactions.aggregate( + pos_allocated_weight=Sum('cur_weight'), + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + pos_allocated_weight = pos_allocated_weight_info['pos_allocated_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + + total_governmental_input_weight = total_entered_kill_house_requests_carcasses_governmental_weight + total_free_input_weight = total_entered_kill_house_requests_carcasses_free_weight + total_entered_kill_house_free_bar_carcasses_weight + total_governmental_output_weight = total_kill_house_free_sale__bar_carcasses_governmental_weight + segmentations_governmental_weight + total_kill_house_allocations_governmental_weight + cold_house_allocations_governmental_weight + int(pos_governmental_allocated_weight / 1000) + total_free_output_weight = total_kill_house_free_sale__bar_carcasses_free_weight + total_kill_house_allocations_free_weight + segmentations_free_weight + cold_house_allocations_free_weight + int(pos_free_allocated_weight / 1000) + total_governmental_remain_weight = ( + total_governmental_input_weight - total_governmental_output_weight) - kill_house.ware_house_archive_governmental_weight + total_free_remain_weight = ( + total_free_input_weight - total_free_output_weight) - kill_house.ware_house_archive_free_weight + + result = { + + "total_governmental_input_weight": int(total_governmental_input_weight), + "total_free_input_weight": int(total_free_input_weight), + "total_governmental_output_weight": int(total_governmental_output_weight), + "total_free_output_weight": int(total_free_output_weight), + "total_governmental_remain_weight": int(total_governmental_remain_weight), + "total_free_remain_weight": int(total_free_remain_weight), + "total_kill_house_free_sale__bar_carcasses_weight": int(total_kill_house_free_sale__bar_carcasses_weight), + "total_kill_house_allocations_weight": int(total_kill_house_allocations_weight), + "segmentations_weight": int(segmentations_weight), + "cold_house_allocations_weight": int(cold_house_allocations_weight), + "total_selling_in_province_governmental_weight": kill_house.total_selling_in_province_governmental_weight, + "total_selling_in_province_free_weight": kill_house.total_selling_in_province_free_weight, + "total_commitment_selling_in_province_governmental_weight": kill_house.total_commitment_selling_in_province_governmental_weight, + "total_commitment_selling_in_province_governmental_remain_weight": kill_house.total_commitment_selling_in_province_governmental_remain_weight, + "total_commitment_selling_in_province_free_weight": kill_house.total_commitment_selling_in_province_free_weight, + "total_commitment_selling_in_province_free_remain_weight": kill_house.total_commitment_selling_in_province_free_remain_weight, + "pos_allocated_weight": int(pos_allocated_weight / 1000), + "pos_governmental_allocated_weight": int(pos_governmental_allocated_weight / 1000), + "pos_free_allocated_weight": int(pos_free_allocated_weight / 1000), + "ware_house_archive_governmental_weight": kill_house.ware_house_archive_governmental_weight, + "ware_house_archive_free_weight": kill_house.ware_house_archive_free_weight, + + } + + return Response(result, status=200) + + +class KillHouseForColdHouseAllocationViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseForColdHouseAllocationSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__mobile', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name' + + ] + + def get(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_filters = {'out_province': False, 'trash': False} + if role in ['CityJahad']: + kill_house_filters['kill_house_operator__user__city'] = user.city + kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by('id', 'killer') + if 'search' in request.GET: + kill_house_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_house_list = ps.filter() + kill_houses = [] if len( + kill_house_list) == 0 else kill_house_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + serializer = self.get_serializer(page, many=True, context={'date1': date1, 'date2': date2}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_houses, many=True, context={'date1': date1, 'date2': date2}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseForSegmentationViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseForSegmentationSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__mobile', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name' + + ] + + def get(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_filters = {'out_province': False, 'trash': False} + if role in ['CityJahad']: + kill_house_filters['kill_house_operator__user__city'] = user.city + + kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by('id', 'killer') + + if 'search' in request.GET: + kill_house_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_house_list = ps.filter() + kill_houses = [] if len( + kill_house_list) == 0 else kill_house_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + serializer = self.get_serializer(page, many=True, context={'date1': date1, 'date2': date2}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_houses, many=True, context={'date1': date1, 'date2': date2}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseComparativeInformationViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseComparativeInformationSerializer + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__mobile', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name' + + ] + + def get(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + # 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,killer=False,trash=False).exclude( + # id__in=kill_house_ids).order_by('id') + kill_houses = KillHouse.objects.filter(out_province=False, killer=False, trash=False).order_by('id') + codes = kill_houses.values_list('unique_identifier', flat=True) + code = ",".join(codes) + if date1: + url = f"https://rsibackend.rasadyar.com/app/send_transport_carcass_detail_for_rasadyaar/?code={code}&date1={date1}&date2={date2}" + else: + url = f"https://rsibackend.rasadyar.com/app/send_transport_carcass_detail_for_rasadyaar/?code={code}" + + response = requests.get(url) + rsi_data = response.json() + if 'search' in request.GET: + kill_house_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_house_list = ps.filter() + kill_houses = [] if len( + kill_house_list) == 0 else kill_house_list + serializer = self.serializer_class(kill_houses, many=True, + context={'date1': date1, 'date2': date2, 'rsi_data': rsi_data}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +def cancel_bar_and_province_request(request): + date_str = '2025-10-11' + date = datetime.now().date() - timedelta(days=1) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, ware_house_confirmation=False, + kill_request__recive_date__date__lte=date, + kill_request__recive_date__date__gte=date_str) + all_province_requests = kill_house_requests.values_list('province_kill_request', flat=True).distinct() + for kill_house_request in kill_house_requests: + kill_house_request.trash = True + kill_house_request.return_trash = True + kill_house_request.save() + update_kill_house_requests(kill_house_request.province_kill_request, + kill_house_request.province_request.poultry_request) + update_province_kill_requests( + kill_house_request.province_kill_request.province_request.poultry_request.hatching) + + for all_province_request in all_province_requests: + if not KillHouseRequest.objects.filter(trash=False, province_kill_request=all_province_request).exists(): + all_province_request.return_to_province = True + all_province_request.returner = {"date": str(datetime.today()), + "mobile": "09000000000", "fullname": "برگشت به دلیل حذف سیستمی بار"} + all_province_request.save() + + province_requests = ProvinceKillRequest.objects.filter(trash=False, first_car_allocated_quantity=0, + return_to_province=False, + kill_request__recive_date__date=datetime.now().date(), + ) + for province_request in province_requests: + province_request.trash = True + province_request.return_trash = True + province_request.save() + update_province_kill_requests(province_request.province_request.poultry_request.hatching) + + return HttpResponse('ok') + + +def cancel_bar_and_province_request_cron(): + date_str = '2025-10-11' + date = datetime.now().date() - timedelta(days=1) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, ware_house_confirmation=False, + kill_request__recive_date__date__lte=date, + kill_request__recive_date__date__gte=date_str) + all_province_requests = kill_house_requests.values_list('province_kill_request', flat=True).distinct() + for kill_house_request in kill_house_requests: + kill_house_request.trash = True + kill_house_request.return_trash = True + kill_house_request.save() + update_kill_house_requests(kill_house_request.province_kill_request, + kill_house_request.province_request.poultry_request) + update_province_kill_requests( + kill_house_request.province_kill_request.province_request.poultry_request.hatching) + + for all_province_request in all_province_requests: + if not KillHouseRequest.objects.filter(trash=False, province_kill_request=all_province_request).exists(): + all_province_request.return_to_province = True + all_province_request.returner = {"date": str(datetime.today()), + "mobile": "09000000000", "fullname": "برگشت به دلیل حذف سیستمی بار"} + all_province_request.save() + + province_requests = ProvinceKillRequest.objects.filter(trash=False, first_car_allocated_quantity=0, + return_to_province=False, + kill_request__recive_date__date=datetime.now().date(), + ) + for province_request in province_requests: + province_request.trash = True + province_request.return_trash = True + province_request.save() + update_province_kill_requests(province_request.province_request.poultry_request.hatching) + + +class ReturnProvinceKillRequestViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = ReturnProvinceKillRequestSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ReturnProvinceKillRequestFilterSet + filterset_fields = [ + 'province_request__poultry_request__order_code', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__address__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__address__city__name', + ] + + def get(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + user = SystemUserProfile.objects.get(user=request.user, trash=False) + filters = { + 'archive_wage': False, + 'state__in': ('pending', 'accepted'), + 'first_car_allocated_quantity': 0 + } + if role == 'KillHouse': + filters['killhouse_user__kill_house_operator__user'] = user + if date1: + filters['kill_request__recive_date__date__gte'] = date1 + filters['kill_request__recive_date__date__lte'] = date2 + + return_province_kill_requests = ProvinceKillRequest.objects.filter( + Q(trash=False, return_to_province=True) | Q(trash=True, return_trash=True), **filters).order_by('id') + + if 'search' in request.GET: + return_province_kill_requests_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=return_province_kill_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=return_province_kill_requests) + return_province_kill_requests_list = ps.filter() + return_province_kill_requests = [] if len( + return_province_kill_requests_list) == 0 else return_province_kill_requests_list + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(return_province_kill_requests) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(return_province_kill_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def put(self, request): + return_province_kill_requests = ProvinceKillRequest.objects.get( + key=request.data['key']) + request.data.pop('key') + serializer = self.serializer_class(return_province_kill_requests) + serializer.update(instance=return_province_kill_requests, validated_data=request.data) + update_province_kill_requests(return_province_kill_requests.province_request.poultry_request.hatching) + poultry_prediction(return_province_kill_requests.province_request.poultry_request.hatching.poultry) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ReturnKillHouseRequestViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + serializer_class = KillHouseRequestForBarManagementSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + def list(self, request, *args, **kwargs): + if request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(user=request.user) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2) + + else: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True)) + + else: + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house_requests = KillHouseRequest.objects.filter( + Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2) + + else: + kill_house_requests = KillHouseRequest.objects.filter( + Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True)) + + if 'search' in request.GET: + kill_house_request_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_house_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_house_requests) + kill_house_request_list = ps.filter() + kill_house_requests = [] if len(kill_house_request_list) == 0 else kill_house_request_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + kill_house_requests = KillHouseRequest.objects.get(key=request.data['key']) + kill_house_requests.province_kill_request.trash = False + kill_house_requests.province_kill_request.return_trash = False + kill_house_requests.province_kill_request.return_to_province = False + kill_house_requests.province_kill_request.returner = None + kill_house_requests.province_kill_request.save() + request.data.pop('key') + serializer = self.serializer_class(kill_house_requests) + serializer.update(instance=kill_house_requests, validated_data=request.data) + update_kill_house_requests(kill_house_requests.province_kill_request, + kill_house_requests.province_request.poultry_request) + update_province_kill_requests(kill_house_requests.province_request.poultry_request.hatching) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ReturnRequestDashboardViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + user = SystemUserProfile.objects.get(user=request.user, trash=False) + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_type = total_wage_type.filter(en_name='province-kill-request', trash=False).first() + province_live_wage_type_amount = province_live_wage_type.amount if province_live_wage_type.status == True else 0 + + province_kill_request_filters = { + 'archive_wage': False, + 'state__in': ('pending', 'accepted'), + 'first_car_allocated_quantity': 0 + } + + kill_house_request_filters = {} + if date1: + province_kill_request_filters['kill_request__recive_date__date__gte'] = date1 + province_kill_request_filters['kill_request__recive_date__date__lte'] = date2 + kill_house_request_filters['kill_request__recive_date__date__gte'] = date1 + kill_house_request_filters['kill_request__recive_date__date__lte'] = date2 + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + province_kill_request_filters['killhouse_user'] = kill_house + return_kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + Q(non_receipt=True, main_non_receipt=True, non_receipt_state__in=('pending', 'accepted')) | Q( + trash=True, return_trash=True), + **kill_house_request_filters) + else: + return_kill_house_requests = KillHouseRequest.objects.filter( + Q(non_receipt=True, main_non_receipt=True, non_receipt_state__in=('pending', 'accepted')) | Q( + trash=True, return_trash=True), + **kill_house_request_filters) + + return_province_kill_requests = ProvinceKillRequest.objects.filter( + Q(trash=False, return_to_province=True) | Q(trash=True, return_trash=True), + **province_kill_request_filters).order_by('id') + + return_province_kill_requests_aggregates = return_province_kill_requests.aggregate( + total_count=Count('id'), + total_operator_return_count=Count('id', filter=Q(trash=False, return_to_province=True)), + total_system_return_count=Count('id', filter=Q(trash=True, return_trash=True)), + total_quantity=Sum('total_killed_quantity'), + total_operator_return_quantity=Sum('main_quantity', filter=Q(trash=False, return_to_province=True)), + total_system_return_quantity=Sum('total_killed_quantity', filter=Q(trash=True, return_trash=True)), + total_weight=Sum('total_killed_weight'), + total_operator_return_weight=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight'), + filter=Q(trash=False, return_to_province=True)), + total_system_return_weight=Sum('total_killed_weight', filter=Q(trash=True, return_trash=True)), + + ) + return_kill_house_requests_aggregates = return_kill_house_requests.aggregate( + total_count=Count('id'), + total_non_receipt_count=Count('id', filter=Q(non_receipt=True, main_non_receipt=True)), + total_system_return_count=Count('id', filter=Q(trash=True, return_trash=True)), + total_quantity=Sum('accepted_real_quantity'), + total_non_receipt_quantity=Sum('accepted_real_quantity', filter=Q(non_receipt=True, main_non_receipt=True)), + total_system_return_quantity=Sum('accepted_real_quantity', filter=Q(trash=True, return_trash=True)), + total_weight=Sum('accepted_real_weight'), + total_non_receipt_weight=Sum('accepted_real_weight', filter=Q(non_receipt=True, main_non_receipt=True)), + total_system_return_weight=Sum('accepted_real_weight', filter=Q(trash=True, return_trash=True)), + ) + province_kill_request_total_operator_return_quantity = return_province_kill_requests_aggregates[ + 'total_operator_return_quantity'] or 0 + province_kill_request_total_system_return_quantity = return_province_kill_requests_aggregates[ + 'total_system_return_quantity'] or 0 + province_kill_request_total_quantity = province_kill_request_total_operator_return_quantity + province_kill_request_total_system_return_quantity + province_kill_request_total_operator_return_weight = return_province_kill_requests_aggregates[ + 'total_operator_return_weight'] or 0 + province_kill_request_total_system_return_weight = return_province_kill_requests_aggregates[ + 'total_system_return_weight'] or 0 + province_kill_request_total_weight = province_kill_request_total_operator_return_weight + province_kill_request_total_system_return_weight + kill_house_request_total_system_return_weight = return_kill_house_requests_aggregates[ + 'total_system_return_weight'] or 0 + total_return_weight_with_wage = province_kill_request_total_system_return_weight + kill_house_request_total_system_return_weight + result = { + "province_kill_request_total_count": return_province_kill_requests_aggregates['total_count'] or 0, + "province_kill_request_total_operator_return_count": return_province_kill_requests_aggregates[ + 'total_operator_return_count'] or 0, + "province_kill_request_total_system_return_count": return_province_kill_requests_aggregates[ + 'total_system_return_count'] or 0, + "province_kill_request_total_quantity": province_kill_request_total_quantity, + "province_kill_request_total_operator_return_quantity": province_kill_request_total_operator_return_quantity, + "province_kill_request_total_system_return_quantity": province_kill_request_total_system_return_quantity, + "province_kill_request_total_weight": province_kill_request_total_weight, + "province_kill_request_total_operator_return_weight": province_kill_request_total_operator_return_weight, + "province_kill_request_total_system_return_weight": province_kill_request_total_system_return_weight, + "kill_house_request_total_count": return_kill_house_requests_aggregates['total_count'] or 0, + "kill_house_request_total_non_receipt_count": return_kill_house_requests_aggregates[ + 'total_non_receipt_count'] or 0, + "kill_house_request_total_system_return_count": return_kill_house_requests_aggregates[ + 'total_system_return_count'] or 0, + "kill_house_request_total_quantity": return_kill_house_requests_aggregates['total_quantity'] or 0, + "kill_house_request_total_non_receipt_quantity": return_kill_house_requests_aggregates[ + 'total_non_receipt_quantity'] or 0, + "kill_house_request_total_system_return_quantity": return_kill_house_requests_aggregates[ + 'total_system_return_quantity'] or 0, + "kill_house_request_total_weight": return_kill_house_requests_aggregates['total_weight'] or 0, + "kill_house_request_total_non_receipt_weight": return_kill_house_requests_aggregates[ + 'total_non_receipt_weight'] or 0, + "kill_house_request_total_system_return_weight": kill_house_request_total_system_return_weight, + "total_return_weight_with_wage": total_return_weight_with_wage, + "total_return_wage": total_return_weight_with_wage * province_live_wage_type_amount, + } + + return Response(result, status=status.HTTP_200_OK) + + +# class KillHouseRemainWeightViewSet(GenericAPIView): +# permission_classes = [TokenHasReadWriteScope] +# +# def get(self, request): +# # چک کردن آیا کاربر بازه تاریخی دلخواه فرستاده یا نه +# start_date_param = request.query_params.get('date1', None) +# end_date_param = request.query_params.get('date2', None) +# +# if start_date_param and end_date_param: +# # بازه تاریخی دلخواه از ورودی کاربر +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() +# product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() +# +# # تبدیل string به date +# from datetime import datetime as dt +# start_date = dt.strptime(start_date_param, '%Y-%m-%d').date() +# end_date = dt.strptime(end_date_param, '%Y-%m-%d').date() +# +# # ساخت لیست تمام روزهای بین start_date و end_date +# days = [] +# current_day = start_date +# while current_day <= end_date: +# days.append(current_day) +# current_day += timedelta(days=1) +# +# kill_house_requests = KillHouseRequest.objects.filter( +# input_warehouse=kill_house, +# kill_request__recive_date__date__gte=start_date, +# kill_request__recive_date__date__lte=end_date, +# ware_house_confirmation=True, +# trash=False, +# calculate_status=True, +# warehouse=True +# ) +# +# kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter( +# trash=False, +# calculate_status=True, +# warehouse=True, +# date__date__gte=start_date, +# date__date__lte=end_date, +# input_warehouse=kill_house +# ).exclude(entered_message='ورود به انبار مجازی') +# +# kill_house_allocations = StewardAllocation.objects.filter( +# kill_house=kill_house, +# trash=False, +# calculate_status=True, +# warehouse=True, +# receiver_state__in=('pending', 'accepted'), +# production_date__date__gte=start_date, +# production_date__date__lte=end_date +# ) +# +# kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( +# kill_house=kill_house, +# production_date__date__gte=start_date, +# production_date__date__lte=end_date, +# trash=False, +# calculate_status=True, +# warehouse=True +# ) +# +# segmentations = PosSegmentation.objects.filter( +# kill_house=kill_house, +# production_date__date__gte=start_date, +# production_date__date__lte=end_date, +# trash=False, +# warehouse=True +# ) +# +# transactions = ProductsTransactions.objects.filter( +# product=product, +# transaction__paid=True, +# transaction__date__date__gte=start_date, +# transaction__date__date__lte=end_date, +# trash=False, +# warehouse=True +# ) +# +# governmental_list = [] +# free_list = [] +# final_dict = {} +# +# for day in days: +# kill_house_requests_info = kill_house_requests.aggregate( +# total_kill_house_request_governmental_weight=Sum( +# 'ware_house_accepted_real_weight', +# filter=Q(province_request__poultry_request__free_sale_in_province=False, +# kill_request__recive_date__date=day) +# ), +# total_kill_house_request_free_weight=Sum( +# 'ware_house_accepted_real_weight', +# filter=Q(province_request__poultry_request__free_sale_in_province=True, +# kill_request__recive_date__date=day) +# ), +# ) +# +# kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate( +# total_kill_house_free_buying_bars_weight=Sum( +# 'weight_of_carcasses', filter=Q(date__date=day) +# ) +# ) +# +# kill_house_allocations_info = kill_house_allocations.aggregate( +# total_kill_house_allocations_governmental_weight=Sum( +# 'real_weight_of_carcasses', +# filter=Q(quota='governmental', production_date__date=day) +# ), +# total_kill_house_allocations_free_weight=Sum( +# 'real_weight_of_carcasses', +# filter=Q(quota='free', production_date__date=day) +# ), +# ) +# +# kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate( +# total_kill_house_free_sale_bars_governmental_weight=Sum( +# 'real_weight_of_carcasses', +# filter=Q(quota='governmental', production_date__date=day) +# ), +# total_kill_house_free_sale_bars_free_weight=Sum( +# 'real_weight_of_carcasses', +# filter=Q(quota='free', production_date__date=day) +# ), +# ) +# +# segmentations_info = segmentations.aggregate( +# segmentations_governmental_weight=Sum( +# 'weight', filter=Q(quota='governmental', production_date__date=day) +# ), +# segmentations_free_weight=Sum( +# 'weight', filter=Q(quota='free', production_date__date=day) +# ), +# ) +# +# pos_allocated_weight_info = transactions.aggregate( +# pos_governmental_allocated_weight=Sum( +# 'cur_weight', filter=Q(price_approved=True, transaction__date__date=day) +# ), +# pos_free_allocated_weight=Sum( +# 'cur_weight', filter=Q(price_approved=False, transaction__date__date=day) +# ), +# ) +# +# total_kill_house_request_governmental_weight = kill_house_requests_info[ +# 'total_kill_house_request_governmental_weight'] or 0 +# total_kill_house_request_free_weight = kill_house_requests_info[ +# 'total_kill_house_request_free_weight'] or 0 +# total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info[ +# 'total_kill_house_free_buying_bars_weight'] or 0 +# total_kill_house_allocations_governmental_weight = kill_house_allocations_info[ +# 'total_kill_house_allocations_governmental_weight'] or 0 +# total_kill_house_allocations_free_weight = kill_house_allocations_info[ +# 'total_kill_house_allocations_free_weight'] or 0 +# total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info[ +# 'total_kill_house_free_sale_bars_governmental_weight'] or 0 +# total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info[ +# 'total_kill_house_free_sale_bars_free_weight'] or 0 +# segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 +# segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 +# pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 +# pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 +# +# total_governmental_input = total_kill_house_request_governmental_weight +# total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight +# +# total_governmental_output = ( +# total_kill_house_allocations_governmental_weight + +# total_kill_house_free_sale_bars_governmental_weight + +# segmentations_governmental_weight + +# int(pos_governmental_allocated_weight / 1000) +# ) +# +# total_free_output = ( +# total_kill_house_allocations_free_weight + +# total_kill_house_free_sale_bars_free_weight + +# segmentations_free_weight + +# int(pos_free_allocated_weight / 1000) +# ) +# +# governmental_data = { +# 'day': day, +# 'amount': total_governmental_input - total_governmental_output, +# } +# free_data = { +# 'day': day, +# 'amount': total_free_input - total_free_output, +# } +# +# governmental_list.append(governmental_data) +# free_list.append(free_data) +# +# final_dict['governmental'] = governmental_list +# final_dict['free'] = free_list +# return Response(final_dict, status=status.HTTP_200_OK) +# +# # حالت پیش‌فرض: 3 روز اخیر (کد قبلی دست نخورده) +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() +# product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() +# today = datetime.now().date() +# yesterday = today - timedelta(days=1) +# two_days_ago = yesterday - timedelta(days=1) +# days = (two_days_ago, yesterday, today) +# +# archives = WarehouseArchive.objects.filter(kill_house=kill_house, trash=False,date__date__gte=two_days_ago,date__date__lte=today) +# +# +# kill_house_requests = KillHouseRequest.objects.filter(input_warehouse=kill_house, +# kill_request__recive_date__date__gte=two_days_ago, +# kill_request__recive_date__date__lte=today, +# ware_house_confirmation=True, trash=False, +# calculate_status=True, warehouse=True) +# kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(trash=False, +# calculate_status=True, warehouse=True, +# date__date__gte=two_days_ago, +# date__date__lte=today, +# input_warehouse=kill_house) \ +# .exclude(entered_message='ورود به انبار مجازی') +# kill_house_allocations = StewardAllocation.objects.filter( +# kill_house=kill_house, trash=False, calculate_status=True, warehouse=True, +# receiver_state__in=('pending', 'accepted'), production_date__date__gte=two_days_ago, +# production_date__date__lte=today) +# +# kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, +# production_date__date__gte=two_days_ago, +# production_date__date__lte=today, +# trash=False, +# calculate_status=True, +# warehouse=True) +# segmentations = PosSegmentation.objects.filter(kill_house=kill_house, production_date__date__gte=two_days_ago, +# production_date__date__lte=today, trash=False, +# warehouse=True) +# transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, +# transaction__date__date__gte=two_days_ago, +# transaction__date__date__lte=today, trash=False, +# warehouse=True) +# +# governmental_list = [] +# free_list = [] +# final_dict = {} +# +# for day in days: +# kill_house_requests_info = kill_house_requests.aggregate( +# total_kill_house_request_governmental_weight=Sum('ware_house_accepted_real_weight', filter=Q( +# province_request__poultry_request__free_sale_in_province=False, +# kill_request__recive_date__date=day)), +# total_kill_house_request_free_weight=Sum('ware_house_accepted_real_weight', filter=Q( +# province_request__poultry_request__free_sale_in_province=True, +# kill_request__recive_date__date=day)), +# +# ) +# +# kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate( +# total_kill_house_free_buying_bars_weight=Sum('weight_of_carcasses', filter=Q(date__date=day))) +# +# kill_house_allocations_info = kill_house_allocations.aggregate( +# total_kill_house_allocations_governmental_weight=Sum('real_weight_of_carcasses', +# filter=Q(quota='governmental', +# production_date__date=day)), +# total_kill_house_allocations_free_weight=Sum('real_weight_of_carcasses', +# filter=Q(quota='free', production_date__date=day)), +# +# ) +# +# kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate( +# total_kill_house_free_sale_bars_governmental_weight=Sum('real_weight_of_carcasses', +# filter=Q(quota='governmental', +# production_date__date=day)), +# total_kill_house_free_sale_bars_free_weight=Sum('real_weight_of_carcasses', +# filter=Q(quota='free', production_date__date=day)), +# +# ) +# +# segmentations_info = segmentations.aggregate( +# segmentations_governmental_weight=Sum('weight', +# filter=Q(quota='governmental', production_date__date=day)), +# segmentations_free_weight=Sum('weight', filter=Q(quota='free', production_date__date=day)), +# +# ) +# pos_allocated_weight_info = transactions.aggregate( +# pos_governmental_allocated_weight=Sum('cur_weight', +# filter=Q(price_approved=True, transaction__date__date=day)), +# pos_free_allocated_weight=Sum('cur_weight', +# filter=Q(price_approved=False, transaction__date__date=day)), +# +# ) +# +# archives_info = archives.aggregate( +# archives_governmental_weight=Sum('weight', +# filter=Q(quota='governmental', date__date=day)), +# archives_free_weight=Sum('weight', +# filter=Q(quota='free', date__date=day)), +# +# ) +# +# total_kill_house_request_governmental_weight = kill_house_requests_info[ +# 'total_kill_house_request_governmental_weight'] or 0 +# total_kill_house_request_free_weight = kill_house_requests_info['total_kill_house_request_free_weight'] or 0 +# total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info[ +# 'total_kill_house_free_buying_bars_weight'] or 0 +# total_kill_house_allocations_governmental_weight = kill_house_allocations_info[ +# 'total_kill_house_allocations_governmental_weight'] or 0 +# total_kill_house_allocations_free_weight = kill_house_allocations_info[ +# 'total_kill_house_allocations_free_weight'] or 0 +# total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info[ +# 'total_kill_house_free_sale_bars_governmental_weight'] or 0 +# total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info[ +# 'total_kill_house_free_sale_bars_free_weight'] or 0 +# segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 +# segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 +# pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 +# pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 +# +# archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 +# archives_free_weight = archives_info['archives_free_weight'] or 0 +# +# total_governmental_input = total_kill_house_request_governmental_weight +# total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight +# total_governmental_output = total_kill_house_allocations_governmental_weight + total_kill_house_free_sale_bars_governmental_weight + segmentations_governmental_weight + int( +# pos_governmental_allocated_weight / 1000) +# total_free_output = total_kill_house_allocations_free_weight + total_kill_house_free_sale_bars_free_weight + segmentations_free_weight + int( +# pos_free_allocated_weight / 1000) +# governmental_data = { +# 'day': day, +# 'amount': (total_governmental_input - total_governmental_output) - archives_governmental_weight, +# } +# free_data = { +# 'day': day, +# 'amount': (total_free_input - total_free_output) - archives_free_weight, +# } +# +# governmental_list.append(governmental_data) +# free_list.append(free_data) +# final_dict['governmental'] = governmental_list +# final_dict['free'] = free_list +# return Response(final_dict, status=status.HTTP_200_OK) +# +# # def get(self, request): +# # target_date = request.GET.get('date') +# # user = SystemUserProfile.objects.get(user=request.user, trash=False) +# # +# # kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() +# # +# # product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() +# # +# # today = datetime.now().date() if not target_date else datetime.strptime(target_date, "%Y-%m-%d").date() +# # month_ago = today - timedelta(days=30) +# # yesterday = today - timedelta(days=1) +# # two_days_ago = yesterday - timedelta(days=1) +# # +# # days = [month_ago + timedelta(days=i) for i in range(31)] +# # target_days = [two_days_ago ,yesterday , today] +# # +# # kill_house_requests = KillHouseRequest.objects.filter( +# # input_warehouse=kill_house, +# # kill_request__recive_date__date__gte=month_ago, +# # kill_request__recive_date__date__lte=today, +# # ware_house_confirmation=True, +# # trash=False, +# # calculate_status=True, +# # warehouse=True +# # ) +# # +# # kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter( +# # trash=False, +# # calculate_status=True, +# # warehouse=True, +# # date__date__gte=month_ago, +# # date__date__lte=today, +# # input_warehouse=kill_house +# # ).exclude(entered_message='ورود به انبار مجازی') +# # +# # kill_house_allocations = StewardAllocation.objects.filter( +# # kill_house=kill_house, +# # trash=False, +# # calculate_status=True, +# # warehouse=True, +# # receiver_state__in=('pending', 'accepted'), +# # production_date__date__gte=month_ago, +# # production_date__date__lte=today +# # ) +# # +# # kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( +# # kill_house=kill_house, +# # production_date__date__gte=month_ago, +# # production_date__date__lte=today, +# # trash=False, +# # calculate_status=True, +# # warehouse=True +# # ) +# # +# # segmentations = PosSegmentation.objects.filter( +# # kill_house=kill_house, +# # production_date__date__gte=month_ago, +# # production_date__date__lte=today, +# # trash=False, +# # warehouse=True +# # ) +# # +# # transactions = ProductsTransactions.objects.filter( +# # product=product, +# # transaction__paid=True, +# # transaction__date__date__gte=month_ago, +# # transaction__date__date__lte=today, +# # trash=False, +# # warehouse=True +# # ) +# # archives = WarehouseArchive.objects.filter(kill_house=kill_house, trash=False) +# # +# # +# # governmental_list = [] +# # free_list = [] +# # final_dict = {} +# # +# # for day in days: +# # kill_house_requests_info = kill_house_requests.aggregate( +# # total_kill_house_request_governmental_weight=Sum( +# # 'ware_house_accepted_real_weight', +# # filter=Q(province_request__poultry_request__free_sale_in_province=False, +# # kill_request__recive_date__date=day) +# # ), +# # total_kill_house_request_free_weight=Sum( +# # 'ware_house_accepted_real_weight', +# # filter=Q(province_request__poultry_request__free_sale_in_province=True, +# # kill_request__recive_date__date=day) +# # ), +# # ) +# # +# # kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate( +# # total_kill_house_free_buying_bars_weight=Sum( +# # 'weight_of_carcasses', filter=Q(date__date=day) +# # ) +# # ) +# # +# # kill_house_allocations_info = kill_house_allocations.aggregate( +# # total_kill_house_allocations_governmental_weight=Sum( +# # 'real_weight_of_carcasses', +# # filter=Q(quota='governmental', production_date__date=day) +# # ), +# # total_kill_house_allocations_free_weight=Sum( +# # 'real_weight_of_carcasses', +# # filter=Q(quota='free', production_date__date=day) +# # ), +# # ) +# # +# # kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate( +# # total_kill_house_free_sale_bars_governmental_weight=Sum( +# # 'real_weight_of_carcasses', +# # filter=Q(quota='governmental', production_date__date=day) +# # ), +# # total_kill_house_free_sale_bars_free_weight=Sum( +# # 'real_weight_of_carcasses', +# # filter=Q(quota='free', production_date__date=day) +# # ), +# # ) +# # +# # segmentations_info = segmentations.aggregate( +# # segmentations_governmental_weight=Sum( +# # 'weight', filter=Q(quota='governmental', production_date__date=day) +# # ), +# # segmentations_free_weight=Sum( +# # 'weight', filter=Q(quota='free', production_date__date=day) +# # ), +# # ) +# # +# # pos_allocated_weight_info = transactions.aggregate( +# # pos_governmental_allocated_weight=Sum( +# # 'cur_weight', filter=Q(price_approved=True, transaction__date__date=day) +# # ), +# # pos_free_allocated_weight=Sum( +# # 'cur_weight', filter=Q(price_approved=False, transaction__date__date=day) +# # ), +# # ) +# # +# # archives_info = archives.aggregate( +# # total_archive_governmental_weight=Sum('weight', filter=Q(date__date=day, quota='governmental')), +# # total_archive_free_weight=Sum('weight', filter=Q(date__date=day, quota='free')), +# # ) +# # +# # total_kill_house_request_governmental_weight = kill_house_requests_info['total_kill_house_request_governmental_weight'] or 0 +# # total_kill_house_request_free_weight = kill_house_requests_info['total_kill_house_request_free_weight'] or 0 +# # total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info['total_kill_house_free_buying_bars_weight'] or 0 +# # total_kill_house_allocations_governmental_weight = kill_house_allocations_info['total_kill_house_allocations_governmental_weight'] or 0 +# # total_kill_house_allocations_free_weight = kill_house_allocations_info['total_kill_house_allocations_free_weight'] or 0 +# # total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info['total_kill_house_free_sale_bars_governmental_weight'] or 0 +# # total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info['total_kill_house_free_sale_bars_free_weight'] or 0 +# # segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 +# # segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 +# # pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 +# # pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 +# # total_archive_governmental_weight = archives_info['total_archive_governmental_weight'] or 0 +# # total_archive_free_weight = archives_info['total_archive_free_weight'] or 0 +# # +# # total_governmental_input = total_kill_house_request_governmental_weight +# # total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight +# # +# # total_governmental_output = ( +# # total_kill_house_allocations_governmental_weight + +# # total_kill_house_free_sale_bars_governmental_weight + +# # segmentations_governmental_weight + +# # int(pos_governmental_allocated_weight / 1000) +# # ) +# # +# # total_free_output = ( +# # total_kill_house_allocations_free_weight + +# # total_kill_house_free_sale_bars_free_weight + +# # segmentations_free_weight + +# # int(pos_free_allocated_weight / 1000) +# # ) +# # +# # governmental_amount = ( +# # total_governmental_input - total_governmental_output) - total_archive_governmental_weight +# # free_amount = (total_free_input - total_free_output) - total_archive_free_weight +# # +# # governmental_data = { +# # 'day': day, +# # 'amount': governmental_amount, +# # 'active': True if day in target_days else False, +# # } +# # free_data = { +# # 'day': day, +# # 'amount': free_amount, +# # 'active': True if day in target_days else False, +# # } +# # +# # governmental_list.append(governmental_data) +# # free_list.append(free_data) +# # +# # final_dict['governmental'] = governmental_list +# # final_dict['free'] = free_list +# # +# # return Response(final_dict, status=status.HTTP_200_OK) + +class KillHouseRemainWeightViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + target_date = request.GET.get('date') + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() + product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() + + today = datetime.now().date() if not target_date else datetime.strptime(target_date, "%Y-%m-%d").date() + month_ago = today - timedelta(days=30) + yesterday = today - timedelta(days=1) + two_days_ago = yesterday - timedelta(days=1) + + days = [month_ago + timedelta(days=i) for i in range(31)] + target_days = {two_days_ago, yesterday, today} + req_vals = list( + KillHouseRequest.objects.filter( + input_warehouse=kill_house, + kill_request__recive_date__date__gte=month_ago, + kill_request__recive_date__date__lte=today, + ware_house_confirmation=True, + trash=False, + calculate_status=True, + warehouse=True + ).values( + "kill_request__recive_date__date", + "ware_house_accepted_real_weight", + "province_request__poultry_request__free_sale_in_province" + ) + ) + + free_buy_vals = list( + KillHouseFreeBarInformation.objects.filter( + trash=False, + calculate_status=True, + warehouse=True, + date__date__gte=month_ago, + date__date__lte=today, + input_warehouse=kill_house + ).exclude(entered_message='ورود به انبار مجازی') + .values("date__date", "weight_of_carcasses") + ) + + alloc_vals = list( + StewardAllocation.objects.filter( + kill_house=kill_house, + trash=False, + calculate_status=True, + warehouse=True, + receiver_state__in=('pending', 'accepted'), + production_date__date__gte=month_ago, + production_date__date__lte=today + ).values( + "production_date__date", + "quota", + "real_weight_of_carcasses" + ) + ) + + free_sale_vals = list( + KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + production_date__date__gte=month_ago, + production_date__date__lte=today, + trash=False, + calculate_status=True, + warehouse=True + ).values("production_date__date", "quota", "real_weight_of_carcasses") + ) + + seg_vals = list( + PosSegmentation.objects.filter( + kill_house=kill_house, + production_date__date__gte=month_ago, + production_date__date__lte=today, + trash=False, + warehouse=True + ).values("production_date__date", "quota", "weight") + ) + + pos_vals = list( + ProductsTransactions.objects.filter( + product=product, + transaction__paid=True, + transaction__date__date__gte=month_ago, + transaction__date__date__lte=today, + trash=False, + warehouse=True + ).values( + "transaction__date__date", + "price_approved", + "cur_weight" + ) + ) + + arch_vals = list( + WarehouseArchive.objects.filter( + kill_house=kill_house, + warehouse=True, + trash=False + ).values("date__date", "quota", "weight") + ) + + req_daily = {} + for r in req_vals: + d = r["kill_request__recive_date__date"] + w = r["ware_house_accepted_real_weight"] or 0 + if d not in req_daily: + req_daily[d] = {"governmental": 0, "free": 0} + if r["province_request__poultry_request__free_sale_in_province"]: + req_daily[d]["free"] += w + else: + req_daily[d]["governmental"] += w + + free_buy_daily = {} + for r in free_buy_vals: + d = r["date__date"] + w = r["weight_of_carcasses"] or 0 + free_buy_daily[d] = free_buy_daily.get(d, 0) + w + + alloc_daily = {} + for r in alloc_vals: + d = r["production_date__date"] + w = r["real_weight_of_carcasses"] or 0 + q = r["quota"] + if d not in alloc_daily: + alloc_daily[d] = {"governmental": 0, "free": 0} + alloc_daily[d][q] += w + + free_sale_daily = {} + for r in free_sale_vals: + d = r["production_date__date"] + w = r["real_weight_of_carcasses"] or 0 + q = r["quota"] + if d not in free_sale_daily: + free_sale_daily[d] = {"governmental": 0, "free": 0} + free_sale_daily[d][q] += w + + seg_daily = {} + for r in seg_vals: + d = r["production_date__date"] + w = r["weight"] or 0 + q = r["quota"] + if d not in seg_daily: + seg_daily[d] = {"governmental": 0, "free": 0} + seg_daily[d][q] += w + + pos_daily = {} + for r in pos_vals: + d = r["transaction__date__date"] + w = r["cur_weight"] or 0 + if d not in pos_daily: + pos_daily[d] = {"governmental": 0, "free": 0} + if r["price_approved"]: + pos_daily[d]["governmental"] += w + else: + pos_daily[d]["free"] += w + + arch_daily = {} + for r in arch_vals: + d = r["date__date"] + w = r["weight"] or 0 + q = r["quota"] + if d not in arch_daily: + arch_daily[d] = {"governmental": 0, "free": 0} + arch_daily[d][q] += w + + governmental_list = [] + free_list = [] + + for day in days: + gov_in = req_daily.get(day, {}).get("governmental", 0) + free_in = req_daily.get(day, {}).get("free", 0) + free_buy_daily.get(day, 0) + + gov_out = ( + alloc_daily.get(day, {}).get("governmental", 0) + + free_sale_daily.get(day, {}).get("governmental", 0) + + seg_daily.get(day, {}).get("governmental", 0) + + (pos_daily.get(day, {}).get("governmental", 0) // 1000) + ) + + free_out = ( + alloc_daily.get(day, {}).get("free", 0) + + free_sale_daily.get(day, {}).get("free", 0) + + seg_daily.get(day, {}).get("free", 0) + + (pos_daily.get(day, {}).get("free", 0) // 1000) + ) + + gov_remain = gov_in - gov_out - arch_daily.get(day, {}).get("governmental", 0) + free_remain = free_in - free_out - arch_daily.get(day, {}).get("free", 0) + + governmental_list.append({ + "day": day, + "amount": gov_remain if gov_remain > 0 else 0, + "active": day in target_days, + }) + + free_list.append({ + "day": day, + "amount": free_remain if free_remain > 0 else 0, + "active": day in target_days, + }) + + return Response({ + "governmental": governmental_list, + "free": free_list + }, status=status.HTTP_200_OK) + + +# class TotalKillHouseRemainWeightViewSet(GenericAPIView): +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = TotalKillHouseRemainWeightViewSetSerializer +# pagination_class = CustomPagination +# filter_backends = [DjangoFilterBackend] +# filterset_class = KillHouseFilterSet +# filterset_fields = [ +# 'name', +# 'kill_house_operator__user__mobile', +# 'kill_house_operator__user__fullname', +# 'kill_house_operator__user__first_name', +# 'kill_house_operator__user__last_name' +# +# ] +# +# def get(self, request): +# +# kill_house_filters = {'out_province': False, 'trash': False, 'total_remain_warehouse_weight__gt': 0} +# kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by('id', 'killer') +# +# if 'search' in request.GET: +# kill_house_list = [] +# if request.GET['search'] == 'filter': +# if request.GET['value'] != "" and request.GET['value'] != 'undefined': +# for item in self.filterset_fields: +# query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) +# if (self.filterset_class( +# data=query, +# queryset=kill_houses +# ) +# ).filter(): +# ps = self.filterset_class(data=query, queryset=kill_houses) +# kill_house_list = ps.filter() +# kill_houses = [] if len( +# kill_house_list) == 0 else kill_house_list +# +# page_size = request.query_params.get('page_size', None) +# if page_size: +# self.pagination_class.page_size = int(page_size) +# +# page = self.paginate_queryset(kill_houses) +# if page is not None: +# serializer = self.get_serializer(page, many=True) +# return self.get_paginated_response(serializer.data) +# +# serializer = self.serializer_class(kill_houses, many=True) +# return Response(serializer.data, status=status.HTTP_200_OK) +class TotalKillHouseRemainWeightViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = TotalKillHouseRemainWeightViewSetSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__mobile', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name' + + ] + + def get(self, request): + quota = request.GET.get("quota") + kill_house_filters = {'out_province': False, 'trash': False, 'total_remain_warehouse_weight__gt': 0} + kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by('id', 'killer') + + if 'search' in request.GET: + kill_house_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_house_list = ps.filter() + kill_houses = [] if len( + kill_house_list) == 0 else kill_house_list + + all_data = TotalKillHouseRemainWeightViewSetSerializer(kill_houses, many=True).data + if quota in ("governmental", "free"): + filtered = [] + today = datetime.today().date() + two_days_ago = today - timedelta(days=2) + + for item in all_data: + info = item.get("info") + if not info: + continue + + for row in info.get(quota, []): + day = row["day"] + amount = row["amount"] + if amount > 0 and day < two_days_ago: + filtered.append(item) + break + + all_data = filtered + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(all_data) + if page is not None: + # serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(page) + + # serializer = self.serializer_class(kill_houses, many=True) + return Response(all_data, status=status.HTTP_200_OK) + + +class TotalKillHouseWarehouseArchiveDashboardViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = TotalKillHouseWarehouseArchiveDashboardSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__mobile', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name' + + ] + + def get(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + archives_filters = {"trash": False, "kill_house__isnull": False} + if date1: + archives_filters['create_date__date__gte'] = date1 + archives_filters['create_date__date__lte'] = date2 + + archives = WarehouseArchive.objects.filter(**archives_filters) + kill_houses = KillHouse.objects.filter(id__in=archives.values_list('kill_house__id', flat=True), trash=False) + if 'search' in request.GET: + kill_house_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_house_list = ps.filter() + kill_houses = [] if len( + kill_house_list) == 0 else kill_house_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + serializer = self.get_serializer(page, many=True, context={'date1': date1, 'date2': date2}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_houses, many=True, context={'date1': date1, 'date2': date2}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +def fix_wage(request): + kill_house_requests = KillHouseRequest.objects.filter(trash=True, return_trash=True) + kill_house_requests_values = kill_house_requests.values_list('province_kill_request__id', flat=True).distinct() + province_requests = ProvinceKillRequest.objects.filter(trash=True, id__in=kill_house_requests_values, + return_trash=True) + return HttpResponse(province_requests.count()) + + +class KillHouseLock(APIView): + + def get(self, request): + + wage_lock = False + ware_house_lock = False + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + kill_house_purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first() + total_unpaid_wage = get_finance_info(kill_house)['total_price'] + 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_unpaid_wage -= total_paid_wage + + if kill_house_purchase.limitation_number <= total_unpaid_wage: + wage_lock = True + + if kill_house.ware_house_remaining_weight_limitation_status: + if kill_house.total_remain_warehouse_governmental_weight > kill_house.ware_house_remaining_weight_limitation: + ware_house_lock = True + + if kill_house.ware_house_remaining_percent_limitation_status: + if not check_kill_house_remain_limitation_weight(kill_house): + ware_house_lock = True + + result = { + 'wage': total_unpaid_wage, + 'wage_lock': wage_lock, + 'ware_house_lock': ware_house_lock + } + + return Response (result,status=status.HTTP_200_OK) diff --git a/panel/ProvinceOperator/__init__.py b/panel/ProvinceOperator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/ProvinceOperator/excel_processing.py b/panel/ProvinceOperator/excel_processing.py new file mode 100644 index 0000000..20da25d --- /dev/null +++ b/panel/ProvinceOperator/excel_processing.py @@ -0,0 +1,25023 @@ +from io import BytesIO +import openpyxl +import datetime +import jdatetime +from itertools import chain +from django.db.models import Case, When +from django.db.models import Value + +import requests +from oauth2_provider.models import AccessToken +from rest_framework.throttling import AnonRateThrottle, UserRateThrottle +from rest_framework.views import APIView +from rest_framework.response import Response + +from deposit_id import wage_counting_type +from general_urls import base_url_for_sms_report +from panel.CityOperator.serializers import CityOperatorForSubSectorTransactionsSerializer, \ + CityOperatorForSubSectorSerializer, CityOperatorForSubSectorSerializerForExcel +from panel.KillHouse.helpers import get_difference_carcasses_weight, get_kill_house_finance_info, \ + get_difference_carcasses_percent +from panel.ProvinceOperator.serializers import \ + GuildsPosMachineForTransactionsSerializer, PosMachineTransactionsForInspectionSerializer, \ + TotalWageInformationSerializer, CityGuildForSubSectorSerializerForExcel, InProvinceAllocationSerializer, \ + StewardFreeSaleBarInformationSerializer, RealGuildsForDashboardSerializer, \ + GuildsPosMachineForTransactionsNewSerializer +from panel.VetFarm.serializers import VetForSubSectorSerializer, VetForSubSectorSerializerForExcel +from panel.helper import build_query +from panel.helper_excel import Alignment_CELL, create_header, create_header_freez, excel_description, \ + create_value, merge_cells, cell_color_changer, get_kill_house_finance_info_by_date, \ + get_kill_house_distribution_info, get_kill_house_distribution_out_province_info, \ + all_get_kill_house_distribution_info, GREEN_CELL, VERY_LIGHT_GREEN_CELL, LIGHT_GREEN_CELL, \ + RED_CELL, convert_str_to_date +from django.http import HttpResponse, QueryDict +from openpyxl import Workbook +from openpyxl.styles import PatternFill, Alignment, Font +from openpyxl.utils import get_column_letter +from django.db.models import Q, Sum, F, Count, Avg + +from panel.KillHouse.serializers import \ + KillHouseForNewWageInormationSerializer, KillHouseFreeSaleBarInformationSerializer, \ + KillHouseForPerformanceDashboardSerializer, KillHouseForProvinceWareHouseDashboardSerializer, \ + KillRequestForDirectBuyingSerializer, ReturnProvinceKillRequestSerializer +from panel.ReportingPanel.helper import poultry_request_new_fields +from panel.convert_date import convert_to_shamsi +from panel.filterset import KillHouseFilterSet, KillHouseRequestFilterSet, InternalTransactionFilterSet, \ + PoultryRequestFilterSet, OutProvincePoultryRequestBuyerFilterSet, ChainCompanyFilterSet, ChainAllocationFilterSet, \ + StewardAllocationDashboardFilterSet, KillHouseFreeSaleBarInformationFilterSet, \ + StewardFreeSaleBarInformationFilterSet, KillRequestFilterSet, ReturnProvinceKillRequestFilterSet, \ + GuildsForPostationFilterSet +from panel.helper_excel import shamsi_date +from panel.models import ProvinceKillRequest, \ + ChainAllocation, KillHouseFreeBarInformation, InternalTransaction, ChainCompany, \ + KillHousePercentage, KillHouseRequest, PoultryRequest, KillHouseVet, VetCheckRequest, \ + KillHouseAssignmentInformation, VetFarm, Poultry, CityOperator, OutProvincePoultryRequestBuyer, Vet, \ + PoultryHatching, KillHouseFreeSaleBarInformation, WageType, PercentageOfWageType, KillHouseWareHouse, \ + StewardAllocation, RolesProducts, Guilds, SubSectorPercentageOfWageType, SubSectorTransactions, \ + StewardFreeBarInformation, StewardFreeSaleBarInformation, PosMachineTransactions, CityGuild, TotalWageInformation, \ + BarDifferenceRequest, BarDocumentStatus, KillRequest, POSTransactions, POSMachine, PosSegmentation, \ + ProductsTransactions, WarehouseArchive +from authentication.models import ( + SystemUserProfile, City, +) +from panel.models import ( + KillHouse, +) + + +def kill_house_total_transactions_wage_payid_super_admin_excel(request): + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + kill_house_list = [] + + excel_options = [ + 'ردیف', + 'تاریخ پرداخت', + 'نوع پرداخت', + 'نام پرداخت کننده', + 'تلفن پرداخت کننده', + 'شماره درخواست', + 'شماره پیگیری', + 'کد سفارش', + 'شماره کارت', + 'مبلغ تراکنش(ریال)', + 'سهم اتحادیه(ریال)', + 'سهم شرکت(ریال)', + 'سهم اصناف(ریال)', + 'سهم دامپزشک(ریال)', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_name = 'اطلاعات کلی' + worksheet = workbook.create_sheet(sheet_name) + + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + worksheet['B2'] = f'اطلاعات کلی تعرفه {from_date_1} تا {from_date_2}' + merge_range1 = 'B2:C2' + worksheet.merge_cells(merge_range1) + + worksheet['B2'].font = Font(color="C00000", bold=True) + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + worksheet['B5'] = f'جزئیات {from_date_1} تا {from_date_2}' + + worksheet['B5'].font = Font(color="C00000", bold=True) + worksheet['B5'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + else: + # worksheet['B2'] = 'اطلاعات کلی تعرفه(از 1403/01/01 به بعد)' + + worksheet['B2'].font = Font(color="C00000") + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + worksheet['B5'] = f'جزئیات' + + worksheet['B5'].font = Font(color="C00000", bold=True) + worksheet['B5'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + worksheet['C9'] = 'اتحادیه' + worksheet['C9'].font = Font(color="C00000") + worksheet['C9'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['C9'].fill = PatternFill(start_color="EEEAF2", fill_type="solid") + worksheet['C9'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + worksheet['C10'] = 'شرکت' + worksheet['C10'].font = Font(color="C00000") + worksheet['C10'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['C10'].fill = PatternFill(start_color="EEEAF2", fill_type="solid") + worksheet['C10'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + worksheet['C11'] = 'صنف' + worksheet['C11'].font = Font(color="C00000") + worksheet['C11'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['C11'].fill = PatternFill(start_color="EEEAF2", fill_type="solid") + worksheet['C11'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + worksheet['C12'] = 'دامپزشک' + worksheet['C12'].font = Font(color="C00000") + worksheet['C12'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['C12'].fill = PatternFill(start_color="EEEAF2", fill_type="solid") + worksheet['C12'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + header_list1 = [ + 'کل تعرفه (ریال)', + 'کل تعرفه پرداخت شده (ریال)', + 'تخفیف (ریال)', + 'کل تعرفه پرداخت نشده (ریال)', + + ] + + header_list2 = [ + 'کل وزن زنده کشتار داخل استان(کیلوگرم)', + 'وزن لاشه کشتار داخل استان(کیلوگرم)', + 'وزن توزیع لاشه کشتار داخل استان(کیلوگرم)', + 'تعرفه توزیع لاشه کشتار داخل استان(ریال)', + 'وزن توزیع لاشه به خارج استان(کیلوگرم)', + 'تعرفه توزیع لاشه به خارج استان(ریال)', + 'وزن لاشه ورودی به استان(کیلوگرم)', + 'تعرفه لاشه ورودی به استان(ریال)', + 'وزن مرغ زنده ورودی به استان(کیلوگرم)', + 'تعرفه مرغ زنده ورودی به استان(ریال)', + + ] + header_list = [ + 'ردیف', + 'ماهیت', + 'خریدار', + 'کل تعرفه(ریال)', + 'کل تعرفه پرداخت شده(ریال)', + 'تخفیف(ریال)', + 'کل تعرفه پرداخت نشده(ریال)', + 'کل وزن زنده کشتار داخل استان(کیلوگرم)', + 'کل وزن لاشه کشتار داخل استان(کیلوگرم)', + 'کل توزیع لاشه داخل استان(کیلوگرم)', + 'تعرفه لاشه داخل استان(ریال)', + 'وزن توزیع لاشه به خارج استان(کیلوگرم)', + 'تعرفه توزیع لاشه به خارج استان(ریال)', + 'وزن لاشه ورودی به استان(کیلوگرم)', + 'تعرفه لاشه ورودی به استان(ریال)', + 'وزن مرغ زنده ورودی به استان(کیلوگرم)', + 'تعرفه مرغ زنده ورودی به استان(ریال)', + + ] + for col_num, option in enumerate(header_list, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=14, column=col_num, value=option) + if option in ['کل تعرفه پرداخت نشده(ریال)']: + cell.fill = PatternFill(start_color="76933C", fill_type="solid") + else: + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[13].height = 45 + worksheet.column_dimensions[col_letter].width = 27 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + header_list5 = [ + 'سهم', + 'تعرفه توزیع لاشه داخل استان(ریال)', + 'تعرفه توزیع لاشه خارج استان(ریال)', + 'تعرفه لاشه ورودی به استان(ریال)', + 'تعرفه مرغ زنده ورودی به استان(ریال)', + 'تعرفه کل(ریال)', + 'تعرفه پرداخت شده(ریال)', + 'تعرفه پرداخت نشده(ریال)', + + ] + create_header(worksheet, header_list5, 3, 8, height=35, width=18, border_style='thin') + + create_header(worksheet, header_list1, 4, 3, height=35, width=18, border_style='thin') + create_header(worksheet, header_list2, 3, 5, height=35, width=18, border_style='thin') + + wage_type = WageType.objects.filter(en_name='province-kill-request').first() + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + union_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name == 'company': + company_wage_percent = percentage_wage_type.percent / 100 + + elif percentage_wage_type.share_type.en_name == 'guilds': + guilds_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name in ['city', 'wallet']: + pass + else: + other_wage_percent = percentage_wage_type.percent / 100 + type = 'total_wage_amount' + share_type = 'amount' + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_buying_live_weight_amount = total_wage_type.filter(en_name='live-buy', trash=False).first().amount + free_buying_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-buy', trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + if 'date1' in request.GET: + 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, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + 'id') + + 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 + ) + + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + trash=False, state='accepted') + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, + kill_house__in=kill_houses, + archive_wage=False, + calculate_status=True, + trash=False) + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, + kill_house__in=kill_houses, + archive_wage=False, + calculate_status=True, + trash=False) + + slaughter_transactions = InternalTransaction.objects.filter(date__date__gte=date1, + date__date__lte=date2, + kill_house__in=kill_houses, status='completed', + trash=False) + + off = kill_houses.aggregate(total=Sum('off'))[ + 'total'] or 0 + + 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 + total_province_carcasses_weight = total_province_live_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 + total_pure_province_carcasses_weight = total_province_carcasses_weight - get_difference_carcasses_weight( + kill_houses) + total_out_live_buying_province_carcasses_weight = \ + kill_house_free_bar_info.filter(buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0 + 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_amount + total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_amount + total_out_live_buying_province_carcasses_price = total_out_live_buying_province_carcasses_weight * free_buying_live_weight_amount + total_out_carcasses_buying_province_carcasses_price = total_out_carcasses_buying_province_carcasses_weight * free_buying_carcesses_weight_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 + + 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 + union_free_buying_live_wage = 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 + 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 + company_free_buying_live_wage = total_out_live_buying_province_carcasses_price * company_free_buying_live_percent + 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 + company_total_paid_wage = slaughter_transactions.aggregate(total=Sum('company_share'))['total'] or 0 + # company_total_pure_paid_wage = company_total_paid_wage - (company_total_paid_wage * 0.08)) + 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_free_buying_live_wage = 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_free_buying_live_wage = 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 + + else: + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + 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') + 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_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, + archive_wage=False, + calculate_status=True, + trash=False) + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + archive_wage=False, calculate_status=True, + trash=False) + + slaughter_transactions = InternalTransaction.objects.filter( + kill_house__in=kill_houses, status='completed', + trash=False) + + off = kill_houses.aggregate(total=Sum('off'))[ + 'total'] or 0 + + 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 + total_province_carcasses_weight = total_province_live_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 + total_pure_province_carcasses_weight = total_province_carcasses_weight - get_difference_carcasses_weight( + kill_houses) + total_out_live_buying_province_carcasses_weight = \ + kill_house_free_bar_info.filter(buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0 + 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_amount + total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_amount + total_out_live_buying_province_carcasses_price = total_out_live_buying_province_carcasses_weight * free_buying_live_weight_amount + total_out_carcasses_buying_province_carcasses_price = total_out_carcasses_buying_province_carcasses_weight * free_buying_carcesses_weight_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 + + 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 + union_free_buying_live_wage = 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 + 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 + company_free_buying_live_wage = total_out_live_buying_province_carcasses_price * company_free_buying_live_percent + 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 + company_total_paid_wage = slaughter_transactions.aggregate(total=Sum('company_share'))['total'] or 0 + # company_total_pure_paid_wage = company_total_paid_wage - (company_total_paid_wage * 0.08)) + 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_free_buying_live_wage = 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_free_buying_live_wage = 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 + + values_list = [ + total_price, + total_paid_wage, + off, + total_price - (total_paid_wage + off) + + ] + create_value(worksheet, values_list, 4, 4, border_style='thin') + + values_list2 = [ + total_province_live_weight, + total_province_carcasses_weight, + total_pure_province_carcasses_weight, + total_pure_province_carcasses_price, + total_out_selling_province_carcasses_weight, + total_out_selling_province_carcasses_price, + total_out_carcasses_buying_province_carcasses_weight, + total_out_carcasses_buying_province_carcasses_price, + total_out_live_buying_province_carcasses_weight, + total_out_live_buying_province_carcasses_price, + + ] + create_value(worksheet, values_list2, 6, 3, border_style='thin') + + values_union = [ + union_province_kill_request_wage, + union_free_sell_carcasses_wage, + union_free_buying_carcasses_wage, + union_free_buying_live_wage, + union_total_wage, + union_total_paid_wage, + union_total_unpaid_wage, + + ] + create_value(worksheet, values_union, 9, 4, border_style='thin') + + values_company = [ + company_province_kill_request_wage, + company_free_sell_carcasses_wage, + company_free_buying_carcasses_wage, + company_free_buying_live_wage, + company_total_wage, + company_total_paid_wage, + company_total_unpaid_wage, + + ] + create_value(worksheet, values_company, 10, 4, border_style='thin') + + values_guild = [ + guilds_province_kill_request_wage, + guilds_free_sell_carcasses_wage, + guilds_free_buying_carcasses_wage, + guilds_free_buying_live_wage, + guilds_total_wage, + guilds_total_paid_wage, + guilds_total_unpaid_wage, + + ] + create_value(worksheet, values_guild, 11, 4, border_style='thin') + + values_others = [ + other_province_kill_request_wage, + other_free_sell_carcasses_wage, + other_free_buying_carcasses_wage, + other_free_buying_live_wage, + other_total_wage, + other_total_paid_wage, + other_total_unpaid_wage, + + ] + create_value(worksheet, values_others, 12, 4, border_style='thin') + + l = 15 + m = 1 + + kill_houses = KillHouse.objects.filter(trash=False).exclude(out_province=True).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_houses) + kill_houses = ps.filter() + else: + kill_houses = kill_houses + all_finance_info_total_price = 0 + all_total_paid_wage = 0 + all_off = 0 + all_unpaid = 0 + finance_info_total_province_live_weight = 0 + finance_info_total_province_carcasses_weight = 0 + finance_info_total_pure_province_carcasses_price = 0 + finance_info_total_out_selling_province_carcasses_weight = 0 + finance_info_total_out_selling_province_carcasses_price = 0 + finance_info_total_out_carcasses_buying_province_carcasses_weight = 0 + finance_info_total_out_carcasses_buying_province_carcasses_price = 0 + finance_info_total_out_live_buying_province_carcasses_weight = 0 + finance_info_total_out_live_buying_province_carcasses_price = 0 + finance_info_total_pure_province_carcasses_weight = 0 + + for obj in kill_houses: + killer = 'کشتارگاه' if obj.killer == False else 'کشتارکن' + if obj.killer == True and obj.type == 'exclusive': + parent = KillHousePercentage.objects.get(kill_house=obj, trash=False) + killer_type = f'کشتارکن اختصاصی {parent.kill_house_for_killer.name}' + elif obj.killer == True and obj.type == 'public': + killer_type = 'کشتارکن عمومی' + else: + killer_type = 'کشتارگاه' + total_paid_wage = 0 + if 'date1' in request.GET: + + finance_info = get_kill_house_finance_info_by_date(obj, date1, date2) + else: + finance_info = get_kill_house_finance_info(obj) + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=obj, status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + if 'date1' in request.GET: + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + trash=False, + return_to_province=False, + first_car_allocated_quantity=0, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).exclude(union_share=0, company_share=0, + guilds_share=0).only( + 'total_killed_weight', 'union_share', 'company_share', + 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + 'company_share', + 'guilds_share', 'total_wage_amount', + 'total_killed_quantity') + + kill_house_requests = KillHouseRequest.objects.filter( + Q(Q(killer=obj) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) | Q(killer=obj)), + archive_wage=False, + trash=False, kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).select_related('province_kill_request').only('accepted_real_weight', + 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', + 'accepted_real_quantity', 'accepted_real_quantity') + + kill_house_requests = kill_house_requests.filter(Q(killer=obj) | Q(killhouse_user=obj)).select_related( + 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', + 'accepted_real_quantity') + + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True).select_related( + 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', + 'accepted_real_quantity') + + free_bars = KillHouseFreeBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, kill_house=obj, + archive_wage=False, + trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', + 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount' + ) + + slaughter_transactions = InternalTransaction.objects.filter(date__date__gte=date1, + date__date__lte=date2, + kill_house=obj, status='completed', + trash=False).only('union_share', + 'company_share', + 'guilds_share', 'amount') + + else: + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + trash=False, + return_to_province=False, + first_car_allocated_quantity=0, + archive_wage=False, + ).exclude(union_share=0, company_share=0, + guilds_share=0).only( + 'total_killed_weight', 'union_share', 'company_share', + 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + 'company_share', + 'guilds_share', 'total_wage_amount', + 'total_killed_quantity') + + kill_house_requests = KillHouseRequest.objects.filter( + Q(Q(killer=obj) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) | Q(killer=obj)), + archive_wage=False, + trash=False + ).select_related('province_kill_request').only('accepted_real_weight', + 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', + 'accepted_real_quantity', 'accepted_real_quantity') + kill_house_requests = kill_house_requests.filter(Q(killer=obj) | Q(killhouse_user=obj)).select_related( + 'province_kill_request').only( + 'accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity') + + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True).select_related( + 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', + 'accepted_real_quantity') + + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=obj, archive_wage=False, + trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', + 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount' + ) + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=obj, status='completed', + trash=False).only('union_share', 'company_share', 'guilds_share', 'amount') + + all_finance_info_total_price += finance_info['total_price'] + all_total_paid_wage += total_paid_wage + all_off += obj.off + all_unpaid += finance_info['total_price'] - (total_paid_wage + obj.off) + finance_info_total_province_live_weight += finance_info['total_province_live_weight'] + finance_info_total_province_carcasses_weight += finance_info['total_province_carcasses_weight'] + finance_info_total_pure_province_carcasses_weight += finance_info['total_pure_province_carcasses_weight'] + finance_info_total_pure_province_carcasses_price += finance_info['total_pure_province_carcasses_price'] + finance_info_total_out_selling_province_carcasses_weight += finance_info[ + 'total_out_selling_province_carcasses_weight'] + finance_info_total_out_selling_province_carcasses_price += finance_info[ + 'total_out_selling_province_carcasses_price'] + finance_info_total_out_carcasses_buying_province_carcasses_weight += finance_info[ + 'total_out_carcasses_buying_province_carcasses_weight'] + finance_info_total_out_carcasses_buying_province_carcasses_price += finance_info[ + 'total_out_carcasses_buying_province_carcasses_price'] + finance_info_total_out_live_buying_province_carcasses_weight += finance_info[ + 'total_out_live_buying_province_carcasses_weight'] + finance_info_total_out_live_buying_province_carcasses_price += finance_info[ + 'total_out_live_buying_province_carcasses_price'] + values_list3 = [ + m, + killer_type, + killer + '(' + obj.name + ')', + finance_info['total_price'], + total_paid_wage, + obj.off, + finance_info['total_price'] - (total_paid_wage + obj.off), + finance_info['total_province_live_weight'], + finance_info['total_province_carcasses_weight'], + finance_info['total_pure_province_carcasses_weight'], + finance_info['total_pure_province_carcasses_price'], + finance_info['total_out_selling_province_carcasses_weight'], + finance_info['total_out_selling_province_carcasses_price'], + finance_info['total_out_carcasses_buying_province_carcasses_weight'], + finance_info['total_out_carcasses_buying_province_carcasses_price'], + finance_info['total_out_live_buying_province_carcasses_weight'], + finance_info['total_out_live_buying_province_carcasses_price'], + + ] + create_value(worksheet, values_list3, l, 1, border_style='thin') + + l += 1 + m += 1 + if slaughter_transactions: + if obj not in kill_house_list: + kill_house_list.append(obj) + list2 = [ + 'مجموع==>', + '', + '', + all_finance_info_total_price, + all_total_paid_wage, + all_off, + all_unpaid, + finance_info_total_province_live_weight, + finance_info_total_province_carcasses_weight, + finance_info_total_pure_province_carcasses_weight, + finance_info_total_pure_province_carcasses_price, + finance_info_total_out_selling_province_carcasses_weight, + finance_info_total_out_selling_province_carcasses_price, + finance_info_total_out_carcasses_buying_province_carcasses_weight, + finance_info_total_out_carcasses_buying_province_carcasses_price, + finance_info_total_out_live_buying_province_carcasses_weight, + finance_info_total_out_live_buying_province_carcasses_price, + + ] + create_value(worksheet, list2, l, 1, border_style='thin', color='yellow') + + for kill_house in kill_house_list: + sheet_name = kill_house.name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[2].height = 27 + worksheet.freeze_panes = worksheet['A3'] + max_col = worksheet.max_column + range_str = f'A2:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 1 + m = 1 + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + kill_house = KillHouse.objects.get(id=kill_house.id, trash=False) + + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).exclude(guilds_share=0, company_share=0, union_share=0).order_by('id') + else: + kill_house = KillHouse.objects.get(key=kill_house.key, trash=False) + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).exclude(guilds_share=0, company_share=0, union_share=0).order_by('id') + + for transaction in transactions: + if transaction.kill_house != None: + fullname = transaction.kill_house.kill_house_operator.user.fullname + mobile = transaction.kill_house.kill_house_operator.user.mobile + else: + fullname = transaction.chain_company.user.fullname + mobile = transaction.chain_company.user.mobile + date = convert_to_shamsi( + datetime=transaction.date + ) + type = 'دستی' if transaction.transaction_type == 'wage-gateway-manual' else 'آنلاین' + if request.GET['role'] == 'ProvinceOperator': + amout = transaction.union_share + elif request.GET['role'] == 'Company': + amout = transaction.company_share + elif request.GET['role'] == 'Guilds': + amout = transaction.guilds_share + else: + amout = transaction.amount + list1 = [ + m, + date, + type, + fullname, + mobile, + transaction.orderId, + transaction.saleReferenceId, + transaction.orderId, + transaction.cardHolderPan, + amout, + transaction.union_share, + transaction.company_share, + transaction.guilds_share, + transaction.other_share, + + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + + 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 + + +def kill_house_total_transactions_wage_payid_excel(request): + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + kill_house_list = [] + + excel_options = [ + 'ردیف', + 'ماهیت تراکنش', + 'نوع تراکنش', + 'تاریخ پرداخت', + 'شماره پیگیری', + 'شماره درخواست', + 'پرداخت کننده', + 'تلفن پرداخت کننده', + 'شماره کارت', + 'مبلغ کل', + 'سهم اتحادیه(ریال)', + 'سهم صنف(ریال)', + 'سهم شرکت(ریال)', + 'سهم دامپزشک(ریال)', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_name = 'اطلاعات کلی' + worksheet = workbook.create_sheet(sheet_name) + + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + + worksheet['B2'] = f'اطلاعات کلی تعرفه {from_date_1} تا {from_date_2}' + merge_range1 = 'B2:C2' + worksheet.merge_cells(merge_range1) + + worksheet['B2'].font = Font(color="C00000", bold=True) + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + worksheet['B5'] = f'جزئیات ' + + worksheet['B5'].font = Font(color="C00000", bold=True) + worksheet['B5'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + else: + # worksheet['B2'] = 'اطلاعات کلی تعرفه(از 1403/01/01 به بعد)' + + worksheet['B2'].font = Font(color="C00000") + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + worksheet['B5'] = f'جزئیات' + + worksheet['B5'].font = Font(color="C00000", bold=True) + worksheet['B5'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'B8:C8' + + worksheet.merge_cells(merge_range1) + worksheet['B8'] = 'پرداختی های کشتارگاه ها' + + worksheet['B8'].font = Font(color="C00000", bold=True) + worksheet['B8'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + header_list1 = [ + 'کل وزن', + 'کل تعرفه (ریال)', + 'کل تعرفه پرداخت شده (ریال)', + 'کل تعرفه پرداخت نشده (ریال)', + + ] + + header_list2 = [ + 'وزن کشتار روزانه (کیلوگرم)', + 'تعرفه کشتار روزانه (ریال)', + 'وزن منجمد (کیلوگرم)', + 'تعرفه منجمد (ریال)', + 'وزن زنجیره ها (کیلوگرم)', + 'تعرفه زنجیره ها (ریال)', + 'وزن مرغ زنده آزاد', + 'تعرفه مرغ زنده آزاد', + 'وزن لاشه آزاد', + 'تعرفه لاشه آزاد', + ] + header_list = [ + 'ردیف', + 'خریدار', + 'نام و نام خانوادگی مالک', + 'تلفن مالک', + 'شهر', + 'تعداد تراکنش ', + 'سهم شما از واریزی(ریال)', + + ] + for col_num, option in enumerate(header_list, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=8, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[8].height = 45 + worksheet.column_dimensions[col_letter].width = 27 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list1, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 35 + worksheet.column_dimensions[col_letter].width = 18 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list2, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[5].height = 35 + worksheet.column_dimensions[col_letter].width = 18 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + total_weight = 0 + total_wage = 0 + total_paid_wage = 0 + + union_total_paid_wage = 0 + + company_total_paid_wage = 0 + + guilds_total_paid_wage = 0 + + freezing_province_kill_requests_total_wage = 0 + freezing_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 + role = request.GET['role'] + user = SystemUserProfile.objects.get(key=request.GET['key']) + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + state__in=('pending', 'accepted'), trash=False, + return_to_province=False, + first_car_allocated_quantity=0, + archive_wage=False, + ) + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True) + + 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 + ) + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True) + + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, archive_wage=False, + trash=False) + free_bars_live = free_bars.filter(buy_type='live', trash=False) + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False) + province_kill_requests_total_wage = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_wage_amount'))[ + 'total'] or 0 + freezing_province_kill_request_total_wage = \ + freezing_province_kill_requests.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + total_wage += province_kill_requests_total_wage + freezing_province_kill_request_total_wage + province_kill_requests_total_weight = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_province_kill_request_total_weight = \ + freezing_province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + total_weight += province_kill_requests_total_weight + freezing_province_kill_request_total_weight + kill_house_reqest_total_wage = \ + kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + freezing_kill_house_reqest_total_wage = \ + freezing_kill_house_requests.aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + total_wage += kill_house_reqest_total_wage + freezing_kill_house_reqest_total_wage + + kill_house_reqest_total_weight = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + freezing_kill_house_reqest_total_weight = \ + freezing_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + total_weight += kill_house_reqest_total_weight + freezing_kill_house_reqest_total_weight + + free_bars_live_total_wage = free_bars_live.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_wage += free_bars_live_total_wage + free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + total_weight += free_bars_live_total_weight + free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_wage += free_bars_carcases_total_wage + free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_weight += free_bars_carcases_total_weight + + 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 + + + elif role == 'ChainCompany': + chain_company = ChainCompany.objects.get(user=user, trash=False) + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, state='accepted', + trash=False) + chain_allocations_total_wage = chain_allocations.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_wage += chain_allocations_total_wage + chain_allocations_total_weight = chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + total_weight += chain_allocations_total_weight + + chain_company_transactions = InternalTransaction.objects.filter(chain_company=chain_company, + status='completed', trash=False) + total_paid_wage += chain_company_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + + + else: + + if role == 'ProvinceOperator': + type = 'union_share' + share_type = 'union_share' + province_kill_requests = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), trash=False, + first_car_allocated_quantity=0, + return_to_province=False, archive_wage=False, union_share__gt=0) + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True) + kill_house_requests = KillHouseRequest.objects.filter(trash=False, archive_wage=False, + province_kill_request__union_share__gt=0) + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True) + + chain_allocations = ChainAllocation.objects.filter(union_share__gt=0, state='accepted', trash=False) + free_bars = KillHouseFreeBarInformation.objects.filter(union_share__gt=0, archive_wage=False, + trash=False) + province_kill_requests_total_wage = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum(type))[ + 'total'] or 0 + province_kill_requests_total_wage += \ + kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + + freezing_province_kill_requests_total_wage = freezing_province_kill_requests.aggregate(total=Sum(type))[ + 'total'] or 0 + freezing_province_kill_requests_total_wage += \ + freezing_kill_house_requests.aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + + + + elif role == 'Guilds': + type = 'guilds_share' + share_type = 'guilds_share' + province_kill_requests = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), trash=False, + first_car_allocated_quantity=0, + + return_to_province=False, archive_wage=False, guilds_share__gt=0) + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, archive_wage=False, + province_kill_request__guilds_share__gt=0) + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True) + + chain_allocations = ChainAllocation.objects.filter(guilds_share__gt=0, state='accepted', trash=False) + free_bars = KillHouseFreeBarInformation.objects.filter(guilds_share__gt=0, archive_wage=False, + trash=False) + + province_kill_requests_total_wage = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum(type))[ + 'total'] or 0 + province_kill_requests_total_wage += \ + kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + + freezing_province_kill_requests_total_wage = freezing_province_kill_requests.aggregate(total=Sum(type))[ + 'total'] or 0 + freezing_province_kill_requests_total_wage += \ + freezing_kill_house_requests.aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + + + elif role == 'Company': + type = 'company_share' + share_type = 'company_share' + province_kill_requests = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), trash=False, + first_car_allocated_quantity=0, + return_to_province=False, archive_wage=False, company_share__gt=0) + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, archive_wage=False, + province_kill_request__company_share__gt=0) + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True) + + chain_allocations = ChainAllocation.objects.filter(company_share__gt=0, state='accepted', trash=False) + free_bars = KillHouseFreeBarInformation.objects.filter(company_share__gt=0, archive_wage=False, + trash=False) + province_kill_requests_total_wage = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum(type))[ + 'total'] or 0 + province_kill_requests_total_wage += \ + kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + + freezing_province_kill_requests_total_wage = freezing_province_kill_requests.aggregate(total=Sum(type))[ + 'total'] or 0 + freezing_province_kill_requests_total_wage += \ + freezing_kill_house_requests.aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + + else: + type = 'total_wage_amount' + share_type = 'amount' + province_kill_requests = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), trash=False, archive_wage=False, + first_car_allocated_quantity=0, + return_to_province=False).exclude(union_share=0, company_share=0, guilds_share=0) + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, archive_wage=False).exclude( + province_kill_request__union_share=0, province_kill_request__company_share=0, + province_kill_request__guilds_share=0) + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True) + + chain_allocations = ChainAllocation.objects.filter(trash=False, state='accepted') + free_bars = KillHouseFreeBarInformation.objects.filter(archive_wage=False, trash=False) + total_slaughter_transactions = InternalTransaction.objects.filter(payer_type='kill_house', + status='completed', + trash=False) + total_chain_company_transactions = InternalTransaction.objects.filter(payer_type='chain_company', + status='completed', trash=False) + + union_province_kill_request_total_weight = \ + province_kill_requests.filter(union_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_union_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(union_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + union_province_kill_request_total_weight += \ + kill_house_requests.filter(province_kill_request__union_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + freezing_union_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + union_province_kill_request_total_wage = \ + province_kill_requests.filter(union_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('union_share'))[ + 'total'] or 0 + union_province_kill_request_total_wage += \ + kill_house_requests.filter(province_kill_request__union_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + + freezing_union_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + freezing_union_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + union_chain_allocation_total_weight = \ + chain_allocations.filter(union_share__gt=0).aggregate(total=Sum('weight'))[ + 'total'] or 0 + union_chain_allocation_total_wage = \ + chain_allocations.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + union_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + union_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + union_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_paid_wage += \ + total_slaughter_transactions.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_paid_wage += \ + total_chain_company_transactions.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_weight = union_province_kill_request_total_weight + freezing_union_province_kill_request_total_weight + union_chain_allocation_total_weight + union_kill_house_free_live_bar_total_weight + union_kill_house_free_carcases_bar_total_weight + union_total_wage = union_province_kill_request_total_wage + freezing_union_province_kill_request_total_wage + union_chain_allocation_total_wage + union_kill_house_free_live_bar_total_wage + union_kill_house_free_carcases_bar_total_wage + union_total_unpaid_wage = union_total_wage - union_total_paid_wage + + company_province_kill_request_total_weight = \ + province_kill_requests.filter(company_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + company_province_kill_request_total_weight += \ + kill_house_requests.filter(province_kill_request__company_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(company_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + company_province_kill_request_total_wage = \ + province_kill_requests.filter(company_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('company_share'))[ + 'total'] or 0 + company_province_kill_request_total_wage += \ + kill_house_requests.filter(province_kill_request__company_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + freezing_company_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + company_chain_allocation_total_weight = \ + chain_allocations.filter(company_share__gt=0).aggregate(total=Sum('weight'))[ + 'total'] or 0 + company_chain_allocation_total_wage = \ + chain_allocations.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + company_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + + company_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate( + total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + company_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_paid_wage += \ + total_slaughter_transactions.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_paid_wage += \ + total_chain_company_transactions.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_weight = company_province_kill_request_total_weight + freezing_company_province_kill_request_total_weight + company_chain_allocation_total_weight + company_kill_house_free_live_bar_total_weight + company_kill_house_free_carcases_bar_total_weight + company_total_wage = company_province_kill_request_total_wage + freezing_company_province_kill_request_total_wage + company_chain_allocation_total_wage + company_kill_house_free_live_bar_total_wage + company_kill_house_free_carcases_bar_total_wage + company_total_unpaid_wage = company_total_wage - company_total_paid_wage + + guilds_province_kill_request_total_weight = \ + province_kill_requests.filter(guilds_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + guilds_province_kill_request_total_weight += \ + kill_house_requests.filter(province_kill_request__guilds_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + freezing_guilds_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + guilds_province_kill_request_total_wage = \ + province_kill_requests.filter(guilds_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_province_kill_request_total_wage += \ + kill_house_requests.filter(province_kill_request__guilds_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + guilds_chain_allocation_total_weight = \ + chain_allocations.filter(guilds_share__gt=0).aggregate(total=Sum('weight'))[ + 'total'] or 0 + guilds_chain_allocation_total_wage = \ + chain_allocations.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + guilds_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + + guilds_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate( + total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + guilds_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_total_paid_wage += \ + total_slaughter_transactions.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_total_paid_wage += \ + total_chain_company_transactions.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_total_weight = guilds_province_kill_request_total_weight + freezing_guilds_province_kill_request_total_weight + guilds_chain_allocation_total_weight + guilds_kill_house_free_live_bar_total_weight + guilds_kill_house_free_carcases_bar_total_weight + guilds_total_wage = guilds_province_kill_request_total_wage + freezing_guilds_province_kill_request_total_wage + guilds_chain_allocation_total_wage + guilds_kill_house_free_live_bar_total_wage + guilds_kill_house_free_carcases_bar_total_wage + guilds_total_unpaid_wage = guilds_total_wage - guilds_total_paid_wage + + province_kill_requests_total_wage = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum(type))[ + 'total'] or 0 + province_kill_requests_total_wage += \ + kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + + freezing_province_kill_requests_total_wage = freezing_province_kill_requests.aggregate(total=Sum(type))[ + 'total'] or 0 + freezing_province_kill_requests_total_wage += \ + freezing_kill_house_requests.aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + + free_bars_live = free_bars.filter(buy_type='live', trash=False) + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False) + + total_wage += province_kill_requests_total_wage + freezing_province_kill_requests_total_wage + + province_kill_requests_total_weight = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + province_kill_requests_total_weight += kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + freezing_province_kill_requests_total_weight = \ + freezing_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_province_kill_requests_total_weight += \ + freezing_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + total_weight += province_kill_requests_total_weight + freezing_province_kill_requests_total_weight + + chain_allocations_total_wage = chain_allocations.aggregate(total=Sum(type))[ + 'total'] or 0 + total_wage += chain_allocations_total_wage + chain_allocations_total_weight = chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + total_weight += chain_allocations_total_weight + free_bars_live_total_wage = free_bars_live.aggregate(total=Sum(type))[ + 'total'] or 0 + total_wage += free_bars_live_total_wage + free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + total_weight += free_bars_live_total_weight + free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum(type))[ + 'total'] or 0 + total_wage += free_bars_carcases_total_wage + free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_weight += free_bars_carcases_total_weight + slaughter_transactions = InternalTransaction.objects.filter(payer_type='kill_house', status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum(share_type))[ + 'total'] or 0 + chain_company_transactions = InternalTransaction.objects.filter(payer_type='chain_company', + status='completed', trash=False) + total_paid_wage += chain_company_transactions.aggregate(total=Sum(share_type))[ + 'total'] or 0 + + values_list = [ + total_weight, + total_wage, + total_paid_wage, + total_wage - total_paid_wage, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=3, column=item + 4, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + values_list2 = [ + province_kill_requests_total_weight, + province_kill_requests_total_wage, + freezing_province_kill_requests_total_weight, + freezing_province_kill_requests_total_wage, + chain_allocations_total_weight, + chain_allocations_total_wage, + free_bars_live_total_weight, + free_bars_live_total_wage, + free_bars_carcases_total_weight, + free_bars_carcases_total_wage, + + ] + for item in range(len(values_list2)): + cell = worksheet.cell(row=6, column=item + 3, value=values_list2[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l = 9 + m = 1 + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'ProvinceOperator': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='kill_house', + union_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='kill_house', + company_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='kill_house', + guilds_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + else: + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + payer_type='kill_house', + status='completed', + trash=False).values( + 'kill_house'), trash=False) + else: + + if request.GET['role'] == 'ProvinceOperator': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='kill_house', + union_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + + elif request.GET['role'] == 'Company': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='kill_house', + company_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + elif request.GET['role'] == 'Guilds': + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='kill_house', + guilds_share__gt=0, + trash=False).values( + 'kill_house'), trash=False) + else: + kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='kill_house', + trash=False).values( + 'kill_house'), trash=False) + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_houses) + kill_houses = ps.filter() + else: + kill_houses = kill_houses + for obj in kill_houses: + if 'date1' in request.GET: + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('id') + else: + transactions = InternalTransaction.objects.filter( + Q(kill_house=obj) | Q(parent_kill_house=obj), + status='completed', + trash=False).order_by('id') + total_paid_wage = 0 + + role = request.GET['role'] + if role in ['KillHouse', 'SuperAdmin', 'AdminX', 'Supporter']: + wage_type = 'amount' + transactions = transactions + elif role == 'ProvinceOperator': + wage_type = 'union_share' + transactions = transactions.filter( + + union_share__gt=0, + ).order_by('id') + elif role == 'Company': + wage_type = 'company_share' + transactions = transactions.filter( + + company_share__gt=0, + ).order_by('id') + elif role == 'Guilds': + wage_type = 'guilds_share' + transactions = transactions.filter( + guilds_share__gt=0, + ).order_by('id') + else: + transactions = transactions + wage_type = 'wallet_share' + if transactions: + if obj not in kill_house_list: + kill_house_list.append(obj) + total_paid_wage += transactions.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + + killer = 'کشتارگاه' if obj.killer == False else 'کشتارکن' + values_list3 = [ + m, + killer + '(' + obj.name + ')', + obj.kill_house_operator.user.fullname, + obj.kill_house_operator.user.mobile, + obj.kill_house_operator.user.city.name, + len(transactions), + total_paid_wage, + + ] + for item in range(len(values_list3)): + cell = worksheet.cell(row=l, column=item + 4, value=values_list3[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list3[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l += 1 + m += 1 + for kill_house in kill_house_list: + sheet_name = kill_house.name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22, width=20.01) + + l = 5 + m = 1 + header_list = [ + 'تعداد کل تراکنش ها', + 'مبلغ کل تراکنش(ریال)', + 'سهم کل اتحادیه(ریال)', + 'سهم کل صنف(ریال)', + 'سهم کل شرکت(ریال)', + 'سهم کل دامپزشک(ریال)', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + user = SystemUserProfile.objects.get(key=request.GET['key']) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).exclude(guilds_share=0, company_share=0, union_share=0).order_by('id') + + elif request.GET['role'] == 'ChainCompany': + chain_company = ChainCompany.objects.get(user=user, trash=False) + + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).exclude(guilds_share=0, company_share=0, union_share=0).order_by('id') + + else: + if request.GET['role'] == 'ProvinceOperator': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + union_share__gt=0, + status='completed', + trash=False).order_by('id') + elif request.GET['role'] == 'Company': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + company_share__gt=0, + status='completed', + trash=False).order_by('id') + elif request.GET['role'] == 'Guilds': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + guilds_share__gt=0, + status='completed', + trash=False).order_by('id') + elif request.GET['role'] == 'SuperAdmin': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).exclude(guilds_share=0, company_share=0, union_share=0).order_by('id') + else: + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('id') + + else: + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).order_by('id') + + elif request.GET['role'] == 'ChainCompany': + chain_company = ChainCompany.objects.get(user=user, trash=False) + + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + status='completed', + trash=False).order_by('id') + + else: + if request.GET['role'] == 'ProvinceOperator': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + union_share__gt=0, + status='completed', + trash=False).order_by('id') + elif request.GET['role'] == 'Company': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + company_share__gt=0, + status='completed', + trash=False).order_by('id') + + elif request.GET['role'] == 'Guilds': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + guilds_share__gt=0, + status='completed', + trash=False).order_by('id') + elif request.GET['role'] == 'SuperAdmin': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).exclude(guilds_share=0, company_share=0, union_share=0).order_by('id') + + else: + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).order_by('id') + + for transaction in transactions: + if transaction.kill_house: + killer_type = 'کشتارگاه' if transaction.kill_house.killer == False else 'کشتارکن' + elif transaction.chain_company: + killer_type = 'شرکت زنجیره' + else: + killer_type = 'خارج استان' + l += 1 + payer_date = jdatetime.date.fromgregorian( + day=transaction.date.day, + month=transaction.date.month, + year=transaction.date.year + ) + + if transaction.kill_house != None: + fullname = transaction.kill_house.kill_house_operator.user.fullname + mobile = transaction.kill_house.kill_house_operator.user.mobile + elif transaction.chain_company is not None: + fullname = transaction.chain_company.user.fullname + mobile = transaction.chain_company.user.mobile + else: + fullname = transaction.user.fullname + mobile = transaction.user.mobile + type = 'دستی' if transaction.transaction_type == 'wage-gateway-manual' else 'آنلاین' + + list1 = [ + m, + killer_type, + type, + str(payer_date), + transaction.refId, + transaction.orderId, + fullname, + mobile, + transaction.cardHolderPan, + transaction.amount, + transaction.union_share, + transaction.guilds_share, + transaction.company_share, + transaction.other_share + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + total_amount = \ + transactions.aggregate(total=Sum('amount'))['total'] or 0 + total_union_share = \ + transactions.aggregate(total=Sum('union_share'))['total'] or 0 + total_guilds_share = \ + transactions.aggregate(total=Sum('guilds_share'))['total'] or 0 + total_company_share = \ + transactions.aggregate(total=Sum('company_share'))['total'] or 0 + total_other_share = \ + transactions.aggregate(total=Sum('other_share'))['total'] or 0 + + value_header_list = [ + m - 1, + total_amount, + total_union_share, + total_guilds_share, + total_company_share, + total_other_share, + + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + total_amount, + total_union_share, + total_guilds_share, + total_company_share, + total_other_share, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def kill_house_total_wage_excel_new(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() + sheet_names2 = [ + 'اطلاعات کلی', + 'تخصیصات بدون بار', + 'بارهای روزانه', + 'مرغ زنده خارج استان', + 'خرید لاشه خارج استان', + # 'فروش لاشه خارج استان', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + wage_type = WageType.objects.filter(en_name='province-kill-request').first() + total_check_wage = wage_type.amount + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + union_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name == 'company': + company_wage_percent = percentage_wage_type.percent / 100 + + elif percentage_wage_type.share_type.en_name == 'guilds': + guilds_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name in ['city', 'wallet']: + pass + else: + other_wage_percent = percentage_wage_type.percent / 100 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_buying_live_weight_amount = total_wage_type.filter(en_name='live-buy', trash=False).first().amount + free_buying_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-buy', trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + total_wage_information = TotalWageInformation.objects.filter(trash=False).first() + if not total_wage_information: + total_wage_information = TotalWageInformation.objects.create() + serialized_wage_data = TotalWageInformationSerializer( + total_wage_information, + context={'request': request} + ).data.get('wage_info', {}) + serializer_finance_info = serialized_wage_data.get('finance_info') + effective_wage_counting_type = serialized_wage_data.get('wage_counting_type', wage_counting_type) + for name in sheet_names2: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + if sheet_name == 'اطلاعات کلی': + finance_info = serializer_finance_info or {} + if not finance_info and date1 and date2: + finance_info = get_kill_house_finance_info_by_date(kill_house, date1, date2) + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + excel_description(worksheet, 'A3', f'اطلاعات کلی تعرفه از تاریخ{from_date_1} تا {from_date_2}', + color='red', row2='C3') + excel_description(worksheet, 'A4', f'{kill_house.name}', color='red', row2='B4') + + if effective_wage_counting_type == 'carcass': + header_list1 = [ + 'کل وزن لاشه داخل استان', + 'وزن مر غ زنده خارج از استان', + 'وزن لاشه خرید خارج از استان', + 'کل تعرفه', + + ] + create_header(worksheet, header_list1, 4, 4, height=50, width=19, border_style='thin', color='C4D79B') + value_list1 = [ + finance_info.get('total_province_carcasses_weight', 0), + finance_info.get('total_out_live_buying_province_carcasses_weight', 0), + finance_info.get('total_out_carcasses_buying_province_carcasses_weight', 0), + finance_info.get('total_price', 0), + ] + create_value(worksheet, value_list1, 5, 4, border_style='thin') + + header_list2 = [ + 'تعرفه کشتار و توزیع داخل استان', + 'تعرفه کشتار و توزیع خارج استان استان', + 'تعرفه خرید لاشه خارج استان', + 'تعرفه خرید مرغ زنده خارج استان', + 'کل وزن زنده کشتار داخل استان(کیلوگرم)', + 'وزن لاشه کشتار داخل استان(کیلوگرم)', + 'وزن توزیع لاشه داخل استان(کیلوگرم)', + 'تعرفه توزیع لاشه داخل استان(ریال)', + 'وزن توزیع لاشه به خارج استان(کیلوگرم)', + 'تعرفه توزیع لاشه به خارج استان(ریال)', + 'وزن لاشه ورودی به استان(کیلوگرم)', + 'تعرفه لاشه ورودی به استان(ریال)', + 'وزن مرغ زنده ورودی به استان(کیلوگرم)', + 'تعرفه مرغ زنده ورودی به استان(کیلوگرم)', + + ] + create_header(worksheet, header_list2, 1, 9, height=50, width=19, border_style='thin', color='E26B0A') + value_list2 = [ + finance_info.get('province_live_wage_amount', 0), + finance_info.get('free_sell_carcesses_weight_amount', 0), + finance_info.get('free_buying_carcesses_weight_amount', 0), + finance_info.get('free_buying_live_weight_amount', 0), + + finance_info.get('total_province_live_weight', 0), + finance_info.get('total_province_carcasses_weight', 0), + + finance_info.get('total_pure_province_carcasses_weight', 0), + finance_info.get('total_pure_province_carcasses_price', 0), + finance_info.get('total_out_selling_province_carcasses_weight', 0), + finance_info.get('total_out_selling_province_carcasses_price', 0), + finance_info.get('total_out_carcasses_buying_province_carcasses_weight', 0), + finance_info.get('total_out_carcasses_buying_province_carcasses_price', 0), + finance_info.get('total_out_live_buying_province_carcasses_weight', 0), + finance_info.get('total_out_live_buying_province_carcasses_price', 0), + + ] + create_value(worksheet, value_list2, 10, 1, border_style='thin') + else: + header_list1 = [ + 'کل وزن لاشه داخل استان', + 'وزن مر غ زنده خارج از استان', + 'وزن لاشه خرید خارج از استان', + 'کل تعرفه', + + ] + create_header(worksheet, header_list1, 4, 4, height=50, width=19, border_style='thin', color='C4D79B') + value_list1 = [ + finance_info.get('total_province_carcasses_weight', 0), + finance_info.get('total_out_live_buying_province_carcasses_weight', 0), + finance_info.get('total_out_carcasses_buying_province_carcasses_weight', 0), + finance_info.get('total_price', 0), + ] + create_value(worksheet, value_list1, 5, 4, border_style='thin') + + header_list2 = [ + 'تعرفه کشتار و توزیع داخل استان', + 'تعرفه کشتار و توزیع خارج استان استان', + 'تعرفه خرید لاشه خارج استان', + 'تعرفه خرید مرغ زنده خارج استان', + 'کل وزن زنده کشتار داخل استان(کیلوگرم)', + # 'وزن لاشه کشتار داخل استان(کیلوگرم)', + # 'وزن توزیع لاشه داخل استان(کیلوگرم)', + 'تعرفه کشتار داخل استان(ریال)', + 'وزن توزیع لاشه به خارج استان(کیلوگرم)', + 'تعرفه توزیع لاشه به خارج استان(ریال)', + 'وزن لاشه ورودی به استان(کیلوگرم)', + 'تعرفه لاشه ورودی به استان(ریال)', + 'وزن مرغ زنده ورودی به استان(کیلوگرم)', + 'تعرفه مرغ زنده ورودی به استان(کیلوگرم)', + + ] + create_header(worksheet, header_list2, 1, 9, height=50, width=19, border_style='thin', color='E26B0A') + value_list2 = [ + finance_info.get('province_live_wage_amount', 0), + finance_info.get('free_sell_carcesses_weight_amount', 0), + finance_info.get('free_buying_carcesses_weight_amount', 0), + finance_info.get('free_buying_live_weight_amount', 0), + + finance_info.get('total_province_live_weight', 0), + # finance_info['total_province_carcasses_weight'], + + finance_info.get('total_pure_province_carcasses_price', 0), + # finance_info['total_pure_province_carcasses_price'], + finance_info.get('total_out_selling_province_carcasses_weight', 0), + finance_info.get('total_out_selling_province_carcasses_price', 0), + finance_info.get('total_out_carcasses_buying_province_carcasses_weight', 0), + finance_info.get('total_out_carcasses_buying_province_carcasses_price', 0), + finance_info.get('total_out_live_buying_province_carcasses_weight', 0), + finance_info.get('total_out_live_buying_province_carcasses_price', 0), + + ] + create_value(worksheet, value_list2, 10, 1, border_style='thin') + # excel_description(worksheet, 'D13', 'اطلاعات بار', size='16', row2='F13') + # header_list3 = [ + # 'تعداد بارهای ایجاد شده', + # 'مجموع تعداد قطعه بارها', + # 'مجموع وزن زنده بارها', + # 'مجموع تعداد نهایی در کشتارگاه', + # 'مجموع وزن نهایی در کشتار گاه', + # 'ملاک قطعه کشتار شده', + # 'ملاک وزن زنده کشتار شده', + # 'تعرفه پایه', + # 'وزن لاشه', + # 'مجموع تعرفه های بار', + # + # ] + # create_header(worksheet, header_list3, 1, 14, height=50, width=19, border_style='thin', color='0070C0') + # kill_house_requests_quantity = \ + # kill_house_requests.aggregate(total=Sum('quantity'))['total'] or 0 + # kill_house_requests_accepted_real_weight = \ + # kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + # kill_house_requests_accepted_real_quantity = \ + # kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + # kill_house_requests_wight = \ + # kill_house_requests.aggregate(total=Sum( + # F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[ + # 'total'] or 0 + # + # kill_house_requests_accepted_real_wight = \ + # kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + # assignment = KillHouseAssignmentInformation.objects.filter( + # kill_house_request__in=kill_house_requests, trash=False) + # + # assignment_net_weight = \ + # assignment.aggregate(total=Sum('net_weight'))['total'] or 0 + # assignment_real_quantity = \ + # assignment.aggregate(total=Sum('real_quantity'))['total'] or 0 + # value_list3 = [ + # len(kill_house_requests), + # kill_house_requests_quantity, + # kill_house_requests_wight, + # assignment_real_quantity, + # assignment_net_weight, + # kill_house_requests_accepted_real_quantity, + # kill_house_requests_accepted_real_weight, + # province_live_wage_type.amount, + # kill_house_requests_accepted_real_wight * 0.75, + # province_live_wage_type.amount * (kill_house_requests_accepted_real_wight * 0.75), + # + # ] + # create_value(worksheet, value_list3, 15, 1, border_style='thin') + # + # excel_description(worksheet, 'B17', 'تخصیصات بدون بار', size='16', row2='F17') + # header_list4 = [ + # 'تعداد سفارشات', + # 'تعداد کل', + # 'وزن کل', + # 'تعرفه', + # 'وزن لاشه ملاک تعرفه', + # 'کل تعرفه', + # + # ] + # create_header(worksheet, header_list4, 2, 18, height=50, width=19, border_style='thin', color='00B050') + # + # province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + # state__in=('pending', 'accepted'), + # return_to_province=False, + # archive_wage=False, + # first_car_allocated_quantity=0, + # kill_request__recive_date__date__gte=date1, + # kill_request__recive_date__date__lte=date2, + # trash=False).order_by( + # 'kill_request__recive_date') + # + # total_weight = \ + # province_kill_request.aggregate(total=Sum('total_killed_weight'))[ + # 'total'] or 0 + # total_killed_quantity = \ + # province_kill_request.aggregate(total=Sum('total_killed_quantity'))[ + # 'total'] or 0 + # + # value_list4 = [ + # len(province_kill_request), + # total_killed_quantity, + # total_weight, + # province_live_wage_type.amount, + # total_weight * 0.75, + # province_live_wage_type.amount * (total_weight * 0.75), + # + # ] + # create_value(worksheet, value_list4, 19, 2, border_style='thin') + # + # excel_description(worksheet, 'C22', 'فروش لاشه خارج استان', size='16', row2='F22') + # header_list5 = [ + # 'تعداد کل لاشه', + # 'حجم کل لاشه', + # 'وزن کل لاشه', + # 'تعرفه', + # 'مبلغ کل تعرفه', + # + # ] + # create_header(worksheet, header_list5, 3, 23, height=50, width=19, border_style='thin', color='B1A0C7') + # free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, date__date__gte=date1, + # date__date__lte=date2, + # kill_house=kill_house).order_by('-date') + # + # total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[ + # 'total'] or 0 + # total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[ + # 'total'] or 0 + # + # value_list5 = [ + # len(free_sales), + # total_quantity, + # total_weight, + # free_sell_carcesses_weight_wage_type.amount, + # total_weight * free_sell_carcesses_weight_wage_type.amount, + # ] + # create_value(worksheet, value_list5, 24, 3, border_style='thin') + # + # excel_description(worksheet, 'C26', 'خرید مرغ زنده خارج استان', size='16', row2='F26') + # header_list6 = [ + # 'تعداد خریداران', + # 'تعداد کل', + # 'وزن کل', + # 'تعرفه', + # 'مبلغ کل', + # + # ] + # create_header(worksheet, header_list6, 3, 27, height=50, width=19, border_style='thin') + # kill_house_free_bar_info_live = kill_house_free_bar_info.filter(buy_type='live') + # + # total_quantity = \ + # kill_house_free_bar_info_live.aggregate(total=Sum('quantity'))[ + # 'total'] or 0 + # total_weight = \ + # kill_house_free_bar_info_live.aggregate(total=Sum('live_weight'))[ + # 'total'] or 0 + # + # value_list6 = [ + # len(kill_house_free_bar_info_live), + # total_quantity, + # total_weight, + # free_buying_live_weight_wage_type.amount, + # total_weight * free_buying_live_weight_wage_type.amount, + # ] + # create_value(worksheet, value_list6, 28, 3, border_style='thin') + # + # excel_description(worksheet, 'C30', 'خرید لاشه خارج استان', size='16', row2='F30') + # header_list7 = [ + # 'تعداد خرید', + # 'وزن کل', + # 'تعرفه', + # 'مبلغ کل', + # + # ] + # create_header(worksheet, header_list7, 3, 31, height=50, width=19, border_style='thin', color='C4D79B') + # kill_house_free_bar_info_carcass = kill_house_free_bar_info.filter(buy_type='carcass') + # total_weight = \ + # kill_house_free_bar_info_carcass.aggregate(total=Sum('weight_of_carcasses'))[ + # 'total'] or 0 + # + # value_list7 = [ + # len(kill_house_free_bar_info_carcass), + # total_weight, + # free_buying_carcesses_weight_wage_type.amount, + # total_weight * free_buying_carcesses_weight_wage_type.amount, + # + # ] + # create_value(worksheet, value_list7, 32, 3, border_style='thin') + elif sheet_name == 'تخصیصات بدون بار': + worksheet['H3'] = 'در این قسمت تخصیصات فاقد بار نمایش داده میشود' + merge_range1 = 'H3:K3' + worksheet.merge_cells(merge_range1) + worksheet['H3'].font = Font(color="C00000", bold=True) + worksheet['H3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + if 'date1' in request.GET: + + province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + first_car_allocated_quantity=0, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).order_by( + 'kill_request__recive_date') + else: + province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + state__in=('pending', 'accepted'), + wage_pay=False, + archive_wage=False, + return_to_province=False, + first_car_allocated_quantity=0, + trash=False).order_by( + 'kill_request__recive_date') + if effective_wage_counting_type == 'carcass': + header_list = [ + 'تعداد سفارشات', + 'تعداد کل', + 'وزن کل', + 'وزن لاشه ملاک تعرفه', + 'جمع کل تعرفه', + ] + else: + header_list = [ + 'تعداد سفارشات', + 'تعداد کل', + 'وزن کل', + 'وزن ملاک تعرفه', + 'جمع کل تعرفه', + ] + for col_num, option in enumerate(header_list, 3): + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[3].height = 20.8 + if effective_wage_counting_type == 'carcass': + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'وزن لاشه ملاک تعرفه ', + 'تعرفه (ریال)', + 'تعرفه تخصیص(ریال)', + + ] + else: + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'وزن ملاک تعرفه ', + 'تعرفه (ریال)', + 'تعرفه تخصیص(ریال)', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 6 + m = 1 + for province_kill in province_kill_request: + + kill_date_1 = shamsi_date(province_kill.province_request.poultry_request.send_date) + + if province_kill.kill_request.slaughter_house is not None: + kill_place = province_kill.kill_request.slaughter_house.name + else: + kill_place = province_kill.kill_request.kill_house.name + + total_amount = province_kill.total_wage_amount + if effective_wage_counting_type == 'carcass': + list1 = [ + m, + str(province_kill.province_request.poultry_request.order_code), + province_kill.province_request.poultry_request.poultry.unit_name, + province_kill.province_request.poultry_request.poultry.user.mobile, + province_kill.province_request.poultry_request.poultry.address.city.name, + str(kill_date_1), + kill_place, + province_kill.province_request.poultry_request.hatching.chicken_breed, + province_kill.total_killed_quantity, + province_kill.total_killed_weight, + province_kill.province_request.poultry_request.Index_weight, + province_kill.total_killed_weight * 0.75, + province_live_wage_amount, + (province_kill.total_killed_weight * 0.75) * province_live_wage_amount, + + ] + else: + list1 = [ + m, + str(province_kill.province_request.poultry_request.order_code), + province_kill.province_request.poultry_request.poultry.unit_name, + province_kill.province_request.poultry_request.poultry.user.mobile, + province_kill.province_request.poultry_request.poultry.address.city.name, + str(kill_date_1), + kill_place, + province_kill.province_request.poultry_request.hatching.chicken_breed, + province_kill.total_killed_quantity, + province_kill.total_killed_weight, + province_kill.province_request.poultry_request.Index_weight, + province_kill.total_killed_weight, + province_live_wage_amount, + (province_kill.total_killed_weight) * province_live_wage_amount, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + m += 1 + total_weight = \ + province_kill_request.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_killed_quantity = \ + province_kill_request.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_wage_amount = \ + province_kill_request.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + if effective_wage_counting_type == 'carcass': + value_list = [ + m - 1, + total_killed_quantity, + total_weight, + total_weight * 0.75, + (total_weight * 0.75) * province_live_wage_amount, + + ] + else: + value_list = [ + m - 1, + total_killed_quantity, + total_weight, + total_weight, + (total_weight) * province_live_wage_amount, + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=4, column=item + 3, value=value_list[item]) + value = value_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + if effective_wage_counting_type == 'carcass': + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_killed_quantity, + total_weight, + '', + total_weight * 0.75, + province_live_wage_amount, + (total_weight * 0.75) * province_live_wage_amount, + + ] + else: + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_killed_quantity, + total_weight, + '', + total_weight, + province_live_wage_amount, + (total_weight) * province_live_wage_amount, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'بارهای روزانه': + + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + filtered_kill_reqs = KillHouseRequest.objects.filter(Q(killhouse_user=kill_house) | Q(killer=kill_house), + trash=False, + + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__wage', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', 'killer').values('message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', + 'province_kill_request__wage', + ) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + if effective_wage_counting_type == 'carcass': + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وزن ملاک تعرفه', + 'تعرفه(ریال)', + 'تعرفه کل بار', + + ] + else: + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وزن ملاک تعرفه', + 'تعرفه(ریال)', + 'تعرفه کل بار', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + if effective_wage_counting_type == 'carcass': + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + ' قطعه کشتار شده', + ' وزن کشتار شده', + 'وزن لاشه ملاک تعرفه', + 'مجموع تعرفه های بار', + + ] + else: + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + ' قطعه کشتار شده', + ' وزن کشتار شده', + 'وزن ملاک تعرفه', + 'مجموع تعرفه های بار', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + total_amount = 0 + weight_amount = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + if effective_wage_counting_type == 'carcass': + accepted_real_weight_kill = kill['accepted_real_weight'] * 0.75 + total_amount += (kill['accepted_real_weight'] * 0.75) * province_live_wage_amount + weight_amount += kill['accepted_real_weight'] * 0.75 + else: + total_amount += (kill['accepted_real_weight']) * province_live_wage_amount + weight_amount += kill['accepted_real_weight'] + accepted_real_weight_kill = kill['accepted_real_weight'] + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + accepted_real_weight_kill, + province_live_wage_amount, + (accepted_real_weight_kill) * province_live_wage_amount, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + killer_exclusive, + all_quantity, + all_weighte, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0, + weight_amount, + total_amount + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0, + weight_amount, + province_live_wage_amount, + total_amount, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'مرغ زنده خارج استان': + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = 'live' + date_type = 'buy' + bar_state = request.GET.get('bar_state') + kill_house_free_bar_info_list = [] + role = request.GET.get('role') + kill_houses = None + order_by_type = 'create_date' + + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters = { + 'register_date__date__gte': date1, + 'register_date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False + } + + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + + if type: + filters['buy_type'] = type + if type == 'live': + if bar_state: + if bar_state == 'entered': + filters['weight_of_carcasses__gt'] = 0 + else: + filters['weight_of_carcasses'] = 0 + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type) + + excel_options = [ + 'ردیف', + 'کدسفارش', + 'تاریخ خرید', + 'ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + 'فروشنده', + 'تلفن فروشنده', + 'نوع خرید', + 'استان/شهر', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'وضعیت دامپزشک', + 'ماشین', + 'راننده', + 'تلفن راننده', + 'کدقرنطینه', + 'تعداد قطعه زنده', + 'وزن زنده (کیلوگرم)', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + 'حجم تایید شده', + 'وزن تایید شده', + 'تایید/رد کننده', + 'تاریخ تایید/ رد', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list2 = [ + 'تعداد بارها', + ' تعداد بار های درانتظار تایید', + 'مجموع قطعه زنده در انتظار تایید', + 'مجموع وزن زنده (کیلوگرم) درانتظار تایید', + 'مجموع تعداد لاشه درانتظار تایید', + 'مجموع وزن لاشه (کیلوگرم) درانتظار تایید', + + ' تعداد بار های رد شده', + 'مجموع قطعه زنده رد شده', + 'مجموع وزن زنده (کیلوگرم) رد شده', + 'مجموع تعداد لاشه رد شده', + 'مجموع وزن لاشه (کیلوگرم) رد شده', + + ' تعداد بار های تایید شده', + 'مجموع قطعه زنده تایید شده', + 'مجموع وزن زنده (کیلوگرم) تایید شده', + 'مجموع تعداد لاشه تایید شده', + 'مجموع وزن لاشه (کیلوگرم) تایید شده', + 'حجم تایید شده دامپزشک', + 'وزن تایید شده دامپزشک', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + type1 = 'زنده' if type == 'live' else 'لاشه' + worksheet['B1'] = f'گزارش بار {type1} خرید از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name \ + if kill_house_free_bar_info.first() else '' + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.kill_house_vet_state == 'accepted': + state = 'تایید شده' + elif kill.kill_house_vet_state == 'pending': + state = 'درانتظار تایید' + else: + state = 'رد شده' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + if kill.exclusive_killer: + killer_type = f'کشتارکن اختصاصی {kill.kill_house.name}' + kill_house_name = kill.exclusive_killer.name + kill_house_mobile = kill.exclusive_killer.kill_house_operator.user.mobile + + elif kill.kill_house.killer == True and kill.kill_house.type == 'public': + killer_type = 'کشتارکن عمومی' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + + else: + killer_type = 'کشتارگاه' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + bar_code = str(kill.bar_code) if kill.bar_code else '-' + list1 = [ + m, + bar_code, + str(date_of_buy), + killer_type, + kill_house_name, + kill_house_mobile, + kill.poultry_name, + kill.poultry_mobile, + buy_type, + f'{kill.province} / {kill.city}', + kill.vet_farm_name, + kill.vet_farm_mobile, + state, + kill.car, + kill.driver_name, + kill.driver_mobile, + kill.bar_clearance_code, + kill.quantity, + kill.live_weight, + kill.number_of_carcasses, + kill.weight_of_carcasses, + kill.kill_house_vet_quantity, + kill.kill_house_vet_weight, + kill.acceptor_rejector, + str(date_of_reject_accepted) + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + bar_pending = kill_house_free_bar_info.filter(kill_house_vet_state='pending') + bar_pending_quantity = bar_pending.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_pending_live_weight = bar_pending.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_pending_number_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_pending_weight_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_rejected = kill_house_free_bar_info.filter(kill_house_vet_state='rejected') + bar_rejected_quantity = bar_rejected.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_rejected_live_weight = bar_rejected.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_rejected_number_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_rejected_weight_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_accepted = kill_house_free_bar_info.filter(kill_house_vet_state='accepted') + bar_accepted_quantity = bar_accepted.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_accepted_live_weight = bar_accepted.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_accepted_number_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_weight_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_quantity = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_weight = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + bar_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_kill_house_vet_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_kill_house_vet_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + m - 1, + len(bar_pending), + int(bar_pending_quantity), + int(bar_pending_live_weight), + int(bar_pending_number_of_carcasses), + int(bar_pending_weight_of_carcasses), + + len(bar_rejected), + int(bar_rejected_quantity), + int(bar_rejected_live_weight), + int(bar_rejected_number_of_carcasses), + int(bar_rejected_weight_of_carcasses), + + len(bar_accepted), + int(bar_accepted_quantity), + int(bar_accepted_live_weight), + int(bar_accepted_number_of_carcasses), + int(bar_accepted_weight_of_carcasses), + int(bar_accepted_kill_house_vet_quantity), + int(bar_accepted_kill_house_vet_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + bar_quantity, + bar_live_weight, + int(bar_number_of_carcasses), + int(bar_weight_of_carcasses), + int(bar_kill_house_vet_quantity), + bar_kill_house_vet_weight, + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'خرید لاشه خارج استان': + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = 'carcass' + date_type = 'buy' + bar_state = request.GET.get('bar_state') + kill_house_free_bar_info_list = [] + role = request.GET.get('role') + kill_houses = None + order_by_type = 'create_date' + + if role in ['KillHouse', 'KillHouseVet']: + if role == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters = { + 'create_date__date__gte': date1, + 'create_date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False + } + + if kill_houses is not None: + filters['kill_house__in'] = kill_houses + + if type: + filters['buy_type'] = type + if type == 'live': + if bar_state: + if bar_state == 'entered': + filters['weight_of_carcasses__gt'] = 0 + else: + filters['weight_of_carcasses'] = 0 + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type) + + excel_options = [ + 'ردیف', + 'کدسفارش', + 'تاریخ خرید', + 'ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + 'فروشنده', + 'تلفن فروشنده', + 'نوع خرید', + 'استان/شهر', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'وضعیت دامپزشک', + 'ماشین', + 'راننده', + 'تلفن راننده', + 'کدقرنطینه', + 'تعداد قطعه زنده', + 'وزن زنده (کیلوگرم)', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + 'حجم تایید شده', + 'وزن تایید شده', + 'تایید/رد کننده', + 'تاریخ تایید/ رد', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list2 = [ + 'تعداد بارها', + ' تعداد بار های درانتظار تایید', + 'مجموع قطعه زنده در انتظار تایید', + 'مجموع وزن زنده (کیلوگرم) درانتظار تایید', + 'مجموع تعداد لاشه درانتظار تایید', + 'مجموع وزن لاشه (کیلوگرم) درانتظار تایید', + + ' تعداد بار های رد شده', + 'مجموع قطعه زنده رد شده', + 'مجموع وزن زنده (کیلوگرم) رد شده', + 'مجموع تعداد لاشه رد شده', + 'مجموع وزن لاشه (کیلوگرم) رد شده', + + ' تعداد بار های تایید شده', + 'مجموع قطعه زنده تایید شده', + 'مجموع وزن زنده (کیلوگرم) تایید شده', + 'مجموع تعداد لاشه تایید شده', + 'مجموع وزن لاشه (کیلوگرم) تایید شده', + 'حجم تایید شده دامپزشک', + 'وزن تایید شده دامپزشک', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + type1 = 'زنده' if type == 'live' else 'لاشه' + worksheet['B1'] = f'گزارش بار {type1} خرید از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name \ + if kill_house_free_bar_info.first() else '' + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.kill_house_vet_state == 'accepted': + state = 'تایید شده' + elif kill.kill_house_vet_state == 'pending': + state = 'درانتظار تایید' + else: + state = 'رد شده' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + if kill.exclusive_killer: + killer_type = f'کشتارکن اختصاصی {kill.kill_house.name}' + kill_house_name = kill.exclusive_killer.name + kill_house_mobile = kill.exclusive_killer.kill_house_operator.user.mobile + + elif kill.kill_house.killer == True and kill.kill_house.type == 'public': + killer_type = 'کشتارکن عمومی' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + + else: + killer_type = 'کشتارگاه' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + bar_code = str(kill.bar_code) if kill.bar_code else '-' + list1 = [ + m, + bar_code, + str(date_of_buy), + killer_type, + kill_house_name, + kill_house_mobile, + kill.poultry_name, + kill.poultry_mobile, + buy_type, + f'{kill.province} / {kill.city}', + kill.vet_farm_name, + kill.vet_farm_mobile, + state, + kill.car, + kill.driver_name, + kill.driver_mobile, + kill.bar_clearance_code, + kill.quantity, + kill.live_weight, + kill.number_of_carcasses, + kill.weight_of_carcasses, + kill.kill_house_vet_quantity, + kill.kill_house_vet_weight, + kill.acceptor_rejector, + str(date_of_reject_accepted) + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + bar_pending = kill_house_free_bar_info.filter(kill_house_vet_state='pending') + bar_pending_quantity = bar_pending.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_pending_live_weight = bar_pending.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_pending_number_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_pending_weight_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_rejected = kill_house_free_bar_info.filter(kill_house_vet_state='rejected') + bar_rejected_quantity = bar_rejected.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_rejected_live_weight = bar_rejected.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_rejected_number_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_rejected_weight_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_accepted = kill_house_free_bar_info.filter(kill_house_vet_state='accepted') + bar_accepted_quantity = bar_accepted.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_accepted_live_weight = bar_accepted.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_accepted_number_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_weight_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_quantity = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_weight = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + bar_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_kill_house_vet_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_kill_house_vet_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + m - 1, + len(bar_pending), + int(bar_pending_quantity), + int(bar_pending_live_weight), + int(bar_pending_number_of_carcasses), + int(bar_pending_weight_of_carcasses), + + len(bar_rejected), + int(bar_rejected_quantity), + int(bar_rejected_live_weight), + int(bar_rejected_number_of_carcasses), + int(bar_rejected_weight_of_carcasses), + + len(bar_accepted), + int(bar_accepted_quantity), + int(bar_accepted_live_weight), + int(bar_accepted_number_of_carcasses), + int(bar_accepted_weight_of_carcasses), + int(bar_accepted_kill_house_vet_quantity), + int(bar_accepted_kill_house_vet_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + bar_quantity, + bar_live_weight, + int(bar_number_of_carcasses), + int(bar_weight_of_carcasses), + int(bar_kill_house_vet_quantity), + bar_kill_house_vet_weight, + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="کارمزدهای کشتارگاه {kill_house.name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def payment_transactions_province_excel(request): + filterset_class = InternalTransactionFilterSet + filterset_fields = [ + 'saleReferenceId', + 'refId', + 'orderId', + 'cardHolderPan', + + ] + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + transactions = InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', payer_type='kill_house', + trash=False).order_by('-date') + else: + transactions = InternalTransaction.objects.filter( + status='completed', payer_type='kill_house', + trash=False).order_by('-date') + + if request.GET['role'] == 'ProvinceOperator': + transactions = transactions.filter(union_share__gt=0) + elif request.GET['role'] == 'Company': + transactions = transactions.filter(company_share__gt=0) + elif request.GET['role'] == 'Guilds': + transactions = transactions.filter(guilds_share__gt=0) + elif request.GET['role'] == 'SuperAdmin': + transactions = transactions.filter().exclude(guilds_share=0, company_share=0, union_share=0) + else: + transactions = transactions + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = filterset_class(data=query, queryset=transactions) + transactions = ps.filter() + + excel_options = [ + 'ردیف', + 'ماهیت تراکنش', + 'نوع تراکنش', + 'تاریخ پرداخت', + 'شماره پیگیری', + 'شماره درخواست', + 'پرداخت کننده', + 'تلفن پرداخت کننده', + 'شماره کارت', + 'مبلغ کل', + 'سهم اتحادیه(ریال)', + 'سهم صنف(ریال)', + 'سهم شرکت(ریال)', + 'سهم دامپزشک(ریال)', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد کل تراکنش ها', + 'مبلغ کل تراکنش(ریال)', + 'سهم کل اتحادیه(ریال)', + 'سهم کل صنف(ریال)', + 'سهم کل شرکت(ریال)', + 'سهم کل دامپزشک(ریال)', + + ] + if base_url_for_sms_report == 'ha': + province = 'همدان' + elif base_url_for_sms_report == 'ku': + province = 'کردستان' + elif base_url_for_sms_report == 'ma': + province = 'مرکزی' + elif base_url_for_sms_report == 'bu': + province = 'بوشهر' + else: + province = 'تست' + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + from_date_1 = shamsi_date(date1) + from_date_2 = shamsi_date(date2) + + excel_description(worksheet, 'B2', + f'گزارش ریز تراکنش ها استان {province} از تاریخ {from_date_1} تا {from_date_2}', color='red', + row2='C3') + + + + else: + excel_description(worksheet, 'B2', f'گزارش ریز تراکنش ها استان {province}', color='red', + row2='C3') + + create_header(worksheet, header_list, 5, 2, height=20) + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22, width=20.01) + + l = 5 + m = 1 + role = request.GET['role'] + for transaction in transactions: + if transaction.kill_house: + killer_type = 'کشتارگاه' if transaction.kill_house.killer == False else 'کشتارکن' + elif transaction.chain_company: + killer_type = 'شرکت زنجیره' + else: + killer_type = 'خارج استان' + l += 1 + payer_date = jdatetime.date.fromgregorian( + day=transaction.date.day, + month=transaction.date.month, + year=transaction.date.year + ) + + if transaction.kill_house != None: + fullname = transaction.kill_house.kill_house_operator.user.fullname + mobile = transaction.kill_house.kill_house_operator.user.mobile + elif transaction.chain_company is not None: + fullname = transaction.chain_company.user.fullname + mobile = transaction.chain_company.user.mobile + else: + fullname = transaction.user.fullname + mobile = transaction.user.mobile + type = 'دستی' if transaction.transaction_type == 'wage-gateway-manual' else 'آنلاین' + + list1 = [ + m, + killer_type, + type, + str(payer_date), + transaction.refId, + transaction.orderId, + fullname, + mobile, + transaction.cardHolderPan, + transaction.amount, + transaction.union_share, + transaction.guilds_share, + transaction.company_share, + transaction.other_share + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + total_amount = \ + transactions.aggregate(total=Sum('amount'))['total'] or 0 + total_union_share = \ + transactions.aggregate(total=Sum('union_share'))['total'] or 0 + total_guilds_share = \ + transactions.aggregate(total=Sum('guilds_share'))['total'] or 0 + total_company_share = \ + transactions.aggregate(total=Sum('company_share'))['total'] or 0 + total_other_share = \ + transactions.aggregate(total=Sum('other_share'))['total'] or 0 + + value_header_list = [ + m - 1, + total_amount, + total_union_share, + total_guilds_share, + total_company_share, + total_other_share, + + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + total_amount, + total_union_share, + total_guilds_share, + total_company_share, + total_other_share, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 + + +def general_free_bar_excel(request): + value_header_list2_pending1 = [] + value_header_list2_accepted = [] + value_header_list2_rejected = [] + filterset_class = PoultryRequestFilterSet + filterset_fields = [ + 'order_code', + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__address__city__name', + + ] + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + excel_options = [ + + 'درخواست های جدید', + 'تایید شده', + 'رد شده', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + header_list_main = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + + for name in excel_options: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + user = SystemUserProfile.objects.get(key=request.GET['key']) + poultry_requests = PoultryRequest.objects.filter( + send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False, out=True).order_by('-send_date') + if sheet_name == 'درخواست های جدید': + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + + poultry_requests = poultry_requests.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__in=poultries + ).order_by('-send_date') + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + poultry_requests = poultry_requests.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__city_operator=city_operator.unit_name, + out=True, + ).order_by('-send_date') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultry_requests = poultry_requests.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__address__city=user.city, + + out=True, + ).order_by('-send_date') + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: + poultry_requests = poultry_requests.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + out=True + ).order_by('-send_date') + else: + poultry_requests = poultry_requests + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=poultry_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=poultry_requests) + poultry_requests = ps.filter() + + poultry_requests_accepted = poultry_requests + + excel_options = [ + 'ردیف', + 'وضعیت', + 'پرداخت کننده', + 'کدسفارش مرغدار', + ' تاریخ ثبت درخواست', + ' تاریخ کشتار', + ' کشتار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' استان مرغدار', + 'سن مرغ', + ' نژاد', + 'تعداد درخواست', + 'میانگین وزنی', + 'وزن درخواست', + 'مانده در سالن', + 'جوجه ریزی اولیه', + + ' ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + ' شهر خریدار', + 'استان خریدار', + 'محل کشتار', + 'کد یکتای کشتارگاه', + 'شهر محل کشتار', + + 'نوع خودرو', + 'پلاک', + + 'نام راننده', + 'موبایل راننده', + 'کد بهداشتی حمل و نقل', + + 'کد رهگیری سامانه قرنطینه', + 'ثبت کننده کد قرنطینه', + 'تاریخ ثبت کد قرنطینه', + 'سازنده', + + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تایید شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای جدید خارج از استان' + if poultry_requests.exists(): + name = poultry_requests.first().poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_weighte = 0 + all_chicken_quantity = 0 + all_age = [] + all_quantity = poultry_requests_accepted.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + all_weighte = poultry_requests_accepted.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] + + has_code = 0 + if poultry_requests: + for poultry_request in poultry_requests: + + # if ProvinceKillRequest.objects.filter( + # province_request__city_request_Poultry__poultry_request=poultry_request, + # state='accepted').exists(): + # age = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + # else: + age = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + all_age.append(age) + all_chicken_quantity += poultry_request.hatching.quantity + create_date_of_poultry_request = jdatetime.date.fromgregorian( + day=poultry_request.create_date.day, + month=poultry_request.create_date.month, + year=poultry_request.create_date.year + ) + date_of_kill_request = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + if poultry_request.quarantine_code_registrar is not None: + date_code = poultry_request.quarantine_code_registrar['date'].split('-') + + date_of_create_code = jdatetime.date.fromgregorian( + day=int(date_code[2]), + month=int(date_code[1]), + year=int(date_code[0]) + ) + full_name = poultry_request.quarantine_code_registrar['fullname'] + mobile = poultry_request.quarantine_code_registrar['mobile'] + else: + date_of_create_code = '-' + full_name = '-' + mobile = '-' + + killing_place = '-' + killing_place_city = '-' + uniq_id = '-' + if poultry_request.out_province_poultry_request_buyer: + if poultry_request.out_province_poultry_request_buyer.type == 'killhouse': + is_killer = 'کشتارگاه' + uniq_id = poultry_request.out_province_poultry_request_buyer.kill_house_unique_id if poultry_request.out_province_poultry_request_buyer.kill_house_unique_id else '-' + + else: + is_killer = 'کشتارکن' + killing_place = poultry_request.killer_kill_house_unit_name \ + if poultry_request.killer_kill_house_unit_name is not None \ + else '-' + killing_place_city = poultry_request.killer_kill_house_province \ + + '(' + poultry_request.killer_kill_house_city \ + + ')' if poultry_request.killer_kill_house_province \ + and poultry_request.killer_kill_house_city is not None \ + else '-' + uniq_id = poultry_request.kill_house_unique_id if poultry_request.kill_house_unique_id else '-' + else: + is_killer = 'کشتارگاه' if poultry_request.buyer is not None and poultry_request.buyer[ + 'buyerType'] == 'killhouse' else 'کشتارکن' + if poultry_request.quarantine_code: + code = poultry_request.quarantine_code + has_code += 1 + else: + code = '-' + + freez_state = 'منجمد' if poultry_request.freezing == True else 'عادی' + + if poultry_request.out_province_poultry_request_buyer is not None: + full_name_buyer = poultry_request.out_province_poultry_request_buyer.fullname + mobile_buyer = poultry_request.out_province_poultry_request_buyer.user.mobile + city_buyer = poultry_request.out_province_poultry_request_buyer.user.city.name + province_buyer = poultry_request.out_province_poultry_request_buyer.user.province.name + + else: + full_name_buyer = poultry_request.buyer['firstName'] + mobile_buyer = poultry_request.buyer['mobile'] + city_buyer = poultry_request.buyer['city'] + province_buyer = poultry_request.buyer['province'] + + if poultry_request.province_state == 'rejected': + state1 = 'رد شده' + elif poultry_request.province_state == 'pending' and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار تایید' + + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار پرداخت' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == False and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'تایید شده' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == True and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'پرداخت شده' + else: + state1 = 'لغو شده' + + list1 = [ + m, + state1, + poultry_request.payer_fullname if poultry_request.payer_fullname else '-', + str(poultry_request.order_code), + str(create_date_of_poultry_request), + str(date_of_kill_request), + freez_state, + poultry_request.poultry.user.fullname, + poultry_request.poultry.user.mobile, + poultry_request.poultry.user.city.name, + poultry_request.poultry.user.province.name, + age, + poultry_request.hatching.chicken_breed, + poultry_request.quantity, + poultry_request.Index_weight, + int(poultry_request.quantity * poultry_request.Index_weight), + poultry_request.hatching.left_over, + poultry_request.hatching.quantity, + is_killer, + full_name_buyer, + mobile_buyer, + city_buyer, + province_buyer, + killing_place, + uniq_id, + killing_place_city, + poultry_request.out_province_driver_info[ + 'driverCar'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverPelak'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverName'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverMobile'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverhealthCode'] if poultry_request.out_province_driver_info != None else '-', + code, + full_name + '(' + mobile + ')', + str(date_of_create_code), + poultry_request.registrar['fullname'] if poultry_request.registrar else '-' + ] + + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(poultry_requests_accepted), + all_quantity if all_quantity != None else 0, + all_weighte if all_weighte != None else 0, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + value_header_list2_accepted.extend(value_header_list2) + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity if all_quantity != None else 0, + '', + all_weighte, + '', + all_chicken_quantity, + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'تایید شده': + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + + poultry_requests = poultry_requests.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__in=poultries).order_by('-send_date') + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + poultry_requests = poultry_requests.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__city_operator=city_operator.unit_name, + ).order_by('-send_date') + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + + poultry_requests = poultry_requests.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__address__city=user.city, + ).order_by('-send_date') + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: + poultry_requests = poultry_requests.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + ).order_by('-send_date') + + else: + poultry_requests = poultry_requests + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=poultry_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=poultry_requests) + poultry_requests = ps.filter() + + poultry_requests_accepted = poultry_requests + + excel_options = [ + 'ردیف', + 'وضعیت', + 'پرداخت کننده', + 'کدسفارش مرغدار', + ' تاریخ ثبت درخواست', + ' تاریخ کشتار', + ' کشتار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' استان مرغدار', + 'سن مرغ', + ' نژاد', + 'تعداد درخواست', + 'میانگین وزنی', + 'وزن درخواست', + 'مانده در سالن', + 'جوجه ریزی اولیه', + + ' ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + ' شهر خریدار', + 'استان خریدار', + 'محل کشتار', + 'کد یکتای کشتارگاه', + 'شهر محل کشتار', + + 'نوع خودرو', + 'پلاک', + + 'نام راننده', + 'موبایل راننده', + 'کد بهداشتی حمل و نقل', + + 'کد رهگیری سامانه قرنطینه', + 'ثبت کننده کد قرنطینه', + 'تاریخ ثبت کد قرنطینه', + 'سازنده', + + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تایید شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای تایید شده خارج از استان' + if poultry_requests.exists(): + name = poultry_requests.first().poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_weighte = 0 + all_chicken_quantity = 0 + all_age = [] + all_quantity = poultry_requests_accepted.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + all_weighte = poultry_requests_accepted.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] + + has_code = 0 + if poultry_requests: + for poultry_request in poultry_requests: + + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, + state='accepted').exists(): + age = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + else: + age = (datetime.datetime.now() - poultry_request.hatching.date).days + 1 + all_age.append(age) + all_chicken_quantity += poultry_request.hatching.quantity + create_date_of_poultry_request = jdatetime.date.fromgregorian( + day=poultry_request.create_date.day, + month=poultry_request.create_date.month, + year=poultry_request.create_date.year + ) + date_of_kill_request = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + if poultry_request.quarantine_code_registrar is not None: + date_code = poultry_request.quarantine_code_registrar['date'].split('-') + + date_of_create_code = jdatetime.date.fromgregorian( + day=int(date_code[2]), + month=int(date_code[1]), + year=int(date_code[0]) + ) + full_name = poultry_request.quarantine_code_registrar['fullname'] + mobile = poultry_request.quarantine_code_registrar['mobile'] + else: + date_of_create_code = '-' + full_name = '-' + mobile = '-' + + killing_place = '-' + killing_place_city = '-' + uniq_id = '-' + if poultry_request.out_province_poultry_request_buyer: + if poultry_request.out_province_poultry_request_buyer.type == 'killhouse': + is_killer = 'کشتارگاه' + uniq_id = poultry_request.out_province_poultry_request_buyer.kill_house_unique_id if poultry_request.out_province_poultry_request_buyer.kill_house_unique_id else '-' + + else: + is_killer = 'کشتارکن' + killing_place = poultry_request.killer_kill_house_unit_name \ + if poultry_request.killer_kill_house_unit_name is not None \ + else '-' + killing_place_city = poultry_request.killer_kill_house_province \ + + '(' + poultry_request.killer_kill_house_city \ + + ')' if poultry_request.killer_kill_house_province \ + and poultry_request.killer_kill_house_city is not None \ + else '-' + uniq_id = poultry_request.kill_house_unique_id if poultry_request.kill_house_unique_id else '-' + else: + is_killer = 'کشتارگاه' if poultry_request.buyer is not None and poultry_request.buyer[ + 'buyerType'] == 'killhouse' else 'کشتارکن' + if poultry_request.quarantine_code: + code = poultry_request.quarantine_code + has_code += 1 + else: + code = '-' + + freez_state = 'منجمد' if poultry_request.freezing == True else 'عادی' + + if poultry_request.out_province_poultry_request_buyer is not None: + full_name_buyer = poultry_request.out_province_poultry_request_buyer.fullname + mobile_buyer = poultry_request.out_province_poultry_request_buyer.user.mobile + city_buyer = poultry_request.out_province_poultry_request_buyer.user.city.name + province_buyer = poultry_request.out_province_poultry_request_buyer.user.province.name + + else: + full_name_buyer = poultry_request.buyer['firstName'] + mobile_buyer = poultry_request.buyer['mobile'] + city_buyer = poultry_request.buyer['city'] + province_buyer = poultry_request.buyer['province'] + + if poultry_request.province_state == 'rejected': + state1 = 'رد شده' + elif poultry_request.province_state == 'pending' and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار تایید' + + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار پرداخت' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == False and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'تایید شده' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == True and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'پرداخت شده' + else: + state1 = 'لغو شده' + + list1 = [ + m, + state1, + poultry_request.payer_fullname if poultry_request.payer_fullname else '-', + str(poultry_request.order_code), + str(create_date_of_poultry_request), + str(date_of_kill_request), + freez_state, + poultry_request.poultry.user.fullname, + poultry_request.poultry.user.mobile, + poultry_request.poultry.user.city.name, + poultry_request.poultry.user.province.name, + age, + poultry_request.hatching.chicken_breed, + poultry_request.quantity, + poultry_request.Index_weight, + int(poultry_request.quantity * poultry_request.Index_weight), + poultry_request.hatching.left_over, + poultry_request.hatching.quantity, + is_killer, + full_name_buyer, + mobile_buyer, + city_buyer, + province_buyer, + killing_place, + uniq_id, + killing_place_city, + poultry_request.out_province_driver_info[ + 'driverCar'] if poultry_request.out_province_driver_info or \ + poultry_request.out_province_driver_info['driverCar'] != None else '-', + poultry_request.out_province_driver_info[ + 'driverPelak'] if poultry_request.out_province_driver_info \ + or poultry_request.out_province_driver_info[ + 'driverPelak'] != None else '-', + poultry_request.out_province_driver_info[ + 'driverName'] if poultry_request.out_province_driver_info \ + or poultry_request.out_province_driver_info['driverName'] != None else '-', + poultry_request.out_province_driver_info[ + 'driverMobile'] if poultry_request.out_province_driver_info or \ + poultry_request.out_province_driver_info[ + 'driverMobile'] != None else '-', + poultry_request.out_province_driver_info[ + 'driverhealthCode'] if poultry_request.out_province_driver_info or \ + poultry_request.out_province_driver_info[ + 'driverhealthCode'] != None else '-', + code, + full_name + '(' + mobile + ')', + str(date_of_create_code), + poultry_request.registrar['fullname'] if poultry_request.registrar else '-' + ] + + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(poultry_requests_accepted), + all_quantity if all_quantity != None else 0, + all_weighte if all_weighte != None else 0, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + value_header_list2_pending1.extend(value_header_list2) + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity if all_quantity != None else 0, + '', + all_weighte, + '', + all_chicken_quantity, + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'رد شده': + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + poultry_requests = poultry_requests.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__in=poultries, ).order_by('-send_date') + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + poultry_requests = poultry_requests.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__city_operator=city_operator.unit_name, + ).order_by('-send_date') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultry_requests = poultry_requests.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__address__city=user.city, + ).order_by('-send_date') + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: + poultry_requests = poultry_requests.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True)).order_by('-send_date') + else: + poultry_requests = poultry_requests + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=poultry_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=poultry_requests) + poultry_requests = ps.filter() + + poultry_requests_accepted = poultry_requests + + excel_options = [ + 'ردیف', + 'وضعیت', + 'پرداخت کننده', + 'کدسفارش مرغدار', + ' تاریخ ثبت درخواست', + ' تاریخ کشتار', + ' کشتار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' استان مرغدار', + 'سن مرغ', + ' نژاد', + 'تعداد درخواست', + 'میانگین وزنی', + 'وزن درخواست', + 'مانده در سالن', + 'جوجه ریزی اولیه', + + ' ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + ' شهر خریدار', + 'استان خریدار', + 'محل کشتار', + 'کد یکتای کشتارگاه', + 'شهر محل کشتار', + + 'نوع خودرو', + 'پلاک', + + 'نام راننده', + 'موبایل راننده', + 'کد بهداشتی حمل و نقل', + + 'کد رهگیری سامانه قرنطینه', + 'ثبت کننده کد قرنطینه', + 'تاریخ ثبت کد قرنطینه', + 'سازنده', + + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تایید شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای حذف /رد شده خارج از استان' + if poultry_requests.exists(): + name = poultry_requests.first().poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_weighte = 0 + all_chicken_quantity = 0 + all_age = [] + all_quantity = poultry_requests_accepted.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + all_weighte = poultry_requests_accepted.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] + + has_code = 0 + if poultry_requests: + for poultry_request in poultry_requests: + + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, + state='accepted').exists(): + age = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + else: + age = (datetime.datetime.now() - poultry_request.hatching.date).days + 1 + all_age.append(age) + all_chicken_quantity += poultry_request.hatching.quantity + create_date_of_poultry_request = jdatetime.date.fromgregorian( + day=poultry_request.create_date.day, + month=poultry_request.create_date.month, + year=poultry_request.create_date.year + ) + date_of_kill_request = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + if poultry_request.quarantine_code_registrar is not None: + date_code = poultry_request.quarantine_code_registrar['date'].split('-') + + date_of_create_code = jdatetime.date.fromgregorian( + day=int(date_code[2]), + month=int(date_code[1]), + year=int(date_code[0]) + ) + full_name = poultry_request.quarantine_code_registrar['fullname'] + mobile = poultry_request.quarantine_code_registrar['mobile'] + else: + date_of_create_code = '-' + full_name = '-' + mobile = '-' + + killing_place = '-' + killing_place_city = '-' + uniq_id = '-' + if poultry_request.out_province_poultry_request_buyer: + if poultry_request.out_province_poultry_request_buyer.type == 'killhouse': + is_killer = 'کشتارگاه' + uniq_id = poultry_request.out_province_poultry_request_buyer.kill_house_unique_id if poultry_request.out_province_poultry_request_buyer.kill_house_unique_id else '-' + + else: + is_killer = 'کشتارکن' + killing_place = poultry_request.killer_kill_house_unit_name \ + if poultry_request.killer_kill_house_unit_name is not None \ + else '-' + killing_place_city = poultry_request.killer_kill_house_province \ + + '(' + poultry_request.killer_kill_house_city \ + + ')' if poultry_request.killer_kill_house_province \ + and poultry_request.killer_kill_house_city is not None \ + else '-' + uniq_id = poultry_request.kill_house_unique_id if poultry_request.kill_house_unique_id else '-' + else: + is_killer = 'کشتارگاه' if poultry_request.buyer is not None and poultry_request.buyer[ + 'buyerType'] == 'killhouse' else 'کشتارکن' + if poultry_request.quarantine_code: + code = poultry_request.quarantine_code + has_code += 1 + else: + code = '-' + + freez_state = 'منجمد' if poultry_request.freezing == True else 'عادی' + + if poultry_request.out_province_poultry_request_buyer is not None: + full_name_buyer = poultry_request.out_province_poultry_request_buyer.fullname + mobile_buyer = poultry_request.out_province_poultry_request_buyer.user.mobile + city_buyer = poultry_request.out_province_poultry_request_buyer.user.city.name + province_buyer = poultry_request.out_province_poultry_request_buyer.user.province.name + + else: + full_name_buyer = poultry_request.buyer['firstName'] + mobile_buyer = poultry_request.buyer['mobile'] + city_buyer = poultry_request.buyer['city'] + province_buyer = poultry_request.buyer['province'] + + if poultry_request.province_state == 'rejected': + state1 = 'رد شده' + elif poultry_request.province_state == 'pending' and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار تایید' + + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار پرداخت' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == False and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'تایید شده' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == True and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'پرداخت شده' + else: + state1 = 'لغو شده' + + list1 = [ + m, + state1, + poultry_request.payer_fullname if poultry_request.payer_fullname else '-', + str(poultry_request.order_code), + str(create_date_of_poultry_request), + str(date_of_kill_request), + freez_state, + poultry_request.poultry.user.fullname, + poultry_request.poultry.user.mobile, + poultry_request.poultry.user.city.name, + poultry_request.poultry.user.province.name, + age, + poultry_request.hatching.chicken_breed, + poultry_request.quantity, + poultry_request.Index_weight, + int(poultry_request.quantity * poultry_request.Index_weight), + poultry_request.hatching.left_over, + poultry_request.hatching.quantity, + is_killer, + full_name_buyer, + mobile_buyer, + city_buyer, + province_buyer, + killing_place, + uniq_id, + killing_place_city, + poultry_request.out_province_driver_info[ + 'driverCar'] if poultry_request.out_province_driver_info or \ + poultry_request.out_province_driver_info['driverCar'] != None else '-', + poultry_request.out_province_driver_info[ + 'driverPelak'] if poultry_request.out_province_driver_info \ + or poultry_request.out_province_driver_info[ + 'driverPelak'] != None else '-', + poultry_request.out_province_driver_info[ + 'driverName'] if poultry_request.out_province_driver_info \ + or poultry_request.out_province_driver_info['driverName'] != None else '-', + poultry_request.out_province_driver_info[ + 'driverMobile'] if poultry_request.out_province_driver_info or \ + poultry_request.out_province_driver_info[ + 'driverMobile'] != None else '-', + poultry_request.out_province_driver_info[ + 'driverhealthCode'] if poultry_request.out_province_driver_info or \ + poultry_request.out_province_driver_info[ + 'driverhealthCode'] != None else '-', + code, + full_name + '(' + mobile + ')', + str(date_of_create_code), + poultry_request.registrar['fullname'] if poultry_request.registrar else '-' + ] + + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(poultry_requests_accepted), + all_quantity if all_quantity != None else 0, + all_weighte if all_weighte != None else 0, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + value_header_list2_rejected.extend(value_header_list2) + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity if all_quantity != None else 0, + '', + all_weighte, + '', + all_chicken_quantity, + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + sheet_name = 'اطلاعات کلی' + worksheet = workbook.create_sheet(sheet_name) + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + worksheet['E3'] = f'اطلاعات بارهای جدید خارج استان از تاریخ {from_date_1} تا {from_date_2}' + merge_range1 = 'E3:J3' + worksheet.merge_cells(merge_range1) + + worksheet['E3'].font = Font(color="C00000", bold=True) + worksheet['E3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + worksheet['E8'] = f'اطلاعات بارهای تایید شده خارج استان از تاریخ {from_date_1} تا {from_date_2}' + merge_range2 = 'E8:J8' + worksheet.merge_cells(merge_range2) + + worksheet['E8'].font = Font(color="C00000", bold=True) + worksheet['E8'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + worksheet['E13'] = f'اطلاعات بارهای رد شده خارج استان از تاریخ {from_date_1} تا {from_date_2}' + merge_range3 = 'E13:J13' + worksheet.merge_cells(merge_range3) + + worksheet['E13'].font = Font(color="C00000", bold=True) + worksheet['E13'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + for col_num, option in enumerate(header_list_main, 5): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[4].height = 35 + worksheet.column_dimensions[col_letter].width = 18 + + for col_num, option in enumerate(header_list_main, 5): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=9, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[9].height = 35 + worksheet.column_dimensions[col_letter].width = 18 + + for col_num, option in enumerate(header_list_main, 5): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=14, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[14].height = 35 + worksheet.column_dimensions[col_letter].width = 18 + + for item in range(len(value_header_list2_pending1)): + cell = worksheet.cell(row=5, column=item + 5, value=value_header_list2_pending1[item]) + value = value_header_list2_pending1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + for item in range(len(value_header_list2_accepted)): + cell = worksheet.cell(row=10, column=item + 5, value=value_header_list2_accepted[item]) + value = value_header_list2_accepted[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + for item in range(len(value_header_list2_rejected)): + cell = worksheet.cell(row=15, column=item + 5, value=value_header_list2_rejected[item]) + value = value_header_list2_rejected[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + 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 + + +def out_province_poultry_request_buyers_excel(request): + filterset_class = OutProvincePoultryRequestBuyerFilterSet + filterset_fields = [ + 'user__national_id', + 'user__base_order', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'unit_name', + + ] + + buyers = OutProvincePoultryRequestBuyer.objects.filter(trash=False).order_by('id') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=buyers + ) + ).filter(): + ps = filterset_class(data=query, queryset=buyers) + buyers = ps.filter() + + excel_options = [ + 'ردیف', + 'نام کامل', + 'موبایل', + 'استان', + 'شهر', + 'ماهیت خریدار', + 'نام واحد', + 'تعداد درخواست ها', + 'حجم درخواست ها(قطعه)', + 'وزن درخواست ها(کیلوگرم)', + 'وضعیت', + ] + date1 = datetime.datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد کل خریداران', + 'مجموع تعداد درخواست ها', + 'مجموع حجم درخواست ها', + 'مجموع وزن درخواست ها', + + ] + + for col_num, option in enumerate(header_list, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + worksheet['B2'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + + worksheet.merge_cells(merge_range1) + worksheet['B2'].font = red_font + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + all_poultry_requests = 0 + all_total_quantity = 0 + all_total_weight = 0 + for buyer in buyers: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True, out_province_request_cancel=False) | Q(state_process='accepted', province_state='accepted', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False), trash=False, + out=True, out_province_poultry_request_buyer=buyer) + all_poultry_requests += len(poultry_requests) + total_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + all_total_quantity += total_quantity + total_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + all_total_weight += total_weight + l += 1 + active = 'فعال' if buyer.active == True else 'غیرفعال' + type = 'کشتارکن' if buyer.type == 'killer' else 'کشتارگاه' + list1 = [ + m, + buyer.user.fullname, + buyer.user.mobile, + buyer.user.province.name, + buyer.user.city.name, + type, + buyer.unit_name if buyer.unit_name is not None else '-', + len(poultry_requests), + total_quantity, + total_weight, + active + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + value_header_list = [ + len(buyers), + all_poultry_requests, + all_total_quantity, + all_total_weight + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + all_poultry_requests, + all_total_quantity, + all_total_weight, + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def chain_company_buyers_excel(request): + filterset_class = ChainCompanyFilterSet + filterset_fields = [ + 'user__national_id', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'name', + + ] + + chain_companies = ChainCompany.objects.filter(trash=False).order_by('id') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=chain_companies + ) + ).filter(): + ps = filterset_class(data=query, queryset=chain_companies) + chain_companies = ps.filter() + + excel_options = [ + 'ردیف', + 'نام شرکت', + 'مدیر عامل', + 'موبایل مدیر عامل', + 'شهر', + 'تعداد سفارشات', + 'حجم سفارشات(قطعه)', + 'وزن سفارشات(قطعه)', + + ] + date1 = datetime.datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد شرکت ها', + 'مجموع تعداد سفارشات', + 'مجموع حجم سفارشات', + 'مجموع وزن سفارشات', + + ] + + for col_num, option in enumerate(header_list, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + worksheet['B2'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + + worksheet.merge_cells(merge_range1) + worksheet['B2'].font = red_font + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + all_poultry_requests = 0 + all_total_quantity = 0 + all_total_weight = 0 + for buyer in chain_companies: + + chain_allocations = ChainAllocation.objects.filter(chain_company=buyer, state='accepted', trash=False).order_by( + '-id') + + total_quantity = chain_allocations.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight = chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + all_poultry_requests += len(chain_allocations) + + all_total_quantity += total_quantity + + all_total_weight += total_weight + l += 1 + + list1 = [ + m, + buyer.name, + buyer.user.fullname, + buyer.user.mobile, + buyer.user.city.name, + len(chain_allocations), + total_quantity, + total_weight + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + value_header_list = [ + len(chain_companies), + all_poultry_requests, + all_total_quantity, + all_total_weight + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + + '', + '', + '', + all_poultry_requests, + all_total_quantity, + all_total_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def bar_chain_excel(request): + now = datetime.datetime.now() + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else now + filterset_class = ChainAllocationFilterSet + filterset_fields = [ + 'poultry_hatching__poultry__breeding_unique_id', + 'poultry_hatching__poultry__user__mobile', + 'poultry_hatching__poultry__user__fullname', + 'poultry_hatching__poultry__user__first_name', + 'poultry_hatching__poultry__user__last_name', + 'poultry_hatching__poultry__unit_name', + 'chain_company__name', + + ] + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + ).order_by('id') + if request.GET['state'] == 'accepted': + if request.GET['role'] == "ChainCompany": + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + chain_allocations = chain_allocations.filter(chain_company__user=user, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + chain_allocations = chain_allocations.filter(poultry_hatching__poultry__address__city=user.city, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] == "CityOperator": + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + city_operator = CityOperator.objects.get(user=user, trash=False) + chain_allocations = chain_allocations.filter( + poultry_hatching__poultry__city_operator=city_operator.unit_name, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] == "VetFarm": + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + vet = Vet.objects.get(user=user, trash=False) + poultry_ids = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry').only( + 'poultry').values_list('poultry', flat=True).distinct() + poultry = Poultry.objects.filter(id__in=poultry_ids) + chain_allocations = chain_allocations.filter(poultry_hatching__poultry__in=poultry, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + else: + chain_allocations = chain_allocations.filter(state__in=('accepted', 'pending'), + trash=False).order_by('-id') + state1 = 'تایید شده' + else: + if request.GET['role'] == "ChainCompany": + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + chain_allocations = chain_allocations.filter(chain_company__user=user, + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, + temporary_deleted=False).order_by('-id') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + chain_allocations = chain_allocations.filter(poultry_hatching__poultry__address__city=user.city, + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, + temporary_deleted=False).order_by('-id') + elif request.GET['role'] == "CityOperator": + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + city_operator = CityOperator.objects.get(user=user, trash=False) + chain_allocations = chain_allocations.filter( + poultry_hatching__poultry__city_operator=city_operator.unit_name, + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, temporary_deleted=False).order_by('-id') + elif request.GET['role'] == "VetFarm": + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + vet = Vet.objects.get(user=user, trash=False) + poultry_ids = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry').only( + 'poultry').values_list('poultry', flat=True).distinct() + poultry = Poultry.objects.filter(id__in=poultry_ids) + chain_allocations = chain_allocations.filter( + poultry_hatching__poultry__in=poultry, + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, temporary_deleted=False).order_by('-id') + else: + chain_allocations = chain_allocations.filter( + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, temporary_deleted=False).order_by('-id') + state1 = 'رد شده' + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=chain_allocations + ) + ).filter(): + ps = filterset_class(data=query, queryset=chain_allocations) + chain_allocations = ps.filter() + + excel_options = [ + 'ردیف', + 'وضعیت', + ' تاریخ سفارش', + 'نوع فروش', + 'ثبت کننده سفارش', + 'تلفن ثبت کننده سفارش', + 'خریدار', + 'تلفن خریدار', + 'مرغداری', + 'تلفن مرغداری', + 'شرکت زنجیره', + ' تلفن شرکت زنجیره', + 'کد بهداشتی', + 'کد قرنطینه', + 'راننده ', + 'تلفن راننده ', + 'خودرو', + 'پلاک', + 'حجم', + 'میانگین وزن', + 'وزن', + 'حذف/رد کننده', + 'تلفن حذف/رد کننده', + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if state1 == 'تایید شده': + for col_num, option in enumerate(excel_options[:21], 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + else: + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای {state1} شرکت زنجیره' + if chain_allocations.exists(): + name = chain_allocations.first().poultry_hatching.poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_age = [] + + all_quantity = chain_allocations.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_weighte = chain_allocations.aggregate( + total=Sum('weight'))[ + 'total'] or 0 + has_code = 0 + if chain_allocations: + for chain_allocation in chain_allocations: + age = (chain_allocation.poultry_hatching.chicken_age) + all_age.append(age) + chain_date = jdatetime.date.fromgregorian( + day=chain_allocation.date.day, + month=chain_allocation.date.month, + year=chain_allocation.date.year + ) + + if chain_allocation.quarantine_code: + has_code += 1 + + remover_fullname = '-' + remover_mobile = '-' + if chain_allocation.state == 'accepted': + state = 'تایید شده' + elif chain_allocation.state == 'rejected': + state = 'رد شده' + remover_fullname = chain_allocation.seconder['fullname'] if chain_allocation.seconder else None + remover_mobile = chain_allocation.seconder['mobile'] if chain_allocation.seconder else None + elif chain_allocation.state == 'pending': + state = 'در انتظار تایید' + else: + state = 'حذف شده' + remover_fullname = chain_allocation.remover['fullname'] if chain_allocation.remover else None + remover_mobile = chain_allocation.remover['mobile'] if chain_allocation.remover else None + out_province = 'خارج استان' if chain_allocation.out_province == True else 'داخل استان' + + full_name_registerer = chain_allocation.registerer['fullname'] if chain_allocation.registerer else '-' + mobile_registerer = chain_allocation.registerer['mobile'] if chain_allocation.registerer else '-' + + if chain_allocation.kill_house is not None: + buyer_fullname = chain_allocation.kill_house.name + buyer_mobile = chain_allocation.kill_house.kill_house_operator.user.mobile + else: + buyer_fullname = chain_allocation.buyer_name + buyer_mobile = chain_allocation.buyer_mobile + + list1 = [ + m, + state, + str(chain_date), + out_province, + full_name_registerer, + mobile_registerer, + buyer_fullname, + buyer_mobile, + chain_allocation.poultry_hatching.poultry.unit_name, + chain_allocation.poultry_hatching.poultry.user.mobile, + chain_allocation.company_name, + chain_allocation.company_user_mobile, + chain_allocation.health_code if chain_allocation.health_code else '-', + chain_allocation.quarantine_code if chain_allocation.quarantine_code else '-', + chain_allocation.driver_name if chain_allocation.driver_name else '-', + chain_allocation.driver_mobile if chain_allocation.driver_mobile else '-', + chain_allocation.type_car if chain_allocation.type_car else '-', + chain_allocation.pelak if chain_allocation.pelak else '-', + chain_allocation.quantity, + chain_allocation.index_weight, + chain_allocation.weight, + remover_fullname, + remover_mobile, + ] + m += 1 + if state1 == 'تایید شده': + for item in range(len(list1) - 2): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + else: + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(chain_allocations), + all_quantity, + all_weighte, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + '', + all_weighte, + '', + '', + + ] + if state1 == 'تایید شده': + for item in range(len(list2) - 2): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + else: + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def general_city_operator(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + city_operator_list = [] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_name = 'اطلاعات کلی' + worksheet = workbook.create_sheet(sheet_name) + + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + city_operators = CityOperator.objects.filter(trash=False).exclude(unit_name='اتحادیه استان (فاقد تعاونی)') + + row_list2 = len(city_operators) + 7 + province = city_operators.last().user.province.name + worksheet[f'F1'] = f'گزارش اطلاعات کلی جوجه ریزی و کشتار تعاونی های استان {province}' + worksheet[f'F1'].font = Font(color="C00000", bold=True, size=12) + worksheet[f'F1'].alignment = Alignment(horizontal='center', vertical='center', + wrap_text=True) + merge_range1 = f'F1:I2' + worksheet.merge_cells(merge_range1) + + worksheet[f'D{row_list2}'] = f'اطلاعات کشتار به تفکیک تعاونی ها از تاریخ {from_date_1} تا {from_date_2}' + worksheet[f'D{row_list2}'].font = Font(color="C00000", bold=True, size=12) + worksheet[f'D{row_list2}'].alignment = Alignment(horizontal='center', vertical='center', + wrap_text=True) + merge_range1 = f'D{row_list2}:J{row_list2 + 1}' + worksheet.merge_cells(merge_range1) + + header_list1 = [ + 'تعاونی', + 'شهر', + 'کاربر', + 'تلفن کاربر', + 'تعداد فارم', + 'تعداد کل جوجه ریزی', + 'حجم کل جوجه ریزی', + 'حجم کل کشتارشده', + 'وزن کل کشتارشده', + 'میانگین وزنی', + 'حجم کل فروش خارج از استان', + 'وزن کل فروش خارج از استان', + 'وزن کل لاشه', + 'تعداد جوجه ریزی فعال', + 'حجم جوجه ریزی فعال', + 'مانده در سالن', + + 'تعداد درخواست کشتار تعاونی', + 'حجم درخواست کشتار تعاونی', + 'درصد نسبت به حجم کل', + 'تعداد خرید مستقیم', + 'حجم خرید مستقیم', + 'درصد نسبت به حجم کل', + 'تعداد درخواست کشتار کاربر سایر', + 'حجم کشتار کاربر سایر', + 'درصد نسبت به حجم کل', + 'تعداد گزارشات کاربر تعاونی', + 'تعداد گزارشات کاربر ادمین', + 'کل گزارشات', + 'درصد فعالیت کاربر نسبت به جوجه ریزی ها', + 'درصد فعالیت ادمین نسبت به جوجه ریزی ها', + 'درصد فعالیت نسبت به کل گزارشات کاربران', + 'درصد فعالیت نسبت به کاربر ادمین', + ] + + for col_num, option in enumerate(header_list1, 2): + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + l = 4 + row_list = len(city_operators) + 12 + row_city = len(city_operators) + 10 + len_poultry = 0 + len_all_hatching = 0 + all_hathcing_quantitya_all = 0 + all_province_requests_quantity = 0 + all_province_requests_weight = 0 + len_hatching = 0 + all_hatching_quantity = 0 + all_hatching_lest_over = 0 + all_out_poultry_request_quantity = 0 + all_out_poultry_request_weight = 0 + city_operator_poultry_request_quantity_all = 0 + city_operator_poultry_request_weight_all = 0 + direct_bying_poultry_request_quantity_all = 0 + direct_bying_poultry_request_weight_all = 0 + province_operaor_poultry_request_quantity_all = 0 + province_operaor_poultry_request_weight_all = 0 + city_operator_name = city_operators.values_list('user__fullname', flat=True).distinct() + city_operator_all_violation_all = PoultryHatching.objects.filter(trash=False, violation_reporter__isnull=False, + violation_reporter__in=city_operator_name).count() + all_admin_all_violation = 0 + for city_operator in city_operators: + poultry_request = PoultryRequest.objects.filter(trash=False, + out_province_request_cancel=False, + province_state='accepted', + poultry__city_operator=city_operator.unit_name) + poultry = Poultry.objects.filter(trash=False, city_operator=city_operator.unit_name) + out_poultry_request = poultry_request.filter(out=True) + city_operator_poultry_request = poultry_request.filter(direct_buying=False, registrar__role='CityOperator') + province_operaor_poultry_request = poultry_request.filter(~Q(registrar__role='CityOperator'), + direct_buying=False) + direct_bying_poultry_request = poultry_request.filter(direct_buying=True) + + province_requests = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name + , return_to_province=False, + state__in=('accepted', 'pending')) + + province_requests_quantity = \ + province_requests.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + + province_requests_weight = \ + province_requests.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + + kill_requests = KillHouseRequest.objects.filter(trash=False, province_kill_request__in=province_requests) + all_hatching = PoultryHatching.objects.filter(trash=False, poultry__in=poultry) + all_violation = all_hatching.filter(violation_reporter__isnull=False) + city_operator_all_violation = all_violation.filter(violation_reporter=city_operator.user.fullname).count() + admin_all_violation = all_violation.filter(~Q(violation_reporter=city_operator.user.fullname)).count() + + hathcing_quantity_all = \ + all_hatching.aggregate( + total=Sum(F('quantity')))[ + 'total'] or 0 + out_poultry_request_quantity_all = \ + out_poultry_request.aggregate( + total=Sum(F('quantity')))[ + 'total'] or 0 + out_poultry_request_weight_all = \ + out_poultry_request.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + hatching = all_hatching.filter(archive=False, allow_hatching='pending') + hatching_quantity = \ + hatching.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + hatching_lest_over = \ + hatching.aggregate( + total=Sum('left_over'))[ + 'total'] or 0 + city_operator_poultry_request_quantity = \ + city_operator_poultry_request.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + city_operator_poultry_request_weight = \ + city_operator_poultry_request.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + quantity_all = \ + poultry_request.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + direct_bying_poultry_request_quantity = \ + direct_bying_poultry_request.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + direct_bying_poultry_request_weight = \ + direct_bying_poultry_request.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + province_operaor_poultry_request_quantity = \ + province_operaor_poultry_request.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + province_operaor_poultry_request_weight = \ + province_operaor_poultry_request.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + all_report = city_operator_all_violation + admin_all_violation + all_admin_all_violation += admin_all_violation + list1 = [ + city_operator.unit_name, + city_operator.user.city.name, + city_operator.user.fullname, + city_operator.user.mobile, + len(poultry), + len(all_hatching), + hathcing_quantity_all, + province_requests_quantity, + province_requests_weight, + round(province_requests_weight / province_requests_quantity, + 1) if province_requests_quantity > 0 else 0, + out_poultry_request_quantity_all, + out_poultry_request_weight_all, + province_requests_weight * 0.75, + len(hatching), + hatching_quantity, + hatching_lest_over, + city_operator_poultry_request_quantity, + city_operator_poultry_request_weight, + round((city_operator_poultry_request_weight * 100) / quantity_all) if quantity_all > 0 else 0, + direct_bying_poultry_request_quantity, + direct_bying_poultry_request_weight, + round((direct_bying_poultry_request_weight * 100) / quantity_all) if quantity_all > 0 else 0, + province_operaor_poultry_request_quantity, + province_operaor_poultry_request_weight, + round((province_operaor_poultry_request_weight * 100) / quantity_all) if quantity_all > 0 else 0, + city_operator_all_violation, + admin_all_violation, + city_operator_all_violation + admin_all_violation, + str(round(city_operator_all_violation * 100 / len(all_hatching), 1) if len(all_hatching) > 0 else 0), + str(round(admin_all_violation * 100 / len(all_hatching), 1) if len(all_hatching) > 0 else 0), + str(round(city_operator_all_violation * 100 / city_operator_all_violation_all, + 1) if city_operator_all_violation_all > 0 else 0), + str(round(city_operator_all_violation * 100 / all_report, 1) if all_report > 0 else 0), + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l, column=item + 2, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l += 1 + len_poultry += len(poultry) + len_all_hatching += len(all_hatching) + all_hathcing_quantitya_all += hathcing_quantity_all + all_province_requests_quantity += province_requests_quantity + all_province_requests_weight += province_requests_weight + len_hatching += len(hatching) + all_hatching_quantity += hatching_quantity + all_hatching_lest_over += hatching_lest_over + all_out_poultry_request_quantity += out_poultry_request_quantity_all + all_out_poultry_request_weight += out_poultry_request_weight_all + province_requests_date = province_requests.filter( + province_request__poultry_request__send_date__date__gte=date1 + , province_request__poultry_request__send_date__date__lte=date2, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name + ) + city_operator_poultry_request_quantity_all += city_operator_poultry_request_quantity + city_operator_poultry_request_weight_all += city_operator_poultry_request_weight + direct_bying_poultry_request_quantity_all += direct_bying_poultry_request_quantity + direct_bying_poultry_request_weight_all += direct_bying_poultry_request_weight + province_operaor_poultry_request_quantity_all += province_operaor_poultry_request_quantity + province_operaor_poultry_request_weight_all += province_operaor_poultry_request_weight + + list2 = [ + 'ردیف', + 'ماهیت', + 'خریدار', + 'نام و نام خانوادگی مالک', + 'تلفن مالک', + 'شهر', + 'تعداد سفارش', + 'حجم سفارش', + 'تعداد بار ', + 'حجم بار', + 'وزن بار', + 'وزن لاشه', + ] + if province_requests_date: + if city_operator not in city_operator_list: + city_operator_list.append(city_operator) + kill_houses1 = province_requests_date.values_list('killhouse_user', flat=True).distinct() + + for col_num, option in enumerate(list2, 2): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=row_list, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + if option in ['تعداد سفارش', 'حجم سفارش', 'تعداد بار ', 'حجم بار', 'وزن بار', 'وزن لاشه']: + cell.fill = PatternFill(start_color="FF0000", fill_type="solid") + # worksheet.row_dimensions[row_list].height = 35 + worksheet.column_dimensions[col_letter].width = 17 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + m = 1 + kill_houses = KillHouse.objects.filter(id__in=kill_houses1) + len_province_requests_kill = 0 + all_province_quantity = 0 + len_kill_requests_date = 0 + all_accepted_assignment_real_quantity = 0 + all_accepted_assignment_real_weight = 0 + all_ware_house_accepted_real_weight = 0 + for kill_house in kill_houses: + province_requests_kill = province_requests_date.filter(killhouse_user=kill_house) + + province_quantity = \ + province_requests_kill.aggregate( + total=Sum('main_quantity'))[ + 'total'] or 0 + + kill_requests_date = kill_requests.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + killhouse_user=kill_house, + province_kill_request__in=province_requests_kill) + + accepted_assignment_real_quantity = \ + kill_requests_date.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + accepted_assignment_real_weight = \ + kill_requests_date.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + len_province_requests_kill += len(province_requests_kill) + all_province_quantity += province_quantity + len_kill_requests_date += len(kill_requests_date) + all_accepted_assignment_real_quantity += accepted_assignment_real_quantity + all_accepted_assignment_real_weight += int(accepted_assignment_real_weight) + all_ware_house_accepted_real_weight += int(accepted_assignment_real_weight) * 0.75 + # killer='کشتارگاه' if kill_house.killer == False else 'کشتارکن' + if kill_house.killer == True and kill_house.type == 'exclusive': + parent = KillHousePercentage.objects.get(kill_house=kill_house, trash=False) + killer_type = f'کشتارکن اختصاصی {parent.kill_house_for_killer.name}' + elif kill_house.killer == True and kill_house.type == 'public': + killer_type = 'کشتارکن عمومی' + else: + killer_type = 'کشتارگاه' + list1 = [ + m, + killer_type, + kill_house.name, + kill_house.kill_house_operator.user.fullname, + kill_house.kill_house_operator.user.mobile, + kill_house.kill_house_operator.user.city.name, + len(province_requests_kill), + province_quantity, + len(kill_requests_date), + accepted_assignment_real_quantity, + int(accepted_assignment_real_weight), + int(accepted_assignment_real_weight) * 0.75, + ] + for item in range(len(list1)): + cell = worksheet.cell(row=row_list + 1, column=item + 2, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + row_list += 1 + m += 1 + + else: + row_list += 5 + worksheet[f'F{row_city}'] = f'{city_operator.unit_name}' + worksheet[f'F{row_city}'].font = Font(color="C00000", bold=True, size=12) + worksheet[f'F{row_city}'].alignment = Alignment(horizontal='center', vertical='center', + wrap_text=True) + merge_range1 = f'F{row_city}:H{row_city + 1}' + worksheet.merge_cells(merge_range1) + + row_city += len(kill_houses) + 5 + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + len_province_requests_kill, + all_province_quantity, + len_kill_requests_date, + all_accepted_assignment_real_quantity, + all_accepted_assignment_real_weight, + all_ware_house_accepted_real_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=row_city - 2, column=item + 2, value=list2[item]) + value = list2[item] + cell.font = Font(size=10, bold=True, color='FFFFFF') + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + list2 = [ + 'مجموع==>', + '', + '', + '', + len_poultry, + len_all_hatching, + all_hathcing_quantitya_all, + all_province_requests_quantity, + all_province_requests_weight, + round(all_province_requests_weight / all_province_requests_quantity, + 1) if all_province_requests_quantity > 0 else 0, + all_out_poultry_request_quantity, + all_out_poultry_request_weight, + all_province_requests_weight * 0.75, + len_hatching, + all_hatching_quantity, + all_hatching_lest_over, + city_operator_poultry_request_quantity_all, + city_operator_poultry_request_weight_all, + '', + direct_bying_poultry_request_quantity_all, + direct_bying_poultry_request_weight_all, + '', + province_operaor_poultry_request_quantity_all, + province_operaor_poultry_request_weight_all, + '', + city_operator_all_violation_all, + all_admin_all_violation, + all_admin_all_violation + city_operator_all_violation_all, + '', + '', + '', + '', + + ] + create_value(worksheet, list2, l + 1, 2, color='green') + for city_operator in city_operator_list: + sheet_name = city_operator.unit_name + sheet_name1 = sheet_name.split(' ')[-2] + ' ' + sheet_name.split(' ')[-1] + worksheet = workbook.create_sheet(f'تعاونی {sheet_name1}') + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', 'killer').values( + 'ware_house_confirmation', 'ware_house_accepted_real_quantity', 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', + ) + if 'key' in request.GET: + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__user__city=user.city) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + filtered_kill_reqs = filtered_kill_request.filter( + killhouse_user__kill_house_operator__user=user) + else: + filtered_kill_reqs = filtered_kill_request + else: + filtered_kill_reqs = filtered_kill_request + + else: + filtered_kill_reqs = filtered_kill_request + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های داری سند', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی {sheet_name}' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + red_font = Font(color="C00000", bold=True) + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:F1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + all_assignment_state_archive_state = 0 + len_weight_loss = 0 + all_state_ware_house_confirmation = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + real_quantity = assignment.get('real_quantity') + + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_quantity += quantity + all_weighte += weight + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + if kill['assignment_state_archive'] == 'True': + all_assignment_state_archive_state += 1 + assignment_state_archive_state = 'وارد شده است' + else: + assignment_state_archive_state = 'وارد نشده است' + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + if weight_loss > 0: + len_weight_loss += 1 + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + all_state_ware_house_confirmation += 1 + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if kill[ + 'accepted_real_weight'] != 0 else 0 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + state_delete, + assignment_state_archive_state, + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + ware_house_accepted_real_weight, + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[40] == 'بار حذف شده': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity', 0) or 0 + all_weight_loss = filtered_kill_reqs.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_weight_loss = round(all_weight_loss / len_weight_loss, 2) if all_weight_loss > 0 else 0 + value_header_list = [ + len(filtered_kill_reqs), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0, + all_assignment_state_archive_state, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + all_ware_house_accepted_real_weight, + all_weight_loss + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + all_ware_house_accepted_real_weight, + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def kill_house_total_transactions_wage_payid_admin_x_excel(request): + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__mobile', + 'system_address__city__name', + + ] + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + kill_house_list = [] + + excel_options = [ + 'ردیف', + 'تاریخ پرداخت', + 'نوع پرداخت', + 'نام پرداخت کننده', + 'تلفن پرداخت کننده', + 'شماره درخواست', + 'شماره پیگیری', + 'کد سفارش', + 'شماره کارت', + 'مبلغ تراکنش(ریال)', + 'سهم اتحادیه(ریال)', + 'سهم شرکت(ریال)', + 'سهم اصناف(ریال)', + 'سهم دامپزشک(ریال)', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_name = 'اطلاعات کلی' + worksheet = workbook.create_sheet(sheet_name) + + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + worksheet['B2'] = f'اطلاعات کلی تعرفه {from_date_1} تا {from_date_2}' + merge_range1 = 'B2:C2' + worksheet.merge_cells(merge_range1) + + worksheet['B2'].font = Font(color="C00000", bold=True) + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + worksheet['B5'] = f'جزئیات {from_date_1} تا {from_date_2}' + + worksheet['B5'].font = Font(color="C00000", bold=True) + worksheet['B5'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + else: + # worksheet['B2'] = 'اطلاعات کلی تعرفه(از 1403/01/01 به بعد)' + + worksheet['B2'].font = Font(color="C00000") + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + worksheet['B5'] = f'جزئیات' + + worksheet['B5'].font = Font(color="C00000", bold=True) + worksheet['B5'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + header_list1 = [ + 'کل تعرفه (ریال)', + 'سهم اتحادیه', + 'سهم شرکت', + 'سهم صنف', + 'سهم دامپزشک', + 'کل تعرفه پرداخت شده (ریال)', + 'سهم پرداخت شده اتحادیه (ریال)', + 'سهم پرداخت شده شرکت (ریال)', + 'سهم پرداخت شده اصناف (ریال)', + 'سهم پرداخت شده دامپزشک (ریال)', + 'مجموع تخفیفات (ریال)', + 'کل تعرفه پرداخت نشده (ریال)', + + 'سهم پرداخت نشده اتحادیه (ریال)', + 'سهم پرداخت نشده شرکت (ریال)', + 'سهم پرداخت نشده اصناف (ریال)', + 'سهم پرداخت نشده دامپزشک (ریال)', + ] + + for col_num, option in enumerate(header_list1, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 35 + worksheet.column_dimensions[col_letter].width = 18 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + try: + total_wage = TotalWageInformation.objects.get(trash=False) + except: + total_wage = TotalWageInformation() + total_wage.save() + serializer_total_wage_information = TotalWageInformationSerializer(total_wage, + context={'request': request}).data + + wage_info = serializer_total_wage_information.get('wage_info', {}) + shares = wage_info.get('shares', []) + company_data = next((item for item in shares if item["name"] == "شرکت"), None) + etehadiye_data = next((item for item in shares if item["name"] == "اتحادیه"), None) + sanf_protein_data = next((item for item in shares if item["name"] == "صنف پروتئین"), None) + dampezshk_data = next((item for item in shares if item["name"] == "دامپزشک"), None) + + values_list = [ + wage_info.get('total_wage', 0), + etehadiye_data['total_wage'], + company_data['total_wage'], + sanf_protein_data['total_wage'], + dampezshk_data['total_wage'], + wage_info.get('total_paid_wage', 0), + etehadiye_data['total_paid_wage'], + company_data['total_paid_wage'], + sanf_protein_data['total_paid_wage'], + dampezshk_data['total_paid_wage'], + wage_info.get('off', 0), + wage_info.get('total_unpaid_wage', 0), + etehadiye_data['total_unpaid_wage'], + company_data['total_unpaid_wage'], + sanf_protein_data['total_unpaid_wage'], + dampezshk_data['total_unpaid_wage'], + ] + create_value(worksheet, values_list, 3, 4, border_style='thin') + kill_houses = KillHouse.objects.filter(trash=False).exclude(out_province=True).order_by('id') + + kill_houses = KillHouseForNewWageInormationSerializer(kill_houses, many=True, context={'request': request}).data + if wage_info['wage_counting_type'] == 'carcass': + l = 15 + m = 1 + header_list2 = [ + "وزن کل فروش به خارج از استان ", + "تعرفه کل فروش به خارج از استان(ریال)", + "کل وزن زنده کشتار داخل استان(کیلوگرم)", + "کل وزن لاشه کشتار داخل استان(کیلوگرم)", + "وزن توزیع لاشه داخل استان(کیلوگرم)", + "تعرفه توزیع لاشه داخل استان(ریال)", + "وزن توزیع لاشه به خارج از استان(کیلوگرم)", + "تعرفه توزیع لاشه به خارج از استان(ریال)", + "وزن لاشه ورودی به استان(کیلوگرم)", + "تعرفه لاشه ورودی به استان(ریال)", + "وزن مرغ زنده ورودی به استان(کیلوگرم)", + "تعرفه مرغ زنده ورودی به استان(ریال)", + "وزن خرید های بازگشتی(کیلوگرم)", + "تعرفه خرید های بازگشتی(ریال)", + + ] + values_list2 = [ + wage_info.get('out_province_poultry_request_weight', 0), + wage_info.get('out_province_poultry_request_wage', 0), + wage_info.get('total_province_live_weight', 0), + wage_info.get('total_province_carcasses_weight', 0), + wage_info.get('province_kill_requests_total_weight', 0), + wage_info.get('province_kill_requests_total_wage', 0), + wage_info.get('free_bars_out_province_carcases_total_weight', 0), + wage_info.get('free_bars_out_province_carcases_total_wage', 0), + wage_info.get('free_bars_carcases_total_weight', 0), + wage_info.get('free_bars_carcases_total_wage', 0), + wage_info.get('free_bars_live_total_weight', 0), + wage_info.get('free_bars_live_total_wage', 0), + wage_info.get('return_total_province_live_weight', 0), + wage_info.get('total_return_pure_province_carcasses_price', 0), + + ] + header_list5 = [ + 'سهم', + 'تعرفه فروش مرغ زنده به خارج از استان(ریال)', + 'تعرفه توزیع لاشه به داخل استان(ریال)', + 'تعرفه توزیع لاشه خارج استان(ریال)', + 'تعرفه لاشه ورودی به استان(ریال)', + 'تعرفه مرغ زنده ورودی به استان(ریال)', + 'تعرفه کل(ریال)', + 'تعرفه پرداخت شده(ریال)', + 'تعرفه پرداخت نشده(ریال)', + + ] + header_list = [ + 'ردیف', + 'کشتارگاه', + 'کل تعرفه (ریال)', + 'سهم اتحادیه (ریال)', + 'سهم شرکت (ریال)', + 'سهم صنف (ریال)', + 'سهم دامپزشک (ریال)', + + 'کل تعرفه پرداخت شده (ریال)', + 'سهم اتحادیه از واریزی(ریال)', + 'سهم شرکت از واریزی(ریال)', + 'سهم اصناف از واریزی(ریال)', + 'سهم دامپزشک از واریزی(ریال)', + 'تخفیفات (ریال)', + + 'کل تعرفه پرداخت نشده (ریال)', + ' سهم اتحادیه پرداخت نشده', + ' سهم شرکت پرداخت نشده', + 'سهم صنف پرداخت نشده', + 'سهم دامپزشک پرداخت نشده', + 'کل وزن زنده کشتار داخل استان', + 'وزن لاشه کشتار داخل استان', + 'وزن توزیع لاشه کشتار داخل استان', + 'تعرفه توزیع لاشه کشتار داخل استان', + 'وزن توزیع لاشه به خارج استان', + 'تعرفه توزیع لاشه به خارج استان', + 'وزن لاشه ورودی به استان', + 'تعرفه لاشه ورودی به استان', + 'وزن مرغ زنده ورودی به استان', + 'تعرفه مرغ زنده ورودی به استان', + 'وزن خریدهای بازگشتی', + 'تعرفه خریدهای بازگشتی', + + ] + + for kill_house in kill_houses: + wage_info2 = kill_house.get('wage_info', {}) + shares2 = kill_house.get('shares', []) + company_data2 = next((item for item in shares2 if item["name"] == "شرکت"), None) + etehadiye_data2 = next((item for item in shares2 if item["name"] == "اتحادیه"), None) + sanf_protein_data2 = next((item for item in shares2 if item["name"] == "صنف پروتئین"), None) + dampezshk_data2 = next((item for item in shares2 if item["name"] == "دامپزشک"), None) + values_list3 = [ + m, + kill_house['name'], + wage_info2['total_wage'], + etehadiye_data2['total_wage'], + company_data2['total_wage'], + sanf_protein_data2['total_wage'], + dampezshk_data2['total_wage'], + wage_info2.get('total_paid_wage', 0), + etehadiye_data2['total_paid_wage'], + company_data2['total_paid_wage'], + sanf_protein_data2['total_paid_wage'], + dampezshk_data2['total_paid_wage'], + wage_info2.get('off', 0), + wage_info2.get('total_unpaid_wage', 0), + etehadiye_data2['total_unpaid_wage'], + company_data2['total_unpaid_wage'], + sanf_protein_data2['total_unpaid_wage'], + dampezshk_data2['total_unpaid_wage'], + wage_info2.get('total_province_live_weight', 0), + wage_info2.get('total_province_carcasses_weight', 0), + wage_info2.get('province_kill_requests_total_weight', 0), + wage_info2.get('province_kill_requests_total_wage', 0), + wage_info2.get('free_bars_out_province_carcases_total_weight', 0), + wage_info2.get('free_bars_out_province_carcases_total_wage', 0), + wage_info2.get('free_bars_carcases_total_weight', 0), + wage_info2.get('free_bars_carcases_total_wage', 0), + wage_info2.get('free_bars_live_total_weight', 0), + wage_info2.get('free_bars_live_total_wage', 0), + wage_info2.get('return_total_province_live_weight', 0), + wage_info2.get('total_return_pure_province_carcasses_price', 0), + + ] + for item in range(len(values_list3)): + cell = worksheet.cell(row=l, column=item + 1, value=values_list3[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list3[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l += 1 + m += 1 + if int(wage_info2.get('total_paid_wage')) > 0: + if kill_house not in kill_house_list: + kill_house_list.append({"name": kill_house['name']}) + list2 = [ + "مجموع==>", "", + sum(kill_house.get('wage_info', {}).get('total_wage', 0) for kill_house in kill_houses), + sum(next( + (item.get("total_wage", 0) for item in kill_house.get("shares", []) if item["name"] == "اتحادیه"), + 0) for kill_house in kill_houses), + sum(next((item.get("total_wage", 0) for item in kill_house.get("shares", []) if item["name"] == "شرکت"), + 0) for kill_house in kill_houses), + sum(next((item.get("total_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "صنف پروتئین"), 0) for kill_house in kill_houses), + sum(next( + (item.get("total_wage", 0) for item in kill_house.get("shares", []) if item["name"] == "دامپزشک"), + 0) for kill_house in kill_houses), + + sum(kill_house.get('wage_info', {}).get('total_paid_wage', 0) for kill_house in kill_houses), + sum(next((item.get("total_paid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "اتحادیه"), 0) for kill_house in kill_houses), + sum(next( + (item.get("total_paid_wage", 0) for item in kill_house.get("shares", []) if item["name"] == "شرکت"), + 0) for kill_house in kill_houses), + sum(next((item.get("total_paid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "صنف پروتئین"), 0) for kill_house in kill_houses), + sum(next((item.get("total_paid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "دامپزشک"), 0) for kill_house in kill_houses), + + sum(kill_house.get('wage_info', {}).get('off', 0) for kill_house in kill_houses), + sum(kill_house.get('wage_info', {}).get('total_unpaid_wage', 0) for kill_house in kill_houses), + sum(next((item.get("total_unpaid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "اتحادیه"), 0) for kill_house in kill_houses), + sum(next((item.get("total_unpaid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "شرکت"), 0) for kill_house in kill_houses), + sum(next((item.get("total_unpaid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "صنف پروتئین"), 0) for kill_house in kill_houses), + sum(next((item.get("total_unpaid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "دامپزشک"), 0) for kill_house in kill_houses), + + sum(kill_house.get('wage_info', {}).get('total_province_live_weight', 0) for kill_house in kill_houses), + sum(kill_house.get('wage_info', {}).get('total_province_carcasses_weight', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('province_kill_requests_total_weight', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('province_kill_requests_total_wage', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_out_province_carcases_total_weight', 0) for + kill_house in kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_out_province_carcases_total_wage', 0) for kill_house + in kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_carcases_total_weight', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_carcases_total_wage', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_live_total_weight', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_live_total_wage', 0) for kill_house in kill_houses), + sum(kill_house.get('wage_info', {}).get('return_total_province_live_weight', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('total_return_pure_province_carcasses_price', 0) for kill_house + in kill_houses), + ] + else: + l = 15 + m = 1 + header_list2 = [ + "وزن کل فروش به خارج از استان ", + "تعرفه کل فروش به خارج از استان(ریال)", + "کل وزن زنده کشتار داخل استان(کیلوگرم)", + "تعرفه کشتار داخل استان(کیلوگرم)", + "وزن توزیع لاشه به خارج از استان(کیلوگرم)", + "تعرفه توزیع لاشه به خارج از استان(ریال)", + "وزن لاشه ورودی به استان(کیلوگرم)", + "تعرفه لاشه ورودی به استان(ریال)", + "وزن مرغ زنده ورودی به استان(کیلوگرم)", + "تعرفه مرغ زنده ورودی به استان(ریال)", + "وزن خرید های بازگشتی(کیلوگرم)", + "تعرفه خرید های بازگشتی(ریال)", + + ] + values_list2 = [ + wage_info.get('out_province_poultry_request_weight', 0), + wage_info.get('out_province_poultry_request_wage', 0), + wage_info.get('total_province_live_weight', 0), + wage_info.get('province_kill_requests_total_wage', 0), + wage_info.get('free_bars_out_province_carcases_total_weight', 0), + wage_info.get('free_bars_out_province_carcases_total_wage', 0), + wage_info.get('free_bars_carcases_total_weight', 0), + wage_info.get('free_bars_carcases_total_wage', 0), + wage_info.get('free_bars_live_total_weight', 0), + wage_info.get('free_bars_live_total_wage', 0), + wage_info.get('return_total_province_live_weight', 0), + wage_info.get('total_return_pure_province_carcasses_price', 0), + + ] + header_list5 = [ + 'سهم', + 'تعرفه فروش مرغ زنده به خارج از استان(ریال)', + 'تعرفه کشتار داخل استان(ریال)', + 'تعرفه توزیع لاشه خارج استان(ریال)', + 'تعرفه لاشه ورودی به استان(ریال)', + 'تعرفه مرغ زنده ورودی به استان(ریال)', + 'تعرفه کل(ریال)', + 'تعرفه پرداخت شده(ریال)', + 'تعرفه پرداخت نشده(ریال)', + + ] + header_list = [ + 'ردیف', + 'کشتارگاه', + 'کل تعرفه (ریال)', + 'سهم اتحادیه (ریال)', + 'سهم شرکت (ریال)', + 'سهم صنف (ریال)', + 'سهم دامپزشک (ریال)', + + 'کل تعرفه پرداخت شده (ریال)', + 'سهم اتحادیه از واریزی(ریال)', + 'سهم شرکت از واریزی(ریال)', + 'سهم اصناف از واریزی(ریال)', + 'سهم دامپزشک از واریزی(ریال)', + 'تخفیفات (ریال)', + + 'کل تعرفه پرداخت نشده (ریال)', + ' سهم اتحادیه پرداخت نشده', + ' سهم شرکت پرداخت نشده', + 'سهم صنف پرداخت نشده', + 'سهم دامپزشک پرداخت نشده', + + 'کل وزن زنده کشتار داخل استان', + 'تعرفه کشتار داخل استان', + 'وزن توزیع لاشه به خارج استان', + 'تعرفه توزیع لاشه به خارج استان', + 'وزن لاشه ورودی به استان', + 'تعرفه لاشه ورودی به استان', + 'وزن مرغ زنده ورودی به استان', + 'تعرفه مرغ زنده ورودی به استان', + 'وزن خریدهای بازگشتی', + 'تعرفه خریدهای بازگشتی', + + ] + for kill_house in kill_houses: + wage_info2 = kill_house.get('wage_info', {}) + shares2 = kill_house.get('shares', []) + company_data2 = next((item for item in shares2 if item["name"] == "شرکت"), None) + etehadiye_data2 = next((item for item in shares2 if item["name"] == "اتحادیه"), None) + sanf_protein_data2 = next((item for item in shares2 if item["name"] == "صنف پروتئین"), None) + dampezshk_data2 = next((item for item in shares2 if item["name"] == "دامپزشک"), None) + values_list3 = [ + m, + kill_house['name'], + wage_info2['total_wage'], + etehadiye_data2['total_wage'], + company_data2['total_wage'], + sanf_protein_data2['total_wage'], + dampezshk_data2['total_wage'], + wage_info2.get('total_paid_wage', 0), + etehadiye_data2['total_paid_wage'], + company_data2['total_paid_wage'], + sanf_protein_data2['total_paid_wage'], + dampezshk_data2['total_paid_wage'], + wage_info2.get('off', 0), + wage_info2.get('total_unpaid_wage', 0), + etehadiye_data2['total_unpaid_wage'], + company_data2['total_unpaid_wage'], + sanf_protein_data2['total_unpaid_wage'], + dampezshk_data2['total_unpaid_wage'], + + wage_info2.get('total_province_live_weight', 0), + wage_info2.get('province_kill_requests_total_wage', 0), + wage_info2.get('free_bars_out_province_carcases_total_weight', 0), + wage_info2.get('free_bars_out_province_carcases_total_wage', 0), + wage_info2.get('free_bars_carcases_total_weight', 0), + wage_info2.get('free_bars_carcases_total_wage', 0), + wage_info2.get('free_bars_live_total_weight', 0), + wage_info2.get('free_bars_live_total_wage', 0), + wage_info2.get('return_total_province_live_weight', 0), + wage_info2.get('total_return_pure_province_carcasses_price', 0), + + ] + for item in range(len(values_list3)): + cell = worksheet.cell(row=l, column=item + 1, value=values_list3[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list3[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l += 1 + m += 1 + if int(wage_info2.get('total_paid_wage')) > 0: + if kill_house not in kill_house_list: + kill_house_list.append({"name": kill_house['name']}) + list2 = [ + "مجموع==>", + "", + sum(kill_house.get('wage_info', {}).get('total_wage', 0) for kill_house in kill_houses), + sum(next( + (item.get("total_wage", 0) for item in kill_house.get("shares", []) if item["name"] == "اتحادیه"), + 0) for kill_house in kill_houses), + sum(next((item.get("total_wage", 0) for item in kill_house.get("shares", []) if item["name"] == "شرکت"), + 0) + for kill_house in kill_houses), + sum(next( + (item.get("total_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "صنف پروتئین"), + 0) for kill_house in kill_houses), + sum(next( + (item.get("total_wage", 0) for item in kill_house.get("shares", []) if item["name"] == "دامپزشک"), + 0) for kill_house in kill_houses), + + sum(kill_house.get('wage_info', {}).get('total_paid_wage', 0) for kill_house in kill_houses), + sum(next( + (item.get("total_paid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "اتحادیه"), + 0) for kill_house in kill_houses), + sum(next( + (item.get("total_paid_wage", 0) for item in kill_house.get("shares", []) if item["name"] == "شرکت"), + 0) + for kill_house in kill_houses), + sum(next((item.get("total_paid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "صنف پروتئین"), 0) for kill_house in kill_houses), + sum(next( + (item.get("total_paid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "دامپزشک"), + 0) for kill_house in kill_houses), + + sum(kill_house.get('wage_info', {}).get('off', 0) for kill_house in kill_houses), + sum(kill_house.get('wage_info', {}).get('total_unpaid_wage', 0) for kill_house in kill_houses), + sum(next((item.get("total_unpaid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "اتحادیه"), 0) for kill_house in kill_houses), + sum(next( + (item.get("total_unpaid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "شرکت"), + 0) for kill_house in kill_houses), + sum(next((item.get("total_unpaid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "صنف پروتئین"), 0) for kill_house in kill_houses), + sum(next((item.get("total_unpaid_wage", 0) for item in kill_house.get("shares", []) if + item["name"] == "دامپزشک"), 0) for kill_house in kill_houses), + + sum(kill_house.get('wage_info', {}).get('total_province_live_weight', 0) for kill_house in kill_houses), + sum(kill_house.get('wage_info', {}).get('province_kill_requests_total_wage', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_out_province_carcases_total_weight', 0) for + kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_out_province_carcases_total_wage', 0) for kill_house + in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_carcases_total_weight', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_carcases_total_wage', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_live_total_weight', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('free_bars_live_total_wage', 0) for kill_house in kill_houses), + sum(kill_house.get('wage_info', {}).get('return_total_province_live_weight', 0) for kill_house in + kill_houses), + sum(kill_house.get('wage_info', {}).get('total_return_pure_province_carcasses_price', 0) for kill_house + in kill_houses), + ] + + for item in range(len(list2)): + cell = worksheet.cell(row=l, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=9, bold=True) + cell.fill = PatternFill(start_color="FFFF00", fill_type="solid") + for col_num, option in enumerate(header_list, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=14, column=col_num, value=option) + if option in ['کل تعرفه (ریال)', 'سهم شرکت (ریال)', 'سهم اتحادیه (ریال)', 'سهم صنف (ریال)', + 'سهم دامپزشک (ریال)']: + cell.fill = PatternFill(start_color="76933C", fill_type="solid") + elif option in ['کل تعرفه پرداخت نشده (ریال)', 'کل تعرفه پرداخت نشده (ریال)', ' سهم شرکت پرداخت نشده', + 'سهم دامپزشک پرداخت نشده', + ' سهم اتحادیه پرداخت نشده', 'سهم صنف پرداخت نشده']: + cell.fill = PatternFill(start_color="E26B0A", fill_type="solid") + elif option in ['تعداد بار', 'حجم بار', 'وزن بار']: + cell.fill = PatternFill(start_color="163CB6", fill_type="solid") + elif option in ['تعداد تخصیص بدون بار', 'حجم تخصیص بدون بار', 'وزن تخصیص بدون بار', ]: + cell.fill = PatternFill(start_color="476DE7", fill_type="solid") + else: + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[14].height = 45 + worksheet.column_dimensions[col_letter].width = 27 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + create_value(worksheet, values_list2, 6, 3, border_style='thin') + for col_num, option in enumerate(header_list2, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[5].height = 35 + worksheet.column_dimensions[col_letter].width = 18 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + for col_num, option in enumerate(header_list5, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=8, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="1E487B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[8].height = 25 + worksheet.column_dimensions[col_letter].width = 20 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + values_union = [ + etehadiye_data['name'], + etehadiye_data['out_province_poultry_request_wage'], + etehadiye_data['province_kill_request_wage'], + etehadiye_data['free_sell_carcasses_wage'], + etehadiye_data['free_buying_carcasses_wage'], + etehadiye_data['free_buying_live_wage'], + etehadiye_data['total_wage'], + etehadiye_data['total_paid_wage'], + etehadiye_data['total_unpaid_wage'], + + ] + for item in range(len(values_union)): + cell = worksheet.cell(row=9, column=item + 1, value=values_union[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_union[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + values_company = [ + company_data['name'], + company_data['out_province_poultry_request_wage'], + company_data['province_kill_request_wage'], + company_data['free_sell_carcasses_wage'], + company_data['free_buying_carcasses_wage'], + company_data['free_buying_live_wage'], + company_data['total_wage'], + company_data['total_paid_wage'], + company_data['total_unpaid_wage'], + + ] + for item in range(len(values_company)): + cell = worksheet.cell(row=10, column=item + 1, value=values_company[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_company[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + values_guild = [ + sanf_protein_data['name'], + sanf_protein_data['out_province_poultry_request_wage'], + sanf_protein_data['province_kill_request_wage'], + sanf_protein_data['free_sell_carcasses_wage'], + sanf_protein_data['free_buying_carcasses_wage'], + sanf_protein_data['free_buying_live_wage'], + sanf_protein_data['total_wage'], + sanf_protein_data['total_paid_wage'], + sanf_protein_data['total_unpaid_wage'], + + ] + for item in range(len(values_guild)): + cell = worksheet.cell(row=11, column=item + 1, value=values_guild[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_guild[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + values_other = [ + dampezshk_data['name'], + dampezshk_data['out_province_poultry_request_wage'], + dampezshk_data['province_kill_request_wage'], + dampezshk_data['free_sell_carcasses_wage'], + dampezshk_data['free_buying_carcasses_wage'], + dampezshk_data['free_buying_live_wage'], + dampezshk_data['total_wage'], + dampezshk_data['total_paid_wage'], + dampezshk_data['total_unpaid_wage'], + + ] + for item in range(len(values_other)): + cell = worksheet.cell(row=12, column=item + 1, value=values_other[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_other[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + for kill_house in kill_house_list: + sheet_name = kill_house['name'] + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[2].height = 27 + worksheet.freeze_panes = worksheet['A3'] + max_col = worksheet.max_column + range_str = f'A2:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 1 + m = 1 + kill_house = KillHouse.objects.get(name=sheet_name, trash=False) + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('id') + else: + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).order_by('id') + + for transaction in transactions: + if transaction.kill_house != None: + fullname = transaction.kill_house.kill_house_operator.user.fullname + mobile = transaction.kill_house.kill_house_operator.user.mobile + else: + fullname = transaction.chain_company.user.fullname + mobile = transaction.chain_company.user.mobile + date = convert_to_shamsi( + datetime=transaction.date + ) + type = 'دستی' if transaction.transaction_type == 'wage-gateway-manual' else 'آنلاین' + if request.GET['role'] == 'ProvinceOperator': + amout = transaction.union_share + elif request.GET['role'] == 'Company': + amout = transaction.company_share + elif request.GET['role'] == 'Guilds': + amout = transaction.guilds_share + else: + amout = transaction.amount + list1 = [ + m, + date, + type, + fullname, + mobile, + transaction.orderId, + transaction.saleReferenceId, + transaction.orderId, + transaction.cardHolderPan, + amout, + transaction.union_share, + transaction.company_share, + transaction.guilds_share, + transaction.other_share, + + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + + 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 + + +def buy_outside_the_province_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() if 'start' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() if 'end' in request.GET else now + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer').values('kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', + ) + + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__user__city=user.city) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + filtered_kill_reqs = filtered_kill_request.filter(killhouse_user__kill_house_operator__user=user) + else: + filtered_kill_reqs = filtered_kill_request + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + kill_house = kill_house_vets.values_list('kill_house', flat=True).distinct() + + else: + kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False) + + if 'state' in request.GET: + if request.GET['state'] == 'completed': + filtered_kill_reqs = filtered_kill_reqs.filter(assignment_state_archive='True') + elif request.GET['state'] == 'bar_pending': + filtered_kill_reqs = filtered_kill_reqs.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), assignment_state_archive='pending') + else: + filtered_kill_reqs = filtered_kill_reqs + else: + filtered_kill_reqs = filtered_kill_reqs + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت', + 'کشور مقصد', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه', + + ] + + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + worksheet['B1'] = f'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_age = [] + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + killer_exclusive = 0 + all_assignment_state_archive_state = 0 + len_weight_loss = 0 + all_state_ware_house_confirmation = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = int(assignment.get('net_weight')) + real_quantity = assignment.get('real_quantity') + + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_quantity += quantity + all_weighte += weight + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + if weight_loss > 0: + len_weight_loss += 1 + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + all_state_ware_house_confirmation += 1 + + else: + state_ware_house_confirmation = '-' + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['document_status'] if kill['document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{weight_loss}', + export_country, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[40] == 'بار حذف شده': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity') or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity', 0) or 0 + all_weight_loss = filtered_kill_reqs.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_weight_loss = round(int(all_weight_loss) / len_weight_loss, 2) if len_weight_loss > 0 else 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False) + all_quarantine_quantity_has_code = has_code1.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + hasnt_code = filtered_kill_reqs.filter(clearance_code__isnull=True) + all_quarantine_quantity_hasnt_code = hasnt_code.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + value_header_list = [ + len(filtered_kill_reqs), + killer_exclusive, + all_quantity, + int(all_weighte), + round(all_weighte / all_quantity, 1) if all_weighte > 0 and all_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}', + '' + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if request.GET['role'] == 'KillHouse': + name = filtered_kill_request.first()['killhouse_user__name'] + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای کشتارگاه {name}.xlsx"'.encode( + 'utf-8') + elif 'state' in request.GET: + if request.GET['state'] == 'bar_pending': + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای تکمیل نشده.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای تکمیل شده.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارها.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def poultry_request_report_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + filterset_class = PoultryRequestFilterSet + filterset_fields = poultry_request_new_fields + filtered_poultry_request = PoultryRequest.objects.filter( + trash=False, + send_date__date__gte=date1, + send_date__date__lte=date2 + ).select_related('poultry', 'poultry__user', 'hatching', 'poultry__user__city').only('freezing', 'remain_quantity', + 'amount', + 'key', 'poultry', + 'send_date', + 'hatching__date', + 'create_date', 'order_code', + 'poultry__unit_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__user__city__name', + 'hatching__quantity', + 'quantity', + 'hatching__left_over', + 'hatching__chicken_breed', + 'poultry__address__province__name', + 'Index_weight', + 'hatching__quantity', 'union', + 'direct_buying', + 'free_sale_in_province', + 'export').values( + 'key', 'poultry', 'remain_quantity', + 'send_date', + 'hatching__date', + 'create_date', 'order_code', + 'poultry__unit_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__user__city__name', + 'hatching__quantity', + 'quantity', + 'hatching__left_over', + 'hatching__chicken_breed', 'poultry__address__province__name', 'Index_weight', 'amount', 'hatching__quantity', + 'union', 'direct_buying', 'free_sale_in_province', 'freezing', 'export').order_by( + '-send_date') + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_poultry_reqs = filtered_poultry_request.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_poultry_reqs = filtered_poultry_request.filter(poultry__user__city=user.city) + else: + filtered_poultry_reqs = filtered_poultry_request + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_reqs + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_reqs) + filtered_poultry_reqs = ps.filter() + + excel_options = [ + 'ردیف', 'کد سفارش', 'نام واحد', 'نام و نام خانوادگی مرغدار', 'موبایل', 'آدرس', 'تاریخ جوجه ریزی', + 'تعداد کل جوجه ریزی', 'سن مرغ', 'تعداد درخواست کشتار', 'وزن درخواست کشتار', 'میانگین وزنی', 'فروش', + 'کشتار', 'قیمت مرغ زنده', 'تعداد تخصیصی به خریدار', 'مانده قابل تخصیص', 'تعداد قطعه باقی مانده در سالن', + 'نژاد', 'تاریخ درخواست کشتار', 'دامپزشک فارم', 'تلفن دامپزشک فارم', 'وضعیت درخواست', 'خریدار', + 'تعداد تخصیصی قطعه', 'وزن تخصیصی', 'تاریخ تخصیص', 'نوع تخصیص', 'آدرس', 'محل کشتار', 'وضعییت تخصیص به خریدار', + 'تعداد بار ایجاد شده', 'تعداد قطعه تخصیصی به بار', 'وزن تخصیصی به بار', 'مانده قطعه قابل تخصیص', + 'مانده وزن قابل تخصیص', 'ماشین', 'راننده', 'تلفن', 'کد بهداشتی حمل و نقل', 'کد رهگیری سامانه قرنطینه', + 'تعداد ثبت شده در قرنطینه', 'تعداد قطعه بار', 'وزن بار', 'وضعیت بار', 'تعداد تخلیه', 'وزن تخلیه', + 'تاریخ تخلیه کشتارگاه', 'دامپزشک کشتارگاه', 'تلفن دامپزشک کشتارگاه', 'اطلاعات تکمیلی قطعه', + 'اطلاعات تکمیلی وزن', 'کاربر کشتارگاه', 'تلفن کاربرکشتارگاه', + ] + + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + header_list = [ + 'تعداد درخواست های کشتار', 'مجموع قطعه درخواست های کشتار', 'مجموع وزن درخواست های کشتار', + 'تعداد تخصیص به خریداران', 'تعداد قطعه تخصیصی به خریداران', 'وزن تخصیصی به خریداران', + 'مانده قابل تخصیص', 'تعداد بار ایجاد شده', 'تعداد قطعه بار های ایجاد شده', + 'وزن بارهای ایجاد شده', 'تعداد قطعه قابل تخصیص به بار', 'تعداد بارهای دارای کد قرنطینه', + 'مجموع تعداد قطعه ثبت شده در قرنطینه', 'تعداد بارهای تخلیه شده', 'تعداد قطعه بارهای تخلیه شده', + 'وزن بارهای تخلیه شده', 'تعداد بار های تکمیل شده', 'تعداد قطعه بارهای تکمیل شده', + 'وزن بارهای تکمیل شده', + ] + + # برای بالای هدر + + create_header(worksheet, header_list, 4, 2, 21, 16.01) + + if filtered_poultry_reqs.exists(): + province = filtered_poultry_reqs.first()['poultry__address__province__name'] + excel_description(worksheet, 'A2', f' استان {province}', color='red') + + excel_description(worksheet, 'A1', 'گزارش روند پرونده های کشتار مرغ گوشتی', size=11, color='red', row2='C1') + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='C3') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + bar_list2 = 0 + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request__poultry_request__key__in=filtered_poultry_reqs.values('key'), + trash=False, return_to_province=False, state__in=('pending', 'accepted')).select_related( + 'kill_request__kill_house', 'killhouse_user__kill_house_operator', + 'killhouse_user__kill_house_operator__user', 'killhouse_user__kill_house_operator__address', + 'killhouse_user').only('kill_request__slaughter_house', 'kill_request__slaughter_house__name', 'state', + 'key', 'create_date', + 'kill_request__kill_house', 'main_quantity', 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__address__city__name', 'killhouse_user__killer', + 'province_request__poultry_request__Index_weight', 'quantity', + 'province_request__poultry_request__union', + 'province_request__poultry_request__direct_buying', ).values( + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', 'key', 'create_date', + 'kill_request__kill_house', + 'main_quantity', + 'killhouse_user__name', + 'killhouse_user__killer', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__address__city__name', + 'province_request__poultry_request__Index_weight', + 'province_request__poultry_request__union', + 'province_request__poultry_request__direct_buying', + 'state', 'quantity') + + kill_house_requestss = KillHouseRequest.objects.filter( + province_kill_request__key__in=province_kill_requests.values('key'), + trash=False).select_related('add_car__driver', + 'killhouse_user').only( + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__user__fullname', 'killhouse_user', + 'province_kill_request__province_request__poultry_request__Index_weight', 'key', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'traffic_code', 'create_date', + 'clearance_code', + 'killhouse_user__killer', + 'accepted_real_quantity', 'accepted_real_weight', + 'quantity', 'province_request__poultry_request__Index_weight', 'vet_state', + 'assignment_state_archive', 'vet_accepted_real_weight', 'vet_accepted_real_quantity', + 'vet_state', 'accepted_real_weight', 'accepted_assignment_real_weight', + 'accepted_assignment_real_quantity').values('vet_state', 'vet_accepted_real_weight', + 'vet_accepted_real_quantity', + 'quarantine_quantity', 'vet_state', 'assignment_state_archive', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'key', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'traffic_code', + 'create_date', + 'clearance_code', + 'killhouse_user__killer', + 'accepted_real_quantity', + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user', + 'accepted_real_weight', + 'killhouse_user__kill_house_operator__user__mobile', + 'quantity', 'quarantine_quantity', + 'province_request__poultry_request__Index_weight', + 'accepted_real_weight', 'accepted_assignment_real_weight', + 'accepted_assignment_real_quantity') + poultry_ids = [req.get('poultry') for req in filtered_poultry_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + for filtered_poultry_req in filtered_poultry_reqs: + + state_p = 'در انتظار تخصیص استان' + if filtered_poultry_req.get('quantity') != filtered_poultry_req.get('remain_quantity'): + state_p = 'تخصیص داده شد' + vet_farm_id = filtered_poultry_req.get('poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + + age = (filtered_poultry_req.get('send_date').date() - filtered_poultry_req.get( + "hatching__date").date()).days + 1 + gregorian_date = convert_to_shamsi(day=filtered_poultry_req.get("hatching__date").day, + month=filtered_poultry_req.get("hatching__date").month, + year=filtered_poultry_req.get("hatching__date").year + ) + date_of_kill = convert_to_shamsi(day=filtered_poultry_req.get('create_date').day, + month=filtered_poultry_req.get('create_date').month, + year=filtered_poultry_req.get('create_date').year) + + if filtered_poultry_req['free_sale_in_province'] == False: + + sale_type = 'دولتی' + elif filtered_poultry_req['export']: + sale_type = 'صادرات' + + else: + sale_type = 'آزاد' + + province_kill_reqs = province_kill_requests.filter( + province_request__poultry_request__key=filtered_poultry_req.get('key')) + freez_state = 'منجمد' if filtered_poultry_req['freezing'] == True else 'عادی' + list1 = [ + m, + str(filtered_poultry_req.get('order_code')), + filtered_poultry_req.get('poultry__unit_name'), + filtered_poultry_req.get('poultry__user__fullname'), + filtered_poultry_req.get('poultry__user__mobile'), + filtered_poultry_req.get('poultry__user__city__name'), + str(gregorian_date), + filtered_poultry_req.get('hatching__quantity'), + str(age), + filtered_poultry_req.get('quantity'), + int(filtered_poultry_req.get('quantity') * filtered_poultry_req.get('Index_weight')), + filtered_poultry_req.get('Index_weight'), + sale_type, + freez_state, + filtered_poultry_req.get('amount'), + filtered_poultry_req.get('quantity') - filtered_poultry_req.get('remain_quantity'), + filtered_poultry_req.get('remain_quantity'), + filtered_poultry_req.get('hatching__left_over'), + + filtered_poultry_req.get('hatching__chicken_breed'), + str(date_of_kill), + vet_farm_name, + vet_farm_mobile, + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=20) + + state_s = 'در انتظار تخصیص استان' + m += 1 + + if province_kill_reqs.exists(): + quantity_kill_house_request = kill_house_requestss.filter(province_request__poultry_request__key= + filtered_poultry_req['key']) + + if len(province_kill_reqs) > 1: + if len(quantity_kill_house_request) <= 1: + s = len(province_kill_reqs) - 1 + merge_cells(worksheet, l, s, cell1='A', cell2='V') + + # TODO : جایی که باید انجام بشه + if quantity_kill_house_request.exists(): + if len(quantity_kill_house_request) > 1: + s = len(quantity_kill_house_request) - 1 + merge_cells(worksheet, l, s, cell1='A', cell2='V') + + for province_kill_req in province_kill_reqs: + + if province_kill_req['state'] == 'pending': + state_s = 'درانتظار تایید' + + elif province_kill_req['state'] == 'accepted': + state_s = ' تایید شده' + elif province_kill_req['state'] == 'rejected': + state_s = 'رد شده' + + date_of_inner_bar = '-' + + code = '-' + + time = convert_to_shamsi(day=province_kill_req.get('create_date').day, + month=province_kill_req.get('create_date').month, + year=province_kill_req.get('create_date').year) + + if province_kill_req.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + else: + killers = 'کشتارکن' + + kill_house_requests = kill_house_requestss.filter( + province_kill_request__key=province_kill_req['key']) + + all_quantity_of_bar = kill_house_requests.aggregate( + total_quantity=Sum('quantity'))['total_quantity'] or 0 + + bar_weight = int(all_quantity_of_bar * province_kill_req[ + 'province_request__poultry_request__Index_weight']) if all_quantity_of_bar > 0 else 0 + remain_province = int(province_kill_req.get('quantity') * province_kill_req[ + 'province_request__poultry_request__Index_weight']) + + if province_kill_req['province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif province_kill_req[ + 'province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + + slaughter_house__name = province_kill_req.get( + 'kill_request__slaughter_house__name') if province_kill_req.get( + 'kill_request__slaughter_house') is not None else '-' + list1 = [ + state_p, + killers + '(' + province_kill_req.get('killhouse_user__name') + ')', + province_kill_req.get('main_quantity'), + int(province_kill_req.get('main_quantity') * province_kill_req.get( + 'province_request__poultry_request__Index_weight')), + str(time), + type, + province_kill_req.get('killhouse_user__kill_house_operator__address__city__name'), + slaughter_house__name, + state_s, + len(kill_house_requests), + all_quantity_of_bar, + bar_weight, + province_kill_req.get('quantity'), + remain_province, + ] + + create_value(worksheet, list1, l, 23, border_style='thin', m=m - 1, height=20) + + if kill_house_requests.exists(): + + if len(kill_house_requests) > 1: + s = len(kill_house_requests) - 1 + + letters = ["W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ"] + merge_cells(worksheet, l, s, lst=letters) + + for kill_house_request in kill_house_requests: + + bar_list2 += 1 + kil_house_vet = KillHouseVet.objects.filter( + kill_house=kill_house_request.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + if (kill_house_request['assignment_state_archive'] == 'True' and kill_house_request[ + 'vet_state'] == 'pending') or kill_house_request[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + all_quantity_of_bar += kill_house_request['quantity'] + vet_quantity = kill_house_request['vet_accepted_real_quantity'] + vet_wight = kill_house_request['vet_accepted_real_weight'] + kill_house_driver_name = kill_house_request.get('add_car__driver__driver_name') + kill_house_driver_mobile = kill_house_request.get('add_car__driver__driver_mobile') + kill_house_driver_type_car = kill_house_request.get('add_car__driver__type_car') + kill_house_traffic_code = kill_house_request.get('traffic_code') + vet_checks = VetCheckRequest.objects.filter( + kill_house_request__key=kill_house_request.get('key')).only( + 'create_date').values('create_date').first() + + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill_house_request.get('key')).only('real_quantity', + 'net_weight', + 'create_date').values( + 'real_quantity', 'net_weight', 'create_date').first() + if assignment: + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + if kill_house_request.get('clearance_code'): + code = kill_house_request.get('clearance_code') + + quarantine_quantity = kill_house_request['quarantine_quantity'] if kill_house_request[ + 'quarantine_quantity'] else '-' + + list1 = [ + kill_house_driver_type_car, + kill_house_driver_name, + kill_house_driver_mobile, + kill_house_traffic_code, + code, + quarantine_quantity, + kill_house_request['quantity'], + int(kill_house_request['accepted_real_weight']), + state, + vet_quantity, + vet_wight, + str(date_of_inner_bar), + kill_house_vet_name, + kill_house_vet_mobile, + kill_house_request['accepted_assignment_real_quantity'], + int(kill_house_request['accepted_assignment_real_weight']), + kill_house_request['killhouse_user__kill_house_operator__user__fullname'], + kill_house_request['killhouse_user__kill_house_operator__user__mobile'], + ] + create_value(worksheet, list1, l, 37, border_style='thin', m=m - 1) + l += 1 + else: + list1 = ['-'] * 18 + create_value(worksheet, list1, l, 37, border_style='thin', m=m - 1) + l += 1 + + + else: + list1 = ['-'] * 32 + create_value(worksheet, list1, l, 23, border_style='thin', m=m - 1) + l += 1 + + aggregates = filtered_poultry_reqs.aggregate( + total_quantity=Sum('quantity'), + total_remain_quantity=Sum('remain_quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')), + total_hatching=Sum('hatching__quantity'), + total_left_over=Sum('hatching__left_over'), + ) + all_poultry_request = aggregates['total_quantity'] or 0 + all_remain_quantity = aggregates['total_remain_quantity'] or 0 + all_wight = aggregates['total_weight'] or 0 + all_hatching = aggregates['total_hatching'] or 0 + all_hatching_left_over = aggregates['total_left_over'] or 0 + sum_province_to_kill_house = all_poultry_request - all_remain_quantity + + aggregates_province_kill_req = province_kill_requests.aggregate( + total_main_quantity=Sum('main_quantity'), + total_weight=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight')), + total_quantity=Sum('quantity') + ) + all_main_quantity = aggregates_province_kill_req['total_main_quantity'] or 0 + all_wight_killer = aggregates_province_kill_req['total_weight'] or 0 + sum_all_remain_quantity_of_bar = aggregates_province_kill_req['total_quantity'] or 0 + + bar_list = len(kill_house_requestss) + aggregates_kill_req = kill_house_requestss.aggregate( + total_quantity=Sum('quantity'), + total_weight=Sum('quantity'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + ) + + sum_all_quantity_of_bar = aggregates_kill_req['total_quantity'] or 0 + sum_all_weight_of_bar = aggregates_kill_req['total_weight'] or 0 + all_qarantine = aggregates_kill_req['total_quarantine_quantity'] or 0 + all_kill_house_request_has_qarantite = len(kill_house_requestss.filter(clearance_code__isnull=False)) + all_vet_quantity = aggregates_kill_req['total_vet_accepted_real_quantity'] or 0 + all_vet_wight = aggregates_kill_req['total_vet_accepted_real_weight'] or 0 + + all_assigment = kill_house_requestss.filter(assignment_state_archive='True') + + vet_state_accepted = len(kill_house_requestss.filter(vet_state='accepted')) + + all_assignment_quantity = all_assigment.aggregate( + total_quantity=Sum('accepted_assignment_real_quantity'))['total_quantity'] or 0 + + all_assignment_weight = all_assigment.aggregate( + total_quantity=Sum('accepted_assignment_real_weight'))['total_quantity'] or 0 + all_reamin_province = sum_all_remain_quantity_of_bar + + value_header_list = [ + len(filtered_poultry_reqs), + all_poultry_request, + all_wight, + len(province_kill_requests), + all_main_quantity, + all_wight_killer, + all_remain_quantity, + bar_list, + sum_all_quantity_of_bar, + sum_all_weight_of_bar, + sum_all_remain_quantity_of_bar, + all_kill_house_request_has_qarantite, + all_qarantine, + vet_state_accepted, + all_vet_quantity, + all_vet_wight, + len(all_assigment), + all_assignment_quantity, + all_assignment_weight, + + ] + create_value(worksheet, value_header_list, 3, 4) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + all_hatching, + '', + all_poultry_request, + all_wight, + '', + '', + '', + '', + sum_province_to_kill_house, + all_remain_quantity, + all_hatching_left_over, + '', + '', + '', + '', + '', + '', + all_main_quantity, + all_wight_killer, + '', + '', + '', + '', + '', + '', + sum_all_quantity_of_bar, + sum_all_weight_of_bar, + sum_all_remain_quantity_of_bar, + all_reamin_province, + '', + '', + '', + '', + '', + all_qarantine, + sum_all_quantity_of_bar, + sum_all_weight_of_bar, + '', + all_vet_quantity, + all_vet_wight, + '', + '', + '', + all_assignment_quantity, + all_assignment_weight, + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 + + +def transacion_out_request_excel(request): + filterset_class = InternalTransactionFilterSet + filterset_fields = [ + 'saleReferenceId', + 'refId', + 'orderId', + 'cardHolderPan', + 'payer_fullname', + 'payer_mobile', + 'user__fullname', + 'user__first_name', + 'user__last_name', + 'user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__mobile', + 'out_province_poultry_request_buyer__user__fullname', + 'out_province_poultry_request_buyer__user__first_name', + 'out_province_poultry_request_buyer__user__last_name', + 'out_province_poultry_request_buyer__user__mobile', + + ] + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['type'] == 'poultry': + transactions = InternalTransaction.objects.filter( + payer_type='poultry', + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('-date') + type_transactions = 'مرغدار' + + else: + transactions = InternalTransaction.objects.filter( + payer_type='buyer', + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('-date') + type_transactions = 'خریدار' + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = filterset_class(data=query, queryset=transactions) + transactions = ps.filter() + excel_options = [ + 'ردیف', + 'کد سفارش', + 'پرداخت کننده', + 'تلفن پرداخت کننده', + 'تاریخ پرداخت', + 'مبلغ کل تراکنش(ریال)', + 'سهم اتحادیه(ریال)', + 'سهم شرکت(ریال)', + 'سهم صنف(ریال)', + 'سهم دیگر(ریال)', + 'شماره پیگیری', + 'شماره سفارش', + ] + + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + header_list = [ + 'تعداد تراکنش ها', + 'مبلغ کل(ریال)', + 'سهم اتحادیه(ریال)', + 'سهم شرکت(ریال)', + 'سهم صنف(ریال)', + 'سهم دیگر(ریال)', + ] + + # برای بالای هدر + + create_header(worksheet, header_list, 4, 2, 21, 16.01) + + excel_description(worksheet, 'A1', f'تراکنش های خارج از استان {type_transactions}', size=11, color='red', row2='C1') + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='C3') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + new_row = 7 + for transaction in transactions: + if transaction.kill_house != None: + fullname = transaction.kill_house.kill_house_operator.user.fullname + mobile = transaction.kill_house.kill_house_operator.user.mobile + elif transaction.out_province_poultry_request_buyer != None: + fullname = transaction.out_province_poultry_request_buyer.user.fullname + mobile = transaction.out_province_poultry_request_buyer.user.mobile + elif transaction.chain_company != None: + fullname = transaction.chain_company.user.fullname + mobile = transaction.chain_company.user.mobile + + else: + fullname = transaction.user.fullname + mobile = transaction.user.mobile + + order_codes = transaction.poultry_request.filter(trash=False) + + if order_codes: + + for order in order_codes: + + list11 = [ + m, + str(order.order_code), + ] + create_value(worksheet, list11, new_row, 1, m=m, border_style='thin', height=25) + + if len(order_codes) > 1: + merge_cells(worksheet, l, len(order_codes) - 1, cell1='C', cell2='L') + print(l) + list1 = [ + fullname, + mobile, + str(convert_to_shamsi(datetime=transaction.date)), + transaction.amount, + transaction.union_share, + transaction.company_share, + transaction.guilds_share, + transaction.other_share, + str(transaction.refId), + str(transaction.orderId), + + ] + create_value(worksheet, list1, l, 3, m=m, border_style='thin', height=25) + m += 1 + new_row = new_row + 1 + + + + else: + list1 = [ + m, + '-', + fullname, + mobile, + str(convert_to_shamsi(datetime=transaction.date)), + transaction.amount, + transaction.union_share, + transaction.company_share, + transaction.guilds_share, + transaction.other_share, + str(transaction.refId), + str(transaction.orderId), + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=20) + m += 1 + l += len(order_codes) + + all_amount = \ + transactions.aggregate( + total=Sum('amount'))[ + 'total'] or 0 + all_union_share = \ + transactions.aggregate( + total=Sum('union_share'))[ + 'total'] or 0 + all_company_share = \ + transactions.aggregate( + total=Sum('company_share'))[ + 'total'] or 0 + all_guilds_share = \ + transactions.aggregate( + total=Sum('guilds_share'))[ + 'total'] or 0 + all_other_share = \ + transactions.aggregate( + total=Sum('other_share'))[ + 'total'] or 0 + value_header_list = [ + len(transactions), + all_amount, + all_union_share, + all_company_share, + all_guilds_share, + all_other_share + + ] + create_value(worksheet, value_header_list, 3, 4) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + all_amount, + all_union_share, + all_company_share, + all_guilds_share, + all_other_share, + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename=" تراکنش های خارج استان {type_transactions} .xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def from_allocation_to_distribution_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_houses = KillHouse.objects.filter(trash=False, active=True).order_by('id') + province_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), + return_to_province=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2) + kill_house_requests = KillHouseRequest.objects.filter( + province_kill_request__key__in=province_requests.values('key'), + trash=False) + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + date__date__gte=date1, date__date__lte=date2, + trash=False) + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + kill_house_free_bars = KillHouseFreeSaleBarInformation.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2) + + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + + sheet_name = 'اطلاعات کلی' + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + worksheet = workbook.create_sheet(sheet_name) + + killhouse_user = kill_house_requests.values_list('killhouse_user__id', flat=True).distinct() + if sheet_name == 'اطلاعات کلی': + excel_options = [ + 'ردیف', + 'نام واحد', + 'مالک', + 'تلفن مالک', + 'ماهیت', + 'تعداد سفارشات', + 'حجم سفارشات', + 'وزن سفارشات', + 'تعداد تخصیصات دولتی', + 'حجم تخصیصات دولتی', + 'وزن تخصیصات دولتی', + ' میانگین وزن تخصیصات دولتی', + ' تعداد تخصیصات آزاد', + 'حجم تخصیصات آزاد', + ' وزن تخصیصات آزاد', + ' میانگین وزن تخصیصات آزاد', + + 'تعداد خرید مستقیم', + 'حجم خرید مستقیم', + 'وزن خرید مستقیم', + ' میانگین وزن خرید مستقیم', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + ' میانگین وزن بار ایجاد شده', + 'تعداد بار تخلیه شده', + 'حجم بار تخلیه شده', + 'وزن بار تخلیه شده', + ' میانگین وزن بار تخلیه شده', + 'تعداد بار ورودی به انبار', + 'حجم تقریبی بار ورودی به انبار', + 'وزن بار ورودی به انبار', + ' میانگین وزن بار ورودی به انبار', + 'تعداد توزیع درون استان', + 'حجم تقریبی توزیع درون استان', + 'وزن توزیع درون استان', + ' میانگین وزن توزیع درون استان', + 'تعداد توزیع خارج استان', + 'حجم تقریبی توزیع خارج استان', + 'وزن توزیع خارج استان', + ' میانگین وزن توزیع خارج استان', + + 'حجم تقریبی مانده در انبار', + 'وزن مانده در انبار', + ' میانگین وزن مانده در انبار', + + ] + header_list = [ + 'ردیف', + 'نام واحد', + 'مالک', + 'تلفن مالک', + 'ماهیت', + 'تعداد سفارشات', + 'حجم سفارشات', + 'وزن سفارشات', + 'میانگین وزن سفارشات', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + + 'تعداد بار ورودی به انبار', + 'حجم تقریبی بار ورودی به انبار', + 'وزن بار ورودی به انبار', + 'تعداد توزیع درون استان', + 'حجم تقریبی توزیع درون استان', + 'وزن توزیع درون استان', + 'تعداد توزیع خارج استان', + 'حجم تقریبی توزیع خارج استان', + 'وزن توزیع خارج استان', + + 'حجم تقریبی مانده در انبار', + 'وزن مانده در انبار', + ] + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + create_header(worksheet, header_list, 4, 2, 21, 16.01, color='blue') + province = kill_houses.first().kill_house_operator.user.province.name + excel_description(worksheet, 'A1', f' گزارش عملکرد خریداران استان {province}', size=11, color='red', row2='C1') + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='C3') + + m = 1 + header_row = 3 + l = 3 + excel_description(worksheet, 'I1', 'اطلاعات کلی کشتار', color='red', row2='K1') + all_len_province_kill_request = 0 + all_quantity_province_kill_request = 0 + all_weight_province_kill_request = 0 + for kill_house in kill_houses: + cell_color_changer(worksheet, l, 5, 8, 'FBFEE2') + percentage = KillHousePercentage.objects.filter(kill_house=kill_house).select_related( + 'kill_house_for_killer', + 'kill_house').first() + if percentage: + if percentage.kill_house_for_killer != None: + place = percentage.kill_house_for_killer.name + else: + place = percentage.kill_house.name + else: + place = kill_house.name + killer_type = 'کشتارگاه' + if kill_house.killer == True: + type = 'کشتارکن' + if kill_house.type == 'public': + killer_type = f'{type} عمومی ' + else: + killer_type = f' {type} اختصاصی ({place})' + + # all + province_kill_request = province_requests.filter(killhouse_user=kill_house) + + # goveerment + province_kill_request_goverment = province_kill_request.filter( + province_request__poultry_request__free_sale_in_province=False) + quantity_province_kill_request_goverment = \ + province_kill_request_goverment.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + weight_province_kill_request_goverment = \ + province_kill_request_goverment.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + # cell_color_changer(worksheet, l, 9, 13, 'EBF1DE') + # free + province_kill_request_free = province_kill_request.filter( + province_request__poultry_request__free_sale_in_province=True) + quantity_province_kill_request_free = \ + province_kill_request_free.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + weight_province_kill_request_free = \ + province_kill_request_free.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + # cell_color_changer(worksheet, l, 13, 17, 'DDD9C4') + # direct_buying + province_kill_request_direct_buying = province_kill_request.filter( + province_request__poultry_request__direct_buying=True) + quantity_province_kill_request_direct_buying = \ + province_kill_request_direct_buying.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + weight_province_kill_request_direct_buying = \ + province_kill_request_direct_buying.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + # cell_color_changer(worksheet, l, 17, 21, 'C5D9F1') + # all + len_province_kill_request = len(province_kill_request_goverment) + \ + len(province_kill_request_free) + len(province_kill_request_direct_buying) + quantity_province_kill_request = quantity_province_kill_request_goverment + quantity_province_kill_request_free + \ + quantity_province_kill_request_direct_buying + + weight_province_kill_request = weight_province_kill_request_goverment + weight_province_kill_request_free + \ + weight_province_kill_request_direct_buying + # cell_color_changer(worksheet, l, 6, 9, 'C5D9F1') + # all_len_province_kill_request += len_province_kill_request + # all_quantity_province_kill_request += quantity_province_kill_request + # all_weight_province_kill_request += weight_province_kill_request + # bar + kill_house_request = kill_house_requests.filter(Q(Q(killer=kill_house) & Q(killhouse_user=kill_house)) | Q( + Q(killer__isnull=True) & Q(killhouse_user=kill_house)) | Q( + Q(killer__isnull=True) | Q(killer=kill_house))) + + kill_house_request = kill_house_request.filter(Q(killer=kill_house) | Q(killhouse_user=kill_house)) + quantity_kill_house_request = \ + kill_house_request.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + weight_kill_house_request = \ + kill_house_request.aggregate( + total=Sum(F('quantity') * F('province_request__poultry_request__Index_weight')))[ + 'total'] or 0 + cell_color_changer(worksheet, l, 13, 16, 'D8E4BC') + + # ware_house_confirmation + ware_house_confirmation = kill_house_request.filter(ware_house_confirmation=True) + quantity_kill_house_request_ware_house = \ + ware_house_confirmation.aggregate( + total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + weight_kill_house_request_ware_house = \ + ware_house_confirmation.aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + cell_color_changer(worksheet, l, 16, 19, 'E6B8B7') + # in_province + kill_house_ware_house = kill_house_ware_houses.filter(kill_house=kill_house) + steward_allocation = steward_allocations.filter(ware_house__in=kill_house_ware_house) + total_allocated_quantity = \ + steward_allocation.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + + total_allocated_weight = \ + steward_allocation.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + # cell_color_changer(worksheet, l, 19, 22, 'EBF1DE') + # out_province + kill_house_free_bar = kill_house_free_bars.filter(kill_house=kill_house) + total_quantity = kill_house_free_bar.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = kill_house_free_bar.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + cell_color_changer(worksheet, l, 22, 25, '95B3D7') + # remain_ + + total_remain_quantity = \ + kill_house_ware_house.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] or 0 + total_remain_weight = \ + kill_house_ware_house.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] or 0 + cell_color_changer(worksheet, l, 25, 27, 'DA9694') + value_header_list = [ + m, + kill_house.name, + kill_house.kill_house_operator.user.fullname, + kill_house.kill_house_operator.user.mobile, + killer_type, + len_province_kill_request, + quantity_province_kill_request, + weight_province_kill_request, + str(round(weight_province_kill_request / quantity_province_kill_request, + 1) if weight_province_kill_request > 0 else 0), + len(kill_house_request), + quantity_kill_house_request, + weight_kill_house_request, + + len(ware_house_confirmation), + quantity_kill_house_request_ware_house, + weight_kill_house_request_ware_house, + + len(steward_allocation), + total_allocated_quantity, + total_allocated_weight, + + len(kill_house_free_bar), + total_quantity, + total_weight, + + total_remain_quantity, + total_remain_weight, + + ] + create_value(worksheet, value_header_list, l, 4, border_style='thin') + l += 1 + header_row += 1 + m += 1 + l += 3 + create_header_freez(worksheet, excel_options, 1, l, l + 1, 20) + m = 1 + excel_description(worksheet, f'I{l - 1}', 'جزئیات کشتار', color='red', row2=f'K{l - 1}') + for kill_house in kill_houses: + percentage = KillHousePercentage.objects.filter(kill_house=kill_house).select_related( + 'kill_house_for_killer', + 'kill_house').first() + if percentage: + if percentage.kill_house_for_killer != None: + place = percentage.kill_house_for_killer.name + else: + place = percentage.kill_house.name + else: + place = kill_house.name + killer_type = 'کشتارگاه' + if kill_house.killer == True: + type = 'کشتارکن' + if kill_house.type == 'public': + killer_type = f'{type} عمومی ' + else: + killer_type = f' {type} اختصاصی ({place})' + + # all + province_kill_request = province_requests.filter(killhouse_user=kill_house) + + # goveerment + province_kill_request_goverment = province_kill_request.filter( + province_request__poultry_request__free_sale_in_province=False) + quantity_province_kill_request_goverment = \ + province_kill_request_goverment.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + weight_province_kill_request_goverment = \ + province_kill_request_goverment.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + cell_color_changer(worksheet, l + 1, 9, 13, 'EBF1DE') + # free + province_kill_request_free = province_kill_request.filter( + province_request__poultry_request__free_sale_in_province=True) + quantity_province_kill_request_free = \ + province_kill_request_free.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + weight_province_kill_request_free = \ + province_kill_request_free.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + cell_color_changer(worksheet, l + 1, 13, 17, 'DDD9C4') + # direct_buying + province_kill_request_direct_buying = province_kill_request.filter( + province_request__poultry_request__direct_buying=True) + quantity_province_kill_request_direct_buying = \ + province_kill_request_direct_buying.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + weight_province_kill_request_direct_buying = \ + province_kill_request_direct_buying.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + cell_color_changer(worksheet, l + 1, 17, 21, 'C5D9F1') + # all + len_province_kill_request = len(province_kill_request_goverment) + \ + len(province_kill_request_free) + len(province_kill_request_direct_buying) + quantity_province_kill_request = quantity_province_kill_request_goverment + quantity_province_kill_request_free + \ + quantity_province_kill_request_direct_buying + + weight_province_kill_request = weight_province_kill_request_goverment + weight_province_kill_request_free + \ + weight_province_kill_request_direct_buying + cell_color_changer(worksheet, l + 1, 6, 9, 'C5D9F1') + all_len_province_kill_request += len_province_kill_request + all_quantity_province_kill_request += quantity_province_kill_request + all_weight_province_kill_request += weight_province_kill_request + # bar + kill_house_request = kill_house_requests.filter(Q(Q(killer=kill_house) & Q(killhouse_user=kill_house)) | Q( + Q(killer__isnull=True) & Q(killhouse_user=kill_house)) | Q( + Q(killer__isnull=True) | Q(killer=kill_house))) + + kill_house_request = kill_house_request.filter(Q(killer=kill_house) | Q(killhouse_user=kill_house)) + quantity_kill_house_request = \ + kill_house_request.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + weight_kill_house_request = \ + kill_house_request.aggregate( + total=Sum(F('quantity') * F('province_request__poultry_request__Index_weight')))[ + 'total'] or 0 + cell_color_changer(worksheet, l + 1, 21, 25, 'EBF1DE') + # assignment_state_archive + assignment_state_archive = kill_house_request.filter(assignment_state_archive='True') + quantity_kill_house_request_assignment = \ + assignment_state_archive.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + weight_kill_house_request_assignment = \ + assignment_state_archive.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + cell_color_changer(worksheet, l + 1, 25, 29, 'DDD9C4') + # ware_house_confirmation + ware_house_confirmation = kill_house_request.filter(ware_house_confirmation=True) + quantity_kill_house_request_ware_house = \ + ware_house_confirmation.aggregate( + total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + weight_kill_house_request_ware_house = \ + ware_house_confirmation.aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + cell_color_changer(worksheet, l + 1, 29, 33, 'C5D9F1') + # in_province + kill_house_ware_house = kill_house_ware_houses.filter(kill_house=kill_house) + steward_allocation = steward_allocations.filter(ware_house__in=kill_house_ware_house) + total_allocated_quantity = \ + steward_allocation.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + + total_allocated_weight = \ + steward_allocation.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + cell_color_changer(worksheet, l + 1, 33, 37, 'EBF1DE') + # out_province + kill_house_free_bar = kill_house_free_bars.filter(kill_house=kill_house) + total_quantity = kill_house_free_bar.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = kill_house_free_bar.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + cell_color_changer(worksheet, l + 1, 37, 41, 'DDD9C4') + # remain_ + + total_remain_quantity = \ + kill_house_ware_house.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] or 0 + total_remain_weight = \ + kill_house_ware_house.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] or 0 + cell_color_changer(worksheet, l + 1, 41, 44, 'C5D9F1') + list1 = [ + m, + kill_house.name, + kill_house.kill_house_operator.user.fullname, + kill_house.kill_house_operator.user.mobile, + killer_type, + len_province_kill_request, + quantity_province_kill_request, + weight_province_kill_request, + + len(province_kill_request_goverment), + quantity_province_kill_request_goverment, + weight_province_kill_request_goverment, + str(round(weight_province_kill_request_goverment / quantity_province_kill_request_goverment, + 1) if weight_province_kill_request_goverment > 0 else 0), + len(province_kill_request_free), + quantity_province_kill_request_free, + weight_province_kill_request_free, + str(round(weight_province_kill_request_free / quantity_province_kill_request_free, + 1) if weight_province_kill_request_free > 0 else 0), + len(province_kill_request_direct_buying), + quantity_province_kill_request_direct_buying, + weight_province_kill_request_direct_buying, + str(round(weight_province_kill_request_direct_buying / quantity_province_kill_request_direct_buying, + 1) if weight_province_kill_request_direct_buying > 0 else 0), + len(kill_house_request), + quantity_kill_house_request, + weight_kill_house_request, + str(round(weight_kill_house_request / quantity_kill_house_request, + 1) if weight_kill_house_request > 0 else 0), + len(assignment_state_archive), + quantity_kill_house_request_assignment, + weight_kill_house_request_assignment, + str(round(weight_kill_house_request_assignment / quantity_kill_house_request_assignment, + 1) if weight_kill_house_request_assignment > 0 else 0), + len(ware_house_confirmation), + quantity_kill_house_request_ware_house, + weight_kill_house_request_ware_house, + str(round(weight_kill_house_request_ware_house / quantity_kill_house_request_ware_house, + 1) if weight_kill_house_request_ware_house > 0 else 0), + len(steward_allocation), + total_allocated_quantity, + total_allocated_weight, + str(round(total_allocated_weight / total_allocated_quantity, + 1) if total_allocated_weight > 0 else 0), + len(kill_house_free_bar), + total_quantity, + total_weight, + str(round(int(total_weight) / total_quantity, + 1) if total_weight > 0 and total_quantity > 0 else 0), + total_remain_quantity, + total_remain_weight, + str(round(total_remain_weight / total_remain_quantity, + 1) if total_remain_weight > 0 else 0), + + ] + create_value(worksheet, list1, l + 1, 1, border_style='thin', height=25) + + m += 1 + + l += 1 + province_kill_request_goverment1 = province_requests.filter( + province_request__poultry_request__free_sale_in_province=False) + quantity_province_kill_request_goverment = \ + province_kill_request_goverment1.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + weight_province_kill_request_goverment = \ + province_kill_request_goverment1.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + province_kill_request_free = province_requests.filter( + province_request__poultry_request__free_sale_in_province=True) + quantity_province_kill_request_free = \ + province_kill_request_free.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + weight_province_kill_request_free = \ + province_kill_request_free.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + province_kill_request_direct_buying = province_requests.filter( + province_request__poultry_request__direct_buying=True) + quantity_province_kill_request_direct_buying = \ + province_kill_request_direct_buying.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + weight_province_kill_request_direct_buying = \ + province_kill_request_direct_buying.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + quantity_kill_house_request = \ + kill_house_requests.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + weight_kill_house_request = \ + kill_house_requests.aggregate( + total=Sum(F('quantity') * F('province_request__poultry_request__Index_weight')))[ + 'total'] or 0 + # assignment_state_archive + assignment_state_archive = kill_house_requests.filter(assignment_state_archive='True') + quantity_kill_house_request_assignment = \ + assignment_state_archive.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + weight_kill_house_request_assignment = \ + assignment_state_archive.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + ware_house_confirmation = kill_house_requests.filter(ware_house_confirmation=True) + quantity_kill_house_request_ware_house = \ + ware_house_confirmation.aggregate( + total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + weight_kill_house_request_ware_house = \ + ware_house_confirmation.aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_quantity = kill_house_free_bars.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = kill_house_free_bars.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] or 0 + + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] or 0 + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + all_len_province_kill_request, + all_quantity_province_kill_request, + all_weight_province_kill_request, + len(province_kill_request_goverment1), + quantity_province_kill_request_goverment, + weight_province_kill_request_goverment, + str(round(weight_province_kill_request_goverment / quantity_province_kill_request_goverment, + 1) if weight_province_kill_request_goverment > 0 else 0), + len(province_kill_request_free), + quantity_province_kill_request_free, + weight_province_kill_request_free, + str(round(weight_province_kill_request_free / quantity_province_kill_request_free, + 1) if weight_province_kill_request_free > 0 else 0), + len(province_kill_request_direct_buying), + quantity_province_kill_request_direct_buying, + weight_province_kill_request_direct_buying, + str(round(weight_province_kill_request_direct_buying / quantity_province_kill_request_direct_buying, + 1) if weight_province_kill_request_direct_buying > 0 else 0), + len(kill_house_requests), + quantity_kill_house_request, + weight_kill_house_request, + str(round(weight_kill_house_request / quantity_kill_house_request, + 1) if weight_kill_house_request > 0 else 0), + len(assignment_state_archive), + quantity_kill_house_request_assignment, + weight_kill_house_request_assignment, + str(round(weight_kill_house_request_assignment / quantity_kill_house_request_assignment, + 1) if weight_kill_house_request_assignment > 0 else 0), + len(ware_house_confirmation), + quantity_kill_house_request_ware_house, + weight_kill_house_request_ware_house, + str(round(weight_kill_house_request_ware_house / quantity_kill_house_request_ware_house, + 1) if weight_kill_house_request_ware_house > 0 else 0), + len(steward_allocations), + total_allocated_quantity, + total_allocated_weight, + str(round(total_allocated_weight / total_allocated_quantity, + 1) if total_allocated_weight > 0 else 0), + len(kill_house_free_bars), + total_quantity, + total_weight, + str(round(total_weight / total_quantity, + 1) if total_weight > 0 else 0), + total_remain_quantity, + total_remain_weight, + str(round(total_remain_weight / total_remain_quantity, + 1) if total_remain_weight > 0 else 0), + + ] + create_value(worksheet, list2, l + 1, 1, color='green') + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + all_len_province_kill_request, + all_quantity_province_kill_request, + all_weight_province_kill_request, + str(round(all_weight_province_kill_request / all_quantity_province_kill_request, + 1) if all_weight_province_kill_request > 0 else 0), + + len(kill_house_requests), + quantity_kill_house_request, + weight_kill_house_request, + + len(ware_house_confirmation), + quantity_kill_house_request_ware_house, + weight_kill_house_request_ware_house, + + len(steward_allocations), + total_allocated_quantity, + total_allocated_weight, + + len(kill_house_free_bars), + total_quantity, + total_weight, + + total_remain_quantity, + total_remain_weight, + + ] + create_value(worksheet, list2, header_row - 1, 4, color='blue') + for kill_house_id in killhouse_user: + kill_house = KillHouse.objects.get(trash=False, id=kill_house_id) + sheet_name = kill_house.name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + filtered_kill_reqs = kill_house_requests.filter( + killhouse_user=kill_house).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت', + 'کشور مقصد', + + ] + + from_date_1 = shamsi_date(date1) + + to_date_1 = shamsi_date(date2) + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه', + + ] + + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + header_list3 = [ + 'درصد بارهای دارای کد قرنطینه', + 'درصد تعداد بارهای احراز شده از قرنطینه', + 'درصد تعداد بارهای تکمیل شده کشتارگاه', + 'درصد وزن نهایی در کشتارگاه نسبت به وزن کل', + 'درصد بارهای فاقد کد قرنطینه', + 'درصد بارهای اختلاف دار در قرنطینه و رصدیار', + 'درصد تعداد بارهای ورودی به انبار', + 'درصد وزن لاشه ها در انبار نسبت به وزن کل', + 'درصد وزن لاشه در انبار نسبت به وزن نهایی در کشتارگاه', + + ] + create_header(worksheet, header_list, 9, 2, height=21.8) + + create_header(worksheet, header_list2, 6, 2, height=21.8, color='green') + + create_header(worksheet, header_list3, 6, 5, height=43, color='orange', text_color='0D0D0D') + create_header_freez(worksheet, excel_options, 1, 8, 9, height=21, len_with=True) + + excel_description(worksheet, 'B1', + f'گزارش بارهای ایجاد شده کشتارگاه {kill_house.name} در فرآیند کشتار مرغ گوشتی', color='red', + row2='E1') + + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + excel_description(worksheet, 'B2', f'استان {name}', color='red', row2='D2') + excel_description(worksheet, 'B3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='D3') + + l = 8 + m = 1 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, + day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{weight_loss}', + export_country, + + ] + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=40, different_value='بار حذف شده') + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs['total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + 2) if all_weight_loss > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, + 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 3, 6) + value_header_list2 = [ + f'%{round((has_code * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((has_qarantine * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((len(bar_complete) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_net_weighte) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((len(hasnt_code1) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((difference_bar * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((all_state_ware_house_confirmation * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_net_weighte), 2) if int(all_net_weighte) > 0 else 0}' + ] + create_value(worksheet, value_header_list2, 6, 6) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}', + '' + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 + + +def all_distribution_province(request): + sheet_names2 = [ + 'اطلاعات کلی', + 'تخصیصات کشتارگاه به مباشر و صنف', + 'تخصیصات مباشر به صنف', + # 'تخصیصات مباشر به مباشر', + 'تخصیصات صنف به صنف', + 'تخصیصات سرد خانه', + 'عملکرد مباشرین', + 'تراکنش های صنوف', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + for name in sheet_names2: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + if sheet_name == 'اطلاعات کلی': + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + excel_description(worksheet, 'B2', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='E2') + excel_description(worksheet, 'B1', f'اطلاعات کلی', row2='E1') + header_list2 = [ + 'ماهیت', + 'اطلاعات فروشنده', + 'مانده در انبار قبل از توزیع', + 'وزن ورودی به انبار فروشنده ', + 'تعداد کل توزیع شده', + ' وزن کل خروجی از انبار (توزیع شده)', + 'کل وزن فروش به خارج از استان', + 'تعداد توزیع به مباشرین', + 'وزن توزیع به مباشرین', + 'تعداد توزیع به صنف', + 'وزن توزیع به صنف', + 'درصد توزیع فروشنده', + 'مانده انبار', + + ] + create_header(worksheet, header_list2, 3, 4, border_style='thin', width=20) + + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + l = 5 + for kill_house in kill_houses: + if kill_house.killer == True and kill_house.type == 'exclusive': + parent = KillHousePercentage.objects.get(kill_house=kill_house, trash=False) + killer_type = f'کشتارکن اختصاصی {parent.kill_house_for_killer.name}' + elif kill_house.killer == True and kill_house.type == 'public': + killer_type = 'کشتارکن عمومی' + else: + killer_type = 'کشتارگاه' + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_house_request = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=True, trash=False, + calculate_status=True + , kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2) + kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter( + kill_house=kill_house, trash=False, + calculate_status=True, date__date__gte=date1, + date__date__lte=date2, ware_house=True) + allocations = StewardAllocation.objects.filter( + receiver_state__in=('pending', 'accepted'), + trash=False, date__date__gte=date1, + date__date__lte=date2, kill_house=kill_house).order_by('id') + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + trash=False, calculate_status=True, date__date__gte=date1, + date__date__lte=date2, ) + else: + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + + trash=False, calculate_status=True) + kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter( + kill_house=kill_house, trash=False, + calculate_status=True, ware_house=True) + kill_house_request = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=True, trash=False, + calculate_status=True + ) + allocations = StewardAllocation.objects.filter( + trash=False, kill_house=kill_house, receiver_state__in=('pending', 'accepted')).order_by('id') + kill_house_to_stw = allocations.filter(allocation_type='killhouse_steward') + quantity_allocations = allocations.aggregate( + total_quantity=Sum('real_number_of_carcasses')).get( + 'total_quantity') or 0 + quantity_kill_house_free_sale_bars = kill_house_free_sale_bars.aggregate( + total_quantity=Sum('real_number_of_carcasses')).get( + 'total_quantity') or 0 + + weight_allocations = allocations.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + weight_kill_house_free_sale_bars = kill_house_free_sale_bars.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + quantity_kill_house_to_stw = kill_house_to_stw.aggregate( + total_quantity=Sum('real_number_of_carcasses')).get( + 'total_quantity') or 0 + weight_kill_house_to_stw = kill_house_to_stw.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + kill_house_to_guild = allocations.filter(allocation_type='killhouse_guild') + quantity_kill_house_to_guild = kill_house_to_guild.aggregate( + total_quantity=Sum('real_number_of_carcasses')).get( + 'total_quantity') or 0 + + weight_kill_house_to_guild = kill_house_to_guild.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + ware_house_accepted_real_weight = kill_house_request.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity') or 0 + + weight_of_carcasses = kill_house_free_buying_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + product = RolesProducts.objects.filter(trash=False, kill_house=kill_house).first() + if product: + total_remain_weight = product.total_remain_weight + else: + total_remain_weight = 0 + + list1 = [ + killer_type, + f"{kill_house.name}-{kill_house.kill_house_operator.user.mobile}-{kill_house.kill_house_operator.user.city.name}", + ((weight_allocations + weight_kill_house_free_sale_bars) - ( + ware_house_accepted_real_weight + weight_of_carcasses) + total_remain_weight), + ware_house_accepted_real_weight + weight_of_carcasses, + len(allocations), + weight_allocations + weight_kill_house_free_sale_bars, + weight_kill_house_free_sale_bars, + len(kill_house_to_stw), + weight_kill_house_to_stw, + len(kill_house_to_guild), + weight_kill_house_to_guild, + f"%{int((weight_allocations + weight_kill_house_free_sale_bars) * 100 / (ware_house_accepted_real_weight + weight_of_carcasses)) if (ware_house_accepted_real_weight + weight_of_carcasses) > 0 else 0}", + total_remain_weight + + ] + create_value(worksheet, list1, l, 3, border_style='thin', width=20) + l += 1 + l += 7 + create_header(worksheet, header_list2, 3, l, border_style='thin', width=20) + stewards = Guilds.objects.filter(trash=False, steward=True) + for steward in stewards: + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter( + Q(to_steward=steward) | Q(steward=steward), + trash=False, date__date__gte=date1, + date__date__lte=date2, calculate_status=True + ).order_by('id') + guild_steward_free_buying_bars = StewardFreeBarInformation.objects.filter( + Q(guild=steward) | Q(steward=steward), trash=False, date__date__gte=date1, + date__date__lte=date2) + guild_steward_free_sale_bars = StewardFreeSaleBarInformation.objects.filter( + Q(guild=steward) | Q(steward=steward), trash=False, date__date__gte=date1, + date__date__lte=date2) + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward=steward) | Q(steward=steward), + trash=False, calculate_status=True).order_by('id') + + guild_steward_free_buying_bars = StewardFreeBarInformation.objects.filter( + Q(guild=steward) | Q(steward=steward), trash=False) + guild_steward_free_sale_bars = StewardFreeSaleBarInformation.objects.filter( + Q(guild=steward) | Q(steward=steward), trash=False) + product = RolesProducts.objects.filter(trash=False, guild=steward).first() + if product: + total_remain_weight = product.total_remain_weight + else: + total_remain_weight = 0 + recive_allocation = allocations.filter(to_steward=steward, receiver_state='accepted') + allocate_allocation = allocations.filter(steward=steward) + real_weight_of_carcasses = recive_allocation.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + number_of_carcasses_guild_steward_free_buying_bars = guild_steward_free_buying_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_guild_steward_free_buying_bars = guild_steward_free_sale_bars.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + number_of_carcasses_guild_steward_free_buying_bars = guild_steward_free_sale_bars.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + real_number_of_carcasses_allocate_allocation = allocate_allocation.aggregate( + total_quantity=Sum('real_number_of_carcasses')).get( + 'total_quantity') or 0 + real_weight_of_carcasses_allocate_allocation = allocate_allocation.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + kill_house_to_stw = allocations.filter(allocation_type='steward_steward') + quantity_kill_house_to_stw = kill_house_to_stw.aggregate( + total_quantity=Sum('real_number_of_carcasses')).get( + 'total_quantity') or 0 + weight_kill_house_to_stw = kill_house_to_stw.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + kill_house_to_guild = allocations.filter(allocation_type='steward_guild') + quantity_kill_house_to_guild = kill_house_to_guild.aggregate( + total_quantity=Sum('real_number_of_carcasses')).get( + 'total_quantity') or 0 + weight_kill_house_to_guild = kill_house_to_guild.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + if real_weight_of_carcasses + real_weight_of_carcasses_allocate_allocation > 0: + list1 = [ + 'مباشر', + f"{steward.guilds_name}-{steward.user.mobile}-{steward.user.city.name}", + ((real_weight_of_carcasses + weight_guild_steward_free_buying_bars) - ( + real_weight_of_carcasses_allocate_allocation + number_of_carcasses_guild_steward_free_buying_bars) + total_remain_weight), + real_weight_of_carcasses + weight_guild_steward_free_buying_bars, + len(allocations), + real_weight_of_carcasses_allocate_allocation + number_of_carcasses_guild_steward_free_buying_bars, + weight_guild_steward_free_buying_bars, + len(kill_house_to_stw), + weight_kill_house_to_stw, + len(kill_house_to_guild), + weight_kill_house_to_guild, + f"%{int((real_weight_of_carcasses_allocate_allocation + number_of_carcasses_guild_steward_free_buying_bars) * 100 / (real_weight_of_carcasses + weight_guild_steward_free_buying_bars)) if (real_weight_of_carcasses + weight_guild_steward_free_buying_bars) > 0 else 0}", + total_remain_weight + + ] + create_value(worksheet, list1, l + 1, 3, border_style='thin', width=20) + l += 1 + l += 5 + list5 = ['شهر'] + kill_house_name = KillHouse.objects.filter(trash=False, out_province=False).order_by('id').values_list( + 'name', flat=True) + list5.extend(kill_house_name) + list5.append('مجموع') + create_header(worksheet, list5, 3, l, border_style='thin', width=20) + cities = City.objects.filter(trash=False).order_by('id') + for city in cities: + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + result = get_kill_house_distribution_info(city, date1, date2) + result1 = all_get_kill_house_distribution_info(city, date1, date2) + else: + result = get_kill_house_distribution_info(city) + result1 = all_get_kill_house_distribution_info(city) + + create_value(worksheet, result, l + 1, 3, border_style='thin', width=20) + create_value(worksheet, [result1], l + 1, int(len(list5) + 2), border_style='thin', width=20) + l += 1 + if 'date1' in request.GET: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + result = get_kill_house_distribution_out_province_info(date1, date2) + else: + result = get_kill_house_distribution_out_province_info() + create_value(worksheet, result, l + 1, 3, border_style='thin', width=20) + + elif sheet_name == 'تخصیصات کشتارگاه به مباشر و صنف': + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter( + allocation_type__in=('killhouse_steward', 'killhouse_guild'), + trash=False, date__date__gte=date1, + date__date__lte=date2, kill_house__isnull=False, calculate_status=True).order_by('id') + else: + allocations = StewardAllocation.objects.filter( + allocation_type__in=('killhouse_steward', 'killhouse_guild'), + trash=False, kill_house__isnull=False, calculate_status=True).order_by('id') + + excel_options = [ + 'ردیف', + 'نام کشتارگاه', + 'نام مالک', + 'شماره مالک', + 'شهر مالک', + 'تاریخ ثبت', + 'نوع تخصیص', + 'خریدار', + 'تلفن خریدار', + 'شهر خریدار', + 'نوع فروش', + 'قیمت هر کیلو(ریال)', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + 'کد احراز', + 'وضعیت کد احراز', + 'وضعیت', + + ] + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد تخصیصات', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'تخصیصات کشتارگاه به مباشرین ', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if allocations: + for allocation in allocations: + l += 1 + if allocation.allocation_type == 'killhouse_steward': + allocation_type = 'کشتارگاه به مباشر' + buyer_name = allocation.to_steward.guilds_name + buyer_mobile = allocation.to_steward.user.mobile + buyer_city = allocation.to_steward.user.city.name + elif allocation.allocation_type == 'killhouse_guild': + allocation_type = 'کشتارگاه به صنف' + buyer_name = allocation.to_guilds.guilds_name if allocation.to_guilds else '-' + buyer_mobile = allocation.to_guilds.user.mobile if allocation.to_guilds else '-' + buyer_city = allocation.to_guilds.user.city.name if allocation.to_guilds else '-' + + else: + allocation_type = '' + buyer_name = '' + buyer_mobile = '' + buyer_city = '' + + if allocation.sell_type == 'exclusive': + sell_type = 'اختصاصی' + else: + sell_type = '' + system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + list1 = [ + m, + allocation.kill_house.name, + allocation.kill_house.kill_house_operator.user.fullname, + allocation.kill_house.kill_house_operator.user.mobile, + allocation.kill_house.kill_house_operator.user.city.name, + str(convert_to_shamsi(datetime=allocation.date)), + allocation_type, + buyer_name, + buyer_mobile, + buyer_city, + sell_type, + allocation.amount, + allocation.total_amount, + allocation.weight_of_carcasses, + allocation.receiver_real_weight_of_carcasses, + allocation.registration_code, + system_registration_code, + state, + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + total_amount_allocations = allocations.aggregate( + total_quantity=Sum('total_amount')).get( + 'total_quantity') or 0 + number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_number_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(allocations), + total_amount_allocations, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_amount_allocations, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'تخصیصات سرد خانه': + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter( + allocation_type='ColdHouse', + trash=False, date__date__gte=date1, + date__date__lte=date2, kill_house__isnull=False, calculate_status=True).order_by('id') + else: + allocations = StewardAllocation.objects.filter( + allocation_type='ColdHouse', + trash=False, kill_house__isnull=False, calculate_status=True).order_by('id') + + excel_options = [ + 'ردیف', + 'فروشنده', + 'نام فروشنده', + 'شماره فروشنده', + 'شهر فروشنده', + 'تاریخ ثبت', + 'نوع تخصیص', + 'خریدار', + 'تلفن خریدار', + 'شهر خریدار', + 'نوع فروش', + 'قیمت هر کیلو(ریال)', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + 'کد احراز', + 'وضعیت کد احراز', + 'وضعیت', + + ] + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد تخصیصات', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'تخصیصات سردخانه', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if allocations: + for allocation in allocations: + l += 1 + if allocation.allocation_type == 'killhouse_steward': + allocation_type = 'کشتارگاه به مباشر' + buyer_name = allocation.to_steward.guilds_name + buyer_mobile = allocation.to_steward.user.mobile + buyer_city = allocation.to_steward.user.city.name + elif allocation.allocation_type == 'killhouse_guild': + allocation_type = 'کشتارگاه به صنف' + buyer_name = allocation.to_guilds.guilds_name + buyer_mobile = allocation.to_guilds.user.mobile + buyer_city = allocation.to_guilds.user.city.name + elif allocation.allocation_type == 'ColdHouse': + allocation_type = 'کشتارگاه به سردخانه' + if allocation.to_cold_house.kill_house: + buyer_name = allocation.to_cold_house.kill_house.name + buyer_mobile = allocation.to_cold_house.kill_house.kill_house_operator.user.mobile + buyer_city = allocation.to_cold_house.kill_house.kill_house_operator.user.city.name + else: + buyer_name = allocation.to_cold_house.live_stock_support.user.name + buyer_mobile = allocation.to_cold_house.live_stock_support.user.mobile + buyer_city = allocation.to_cold_house.live_stock_support.user.city.name + elif allocation.allocation_type == 'killhouse_killhouse': + allocation_type = 'کشتارگاه به کشتارگاه' + buyer_name = allocation.to_kill_house.kill_house.name + buyer_mobile = allocation.to_kill_house.kill_house_operator.user.mobile + buyer_city = allocation.to_kill_house.kill_house_operator.user.city.name + else: + allocation_type = '' + buyer_name = '' + buyer_mobile = '' + buyer_city = '' + + if allocation.sell_type == 'exclusive': + sell_type = 'اختصاصی' + else: + sell_type = 'آزاد' + system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + list1 = [ + m, + allocation.kill_house.name, + allocation.kill_house.kill_house_operator.user.fullname, + allocation.kill_house.kill_house_operator.user.mobile, + allocation.kill_house.kill_house_operator.user.city.name, + str(convert_to_shamsi(datetime=allocation.date)), + allocation_type, + buyer_name, + buyer_mobile, + buyer_city, + sell_type, + allocation.amount, + allocation.total_amount, + allocation.weight_of_carcasses, + allocation.receiver_real_weight_of_carcasses, + allocation.registration_code, + system_registration_code, + state, + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + total_amount_allocations = allocations.aggregate( + total_quantity=Sum('total_amount')).get( + 'total_quantity') or 0 + number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_number_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(allocations), + total_amount_allocations, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_amount_allocations, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'تخصیصات مباشر به صنف': + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter( + allocation_type='steward_guild', + trash=False, date__date__gte=date1, + date__date__lte=date2, calculate_status=True).order_by('id') + else: + allocations = StewardAllocation.objects.filter( + allocation_type='steward_guild', + trash=False, calculate_status=True).order_by('id') + + excel_options = [ + 'ردیف', + 'فروشنده', + 'نام فروشنده', + 'شماره فروشنده', + 'شهر فروشنده', + 'تاریخ ثبت', + 'نوع تخصیص', + 'خریدار', + 'تلفن خریدار', + 'شهر خریدار', + 'نوع فروش', + 'قیمت هر کیلو(ریال)', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + 'کد احراز', + 'وضعیت کد احراز', + 'وضعیت', + + ] + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد تخصیصات', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'تخصیصات مباشر به صنف ', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if allocations: + for allocation in allocations: + l += 1 + if allocation.allocation_type == 'killhouse_steward': + allocation_type = 'کشتارگاه به مباشر' + buyer_name = allocation.to_steward.guilds_name + buyer_mobile = allocation.to_steward.user.mobile + buyer_city = allocation.to_steward.user.city.name + elif allocation.allocation_type == 'killhouse_guild' or allocation.allocation_type == 'steward_guild': + allocation_type = 'مباشر به صنف' + buyer_name = allocation.to_guilds.guilds_name + buyer_mobile = allocation.to_guilds.user.mobile + buyer_city = allocation.to_guilds.user.city.name + + else: + allocation_type = '' + buyer_name = '' + buyer_mobile = '' + buyer_city = '' + + if allocation.sell_type == 'exclusive': + sell_type = 'اختصاصی' + else: + sell_type = '' + system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + list1 = [ + m, + allocation.steward.guilds_name, + allocation.steward.user.fullname, + allocation.steward.user.mobile, + allocation.steward.user.city.name, + str(convert_to_shamsi(datetime=allocation.date)), + allocation_type, + buyer_name, + buyer_mobile, + buyer_city, + sell_type, + allocation.amount, + allocation.total_amount, + allocation.weight_of_carcasses, + allocation.receiver_real_weight_of_carcasses, + allocation.registration_code, + system_registration_code, + state, + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + total_amount_allocations = allocations.aggregate( + total_quantity=Sum('total_amount')).get( + 'total_quantity') or 0 + number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_number_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(allocations), + total_amount_allocations, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_amount_allocations, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'تخصیصات صنف به صنف': + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter( + allocation_type='guild_guild', + trash=False, date__date__gte=date1, + date__date__lte=date2, calculate_status=True).order_by('id') + else: + allocations = StewardAllocation.objects.filter( + allocation_type='guild_guild', + trash=False, calculate_status=True).order_by('id') + + excel_options = [ + 'ردیف', + 'فروشنده', + 'نام فروشنده', + 'شماره فروشنده', + 'شهر فروشنده', + 'تاریخ ثبت', + 'نوع تخصیص', + 'خریدار', + 'تلفن خریدار', + 'شهر خریدار', + 'نوع فروش', + 'قیمت هر کیلو(ریال)', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + 'کد احراز', + 'وضعیت کد احراز', + 'وضعیت', + + ] + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد تخصیصات', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'تخصیصات صنف به صنف ', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if allocations: + for allocation in allocations: + l += 1 + if allocation.allocation_type == 'killhouse_steward': + allocation_type = 'کشتارگاه به مباشر' + buyer_name = allocation.to_steward.guilds_name + buyer_mobile = allocation.to_steward.user.mobile + buyer_city = allocation.to_steward.user.city.name + elif allocation.allocation_type == 'killhouse_guild' or allocation.allocation_type == 'steward_guild' or \ + allocation.allocation_type == 'guild_guild': + allocation_type = 'صنف به صنف' + buyer_name = allocation.to_guilds.guilds_name + buyer_mobile = allocation.to_guilds.user.mobile + buyer_city = allocation.to_guilds.user.city.name + + else: + allocation_type = '' + buyer_name = '' + buyer_mobile = '' + buyer_city = '' + + if allocation.sell_type == 'exclusive': + sell_type = 'اختصاصی' + else: + sell_type = '' + system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + list1 = [ + m, + allocation.steward.guilds_name, + allocation.steward.user.fullname, + allocation.steward.user.mobile, + allocation.steward.user.city.name, + str(convert_to_shamsi(datetime=allocation.date)), + allocation_type, + buyer_name, + buyer_mobile, + buyer_city, + sell_type, + allocation.amount, + allocation.total_amount, + allocation.weight_of_carcasses, + allocation.receiver_real_weight_of_carcasses, + allocation.registration_code, + system_registration_code, + state, + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + total_amount_allocations = allocations.aggregate( + total_quantity=Sum('total_amount')).get( + 'total_quantity') or 0 + number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_number_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + len(allocations), + total_amount_allocations, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_amount_allocations, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + # elif sheet_name == 'تخصیصات مباشر به مباشر': + # + # if 'date1' in request.GET and request.GET['date1']: + # + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # + # allocations = StewardAllocation.objects.filter( + # allocation_type='steward_guild', + # trash=False, date__date__gte=date1, + # date__date__lte=date2, kill_house__isnull=False, calculate_status=True).order_by('id') + # else: + # allocations = StewardAllocation.objects.filter( + # allocation_type='steward_guild', + # trash=False, kill_house__isnull=False, calculate_status=True).order_by('id') + # + # excel_options = [ + # 'ردیف', + # 'نام کشتارگاه', + # 'نام مالک', + # 'شماره مالک', + # 'شهر مالک', + # 'تاریخ ثبت', + # 'نوع تخصیص', + # 'خریدار', + # 'تلفن خریدار', + # 'شهر خریدار', + # 'نوع فروش', + # 'قیمت هر کیلو(ریال)', + # 'قیمت کل', + # 'حجم تخصیصی', + # 'وزن تخصیصی', + # 'حجم تایید شده', + # 'وزن تایید شده', + # 'کد احراز', + # 'وضعیت کد احراز', + # 'وضعیت', + # + # ] + # + # blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + # red_font = Font(color="C00000", bold=True) + # if 'date1' in request.GET: + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # from_date_1 = shamsi_date(date1) + # to_date_1 = shamsi_date(date2) + # worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + # header_list2 = [ + # 'تعداد تخصیصات', + # 'قیمت کل', + # 'حجم تخصیصی', + # 'وزن تخصیصی', + # 'حجم تایید شده', + # 'وزن تایید شده', + # + # ] + # + # for col_num, option in enumerate(header_list2, 5): + # cell = worksheet.cell(row=2, column=col_num, value=option) + # cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + # cell.fill = PatternFill(start_color="00B050", fill_type="solid") + # cell.font = Font(size=9, bold=True, color='D9FFFFFF') + # worksheet.row_dimensions[2].height = 20.8 + # create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + # + # excel_description(worksheet, 'A1', f'تخصیصات مباشر به صنف ', size=11, color='red', + # row2='D1') + # + # worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + # merge_range1 = 'B1:D1' + # merge_range2 = 'B2:D2' + # merge_range = 'B3:D3' + # worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range) + # worksheet.merge_cells(merge_range2) + # worksheet['B1'].font = red_font + # worksheet['B3'].font = Font(size=11) + # worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + # + # l = 5 + # m = 1 + # + # if allocations: + # for allocation in allocations: + # l += 1 + # if allocation.allocation_type == 'killhouse_steward' : + # allocation_type = 'کشتارگاه به مباشر' + # buyer_name = allocation.to_steward.guilds_name + # buyer_mobile = allocation.to_steward.user.mobile + # buyer_city = allocation.to_steward.user.city.name + # elif allocation.allocation_type == 'killhouse_guild' or allocation.allocation_type == 'steward_guild': + # allocation_type = 'کشتارگاه به صنف' + # buyer_name = allocation.to_guilds.guilds_name + # buyer_mobile = allocation.to_guilds.user.mobile + # buyer_city = allocation.to_guilds.user.city.name + # + # else: + # allocation_type = '' + # buyer_name = '' + # buyer_mobile = '' + # buyer_city = '' + # + # if allocation.sell_type == 'exclusive': + # sell_type = 'اختصاصی' + # else: + # sell_type = '' + # system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + # state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + # list1 = [ + # m, + # allocation.kill_house.name, + # allocation.kill_house.kill_house_operator.user.fullname, + # allocation.kill_house.kill_house_operator.user.mobile, + # allocation.kill_house.kill_house_operator.user.city.name, + # str(convert_to_shamsi(datetime=allocation.date)), + # allocation_type, + # buyer_name, + # buyer_mobile, + # buyer_city, + # sell_type, + # allocation.amount, + # allocation.total_amount, + # allocation.number_of_carcasses, + # allocation.weight_of_carcasses, + # allocation.receiver_real_number_of_carcasses, + # allocation.receiver_real_weight_of_carcasses, + # allocation.registration_code, + # system_registration_code, + # state, + # + # ] + # m += 1 + # create_value(worksheet,list1,l+1,1,height=20,width=30) + # + # total_amount_allocations = allocations.aggregate( + # total_quantity=Sum('total_amount')).get( + # 'total_quantity') or 0 + # number_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('number_of_carcasses')).get( + # 'total_quantity') or 0 + # weight_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('weight_of_carcasses')).get( + # 'total_quantity') or 0 + # receiver_real_number_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('receiver_real_number_of_carcasses')).get( + # 'total_quantity') or 0 + # receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + # 'total_quantity') or 0 + # + # value_header_list2 = [ + # len(allocations), + # total_amount_allocations, + # number_of_carcasses_allocations, + # weight_of_carcasses_allocations, + # receiver_real_number_of_carcasses_allocations, + # receiver_real_weight_of_carcasses_allocations, + # + # ] + # for item in range(len(value_header_list2)): + # cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + # value = value_header_list2[item] + # # Check if the value is a number before formatting + # if isinstance(value, (int, float)): + # if value != 0: + # cell.number_format = '#,###' # Apply general number format + # else: + # cell.value = value # Keep as text for other values + # + # cell.alignment = Alignment(horizontal='center') + # cell.font = Font(size=10, bold=True) + # list2 = [ + # 'مجموع==>', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # total_amount_allocations, + # number_of_carcasses_allocations, + # weight_of_carcasses_allocations, + # receiver_real_number_of_carcasses_allocations, + # receiver_real_weight_of_carcasses_allocations, + # '', + # '', + # '', + # + # ] + # for item in range(len(list2)): + # cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + # value = list2[item] + # if isinstance(value, (int, float)): + # cell.number_format = '#,###' # Apply general number format + # else: + # cell.value = value # Keep as text for other values + # + # cell.alignment = Alignment(horizontal='center') + # cell.font = Font(size=10, bold=True) + # cell.font = Font(bold=True) + # cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'عملکرد مباشرین': + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter( + allocation_type__in=('killhouse_steward', 'killhouse_guild'), + trash=False, date__date__gte=date1, + date__date__lte=date2, calculate_status=True).order_by('id') + else: + allocations = StewardAllocation.objects.filter( + allocation_type__in=('killhouse_steward', 'killhouse_guild'), + trash=False, calculate_status=True).order_by('id') + user_value = list(allocations.values_list('to_steward__user__user', flat=True).distinct()) + user_value2 = list(allocations.values_list('to_guilds__user__user', flat=True).distinct()) + user_value3 = list(set(user_value + user_value2)) + excel_options = [ + 'ردیف', + 'خریدار', + 'تلفن خریدار', + 'شهر خریدار', + 'وزن تخصیصی', + 'وزن تایید شده', + 'تخصیص دهنده', + + ] + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد مباشرین', + 'وزن تخصیصی', + 'وزن تایید شده', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'عملکرد مباشرین', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if allocations: + for user in user_value3: + user_new = SystemUserProfile.objects.filter(trash=False, user=user).first() + guilds = Guilds.objects.filter(trash=False, user=user_new).first() + new_allocation = allocations.filter(Q(to_steward=guilds) | Q(to_guilds=guilds)) + kill_house_name = new_allocation.values_list('kill_house__name', flat=True).distinct() + kill_house_names = [str(name) for name in kill_house_name if name is not None] + + if kill_house_names: + kill_house_name_str = ' / '.join(set(kill_house_names)) + else: + kill_house_name_str = '-' + weight_of_carcasses_allocations = new_allocation.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_number_of_carcasses_allocations = new_allocation.aggregate( + total_quantity=Sum('receiver_real_number_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_weight_of_carcasses_allocations = new_allocation.aggregate( + total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + 'total_quantity') or 0 + if guilds: + l += 1 + + list1 = [ + m, + guilds.guilds_name if guilds else '-', + user_new.mobile if user_new else '-', + user_new.city.name if user_new else '-', + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + kill_house_name_str + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_number_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_number_of_carcasses')).get( + 'total_quantity') or 0 + receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + 'total_quantity') or 0 + # + value_header_list2 = [ + len(user_value3), + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + + + # elif sheet_name == 'تخصیصات مباشرین به صنوف': + # + # if 'date1' in request.GET and request.GET['date1']: + # + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # + # allocations = StewardAllocation.objects.filter(allocation_type__in=('steward_guild', 'steward_steward'), + # trash=False, date__date__gte=date1, + # date__date__lte=date2, calculate_status=True + # ).order_by('id') + # else: + # allocations = StewardAllocation.objects.filter(allocation_type__in=('steward_guild', 'steward_steward'), + # trash=False, calculate_status=True).order_by('id') + # + # excel_options = [ + # 'ردیف', + # 'ماهیت', + # 'نام مالک', + # 'شماره مالک', + # 'شهر مالک', + # 'تاریخ ثبت', + # 'نوع تخصیص', + # 'خریدار', + # 'تلفن خریدار', + # 'شهر خریدار', + # 'نوع فروش', + # 'قیمت هر کیلو(ریال)', + # 'قیمت کل', + # 'حجم تخصیصی', + # 'وزن تخصیصی', + # 'حجم تایید شده', + # 'وزن تایید شده', + # 'کد احراز', + # 'وضعیت کد احراز', + # 'وضعیت', + # + # ] + # + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + # red_font = Font(color="C00000", bold=True) + # if 'date1' in request.GET: + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # from_date_1 = shamsi_date(date1) + # to_date_1 = shamsi_date(date2) + # worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + # header_list2 = [ + # 'تعداد تخصیصات', + # 'قیمت کل', + # 'حجم تخصیصی', + # 'وزن تخصیصی', + # 'حجم تایید شده', + # 'وزن تایید شده', + # + # ] + # + # for col_num, option in enumerate(header_list2, 5): + # cell = worksheet.cell(row=2, column=col_num, value=option) + # cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + # cell.fill = PatternFill(start_color="00B050", fill_type="solid") + # cell.font = Font(size=9, bold=True, color='D9FFFFFF') + # worksheet.row_dimensions[2].height = 20.8 + # create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + # + # excel_description(worksheet, 'A1', f'تخصیصات کشتارگاه به صنف ', size=11, color='red', + # row2='D1') + # + # worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + # merge_range1 = 'B1:D1' + # merge_range2 = 'B2:D2' + # merge_range = 'B3:D3' + # worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range) + # worksheet.merge_cells(merge_range2) + # worksheet['B1'].font = red_font + # worksheet['B3'].font = Font(size=11) + # worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + # + # l = 5 + # m = 1 + # + # if allocations: + # for allocation in allocations: + # l += 1 + # if allocation.allocation_type == 'killhouse_steward': + # allocation_type = 'کشتارگاه به مباشر' + # buyer_name = allocation.to_steward.guilds_name + # buyer_mobile = allocation.to_steward.user.mobile + # buyer_city = allocation.to_steward.user.city.name + # elif allocation.allocation_type == 'killhouse_guild': + # allocation_type = 'کشتارگاه به صنف' + # buyer_name = allocation.to_guilds.guilds_name + # buyer_mobile = allocation.to_guilds.user.mobile + # buyer_city = allocation.to_guilds.user.city.name + # elif allocation.allocation_type == 'steward_guild': + # allocation_type = 'مباشر به صنف' + # buyer_name = allocation.to_guilds.guilds_name + # buyer_mobile = allocation.to_guilds.user.mobile + # buyer_city = allocation.to_guilds.user.city.name + # elif allocation.allocation_type == 'steward_steward': + # allocation_type = 'مباشر به مباشر' + # buyer_name = allocation.to_steward.guilds_name + # buyer_mobile = allocation.to_steward.user.mobile + # buyer_city = allocation.to_steward.user.city.name + # else: + # allocation_type = '' + # buyer_name = '' + # buyer_mobile = '' + # buyer_city = '' + # + # if allocation.sell_type == 'exclusive': + # sell_type = 'اختصاصی' + # else: + # sell_type = '' + # system_registration_code = 'ارسال شده' if allocation.system_registration_code == True else 'ارسال نشده' + # state = 'در انتظار تایید' if allocation.state == 'pending' else 'تایید شده' + # type = 'مباشر' if allocation.steward.steward == True else 'صنف' + # list1 = [ + # m, + # type, + # allocation.steward.user.fullname, + # allocation.steward.user.mobile, + # allocation.steward.user.city.name, + # str(convert_to_shamsi(datetime=allocation.date)), + # allocation_type, + # buyer_name, + # buyer_mobile, + # buyer_city, + # sell_type, + # allocation.amount, + # allocation.total_amount, + # allocation.number_of_carcasses, + # allocation.weight_of_carcasses, + # allocation.receiver_real_number_of_carcasses, + # allocation.receiver_real_weight_of_carcasses, + # allocation.registration_code, + # system_registration_code, + # state, + # + # ] + # m += 1 + # create_value(worksheet, list1, l + 1, 1, height=20, width=30) + # + # total_amount_allocations = allocations.aggregate( + # total_quantity=Sum('total_amount')).get( + # 'total_quantity') or 0 + # number_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('number_of_carcasses')).get( + # 'total_quantity') or 0 + # weight_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('weight_of_carcasses')).get( + # 'total_quantity') or 0 + # receiver_real_number_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('receiver_real_number_of_carcasses')).get( + # 'total_quantity') or 0 + # receiver_real_weight_of_carcasses_allocations = allocations.aggregate( + # total_quantity=Sum('receiver_real_weight_of_carcasses')).get( + # 'total_quantity') or 0 + # + # value_header_list2 = [ + # len(allocations), + # total_amount_allocations, + # number_of_carcasses_allocations, + # weight_of_carcasses_allocations, + # receiver_real_number_of_carcasses_allocations, + # receiver_real_weight_of_carcasses_allocations, + # + # ] + # for item in range(len(value_header_list2)): + # cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + # value = value_header_list2[item] + # # Check if the value is a number before formatting + # if isinstance(value, (int, float)): + # if value != 0: + # cell.number_format = '#,###' # Apply general number format + # else: + # cell.value = value # Keep as text for other values + # + # cell.alignment = Alignment(horizontal='center') + # cell.font = Font(size=10, bold=True) + # list2 = [ + # 'مجموع==>', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # '', + # total_amount_allocations, + # number_of_carcasses_allocations, + # weight_of_carcasses_allocations, + # receiver_real_number_of_carcasses_allocations, + # receiver_real_weight_of_carcasses_allocations, + # '', + # '', + # '', + # + # ] + # for item in range(len(list2)): + # cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + # value = list2[item] + # if isinstance(value, (int, float)): + # cell.number_format = '#,###' # Apply general number format + # else: + # cell.value = value # Keep as text for other values + # + # cell.alignment = Alignment(horizontal='center') + # cell.font = Font(size=10, bold=True) + # cell.font = Font(bold=True) + # cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'تراکنش های صنوف': + + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + guilds = Guilds.objects.filter( + id__in=PosMachineTransactions.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + pos__guild__isnull=False, + paid=True + ).values_list('pos__guild__id', flat=True).distinct() + ) + else: + guilds = Guilds.objects.filter( + id__in=PosMachineTransactions.objects.filter( + trash=False, + pos__guild__isnull=False, + paid=True + ).values_list('pos__guild__id', flat=True).distinct() + ) + + serializer = GuildsPosMachineForTransactionsSerializer(guilds, many=True, context={'request': request}) + + excel_options = [ + 'ردیف', + 'نام واحد صنفی', + 'موبایل', + 'شهر', + 'تعداد تراکنش ها', + 'مبلغ کل تراکنش ها', + 'کل ورودی به انبار(کیلوگرم)', + 'کل فروش(کیلوگرم)', + 'مانده انبار(کیلوگرم)', + + ] + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد تراکنش ها', + 'تعداد صنوف', + 'مبلغ کل تراکنش ها', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'تراکنش های صنف ', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if serializer.data: + for data in serializer.data: + l += 1 + + list1 = [ + m, + data['guilds_name'], + data['user']['mobile'], + data['user']['city']['name'], + data['transaction']['len_transaction'], + data['transaction']['total_price'], + data['transaction']['total_carcasses_weight'], + data['transaction']['real_allocated_weight'], + data['transaction']['total_remain_weight'], + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + pos = PosMachineTransactions.objects.filter(trash=False, pos__guild__in=guilds, paid=True) + total_price = pos.aggregate(total=Sum('price'))[ + 'total'] or 0 + + value_header_list2 = [ + len(pos), + len(guilds), + total_price, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + len_transaction = sum(item['transaction'].get('len_transaction', 0) for item in serializer.data) + total_price = sum(item['transaction'].get('total_price', 0) for item in serializer.data) + total_carcasses_weight = sum( + item['transaction'].get('total_carcasses_weight', 0) for item in serializer.data) + real_allocated_weight = sum(item['transaction'].get('real_allocated_weight', 0) for item in serializer.data) + total_remain_weight = sum(item['transaction'].get('total_remain_weight', 0) for item in serializer.data) + + list2 = [ + 'مجموع==>', + '', + '', + '', + len_transaction, + total_price, + total_carcasses_weight, + real_allocated_weight, + total_remain_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def login_user_excel(request): + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + accesstokens = AccessToken.objects.filter(created__date__gte=date1, created__date__lte=date2).select_related( + 'user').order_by('-id') + else: + accesstokens = AccessToken.objects.filter(created__date__gt='2024-12-15').select_related('user').order_by('-id') + excel_options = [ + 'ردیف', + 'نام و نام خانوادگی کاربر', + 'موبایل کاربر', + 'تاریخ ورود به سیستم', + 'توکن', + 'نقش', + 'شهرستان', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 1, 2, 20, width=30) + + l = 2 + for accesstoken in accesstokens: + user = SystemUserProfile.objects.get(user=accesstoken.user) + role_list = [role.name for role in user.role.all()] + date = convert_to_shamsi(datetime=accesstoken.created) + list1 = [ + m, + user.fullname, + user.mobile, + str(date), + accesstoken.token, + str(role_list), + user.city.name if user.city else '-' + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=20) + m += 1 + l += 1 + + 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 + + +def sub_section_of_cooperative_share_detail(request): + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + 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') + 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 = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + total_province_live_quantity += kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['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) + + # return Response(total_pure_province_carcasses_weight) + internal_total_pure_province_carcasses_weight = ( + total_pure_province_carcasses_weight / total_province_carcasses_weight) * total_province_carcasses_weight + external_total_pure_province_carcasses_weight = total_province_carcasses_weight - internal_total_pure_province_carcasses_weight + + total_pure_province_carcasses_price = internal_total_pure_province_carcasses_weight * province_live_wage_amount + total_out_selling_province_carcasses_price = external_total_pure_province_carcasses_weight * free_sell_carcesses_weight_amount + + poultries = Poultry.objects.filter(trash=False, city_operator__isnull=False).order_by('id') + hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by( + 'poultry') + + hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + has_wage=True, wage_pay=True, + temporary_deleted=False, hatching__in=hatchings) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + union_out_province_poultry_request_amount = poultry_requests.aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + 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 + + union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell', + share_type__en_name='union').first().percent / 100 + union_province_kill_request_wage = total_pure_province_carcasses_price * union_province_kill_request_percent + union_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * union_free_sell_carcasses_percent + + city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100 + city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100 + city_percent_out_sell_carcasses = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100 + + union_total_wage = union_province_kill_request_wage + union_out_province_poultry_request_amount + union_free_sell_carcasses_wage + hatching_killing_percent = (( + out_province_poultry_request_quantity + total_province_live_quantity) / hatching_quantity) * 100 + + city_province_kill_request_wage = union_province_kill_request_wage * city_percent_province_kill_request + city_out_province_poultry_request = union_out_province_poultry_request_amount * city_percent_out_poultry_request + city_out_province_sell_carcasses = union_free_sell_carcasses_wage * city_percent_out_sell_carcasses + city_total_wage = city_province_kill_request_wage + city_out_province_poultry_request + city_out_province_sell_carcasses + city_operator_deposit = SubSectorTransactions.objects.filter(trash=False) + city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0 + city_total_remain_wage_amount = city_total_wage - city_deposit + + excel_options = [ + 'ردیف', + 'تعاونی', + 'شهر', + 'کاربر', + 'موبایل کاربر', + 'تعداد فارم', + 'تعداد کل جوجه ریزی', + 'حجم کل جوجه ریزی', + 'حجم کل کشتار شده داخل استان', + 'وزن کل کشتار شده داخل استان', + 'وزن لاشه کشتار شده داخل استان', + 'وزن لاشه توزیع داخل استان', + 'وزن لاشه توزیع خارج استان', + 'حجم فروش خارج از استان', + 'وزن فروش خارج از استان', + 'حجم کل کشتار شده', + 'درصد کشتار شده نسبت به جوجه ریزی', + 'تعرفه زنده خارج از استان', + 'تعرفه کشتار و توزیع داخل استان', + 'تعرفه کشتار و توزیع خارج از استان', + 'مجموع تعرفه', + 'واریزی اتحادیه', + 'مانده تعرفه', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + header_list = [ + 'تعداد فارم', + 'تعداد کل جوجه ریزی', + 'حجم کل جوجه ریزی', + 'حجم کل کشتارشده داخل استان', + 'وزن کل کشتار شده داخل استان', + 'وزن لاشه کشتار شده داخل استان', + 'وزن کل لاشه توزیع داخل استان', + 'وزن کل لاشه توزیع خارج استان', + 'حجم کل فروش به خارج استان', + 'وزن کل فروش به خارج از استان', + 'حجم کل کشتار شده', + 'درصد کشتار شده نسبت به جوجه ریزی', + 'تعرفه زنده خارج از استان(اتحادیه)', + 'تعرفه کشتار و توزیع داخل استان(اتحادیه)', + 'تعرفه کشتار و توزیع خارج ازاستان(اتحادیه)', + 'کل تعرفه سهم اتحادیه استان', + 'تعرفه سهم زیر بخش ها', + 'واریزی اتحادیه به زیر بخش ها', + 'مانده تعرفه', + ] + create_header(worksheet, header_list, 4, 2, 21, 16.01) + + excel_description(worksheet, 'A1', 'گزارش جزئیات تعرفه سهم تعاونی ها', size=11, color='red', row2='C1') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + city_operators = CityOperator.objects.filter(address__province=user.province, trash=False) + if 'operators' in request.GET: + + serializer = CityOperatorForSubSectorTransactionsSerializer(city_operators, many=True, + context={'request': request}) + else: + serializer = CityOperatorForSubSectorSerializer(city_operators, many=True, context={'request': request}) + for data in serializer.data: + list1 = [ + m, + data['unit_name'], + data['user']['city'], + data['user']['fullname'], + data['user']['mobile'], + data['wage_info']['poultries'], + data['wage_info']['hatchings'], + data['wage_info']['hatchings_quantity'], + data['wage_info']['total_province_kill_requests_quantity'], + data['wage_info']['total_province_kill_requests_weight'], + data['wage_info']['total_province_carcasses_weight'], + data['wage_info']['total_pure_internal_province_carcasses_weight'], + data['wage_info']['total_pure_external_province_carcasses_weight'], + data['wage_info']['out_province_poultry_request_quantity'], + data['wage_info']['out_province_poultry_request_weight'], + data['wage_info']['total_killed_quantity'], + data['wage_info']['hatching_killing_percent'], + data['wage_info']['out_province_poultry_request_amount'], + data['wage_info']['total_pure_internal_province_carcasses_amount'], + data['wage_info']['total_pure_external_province_carcasses_amount'], + data['wage_info']['total_wage_amount'], + data['wage_info']['city_deposit'], + data['wage_info']['total_remain_wage_amount'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + + value_header_list = [ + len(poultries), + len(hatchings), + hatching_quantity, + total_province_live_quantity, + total_province_live_weight, + total_province_carcasses_weight, + internal_total_pure_province_carcasses_weight, + external_total_pure_province_carcasses_weight, + out_province_poultry_request_quantity, + out_province_poultry_request_weight, + out_province_poultry_request_quantity + total_province_live_quantity, + hatching_killing_percent, + union_free_sell_carcasses_wage, + + union_province_kill_request_wage, + union_out_province_poultry_request_amount, + + union_total_wage, + city_total_wage, + city_deposit, + city_total_remain_wage_amount, + + ] + create_value(worksheet, value_header_list, 3, 4) + + poultries = sum(item['wage_info'].get('poultries', 0) for item in serializer.data) + hatchings = sum(item['wage_info'].get('hatchings', 0) for item in serializer.data) + hatchings_quantity = sum(item['wage_info'].get('hatchings_quantity', 0) for item in serializer.data) + total_province_kill_requests_quantity = sum( + item['wage_info'].get('total_province_kill_requests_quantity', 0) for item in serializer.data) + total_province_kill_requests_weight = sum( + item['wage_info'].get('total_province_kill_requests_weight', 0) for item in serializer.data) + total_province_carcasses_weight = sum( + item['wage_info'].get('total_province_carcasses_weight', 0) for item in serializer.data) + total_pure_internal_province_carcasses_weight = sum( + item['wage_info'].get('total_pure_internal_province_carcasses_weight', 0) for item in serializer.data) + total_pure_external_province_carcasses_weight = sum( + item['wage_info'].get('total_pure_external_province_carcasses_weight', 0) for item in serializer.data) + out_province_poultry_request_quantity = sum( + item['wage_info'].get('out_province_poultry_request_quantity', 0) for item in serializer.data) + out_province_poultry_request_weight = sum( + item['wage_info'].get('out_province_poultry_request_weight', 0) for item in serializer.data) + total_killed_quantity = sum(item['wage_info'].get('total_killed_quantity', 0) for item in serializer.data) + hatching_killing_percent = sum(item['wage_info'].get('hatching_killing_percent', 0) for item in serializer.data) + out_province_poultry_request_amount = sum( + item['wage_info'].get('out_province_poultry_request_amount', 0) for item in serializer.data) + total_pure_internal_province_carcasses_amount = sum( + item['wage_info'].get('total_pure_internal_province_carcasses_amount', 0) for item in serializer.data) + total_pure_external_province_carcasses_amount = sum( + item['wage_info'].get('total_pure_external_province_carcasses_amount', 0) for item in serializer.data) + total_wage_amount = sum(item['wage_info'].get('total_wage_amount', 0) for item in serializer.data) + city_deposit = sum(item['wage_info'].get('city_deposit', 0) for item in serializer.data) + total_remain_wage_amount = sum(item['wage_info'].get('total_remain_wage_amount', 0) for item in serializer.data) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + poultries, + hatchings, + hatchings_quantity, + total_province_kill_requests_quantity, + total_province_kill_requests_weight, + total_province_carcasses_weight, + total_pure_internal_province_carcasses_weight, + total_pure_external_province_carcasses_weight, + out_province_poultry_request_quantity, + out_province_poultry_request_weight, + total_killed_quantity, + hatching_killing_percent, + out_province_poultry_request_amount, + total_pure_internal_province_carcasses_amount, + total_pure_external_province_carcasses_amount, + total_wage_amount, + city_deposit, + total_remain_wage_amount, + + ] + create_value(worksheet, list2, l + 1, 1, color='green') + + 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 + + +def city_operator_for_sub_sector_excel(request): + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_name = 'اطلاعات کلی' + worksheet = workbook.create_sheet(sheet_name) + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + city_operators = CityOperator.objects.filter(address__province=user.province, trash=False) + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعرفه زنده خارج از استان', + 'تعرفه کشتار و توزیع داخل استان', + 'تعرفه کشتار و توزیع خارج استان', + 'مجموع تعرفه', + 'واریزی اتحادیه', + 'مانده تعرفه', + ] + create_header(worksheet, header_list, 4, 2, height=25, width=25, border_style='thin', color='C00000') + + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + 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') + 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 = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + total_province_live_quantity += kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['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) + + internal_total_pure_province_carcasses_weight = ( + total_pure_province_carcasses_weight / total_province_carcasses_weight) * total_province_carcasses_weight + external_total_pure_province_carcasses_weight = total_province_carcasses_weight - internal_total_pure_province_carcasses_weight + + total_pure_province_carcasses_price = internal_total_pure_province_carcasses_weight * province_live_wage_amount + total_out_selling_province_carcasses_price = external_total_pure_province_carcasses_weight * free_sell_carcesses_weight_amount + + poultries = Poultry.objects.filter(trash=False, city_operator__isnull=False).order_by('id') + hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by( + 'poultry') + + hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + has_wage=True, wage_pay=True, + temporary_deleted=False, hatching__in=hatchings) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + union_out_province_poultry_request_amount = poultry_requests.aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + 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 + + union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell', + share_type__en_name='union').first().percent / 100 + union_province_kill_request_wage = total_pure_province_carcasses_price * union_province_kill_request_percent + union_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * union_free_sell_carcasses_percent + + city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100 + city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100 + city_percent_out_sell_carcasses = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100 + + union_total_wage = union_province_kill_request_wage + union_out_province_poultry_request_amount + union_free_sell_carcasses_wage + hatching_killing_percent = (( + out_province_poultry_request_quantity + total_province_live_quantity) / hatching_quantity) * 100 + + city_province_kill_request_wage = union_province_kill_request_wage * city_percent_province_kill_request + city_out_province_poultry_request = union_out_province_poultry_request_amount * city_percent_out_poultry_request + city_out_province_sell_carcasses = union_free_sell_carcasses_wage * city_percent_out_sell_carcasses + city_total_wage = city_province_kill_request_wage + city_out_province_poultry_request + city_out_province_sell_carcasses + city_operator_deposit = SubSectorTransactions.objects.filter(trash=False) + city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0 + city_total_remain_wage_amount = city_total_wage - city_deposit + + value_header_list = [ + city_out_province_poultry_request, + city_province_kill_request_wage, + city_out_province_sell_carcasses, + city_total_wage, + city_deposit, + city_total_remain_wage_amount, + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + + excel_options = [ + 'ردیف', + 'تعاونی', + 'شهر', + 'کاربر', + 'موبایل کاربر', + + 'تعرفه زنده خارج از استان', + 'تعرفه کشتار و توزیع داخل استان', + 'تعرفه کشتار و توزیع خارج از استان', + 'مجموع تعرفه', + ' تعداد دفعات واریز', + 'مجموع واریزی اتحادیه', + 'مانده تعرفه', + ] + + # excel_description(worksheet, 'A1', 'گزارش جزئیات تعرفه سهم تعاونی ها', size=11, color='red', row2='C1') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + + if 'operators' in request.GET: + serializer = CityOperatorForSubSectorTransactionsSerializer(city_operators, many=True, + context={'request': request}) + else: + serializer = CityOperatorForSubSectorSerializer(city_operators, many=True, context={'request': request}) + # todo:مقادیر باید درست شه + for data in serializer.data: + list1 = [ + m, + data['unit_name'], + data['user']['city'], + data['user']['fullname'], + data['user']['mobile'], + + data['wage_info']['out_province_poultry_request_amount'], + data['wage_info']['total_pure_internal_province_carcasses_amount'], + data['wage_info']['total_pure_external_province_carcasses_weight'], + data['wage_info']['total_wage_amount'], + data['wage_info']['number_of_city_deposit'], + data['wage_info']['city_deposit'], + data['wage_info']['total_remain_wage_amount'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + for city_operator in city_operators: + if SubSectorTransactions.objects.filter(trash=False, city_operator=city_operator).exists(): + sheet_name = city_operator.unit_name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + role_type = request.GET['type'] + excel_options = [ + 'ردیف', + 'تعاونی', + 'شهر', + 'کاربر', + 'موبایل کاربر', + 'تاریخ واریز', + 'شماره حساب مبدا', + 'شماره حساب مقصد', + 'نوع تراکنش', + 'مبلغ تراکنش', + ] + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22, width=20.01) + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + excel_description(worksheet, 'A3', + f'واریزی های {city_operator.unit_name} از تاریخ{from_date_1} تا {from_date_2}', + color='red', row2='C3') + if role_type == 'city': + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + city_operator__isnull=False, + trash=False, + city_operator=city_operator).order_by( + '-date') + elif role_type == 'vet': + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + vet__isnull=False, + trash=False).order_by('-date') + else: + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + city_guild__isnull=False, + trash=False, + city_operator=city_operator).order_by( + '-date') + + + else: + excel_description(worksheet, 'A4', f'{city_operator.unit_name}', color='red', row2='B4') + + if role_type == 'city': + operator_transactions = SubSectorTransactions.objects.filter(city_operator__isnull=False, + trash=False, + city_operator=city_operator).order_by( + '-date') + + elif role_type == 'vet': + operator_transactions = SubSectorTransactions.objects.filter(vet__isnull=False, + trash=False).order_by( + '-date') + else: + operator_transactions = SubSectorTransactions.objects.filter(city_guild__isnull=False, + trash=False).order_by('-date') + l = 7 + m = 1 + for operator_transaction in operator_transactions: + if operator_transaction.type == 'online': + type = "آنلاین" + elif operator_transaction.type == 'bank': + type = "توسط بانک" + else: + type = 'دستی' + list1 = [ + m, + operator_transaction.city_operator.unit_name, + operator_transaction.city_operator.user.city.name, + operator_transaction.city_operator.user.fullname, + operator_transaction.city_operator.user.mobile, + str(shamsi_date(operator_transaction.date)), + operator_transaction.from_account, + operator_transaction.to_account, + type, + operator_transaction.amount, + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + amount = operator_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + header_list1 = [ + 'تعداد تراکنش ها', + 'مبلغ تراکنش ها', + + ] + create_header(worksheet, header_list1, 5, 3, border_style='thin', color='C4D79B', height=25) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + amount, + + ] + create_value(worksheet, list2, l + 1, 1, border_style='thin', color='yellow') + list3 = [ + len(operator_transactions), + amount, + + ] + create_value(worksheet, list3, 4, 5, border_style='thin') + 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 + + +def vet_for_sub_sector_excel(request): + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + sheet_list = [ + 'اطلاعات کلی', + 'واریزی ها' + ] + + for sheet_name in sheet_list: + worksheet = workbook.create_sheet(sheet_name) + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعرفه زنده خارج از استان', + 'تعرفه کشتار و توزیع داخل استان', + 'تعرفه فروش به خارج استان', + 'مجموع تعرفه', + 'واریزی اتحادیه', + 'مانده تعرفه', + ] + create_header(worksheet, header_list, 4, 2, height=25, width=25, border_style='thin', color='C00000') + + total_quantity = 0 + total_weight = 0 + total_wage = 0 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', + trash=False).first().amount + free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', + trash=False).first().amount + out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', + trash=False).first().amount + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, + temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False, vet_farm__isnull=False, + quarantine_code__isnull=False, + send_date__date__gte=date1, + send_date__date__lte=date2) + 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, + province_request__poultry_request__vet_farm__isnull=False, + clearance_code__isnull=False, + trash=False, calculate_status=True, kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ) + vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet__isnull=False, + date__date__gte=date1, date__date__lte=date2) + + else: + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, + temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False, vet_farm__isnull=False, + quarantine_code__isnull=False) + + 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, + province_request__poultry_request__vet_farm__isnull=False, + clearance_code__isnull=False, + trash=False, calculate_status=True + ) + vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet__isnull=False) + + percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) + other_province_kill_request_percent = percentages_wage_type.filter( + wage_type__en_name='province-kill-request', share_type__en_name='other').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 + + other_out_poultry_request_percent = percentages_wage_type.filter( + wage_type__en_name='poultry-sell-out-province', + share_type__en_name='other').first().percent / 100 + other_province_kill_request_amount = province_live_wage_amount * other_province_kill_request_percent + other_free_sell_carcasses_amount = free_sell_carcasses_wage_amount * other_free_sell_carcasses_percent + + other_out_poultry_request_amount = out_poultry_request_wage_amount * other_out_poultry_request_percent + + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = \ + poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + province_live_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + province_live_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + total_quantity += province_live_quantity + out_province_poultry_request_quantity + total_weight += province_live_weight + out_province_poultry_request_weight + + province_carcasses_weight = province_live_weight * 0.75 + internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent() + external_pure_province_carcasses_weight = province_carcasses_weight - internal_pure_province_carcasses_weight + + total_pure_internal_province_carcasses_amount = internal_pure_province_carcasses_weight * other_province_kill_request_amount + total_pure_external_province_carcasses_amount = external_pure_province_carcasses_weight * other_free_sell_carcasses_amount + out_province_poultry_request_amount = out_province_poultry_request_weight * other_out_poultry_request_amount + + vet_deposit_amount = vet_deposit.aggregate(total=Sum('amount'))['total'] or 0 + total_wage += total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount + total_remain_wage = total_wage - vet_deposit_amount + + value_header_list = [ + total_pure_internal_province_carcasses_amount, + total_pure_external_province_carcasses_amount, + out_province_poultry_request_amount, + total_wage, + vet_deposit_amount, + total_remain_wage, + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + + excel_options = [ + 'ردیف', + 'کاربر', + 'موبایل کاربر', + 'شهر', + + 'حجم کشتار (دارای کد قرنطینه)', + 'وزن کشتار (دارای کد قرنطینه)', + 'تعرفه کشتار و توزیع داخل استان (ریال)', + 'تعرفه کشتار و توزیع خارج استان (ریال)', + 'تعرفه فروش به خارج استان (ریال)', + 'مجموع تعرفه (ریال)', + 'تعداد دفعات واریز', + 'مجموع واریزی اتحادیه(ریال)', + 'مانده تعرفه(ریال)', + + ] + + # excel_description(worksheet, 'A1', 'گزارش جزئیات تعرفه سهم تعاونی ها', size=11, color='red', row2='C1') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + + vet = Vet.objects.filter(pk__in=VetFarm.objects.all().values_list('vet', flat=True), trash=False).order_by( + 'id') + serializer = VetForSubSectorSerializerForExcel(vet, many=True, context={'request': request}) + for data in serializer.data: + list1 = [ + m, + data['user']['fullname'], + data['user']['mobile'], + data['user']['city'], + data['wage_info']['total_quantity'], + data['wage_info']['total_weight'], + data['wage_info']['total_pure_internal_province_carcasses_amount'], + data['wage_info']['total_pure_external_province_carcasses_amount'], + data['wage_info']['out_province_poultry_request_amount'], + data['wage_info']['total_wage'], + data['wage_info']['number_of_deposit'], + data['wage_info']['vet_deposit_amount'], + data['wage_info']['total_remain_wage'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + else: + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + role_type = request.GET['type'] + excel_options = [ + 'ردیف', + 'کاربر', + 'موبایل کاربر', + 'شهر', + 'تاریخ واریز', + 'شماره حساب مبدا', + 'شماره حساب مقصد', + 'نوع تراکنش', + 'مبلغ تراکنش', + ] + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22, width=20.01) + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + excel_description(worksheet, 'A3', + f'واریزی ها از تاریخ{from_date_1} تا {from_date_2}', + color='red', row2='C3') + if role_type == 'city': + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + city_operator__isnull=False, + trash=False, + ).order_by( + '-date') + elif role_type == 'vet': + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + vet__isnull=False, + trash=False).order_by('-date') + else: + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + city_guild__isnull=False, + trash=False, + ).order_by( + '-date') + + + else: + excel_description(worksheet, 'A4', f'واریزی های سهم دامپزشک', color='red', row2='B4') + + if role_type == 'city': + operator_transactions = SubSectorTransactions.objects.filter(city_operator__isnull=False, + trash=False, + ).order_by( + '-date') + + elif role_type == 'vet': + operator_transactions = SubSectorTransactions.objects.filter(vet__isnull=False, + trash=False).order_by( + '-date') + else: + operator_transactions = SubSectorTransactions.objects.filter(city_guild__isnull=False, + trash=False).order_by('-date') + l = 7 + m = 1 + for operator_transaction in operator_transactions: + if operator_transaction.type == 'online': + type = "آنلاین" + elif operator_transaction.type == 'bank': + type = "توسط بانک" + else: + type = 'دستی' + list1 = [ + m, + operator_transaction.vet.user.fullname, + operator_transaction.vet.user.mobile, + operator_transaction.vet.user.city.name, + str(shamsi_date(operator_transaction.date)), + operator_transaction.from_account, + operator_transaction.to_account, + type, + operator_transaction.amount, + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + amount = operator_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + header_list1 = [ + 'تعداد تراکنش ها', + 'مبلغ تراکنش ها', + + ] + create_header(worksheet, header_list1, 5, 3, border_style='thin', color='C4D79B', height=25) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + amount, + + ] + create_value(worksheet, list2, l + 1, 1, border_style='thin', color='yellow') + list3 = [ + len(operator_transactions), + amount, + + ] + create_value(worksheet, list3, 4, 5, border_style='thin') + 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 + + +def guild_for_sub_sector_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + sheet_list = [ + 'اطلاعات کلی', + 'واریزی ها' + ] + + for sheet_name in sheet_list: + worksheet = workbook.create_sheet(sheet_name) + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'کل وزن دریافتی', + 'کل وزن فروش رفته', + 'تعرفه فروش به خارج استان', + 'مجموع تعرفه', + 'واریزی اتحادیه', + 'مانده تعرفه', + ] + create_header(worksheet, header_list, 4, 2, height=25, width=25, border_style='thin', color='C00000') + + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', + trash=False).first().amount + percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) + other_province_kill_request_percent = percentages_wage_type.filter( + wage_type__en_name='province-kill-request', share_type__en_name='other').first().percent / 100 + if date1: + + allocations = StewardAllocation.objects.filter(trash=False, to_guilds__isnull=False, + calculate_status=True, + temporary_trash=False, temporary_deleted=False, + receiver_state='accepted', date__date__gte=date1, + date__date__lte=date2) + transactions = PosMachineTransactions.objects.filter(paid=True, trash=False, date__date__gte=date1, + date__date__lte=date2) + sub_transactions = SubSectorTransactions.objects.filter(trash=False, city_guild__isnull=False, + date__date__gte=date1, date__date__lte=date2) + else: + allocations = StewardAllocation.objects.filter(trash=False, to_guilds__isnull=False, + calculate_status=True, + temporary_trash=False, temporary_deleted=False, + receiver_state='accepted') + transactions = PosMachineTransactions.objects.filter(paid=True, trash=False) + sub_transactions = SubSectorTransactions.objects.filter(trash=False, city_guild__isnull=False) + allocations_weight = allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + transactions_weight = transactions.aggregate(total=Sum('weight'))[ + 'total'] or 0 + transactions_weight = transactions_weight / 1000 if transactions_weight > 0 else 0 + total_wage = transactions_weight * (province_live_wage_amount * other_province_kill_request_percent) + + sub_transactions_amount = sub_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + remain_wage = total_wage - sub_transactions_amount + + value_header_list = [ + allocations_weight, + transactions_weight, + total_wage, + sub_transactions_amount, + remain_wage + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + + excel_options = [ + 'ردیف', + 'کاربر', + 'موبایل کاربر', + 'شهر', + 'کل وزن دریافتی', + 'کل وزن فروش رفته', + 'مجموع تعرفه (ریال)', + 'مجموع واریزی اتحادیه(ریال)', + 'مانده تعرفه(ریال)', + + ] + + # excel_description(worksheet, 'A1', 'گزارش جزئیات تعرفه سهم تعاونی ها', size=11, color='red', row2='C1') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + + city_guilds = CityGuild.objects.filter(trash=False) + serializer = CityGuildForSubSectorSerializerForExcel(city_guilds, many=True, context={'request': request}) + for data in serializer.data: + list1 = [ + m, + data['user']['fullname'], + data['user']['mobile'], + data['user']['city'], + data['wage_info']['buy_weight'], + data['wage_info']['sell_weight'], + data['wage_info']['total_wage'], + data['wage_info']['guild_deposit'], + data['wage_info']['remain_wage'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + else: + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + role_type = request.GET['type'] + excel_options = [ + 'ردیف', + 'کاربر', + 'موبایل کاربر', + 'شهر', + 'تاریخ واریز', + 'شماره حساب مبدا', + 'شماره حساب مقصد', + 'نوع تراکنش', + 'مبلغ تراکنش', + ] + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22, width=20.01) + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + excel_description(worksheet, 'A3', + f'واریزی ها از تاریخ{from_date_1} تا {from_date_2}', + color='red', row2='C3') + if role_type == 'city': + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + city_operator__isnull=False, + trash=False, + ).order_by( + '-date') + elif role_type == 'vet': + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + vet__isnull=False, + trash=False).order_by('-date') + else: + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + city_guild__isnull=False, + trash=False, + ).order_by( + '-date') + + + else: + excel_description(worksheet, 'A4', f'واریزی های سهم صنف', color='red', row2='B4') + + if role_type == 'city': + operator_transactions = SubSectorTransactions.objects.filter(city_operator__isnull=False, + trash=False, + ).order_by( + '-date') + + elif role_type == 'vet': + operator_transactions = SubSectorTransactions.objects.filter(vet__isnull=False, + trash=False).order_by( + '-date') + else: + operator_transactions = SubSectorTransactions.objects.filter(city_guild__isnull=False, + trash=False).order_by('-date') + l = 7 + m = 1 + for operator_transaction in operator_transactions: + if operator_transaction.type == 'online': + type = "آنلاین" + elif operator_transaction.type == 'bank': + type = "توسط بانک" + else: + type = 'دستی' + list1 = [ + m, + operator_transaction.city_guild.user.fullname, + operator_transaction.city_guild.user.mobile, + operator_transaction.city_guild.user.city.name, + str(shamsi_date(operator_transaction.date)), + operator_transaction.from_account, + operator_transaction.to_account, + type, + operator_transaction.amount, + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + amount = operator_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + header_list1 = [ + 'تعداد تراکنش ها', + 'مبلغ تراکنش ها', + + ] + create_header(worksheet, header_list1, 5, 3, border_style='thin', color='C4D79B', height=25) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + amount, + + ] + create_value(worksheet, list2, l + 1, 1, border_style='thin', color='yellow') + list3 = [ + len(operator_transactions), + amount, + + ] + create_value(worksheet, list3, 4, 5, border_style='thin') + 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 + + +def all_guilds_transaction_excel(request): + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + filterset_class = GuildsForPostationFilterSet + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + + if date1 and date2: + date1 = datetime.datetime.strptime(date1, '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(date2, '%Y-%m-%d').date() + + guilds = Guilds.objects.filter( + Q( + id__in=PosMachineTransactions.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + pos__guild__isnull=False, + paid=True + ).values_list('pos__guild__id', flat=True) + ) | + Q( + id__in=StewardAllocation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + to_guilds__isnull=False, + to_cold_house__isnull=True, + temporary_trash=False, + trash=False, + calculate_status=True + ).values_list('to_guilds__id', flat=True) + ) + ).annotate( + transaction_count=Count( + 'guild_pos__roles_products_pos_transactions', + filter=Q( + guild_pos__roles_products_pos_transactions__trash=False, + guild_pos__roles_products_pos_transactions__paid=True, + guild_pos__roles_products_pos_transactions__date__date__gte=date1, + guild_pos__roles_products_pos_transactions__date__date__lte=date2 + ), + distinct=True + ) + ).order_by('-transaction_count') + + else: + guilds = Guilds.objects.filter( + Q( + id__in=PosMachineTransactions.objects.filter( + trash=False, + paid=True, + pos__guild__isnull=False + ).values_list('pos__guild__id', flat=True) + ) | + Q( + id__in=StewardAllocation.objects.filter( + to_guilds__isnull=False, + to_cold_house__isnull=True, + temporary_trash=False, + trash=False, + calculate_status=True + ).values_list('to_guilds__id', flat=True) + ) + ).annotate( + transaction_count=Count( + 'guild_pos__roles_products_pos_transactions', + filter=Q( + guild_pos__roles_products_pos_transactions__trash=False, + guild_pos__roles_products_pos_transactions__paid=True + ), + distinct=True + ) + ).order_by('-transaction_count') + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + guilds = guilds.filter( + build_query(filterset_class.Meta.fields, value) + ) + serializer = GuildsPosMachineForTransactionsNewSerializer(guilds, many=True, context={'request': request}) + + excel_options = [ + 'ردیف', + 'نام واحد صنفی', + 'موبایل', + 'شهر', + 'کل ورودی به انبار(کیلوگرم)', + 'کل فروش(کیلوگرم)', + 'مانده انبار(کیلوگرم)', + 'تعداد تراکنش ها', + 'مبلغ کل تراکنش ها', + + ] + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + excel_description(worksheet, 'B3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='D3') + header_list2 = [ + 'کل ورودی به انبار(کیلوگرم)', + 'کل فروش(کیلوگرم)', + 'مانده انبار(کیلوگرم)', + 'تعداد تراکنش ها', + 'مبلغ کل تراکنش ها', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'مدیریت انبار صنوف', size=11, color='red', + row2='D1') + l = 5 + m = 1 + datas = serializer.data + + datas = sorted(datas, key=lambda x: x['transaction']['total_carcasses_weight'], reverse=True) + for data in datas: + l += 1 + + list1 = [ + m, + data['guilds_name'], + data['user']['mobile'], + data['user']['city']['name'], + data['transaction']['total_carcasses_weight'], + str(data['transaction']['real_allocated_weight']), + data['transaction']['total_remain_weight'], + data['transaction']['len_transaction'], + data['transaction']['total_price'], + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + len_transaction = sum(item['transaction'].get('len_transaction', 0) for item in serializer.data) + total_price = sum(item['transaction'].get('total_price', 0) for item in serializer.data) + total_carcasses_weight = sum(item['transaction'].get('total_carcasses_weight', 0) for item in serializer.data) + real_allocated_weight = sum(item['transaction'].get('real_allocated_weight', 0) for item in serializer.data) + total_remain_weight = sum(item['transaction'].get('total_remain_weight', 0) for item in serializer.data) + + list2 = [ + 'مجموع==>', + '', + '', + '', + total_carcasses_weight, + real_allocated_weight, + total_remain_weight, + len_transaction, + total_price, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + value_header_list2 = [ + total_carcasses_weight, + real_allocated_weight, + total_remain_weight, + len_transaction, + total_price, + + ] + create_value(worksheet, value_header_list2, 3, 5) + + 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 + + +def detail_guilds_transaction_excel(request): + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + guild = Guilds.objects.get(key=request.GET['key']) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + transactions = PosMachineTransactions.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2, pos__guild=guild, + paid=True).order_by('-date') + else: + transactions = PosMachineTransactions.objects.filter(trash=False, pos__guild=guild, + paid=True).order_by('-date') + + serializer = PosMachineTransactionsForInspectionSerializer(transactions, many=True) + + excel_options = [ + 'ردیف', + 'وضعیت تراکنش', + 'تاریخ تراکنش', + 'محصول', + 'قیمت واحد', + 'وزن (گرم)', + 'مبلغ(ریال)', + 'از سرویس', + + ] + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + excel_description(worksheet, 'B3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='D3') + header_list2 = [ + 'تعداد تراکنش ها', + 'وزن کل(گرم)', + 'مبلغ کل تراکنش ها(ریال)', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + if guild: + name = guild.guilds_name + else: + name = '' + excel_description(worksheet, 'A1', f'تراکنش های صنف {name}', size=11, color='red', + row2='D1') + + l = 5 + m = 1 + + for data in serializer.data: + l += 1 + paid = 'موفق' if data['paid'] == True else 'ناموفق' + posProvider = 'سامان کیش' if data['posProvider'] == "SEP" else '-' + date = '-' + if data['date']: + try: + date = datetime.datetime.strptime(str(data['date']), '%Y-%m-%dT%H:%M:%S.%f') + except ValueError: + date = datetime.datetime.strptime(str(data['date']), '%Y-%m-%dT%H:%M:%S') + date = shamsi_date(date, in_value=True) + list1 = [ + m, + paid, + str(date), + (data.get('product') or {}).get('name') or '-', + data.get('price') or 0, + data.get('weight') or 0, + data.get('current_price') or 0, + posProvider, + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + pos = PosMachineTransactions.objects.filter(trash=False, pos__guild=guild, paid=True) + total_price = pos.aggregate(total=Sum('price'))[ + 'total'] or 0 + weight = sum(item['weight'] for item in serializer.data) + + value_header_list2 = [ + len(pos), + weight, + total_price, + + ] + create_value(worksheet, value_header_list2, 3, 5) + + len_transaction = sum(item['price'] for item in serializer.data) + total_carcasses_weight = sum(item['current_price'] for item in serializer.data) + + list2 = [ + 'مجموع==>', + '', + '', + '', + len_transaction, + weight, + total_carcasses_weight, + '' + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 + + +class GetExcel(APIView): + throttle_classes = [AnonRateThrottle, UserRateThrottle] + + def get(self, request): + excel_name = request.GET.get('name') + return Response(f'https://{base_url_for_sms_report}backend.rasadyaar.ir/{excel_name}/?{request.query_params}') + + +def management_hatching_excel(request): + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + poultry_hatching = PoultryHatching.objects.filter(state__in=('pending', 'complete'), archive=False, + allow_hatching='pending', + trash=False).order_by('-chicken_age').select_related( + 'poultry') + + excel_options = [ + 'ردیف', + 'شهرستان', + 'نام واحد', + 'نام مالک', + 'تاریخ جوجه ریزی', + 'تعداد جوجه ریزی', + 'سن', + 'نود درصد جوجه ریزی', + 'مانده در سالن', + + ] + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + excel_description(worksheet, 'B3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='D3') + header_list2 = [ + 'تعداد کل جوجه ریزی', + 'تعداد قطعه بین 42تا 50روزگی', + 'تعداد قطعه بین 51تا 54روزگی', + 'تعداد قطعه بین 55تا 60روزگی', + 'تعداد قطعه بالای 60روزگی', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 9, 10, 20) + + # excel_description(worksheet, 'A1', f'تراکنش های صنف {name}', size=11, color='red', + # row2='D1') + + l = 8 + m = 1 + + for data in poultry_hatching: + l += 1 + age = data.chicken_age + if age > 60: + color = RED_CELL + elif 60 > age > 54: + color = LIGHT_GREEN_CELL + elif 54 > age > 49: + color = GREEN_CELL + elif 49 > age > 47: + color = VERY_LIGHT_GREEN_CELL + else: + color = None + list1 = [ + m, + data.poultry.address.city.name, + data.poultry.unit_name, + data.poultry.user.fullname, + convert_to_shamsi(date=data.date), + data.quantity, + data.chicken_age, + int(data.quantity * 0.9), + data.left_over + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, m=m, item_num=6, item_color=color, border_style='thin') + + quantity = poultry_hatching.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + beetwen_43_50 = poultry_hatching.filter(chicken_age__range=(43, 50)).aggregate(total=Sum('quantity'))[ + 'total'] or 0 + beetwen_51_54 = poultry_hatching.filter(chicken_age__range=(51, 54)).aggregate(total=Sum('quantity'))[ + 'total'] or 0 + beetwen_55_60 = poultry_hatching.filter(chicken_age__range=(55, 60)).aggregate(total=Sum('quantity'))[ + 'total'] or 0 + gt_60 = poultry_hatching.filter(chicken_age__gt=60).aggregate(total=Sum('quantity'))[ + 'total'] or 0 + value_header_list2 = [ + quantity, + beetwen_43_50, + beetwen_51_54, + beetwen_55_60, + gt_60 + + ] + create_value(worksheet, value_header_list2, 3, 5) + # + # len_transaction = sum(item['price'] for item in serializer.data) + # total_carcasses_weight = sum(item['current_price'] for item in serializer.data) + # + + left_over = poultry_hatching.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + quantity, + '', + int(quantity * 0.9), + left_over + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 + + +def user_without_role_excel(request): + users = SystemUserProfile.objects.filter(role__isnull=True, trash=False).only('fullname', 'create_date', + 'fullname').order_by('-create_date') + excel_options = [ + 'ردیف', + 'نام و نام خانوادگی کاربر', + 'موبایل کاربر', + 'تاریخ ایجاد کاربر', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 1, 2, 20, width=30) + + l = 2 + for user in users: + list1 = [ + m, + user.fullname, + user.mobile, + convert_to_shamsi(date=user.create_date), + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=20) + m += 1 + l += 1 + + 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 + + +def sub_section_of_cooperative_share_detail_with_date_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + 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, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + 'id') + 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 + ) + + total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + total_province_live_quantity += kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['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) + + # return Response(total_pure_province_carcasses_weight) + internal_total_pure_province_carcasses_weight = (( + total_pure_province_carcasses_weight / total_province_carcasses_weight) if total_province_carcasses_weight > 0 else 0) * total_province_carcasses_weight + external_total_pure_province_carcasses_weight = total_province_carcasses_weight - internal_total_pure_province_carcasses_weight + + total_pure_province_carcasses_price = internal_total_pure_province_carcasses_weight * province_live_wage_amount + total_out_selling_province_carcasses_price = external_total_pure_province_carcasses_weight * free_sell_carcesses_weight_amount + + poultries = Poultry.objects.filter(trash=False, city_operator__isnull=False).order_by('id') + hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by( + 'poultry') + + hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + has_wage=True, wage_pay=True, + temporary_deleted=False, hatching__in=hatchings, + send_date__date__gte=date1, + send_date__date__lte=date2) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + union_out_province_poultry_request_amount = poultry_requests.aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + 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 + + union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell', + share_type__en_name='union').first().percent / 100 + union_province_kill_request_wage = total_pure_province_carcasses_price * union_province_kill_request_percent + union_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * union_free_sell_carcasses_percent + + city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100 + city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100 + city_percent_out_sell_carcasses = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100 + + union_total_wage = union_province_kill_request_wage + union_out_province_poultry_request_amount + union_free_sell_carcasses_wage + hatching_killing_percent = (( + out_province_poultry_request_quantity + total_province_live_quantity) / hatching_quantity) * 100 + + city_province_kill_request_wage = union_province_kill_request_wage * city_percent_province_kill_request + city_out_province_poultry_request = union_out_province_poultry_request_amount * city_percent_out_poultry_request + city_out_province_sell_carcasses = union_free_sell_carcasses_wage * city_percent_out_sell_carcasses + city_total_wage = city_province_kill_request_wage + city_out_province_poultry_request + city_out_province_sell_carcasses + city_operator_deposit = SubSectorTransactions.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2) + city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0 + city_total_remain_wage_amount = city_total_wage - city_deposit + + excel_options = [ + 'ردیف', + 'تعاونی', + 'شهر', + 'کاربر', + 'موبایل کاربر', + 'تعداد فارم', + 'تعداد کل جوجه ریزی', + 'حجم کل جوجه ریزی', + 'حجم کل کشتار شده داخل استان', + 'وزن کل کشتار شده داخل استان', + 'وزن لاشه کشتار شده داخل استان', + 'وزن لاشه توزیع داخل استان', + 'وزن لاشه توزیع خارج استان', + 'حجم فروش خارج از استان', + 'وزن فروش خارج از استان', + 'حجم کل کشتار شده', + 'درصد کشتار شده نسبت به جوجه ریزی', + 'تعرفه زنده خارج از استان', + 'تعرفه کشتار و توزیع داخل استان', + 'تعرفه کشتار و توزیع خارج از استان', + 'مجموع تعرفه', + 'واریزی اتحادیه', + 'مانده تعرفه', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + header_list = [ + 'تعداد فارم', + 'تعداد کل جوجه ریزی', + 'حجم کل جوجه ریزی', + 'حجم کل کشتارشده داخل استان', + 'وزن کل کشتار شده داخل استان', + 'وزن لاشه کشتار شده داخل استان', + 'وزن کل لاشه توزیع داخل استان', + 'وزن کل لاشه توزیع خارج استان', + 'حجم کل فروش به خارج استان', + 'وزن کل فروش به خارج از استان', + 'حجم کل کشتار شده', + 'درصد کشتار شده نسبت به جوجه ریزی', + 'تعرفه زنده خارج از استان(اتحادیه)', + 'تعرفه کشتار و توزیع داخل استان(اتحادیه)', + 'تعرفه کشتار و توزیع خارج ازاستان(اتحادیه)', + 'کل تعرفه سهم اتحادیه استان', + 'تعرفه سهم زیر بخش ها', + 'واریزی اتحادیه به زیر بخش ها', + 'مانده تعرفه', + ] + create_header(worksheet, header_list, 4, 2, 21, 16.01) + from_date_1 = shamsi_date(date1) + from_date_2 = shamsi_date(date2) + excel_description(worksheet, 'A1', + f'گزارش جزئیات تعرفه سهم تعاونی ها ار تاریخ {from_date_1} تا تاریخ {from_date_2}', size=11, + color='red', row2='E1') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + # user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + city_operators = CityOperator.objects.filter(trash=False) + if 'operators' in request.GET: + + serializer = CityOperatorForSubSectorTransactionsSerializer(city_operators, many=True, + context={'request': request}) + else: + serializer = CityOperatorForSubSectorSerializerForExcel(city_operators, many=True, context={'request': request}) + if serializer.data: + for data in serializer.data: + list1 = [ + m, + data['unit_name'], + data['user']['city'], + data['user']['fullname'], + data['user']['mobile'], + data['wage_info']['poultries'], + data['wage_info']['hatchings'], + data['wage_info']['hatchings_quantity'], + data['wage_info']['total_province_kill_requests_quantity'], + data['wage_info']['total_province_kill_requests_weight'], + data['wage_info']['total_province_carcasses_weight'], + data['wage_info']['total_pure_internal_province_carcasses_weight'], + data['wage_info']['total_pure_external_province_carcasses_weight'], + data['wage_info']['out_province_poultry_request_quantity'], + data['wage_info']['out_province_poultry_request_weight'], + data['wage_info']['total_killed_quantity'], + data['wage_info']['hatching_killing_percent'], + data['wage_info']['out_province_poultry_request_amount'], + data['wage_info']['total_pure_internal_province_carcasses_amount'], + data['wage_info']['total_pure_external_province_carcasses_amount'], + data['wage_info']['total_wage_amount'], + data['wage_info']['city_deposit'], + data['wage_info']['total_remain_wage_amount'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + + value_header_list = [ + len(poultries), + len(hatchings), + hatching_quantity, + total_province_live_quantity, + total_province_live_weight, + total_province_carcasses_weight, + internal_total_pure_province_carcasses_weight, + external_total_pure_province_carcasses_weight, + out_province_poultry_request_quantity, + out_province_poultry_request_weight, + out_province_poultry_request_quantity + total_province_live_quantity, + hatching_killing_percent, + union_free_sell_carcasses_wage, + + union_province_kill_request_wage, + union_out_province_poultry_request_amount, + + union_total_wage, + city_total_wage, + city_deposit, + city_total_remain_wage_amount, + + ] + create_value(worksheet, value_header_list, 3, 4) + + poultries = sum(item['wage_info'].get('poultries', 0) for item in serializer.data) + hatchings = sum(item['wage_info'].get('hatchings', 0) for item in serializer.data) + hatchings_quantity = sum(item['wage_info'].get('hatchings_quantity', 0) for item in serializer.data) + total_province_kill_requests_quantity = sum( + item['wage_info'].get('total_province_kill_requests_quantity', 0) for item in serializer.data) + total_province_kill_requests_weight = sum( + item['wage_info'].get('total_province_kill_requests_weight', 0) for item in serializer.data) + total_province_carcasses_weight = sum( + item['wage_info'].get('total_province_carcasses_weight', 0) for item in serializer.data) + total_pure_internal_province_carcasses_weight = sum( + item['wage_info'].get('total_pure_internal_province_carcasses_weight', 0) for item in serializer.data) + total_pure_external_province_carcasses_weight = sum( + item['wage_info'].get('total_pure_external_province_carcasses_weight', 0) for item in serializer.data) + out_province_poultry_request_quantity = sum( + item['wage_info'].get('out_province_poultry_request_quantity', 0) for item in serializer.data) + out_province_poultry_request_weight = sum( + item['wage_info'].get('out_province_poultry_request_weight', 0) for item in serializer.data) + total_killed_quantity = sum(item['wage_info'].get('total_killed_quantity', 0) for item in serializer.data) + hatching_killing_percent = sum(item['wage_info'].get('hatching_killing_percent', 0) for item in serializer.data) + out_province_poultry_request_amount = sum( + item['wage_info'].get('out_province_poultry_request_amount', 0) for item in serializer.data) + total_pure_internal_province_carcasses_amount = sum( + item['wage_info'].get('total_pure_internal_province_carcasses_amount', 0) for item in serializer.data) + total_pure_external_province_carcasses_amount = sum( + item['wage_info'].get('total_pure_external_province_carcasses_amount', 0) for item in serializer.data) + total_wage_amount = sum(item['wage_info'].get('total_wage_amount', 0) for item in serializer.data) + city_deposit = sum(item['wage_info'].get('city_deposit', 0) for item in serializer.data) + total_remain_wage_amount = sum(item['wage_info'].get('total_remain_wage_amount', 0) for item in serializer.data) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + poultries, + hatchings, + hatchings_quantity, + total_province_kill_requests_quantity, + total_province_kill_requests_weight, + total_province_carcasses_weight, + total_pure_internal_province_carcasses_weight, + total_pure_external_province_carcasses_weight, + out_province_poultry_request_quantity, + out_province_poultry_request_weight, + total_killed_quantity, + hatching_killing_percent, + out_province_poultry_request_amount, + total_pure_internal_province_carcasses_amount, + total_pure_external_province_carcasses_amount, + total_wage_amount, + city_deposit, + total_remain_wage_amount, + + ] + create_value(worksheet, list2, l + 1, 1, color='green') + + 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 + + +def vet_for_sub_sector_with_date_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + vet = Vet.objects.filter(pk__in=VetFarm.objects.all().values_list('vet', flat=True), trash=False).order_by('id') + serializer = VetForSubSectorSerializer(vet, many=True, context={'request': request}) + + excel_options = [ + 'ردیف', + 'کاربر', + 'شهر', + 'حجم کشتار (دارای کد قرنطینه)', + 'وزن کشتار (دارای کد قرنطینه)', + 'تعرفه کشتارو توزیع داخل استان (ریال)', + 'تعرفه کشتارو توزیع خارج از استان (ریال)', + 'تعرفه فروش به خارج از استان (ریال)', + 'مجموع تعرفه (ریال)', + 'تعداد دفعات واریز', + 'مجموع واریزی اتحادیه (ریال)', + 'مانده تعرفه (ریال)' + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + header_list = [ + 'تعرفه کشتار و توزیع داخل استان', + 'تعرفه کشتار و توزیع خارج استان', + 'تعرفه فروش به خارج استان', + 'مجموع تعرفه', + 'واریزی اتحادیه', + 'مانده تعرفه' + ] + create_header(worksheet, header_list, 4, 2, 21, 16.01) + from_date_1 = shamsi_date(date1) + from_date_2 = shamsi_date(date2) + excel_description(worksheet, 'A1', + f'گزارش جزئیات تعرفه سهم تعاونی ها ار تاریخ {from_date_1} تا تاریخ {from_date_2}', size=11, + color='red', row2='E1') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + # user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + + if serializer.data: + for data in serializer.data: + list1 = [ + m, + data['user']['fullname'], # کاربر + data['user']['city'], # شهر + data['wage_info']['province_live_quantity'], # حجم کشتار (دارای کد قرنطینه) 🔺 + data['wage_info']['province_live_weight'], # وزن کشتار (دارای کد قرنطینه) + data['wage_info']['total_pure_internal_province_carcasses_amount'], + # تعرفه کشتارو توزیع داخل استان (ریال) + data['wage_info']['total_pure_external_province_carcasses_amount'], + # تعرفه کشتارو توزیع خارج از استان (ریال) + data['wage_info']['out_province_poultry_request_amount'], # تعرفه فروش به خارج از استان (ریال) + data['wage_info']['total_wage'], # مجموع تعرفه (ریال) + data['wage_info']['number_of_deposit'], # تعداد دفعات واریز + data['wage_info']['vet_deposit_amount'], # مجموع واریزی اتحادیه (ریال) + data['wage_info']['total_remain_wage'] # مانده تعرفه (ریال) + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + total_quantity = 0 + total_weight = 0 + total_wage = 0 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', + trash=False).first().amount + + percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) + other_province_kill_request_percent = percentages_wage_type.filter( + wage_type__en_name='province-kill-request', share_type__en_name='other').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 + + other_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province', + share_type__en_name='other').first().percent / 100 + other_province_kill_request_amount = province_live_wage_amount * other_province_kill_request_percent + other_free_sell_carcasses_amount = free_sell_carcasses_wage_amount * other_free_sell_carcasses_percent + + other_out_poultry_request_amount = out_poultry_request_wage_amount * other_out_poultry_request_percent + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False, vet_farm__isnull=False, + ) + # quarantine_code__isnull=False) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + 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, + province_request__poultry_request__vet_farm__isnull=False, + # clearance_code__isnull=False, + clearance_code__isnull=False, + trash=False, calculate_status=True + ) + + province_live_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + province_live_quantity = 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') + province_live_weight += \ + difference_requests.aggregate(total=Sum('weight'))['total'] or 0 + total_quantity += province_live_quantity + out_province_poultry_request_quantity + total_weight += province_live_weight + out_province_poultry_request_weight + + province_carcasses_weight = province_live_weight * 0.75 + internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent() + external_pure_province_carcasses_weight = province_carcasses_weight - internal_pure_province_carcasses_weight + + total_pure_internal_province_carcasses_amount = internal_pure_province_carcasses_weight * other_province_kill_request_amount + total_pure_external_province_carcasses_amount = external_pure_province_carcasses_weight * other_free_sell_carcasses_amount + out_province_poultry_request_amount = out_province_poultry_request_weight * other_out_poultry_request_amount + + vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet__isnull=False) + vet_deposit_amount = vet_deposit.aggregate(total=Sum('amount'))['total'] or 0 + total_wage += total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount + total_remain_wage = total_wage - vet_deposit_amount + value_header_list = [ + total_pure_internal_province_carcasses_amount, # تعرفه کشتار و توزیع داخل استان + total_pure_external_province_carcasses_amount, # تعرفه کشتار و توزیع خارج استان + out_province_poultry_request_amount, # تعرفه فروش به خارج استان + total_wage, # مجموع تعرفه + vet_deposit_amount, # واریزی اتحادیه + total_remain_wage # مانده تعرفه + ] + create_value(worksheet, value_header_list, 3, 4) + + # list2 = [ + # 'مجموع==>', + # '', + # '', + # '', + # '', + # poultries, + # hatchings, + # hatchings_quantity, + # total_province_kill_requests_quantity, + # total_province_kill_requests_weight, + # total_province_carcasses_weight, + # total_pure_internal_province_carcasses_weight, + # total_pure_external_province_carcasses_weight, + # out_province_poultry_request_quantity, + # out_province_poultry_request_weight, + # total_killed_quantity, + # hatching_killing_percent, + # out_province_poultry_request_amount, + # total_pure_internal_province_carcasses_amount, + # total_pure_external_province_carcasses_amount, + # total_wage_amount, + # city_deposit, + # total_remain_wage_amount, + # + # ] + # create_value(worksheet, list2, l + 1, 1, color='green') + + 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 + + +def dashboard_monitoring_bar_and_killing_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else now + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + sheet_names2 = ['اطلاعات کشتار', 'اطلاعات بار', 'تخصیصات بدون بار', 'خرید زنده خارج از استان', + 'خرید لاشه خارج استان', + 'فروش زنده به خارج استان', 'اطلاعات کشتارگاه ها'] + for name in sheet_names2: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + if sheet_name == 'اطلاعات کشتار': + filtered_province_kill_reqs = PoultryRequest.objects.filter(state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2).select_related( + 'poultry', 'poultry__user').order_by( + '-send_date') + excel_options = [ + 'ردیف', + 'کد سفارش', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'فروش', + 'نام و نام خانوادگی مرغدار', + 'نام فارم', + 'موبایل', + 'کشتارگاه های پیشنهادی', + 'آدرس', + 'سن مرغ', + 'تعداد درخواست کشتار', + 'مانده در سالن', + 'میانگین وزنی هر قطعه(کیلوگرم)', + 'وزن کل درخواست(کیلوگرم)', + 'قیمت هرکیلو مرغ زنده(ریال)', + 'تایید شده', + ] + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد درخواست', + 'مجموع تعداد قطعه', + 'وزن تقریبی کل درخواست', + 'مجموع مانده در سالن', + 'میانگین سنی', + ] + create_header(worksheet, header_list, 4, 2, height=17) + + excel_description(worksheet, 'A2', 'درخواست کشتار مرغداران', size=11, row2='B2') + + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', color='red', + row2='C3') + m = 1 + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=23, width=21.01) + l = 4 + all_quantity = 0 + all_wight = 0 + all_left_over = 0 + all_age = [] + if filtered_province_kill_reqs: + for filtered_poultry_kill_request in filtered_province_kill_reqs: + all_quantity += filtered_poultry_kill_request.quantity + all_wight += int( + filtered_poultry_kill_request.quantity * filtered_poultry_kill_request.Index_weight) + l += 1 + date_of_create = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.create_date.day, + month=filtered_poultry_kill_request.create_date.month, + year=filtered_poultry_kill_request.create_date.year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.send_date.day, + month=filtered_poultry_kill_request.send_date.month, + year=filtered_poultry_kill_request.send_date.year + ) + state = 'تایید شده' + if filtered_poultry_kill_request.state == 'pending': + state = 'در انتظار تایید' + kill_house = '-' + if filtered_poultry_kill_request.kill_house_list is not None: + for name in filtered_poultry_kill_request.kill_house_list: + kill_house += name + '/' + age = ( + filtered_poultry_kill_request.send_date.date() - filtered_poultry_kill_request.hatching.date.date()).days + 1 + + if age not in all_age: + all_age.append(age) + + sale_type = 'دولتی' if filtered_poultry_kill_request.free_sale_in_province == False else 'آزاد' + all_left_over += filtered_poultry_kill_request.hatching.left_over + + list1 = [ + m, + str(filtered_poultry_kill_request.order_code), + str(date_of_create), + str(date_of_kill), + sale_type, + filtered_poultry_kill_request.poultry.user.fullname, + filtered_poultry_kill_request.poultry.unit_name, + filtered_poultry_kill_request.poultry.user.mobile, + kill_house, + filtered_poultry_kill_request.poultry.address.city.name, + str(age), + filtered_poultry_kill_request.quantity, + filtered_poultry_kill_request.hatching.left_over, + filtered_poultry_kill_request.Index_weight, + int(filtered_poultry_kill_request.quantity * filtered_poultry_kill_request.Index_weight), + filtered_poultry_kill_request.amount, + state + ] + m += 1 + create_value(worksheet, list1, l + 1, 1) + all_age1 = sorted(all_age) + value_header_list = [ + len(filtered_province_kill_reqs), + all_quantity, + all_wight, + all_left_over, + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + + ] + create_value(worksheet, value_header_list, 3, 4) + elif sheet_name == 'اطلاعات بار': + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'province_kill_request__kill_house_price', + 'price', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'province_kill_request__kill_house_price', + 'price', + 'bar_document_status__title' + ) + + filtered_kill_reqs = filtered_kill_request + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + 'قیمت پیشنهادی کشتارگاه(ریال)', + 'قیمت تعاونی(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + 'کشور مقصد', + 'اختلاف مجوز', + + ] + + from_date_1 = shamsi_date(date1) + + to_date_1 = shamsi_date(date2) + + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + header_list3 = [ + 'درصد بارهای دارای کد قرنطینه', + 'درصد تعداد بارهای احراز شده از قرنطینه', + 'درصد تعداد بارهای تکمیل شده کشتارگاه', + 'درصد وزن نهایی در کشتارگاه نسبت به وزن کل', + 'درصد بارهای فاقد کد قرنطینه', + 'درصد بارهای اختلاف دار در قرنطینه و رصدیار', + 'درصد تعداد بارهای ورودی به انبار', + 'درصد وزن لاشه ها در انبار نسبت به وزن کل', + 'درصد وزن لاشه در انبار نسبت به وزن نهایی در کشتارگاه', + + ] + create_header(worksheet, header_list, 9, 2, height=21.8) + + create_header(worksheet, header_list2, 6, 2, height=21.8, color='green') + + create_header(worksheet, header_list3, 6, 5, height=43, color='orange', text_color='0D0D0D') + create_header_freez(worksheet, excel_options, 1, 8, 9, height=21, len_with=True) + + excel_description(worksheet, 'B1', 'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی', color='red', + row2='D1') + + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + excel_description(worksheet, 'B2', f'استان {name}', color='red', row2='D2') + excel_description(worksheet, 'B3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='D3') + + l = 8 + m = 1 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, + day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if weight_loss1 != 0 else 0 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + + kill.get('province_kill_request__kill_house_price') if kill.get( + 'province_kill_request__kill_house_price') else '-', + + kill.get('price') if kill.get( + 'price') else '-', + + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + export_country, + kill['accepted_real_quantity'] - quarantine_quantity if kill[ + 'quarantine_quantity'] != None else quarantine_quantity + + ] + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=40, different_value='بار حذف شده') + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + 2) if all_weight_loss > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, + 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 3, 6) + value_header_list2 = [ + f'%{round((has_code * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((has_qarantine * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((len(bar_complete) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_net_weighte) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((len(hasnt_code1) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((difference_bar * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((all_state_ware_house_confirmation * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_net_weighte), 2) if int(all_net_weighte) > 0 else 0}' + ] + create_value(worksheet, value_header_list2, 6, 6) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + '', + '', + '', + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_name == 'تخصیصات بدون بار': + wage_type = WageType.objects.filter(en_name='province-kill-request').first() + total_check_wage = wage_type.amount + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + union_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name == 'company': + company_wage_percent = percentage_wage_type.percent / 100 + + elif percentage_wage_type.share_type.en_name == 'guilds': + guilds_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name in ['city', 'wallet']: + pass + else: + other_wage_percent = percentage_wage_type.percent / 100 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', + trash=False).first().amount + free_buying_live_weight_amount = total_wage_type.filter(en_name='live-buy', trash=False).first().amount + free_buying_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-buy', + trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', + trash=False).first().amount + worksheet['H3'] = 'در این قسمت تخصیصات فاقد بار نمایش داده میشود' + merge_range1 = 'H3:K3' + worksheet.merge_cells(merge_range1) + worksheet['H3'].font = Font(color="C00000", bold=True) + worksheet['H3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + province_kill_request = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + first_car_allocated_quantity=0, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).order_by( + 'kill_request__recive_date') + + if wage_counting_type == 'carcass': + header_list = [ + 'تعداد سفارشات', + 'تعداد کل', + 'وزن کل', + 'وزن لاشه ملاک تعرفه', + 'جمع کل تعرفه', + ] + else: + header_list = [ + 'تعداد سفارشات', + 'تعداد کل', + 'وزن کل', + 'وزن ملاک تعرفه', + 'جمع کل تعرفه', + ] + for col_num, option in enumerate(header_list, 3): + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[3].height = 20.8 + if wage_counting_type == 'carcass': + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'وزن لاشه ملاک تعرفه ', + 'تعرفه (ریال)', + 'تعرفه تخصیص(ریال)', + + ] + else: + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'وزن ملاک تعرفه ', + 'تعرفه (ریال)', + 'تعرفه تخصیص(ریال)', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 6 + m = 1 + for province_kill in province_kill_request: + + kill_date_1 = shamsi_date(province_kill.province_request.poultry_request.send_date) + + if province_kill.kill_request.slaughter_house is not None: + kill_place = province_kill.kill_request.slaughter_house.name + else: + kill_place = province_kill.kill_request.kill_house.name + + total_amount = province_kill.total_wage_amount + if wage_counting_type == 'carcass': + list1 = [ + m, + str(province_kill.province_request.poultry_request.order_code), + province_kill.province_request.poultry_request.poultry.unit_name, + province_kill.province_request.poultry_request.poultry.user.mobile, + province_kill.province_request.poultry_request.poultry.address.city.name, + str(kill_date_1), + kill_place, + province_kill.province_request.poultry_request.hatching.chicken_breed, + province_kill.total_killed_quantity, + province_kill.total_killed_weight, + province_kill.province_request.poultry_request.Index_weight, + province_kill.total_killed_weight * 0.75, + province_live_wage_amount, + (province_kill.total_killed_weight * 0.75) * province_live_wage_amount, + + ] + else: + list1 = [ + m, + str(province_kill.province_request.poultry_request.order_code), + province_kill.province_request.poultry_request.poultry.unit_name, + province_kill.province_request.poultry_request.poultry.user.mobile, + province_kill.province_request.poultry_request.poultry.address.city.name, + str(kill_date_1), + kill_place, + province_kill.province_request.poultry_request.hatching.chicken_breed, + province_kill.total_killed_quantity, + province_kill.total_killed_weight, + province_kill.province_request.poultry_request.Index_weight, + province_kill.total_killed_weight, + province_live_wage_amount, + (province_kill.total_killed_weight) * province_live_wage_amount, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + m += 1 + total_weight = \ + province_kill_request.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_killed_quantity = \ + province_kill_request.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_wage_amount = \ + province_kill_request.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + if wage_counting_type == 'carcass': + value_list = [ + m - 1, + total_killed_quantity, + total_weight, + total_weight * 0.75, + (total_weight * 0.75) * province_live_wage_amount, + + ] + else: + value_list = [ + m - 1, + total_killed_quantity, + total_weight, + total_weight, + (total_weight) * province_live_wage_amount, + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=4, column=item + 3, value=value_list[item]) + value = value_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + if wage_counting_type == 'carcass': + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_killed_quantity, + total_weight, + '', + total_weight * 0.75, + province_live_wage_amount, + (total_weight * 0.75) * province_live_wage_amount, + + ] + else: + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_killed_quantity, + total_weight, + '', + total_weight, + province_live_wage_amount, + (total_weight) * province_live_wage_amount, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'خرید زنده خارج از استان': + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = 'live' + if request.GET['role'] in ['KillHouse', 'KillHouseVet']: + if request.GET['role'] == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + trash=False).order_by('-date') + else: + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + trash=False).order_by('-date') + + excel_options = [ + 'ردیف', + 'کدسفارش', + 'تاریخ خرید', + 'ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + 'فروشنده', + 'تلفن فروشنده', + 'نوع خرید', + 'استان/شهر', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'وضعیت دامپزشک', + 'ماشین', + 'راننده', + 'تلفن راننده', + 'کدقرنطینه', + 'تعداد قطعه زنده', + 'وزن زنده (کیلوگرم)', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + 'حجم تایید شده', + 'وزن تایید شده', + 'تایید/رد کننده', + 'تاریخ تایید/ رد', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list2 = [ + 'تعداد بارها', + ' تعداد بار های درانتظار تایید', + 'مجموع قطعه زنده در انتظار تایید', + 'مجموع وزن زنده (کیلوگرم) درانتظار تایید', + 'مجموع تعداد لاشه درانتظار تایید', + 'مجموع وزن لاشه (کیلوگرم) درانتظار تایید', + + ' تعداد بار های رد شده', + 'مجموع قطعه زنده رد شده', + 'مجموع وزن زنده (کیلوگرم) رد شده', + 'مجموع تعداد لاشه رد شده', + 'مجموع وزن لاشه (کیلوگرم) رد شده', + + ' تعداد بار های تایید شده', + 'مجموع قطعه زنده تایید شده', + 'مجموع وزن زنده (کیلوگرم) تایید شده', + 'مجموع تعداد لاشه تایید شده', + 'مجموع وزن لاشه (کیلوگرم) تایید شده', + 'حجم تایید شده دامپزشک', + 'وزن تایید شده دامپزشک', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + type = 'زنده' if type == 'live' else 'لاشه' + worksheet['B1'] = f'گزارش بار {type} خرید از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.kill_house_vet_state == 'accepted': + state = 'تایید شده' + elif kill.kill_house_vet_state == 'pending': + state = 'درانتظار تایید' + else: + state = 'رد شده' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + if kill.exclusive_killer: + killer_type = f'کشتارکن اختصاصی {kill.kill_house.name}' + kill_house_name = kill.exclusive_killer.name + kill_house_mobile = kill.exclusive_killer.kill_house_operator.user.mobile + + elif kill.kill_house.killer == True and kill.kill_house.type == 'public': + killer_type = 'کشتارکن عمومی' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + + else: + killer_type = 'کشتارگاه' + kill_house_name = kill.kill_house.name + kill_house_mobile = kill.kill_house.kill_house_operator.user.mobile + bar_code = str(kill.bar_code) if kill.bar_code else '-' + list1 = [ + m, + bar_code, + str(date_of_buy), + killer_type, + kill_house_name, + kill_house_mobile, + kill.poultry_name, + kill.poultry_mobile, + buy_type, + f'{kill.province} / {kill.city}', + kill.vet_farm_name, + kill.vet_farm_mobile, + state, + kill.car, + kill.driver_name, + kill.driver_mobile, + kill.bar_clearance_code, + kill.quantity, + kill.live_weight, + kill.number_of_carcasses, + kill.weight_of_carcasses, + kill.kill_house_vet_quantity, + kill.kill_house_vet_weight, + kill.acceptor_rejector, + str(date_of_reject_accepted) + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, height=20, width=30) + + bar_pending = kill_house_free_bar_info.filter(kill_house_vet_state='pending') + bar_pending_quantity = bar_pending.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_pending_live_weight = bar_pending.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_pending_number_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_pending_weight_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_rejected = kill_house_free_bar_info.filter(kill_house_vet_state='rejected') + bar_rejected_quantity = bar_rejected.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_rejected_live_weight = bar_rejected.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_rejected_number_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_rejected_weight_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_accepted = kill_house_free_bar_info.filter(kill_house_vet_state='accepted') + bar_accepted_quantity = bar_accepted.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_accepted_live_weight = bar_accepted.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_accepted_number_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_weight_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_quantity = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_weight = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + bar_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_kill_house_vet_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_kill_house_vet_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + m - 1, + len(bar_pending), + int(bar_pending_quantity), + int(bar_pending_live_weight), + int(bar_pending_number_of_carcasses), + int(bar_pending_weight_of_carcasses), + + len(bar_rejected), + int(bar_rejected_quantity), + int(bar_rejected_live_weight), + int(bar_rejected_number_of_carcasses), + int(bar_rejected_weight_of_carcasses), + + len(bar_accepted), + int(bar_accepted_quantity), + int(bar_accepted_live_weight), + int(bar_accepted_number_of_carcasses), + int(bar_accepted_weight_of_carcasses), + int(bar_accepted_kill_house_vet_quantity), + int(bar_accepted_kill_house_vet_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + bar_quantity, + bar_live_weight, + int(bar_number_of_carcasses), + int(bar_weight_of_carcasses), + int(bar_kill_house_vet_quantity), + bar_kill_house_vet_weight, + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'خرید لاشه خارج استان': + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + type = 'carcass' + if request.GET['role'] in ['KillHouse', 'KillHouseVet']: + if request.GET['role'] == 'KillHouse': + kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + else: + kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house', + flat=True) + kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False) + + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + trash=False).order_by('-date') + else: + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + buy_type=type, + trash=False).order_by('-date') + + excel_options = [ + 'ردیف', + 'وضعیت دامپزشک', + 'کشتارگاه', + 'فروشنده', + 'نوع خرید', + 'استان/شهر', + 'تاریخ خرید', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'ماشین', + 'راننده', + 'تلفن راننده', + 'کدقرنطینه', + 'تعداد قطعه زنده', + 'وزن زنده (کیلوگرم)', + 'تعداد لاشه', + 'وزن لاشه (کیلوگرم)', + 'حجم تایید شده', + 'وزن تایید شده', + 'تایید/رد کننده', + 'تاریخ تایید/ رد', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list2 = [ + 'تعداد بارها', + ' تعداد بار های درانتظار تایید', + 'مجموع قطعه زنده در انتظار تایید', + 'مجموع وزن زنده (کیلوگرم) درانتظار تایید', + 'مجموع تعداد لاشه درانتظار تایید', + 'مجموع وزن لاشه (کیلوگرم) درانتظار تایید', + + ' تعداد بار های رد شده', + 'مجموع قطعه زنده رد شده', + 'مجموع وزن زنده (کیلوگرم) رد شده', + 'مجموع تعداد لاشه رد شده', + 'مجموع وزن لاشه (کیلوگرم) رد شده', + + ' تعداد بار های تایید شده', + 'مجموع قطعه زنده تایید شده', + 'مجموع وزن زنده (کیلوگرم) تایید شده', + 'مجموع تعداد لاشه تایید شده', + 'مجموع وزن لاشه (کیلوگرم) تایید شده', + 'حجم تایید شده دامپزشک', + 'وزن تایید شده دامپزشک', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + type = 'زنده' if type == 'live' else 'لاشه' + worksheet['B1'] = f'گزارش بار {type} خرید از استان' + + if kill_house_free_bar_info.exists(): + name = kill_house_free_bar_info.first().kill_house.kill_house_operator.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if kill_house_free_bar_info: + for kill in kill_house_free_bar_info: + l += 1 + + if kill.kill_house_vet_state == 'accepted': + state = 'تایید شده' + elif kill.kill_house_vet_state == 'pending': + state = 'درانتظار تایید' + else: + state = 'رد شده' + + if kill.buy_type == 'live': + buy_type = 'زنده' + else: + buy_type = 'لاشه' + + date_of_buy = jdatetime.date.fromgregorian( + day=kill.date.day, + month=kill.date.month, + year=kill.date.year + ) + + if kill.date_of_accept_reject: + date_of_reject_accepted = jdatetime.date.fromgregorian( + day=kill.date_of_accept_reject.day, + month=kill.date_of_accept_reject.month, + year=kill.date_of_accept_reject.year + ) + else: + date_of_reject_accepted = '-' + + list1 = [ + m, + state, + kill.kill_house.name, + kill.poultry_name, + buy_type, + f'{kill.province} / {kill.city}', + str(date_of_buy), + kill.vet_farm_name, + kill.vet_farm_mobile, + kill.car, + kill.driver_name, + kill.driver_mobile, + kill.bar_clearance_code, + kill.quantity, + kill.live_weight, + kill.number_of_carcasses, + kill.weight_of_carcasses, + kill.kill_house_vet_quantity, + kill.kill_house_vet_weight, + kill.acceptor_rejector, + str(date_of_reject_accepted) + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + bar_pending = kill_house_free_bar_info.filter(kill_house_vet_state='pending') + bar_pending_quantity = bar_pending.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_pending_live_weight = bar_pending.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_pending_number_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_pending_weight_of_carcasses = bar_pending.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_rejected = kill_house_free_bar_info.filter(kill_house_vet_state='rejected') + bar_rejected_quantity = bar_rejected.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_rejected_live_weight = bar_rejected.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_rejected_number_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_rejected_weight_of_carcasses = bar_rejected.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + + bar_accepted = kill_house_free_bar_info.filter(kill_house_vet_state='accepted') + bar_accepted_quantity = bar_accepted.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_accepted_live_weight = bar_accepted.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_accepted_number_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_weight_of_carcasses = bar_accepted.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_quantity = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_accepted_kill_house_vet_weight = bar_accepted.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + bar_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + bar_live_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('live_weight')).get( + 'total_quantity') or 0 + bar_number_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('number_of_carcasses')).get( + 'total_quantity') or 0 + bar_weight_of_carcasses = kill_house_free_bar_info.aggregate( + total_quantity=Sum('weight_of_carcasses')).get( + 'total_quantity') or 0 + bar_kill_house_vet_quantity = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_quantity')).get( + 'total_quantity') or 0 + bar_kill_house_vet_weight = kill_house_free_bar_info.aggregate( + total_quantity=Sum('kill_house_vet_weight')).get( + 'total_quantity') or 0 + + value_header_list2 = [ + m - 1, + len(bar_pending), + int(bar_pending_quantity), + int(bar_pending_live_weight), + int(bar_pending_number_of_carcasses), + int(bar_pending_weight_of_carcasses), + + len(bar_rejected), + int(bar_rejected_quantity), + int(bar_rejected_live_weight), + int(bar_rejected_number_of_carcasses), + int(bar_rejected_weight_of_carcasses), + + len(bar_accepted), + int(bar_accepted_quantity), + int(bar_accepted_live_weight), + int(bar_accepted_number_of_carcasses), + int(bar_accepted_weight_of_carcasses), + int(bar_accepted_kill_house_vet_quantity), + int(bar_accepted_kill_house_vet_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + bar_quantity, + bar_live_weight, + int(bar_number_of_carcasses), + int(bar_weight_of_carcasses), + int(bar_kill_house_vet_quantity), + bar_kill_house_vet_weight, + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'فروش زنده به خارج استان': + + state = 'accepted' + user = SystemUserProfile.objects.get(key=request.GET['key']) + name_bar = '' + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False).order_by('-send_date') + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + if state == 'pending': + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'جدید' + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'تایید شده' + else: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + + name_bar = 'حذف/رد شده' + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'جدید' + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'تایید شده' + else: + name_bar = 'حذف/رد شده' + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + + + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']: + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'جدید' + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'تایید شده' + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + trash=False).order_by('-send_date') + name_bar = 'رد شده' + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + poultry_requests_accepted = poultry_requests.filter(province_state='accepted') + + excel_options = [ + 'ردیف', + 'وضعیت', + 'پرداخت کننده', + 'کدسفارش مرغدار', + ' تاریخ ثبت درخواست', + ' تاریخ کشتار', + ' کشتار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' استان مرغدار', + 'سن مرغ', + ' نژاد', + 'تعداد درخواست', + 'میانگین وزنی', + 'وزن درخواست', + 'مانده در سالن', + 'جوجه ریزی اولیه', + + ' ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + ' شهر خریدار', + 'استان خریدار', + 'محل کشتار', + 'کد یکتای کشتارگاه', + 'شهر محل کشتار', + + 'نوع خودرو', + 'پلاک', + + 'نام راننده', + 'موبایل راننده', + 'کد بهداشتی حمل و نقل', + + 'کد رهگیری سامانه قرنطینه', + 'ثبت کننده کد قرنطینه', + 'تاریخ ثبت کد قرنطینه', + 'سازنده', + + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تایید شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای {name_bar} خارج از استان' + if poultry_requests.exists(): + name = poultry_requests.first().poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_weighte = 0 + all_chicken_quantity = 0 + all_age = [] + all_quantity = poultry_requests_accepted.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + all_weighte = poultry_requests_accepted.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] + + has_code = 0 + if poultry_requests: + for poultry_request in poultry_requests: + + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, + state='accepted').exists(): + age = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + else: + age = (datetime.datetime.now() - poultry_request.hatching.date).days + 1 + all_age.append(age) + all_chicken_quantity += poultry_request.hatching.quantity + create_date_of_poultry_request = jdatetime.date.fromgregorian( + day=poultry_request.create_date.day, + month=poultry_request.create_date.month, + year=poultry_request.create_date.year + ) + date_of_kill_request = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + if poultry_request.quarantine_code_registrar is not None: + date_code = poultry_request.quarantine_code_registrar['date'].split('-') + + date_of_create_code = jdatetime.date.fromgregorian( + day=int(date_code[2]), + month=int(date_code[1]), + year=int(date_code[0]) + ) + full_name = poultry_request.quarantine_code_registrar['fullname'] + mobile = poultry_request.quarantine_code_registrar['mobile'] + else: + date_of_create_code = '-' + full_name = '-' + mobile = '-' + + killing_place = '-' + killing_place_city = '-' + uniq_id = '-' + if poultry_request.out_province_poultry_request_buyer: + if poultry_request.out_province_poultry_request_buyer.type == 'killhouse': + is_killer = 'کشتارگاه' + uniq_id = poultry_request.out_province_poultry_request_buyer.kill_house_unique_id if poultry_request.out_province_poultry_request_buyer.kill_house_unique_id else '-' + + else: + is_killer = 'کشتارکن' + killing_place = poultry_request.killer_kill_house_unit_name \ + if poultry_request.killer_kill_house_unit_name is not None \ + else '-' + killing_place_city = poultry_request.killer_kill_house_province \ + + '(' + poultry_request.killer_kill_house_city \ + + ')' if poultry_request.killer_kill_house_province \ + and poultry_request.killer_kill_house_city is not None \ + else '-' + uniq_id = poultry_request.kill_house_unique_id if poultry_request.kill_house_unique_id else '-' + else: + is_killer = 'کشتارگاه' if poultry_request.buyer is not None and poultry_request.buyer[ + 'buyerType'] == 'killhouse' else 'کشتارکن' + if poultry_request.quarantine_code: + code = poultry_request.quarantine_code + has_code += 1 + else: + code = '-' + + freez_state = 'منجمد' if poultry_request.freezing == True else 'عادی' + + if poultry_request.out_province_poultry_request_buyer is not None: + full_name_buyer = poultry_request.out_province_poultry_request_buyer.fullname + mobile_buyer = poultry_request.out_province_poultry_request_buyer.user.mobile + city_buyer = poultry_request.out_province_poultry_request_buyer.user.city.name + province_buyer = poultry_request.out_province_poultry_request_buyer.user.province.name + + else: + full_name_buyer = poultry_request.buyer['firstName'] + mobile_buyer = poultry_request.buyer['mobile'] + city_buyer = poultry_request.buyer['city'] + province_buyer = poultry_request.buyer['province'] + + if poultry_request.province_state == 'rejected': + state1 = 'رد شده' + elif poultry_request.province_state == 'pending' and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار تایید' + + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار پرداخت' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == False and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'تایید شده' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == True and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'پرداخت شده' + else: + state1 = 'لغو شده' + + list1 = [ + m, + state1, + poultry_request.payer_fullname if poultry_request.payer_fullname else '-', + str(poultry_request.order_code), + str(create_date_of_poultry_request), + str(date_of_kill_request), + freez_state, + poultry_request.poultry.user.fullname, + poultry_request.poultry.user.mobile, + poultry_request.poultry.user.city.name, + poultry_request.poultry.user.province.name, + age, + poultry_request.hatching.chicken_breed, + poultry_request.quantity, + poultry_request.Index_weight, + int(poultry_request.quantity * poultry_request.Index_weight), + poultry_request.hatching.left_over, + poultry_request.hatching.quantity, + is_killer, + full_name_buyer, + mobile_buyer, + city_buyer, + province_buyer, + killing_place, + uniq_id, + killing_place_city, + poultry_request.out_province_driver_info[ + 'driverCar'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverPelak'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverName'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverMobile'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverhealthCode'] if poultry_request.out_province_driver_info != None else '-', + code, + full_name + '(' + mobile + ')', + str(date_of_create_code), + poultry_request.registrar['fullname'] if poultry_request.registrar else '-' + ] + + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(poultry_requests_accepted), + all_quantity if all_quantity != None else 0, + all_weighte if all_weighte != None else 0, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity if all_quantity != None else 0, + '', + all_weighte, + '', + all_chicken_quantity, + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + else: + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + 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, trash=False).exclude( + id__in=kill_house_ids).order_by( + 'id') + + serializer = KillHouseForPerformanceDashboardSerializer(kill_houses, many=True, + context={'date1': date1, 'date2': date2, }).data + + excel_options = [ + 'ردیف', + 'ماهیت', + 'کشتارگاه / کشتارکن', + 'مالک', + 'تلفن', + 'شهر', + 'تعداد بار داخل استان', + 'حجم بار داخل استان', + 'وزن بار داخل استان', + 'تعداد بار خارج استان', + 'حجم بار خارج استان', + 'وزن بار خارج استان', + 'وزن تخصیصات بدون بار', + + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بار داخل استان', + 'حجم بار داخل استان', + 'وزن بار داخل استان', + 'تعداد بار خارج استان', + 'حجم بار خارج استان', + 'وزن بار خارج استان', + 'وزن تخصیصات بدون بار', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'اطلاعات کشتارگاه ها' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + if serializer: + for data in serializer: + killer = 'کشتارگاه' if data['killer'] == False else 'کشتارکن' + list1 = [ + m, + killer, + data['name'], + data['kill_house_operator']['user']['fullname'], + data['kill_house_operator']['user']['mobile'], + data['kill_house_operator']['user']['city'], + data['killing_info']['kill_house_requests_count'], + data['killing_info']['kill_house_requests_quantity'], + data['killing_info']['kill_house_requests_weight'], + data['killing_info']['kill_house_free_bar_count'], + data['killing_info']['kill_house_free_bar_quantity'], + data['killing_info']['kill_house_free_bar_weight'], + data['killing_info']['province_kill_requests_quantity'], + + ] + + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + total_kill_house_requests_count = sum( + data.get('killing_info', {}).get('kill_house_requests_count', 0) for data in serializer + ) + total_kill_house_requests_quantity = sum( + data.get('killing_info', {}).get('kill_house_requests_quantity', 0) for data in serializer + ) + total_kill_house_requests_weight = sum( + data.get('killing_info', {}).get('kill_house_requests_weight', 0) for data in serializer + ) + total_kill_house_free_bar_count = sum( + data.get('killing_info', {}).get('kill_house_free_bar_count', 0) for data in serializer + ) + total_kill_house_free_bar_quantity = sum( + data.get('killing_info', {}).get('kill_house_free_bar_quantity', 0) for data in serializer + ) + total_kill_house_free_bar_weight = sum( + data.get('killing_info', {}).get('kill_house_free_bar_weight', 0) for data in serializer + ) + total_province_kill_requests_quantity = sum( + data.get('killing_info', {}).get('province_kill_requests_quantity', 0) for data in serializer + ) + + # ایجاد لیست از مقادیر جمع‌زده شده + totals_list = [ + total_kill_house_requests_count, + total_kill_house_requests_quantity, + total_kill_house_requests_weight, + total_kill_house_free_bar_count, + total_kill_house_free_bar_quantity, + total_kill_house_free_bar_weight, + total_province_kill_requests_quantity + ] + for item in range(len(totals_list)): + cell = worksheet.cell(row=3, column=item + 6, value=totals_list[item]) + value = totals_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + total_kill_house_requests_count, + total_kill_house_requests_quantity, + total_kill_house_requests_weight, + total_kill_house_free_bar_count, + total_kill_house_free_bar_quantity, + total_kill_house_free_bar_weight, + total_province_kill_requests_quantity + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="داشبورد.xlsx"'.encode( # noqa + 'utf-8') + response.write(output.getvalue()) + return response + + +def steward_allocation_excel(request): + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + role = request.GET.get('role') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + value = request.GET.get('value') + search = request.GET.get('search') + kill_house_key = request.GET.get('kill_house_key') + steward_key = request.GET.get('steward_key') + allocations_type = request.GET.get('type') + trash = request.GET.get('trash') + return_trash = request.GET.get('return_trash') + filters = { + 'to_cold_house__isnull': True, + 'calculate_status': True, + } + if trash == 'true': + filters['trash'] = True + filters['active_expire_date_time'] = True + else: + filters['trash'] = False + if allocations_type == 'KillHouse': + filters['kill_house__isnull'] = False + elif allocations_type == 'Steward': + filters['steward__isnull'] = False + if return_trash == 'true': + filters['return_trash'] = True + filters['trash'] = False + if kill_house_key and kill_house_key != 'all': + filters['kill_house__key'] = kill_house_key + if steward_key and steward_key != 'all': + filters['steward__key'] = steward_key + + if date1: + filters['date__date__gte'] = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + filters['date__date__lte'] = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + filters['kill_house'] = kill_house + elif role == 'Steward': + steward = Guilds.objects.get(user=user, trash=False) + filters['steward'] = steward + allocations = StewardAllocation.objects.filter(**filters).order_by('-date') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + allocations = allocations.filter( + build_query(StewardAllocationDashboardFilterSet, value) + ) + serializer = InProvinceAllocationSerializer(allocations, many=True).data + + excel_options = [ + 'ردیف', + 'تاریخ ثبت', + 'نوع تخصیص', + 'فروشنده', + 'تلفن فروشنده', + 'شهر فروشنده', + 'خریدار', + 'تلفن خریدار', + 'شماره واسط خریدار', + 'شهر خریدار', + 'پوز مباشر', + 'پوز صنف', + 'نوع فروش', + 'قیمت هر کیلو(ریال)', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + 'کد احراز', + 'وضعیت کد احراز', + 'وضعیت', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد توزیع', + 'وزن کل توزیع', + 'وزن توزیع به مباشر', + 'وزن توزیع به صنف', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + if trash == 'true': + excel_description(worksheet, 'A1', f'تخصیصات حذف شده', size=11, color='red', + row2='D1') + elif return_trash == 'true': + excel_description(worksheet, 'A1', f'تخصیصات برگشت داده شده', size=11, color='red', + row2='D1') + else: + excel_description(worksheet, 'A1', f'تخصیصات صورت گرفته', size=11, color='red', + row2='D1') + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if serializer: + for allocation in serializer: + l += 1 + + allocation_type = allocation.get('allocation_type', '') + + seller_name = '' + seller_mobile = '' + seller_city = '' + buyer_name = '' + buyer_mobile = '' + buyer_city = '' + + kill_house = (allocation or {}).get('kill_house', {}) or {} + steward = allocation.get('steward', {}) or {} + kill_house_operator = kill_house.get('kill_house_operator', {}) or {} + kill_house_user = kill_house_operator.get('user', {}) or {} + kill_house_user_city = kill_house_user.get('city', {}) or {} + + if allocation_type == 'killhouse_steward': + seller_name = kill_house.get('name', '') + seller_mobile = kill_house_user.get('mobile', '') + seller_city = kill_house_user_city.get('city_name', '') + allocation_type = 'کشتارگاه به مباشر' + + to_steward = allocation.get('to_steward', {}) + buyer_name = to_steward.get('guilds_name', '') + buyer_mobile = to_steward.get('user', {}).get('mobile', '') + buyer_city = to_steward.get('user', {}).get('city_name', '') + + elif allocation_type == 'killhouse_guild': + seller_name = kill_house.get('name', '') + seller_mobile = kill_house_user.get('mobile', '') + seller_city = kill_house_user_city.get('city_name', '') + allocation_type = 'کشتارگاه به صنف' + + to_guilds = allocation.get('to_guilds', {}) + if to_guilds: + buyer_name = to_guilds.get('guilds_name', '') + buyer_mobile = to_guilds.get('user', {}).get('mobile', '') + buyer_city = to_guilds.get('user', {}).get('city_name', '') + elif allocation_type == 'steward_guild': + seller_name = steward.get('guilds_name', '') + seller_mobile = steward.get('user', {}).get('mobile', '') + seller_city = steward.get('user', {}).get('city_name', '') + allocation_type = 'مباشر به صنف' + + to_guilds = allocation.get('to_guilds', {}) + if to_guilds: + buyer_name = to_guilds.get('guilds_name', '') + buyer_mobile = to_guilds.get('user', {}).get('mobile', '') + buyer_city = to_guilds.get('user', {}).get('city_name', '') + elif allocation_type == 'steward_steward': + seller_name = steward.get('guilds_name', '') + seller_mobile = steward.get('user', {}).get('mobile', '') + seller_city = steward.get('user', {}).get('city_name', '') + allocation_type = 'مباشر به مباشر' + + to_steward = allocation.get('to_steward', {}) + buyer_name = to_steward.get('guilds_name', '') + buyer_mobile = to_steward.get('user', {}).get('mobile', '') + buyer_city = to_steward.get('user', {}).get('city_name', '') + + elif allocation_type == 'killhouse_killhouse': + seller_name = kill_house.get('name', '') + seller_mobile = kill_house_user.get('mobile', '') + seller_city = kill_house_user_city.get('city_name', '') + allocation_type = 'کشتارگاه به کشتارگاه' + + to_kill_house = allocation.get('to_kill_house', {}) + buyer_name = to_kill_house.get('name', '') + buyer_mobile = to_kill_house.get('kill_house_operator', {}).get('user', {}).get('mobile', '') + buyer_city = to_kill_house.get('kill_house_operator', {}).get('user', {}).get('city', {}).get( + 'city_name', '') + + if allocation['sell_type'] == 'exclusive': + sell_type = 'اختصاصی' + else: + sell_type = 'آزاد' + system_registration_code = 'ارسال شده' if allocation['system_registration_code'] == True else 'ارسال نشده' + if allocation['state'] == 'pending': + state = 'در انتظار تایید' + elif trash == 'true': + state = 'حذف شده' + elif return_trash == 'true': + state = 'برگشت داده شده' + else: + state = 'تایید شده' + try: + date = datetime.datetime.strptime(allocation['date'], '%Y-%m-%dT%H:%M:%S.%f') + except ValueError: + date = datetime.datetime.strptime(allocation['date'], '%Y-%m-%dT%H:%M:%S') + list1 = [ + m, + str(shamsi_date(date, set_datetime=True)), + allocation_type, + seller_name, + seller_mobile, + seller_city, + buyer_name, + buyer_mobile, + allocation.get('interface_number') or '-', + buyer_city, + allocation.get('steward_pos_status') or 'ندارد', + allocation.get('guild_pos_status') or 'ندارد', + sell_type, + allocation.get('amount', 0), + allocation.get('total_amount', 0), + allocation.get('weight_of_carcasses', 0), + allocation.get('receiver_real_weight_of_carcasses', 0), + str(allocation.get('registration_code') or '-'), + system_registration_code, + state, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + total_amount = sum( + allocation.get('total_amount', 0) for allocation in serializer) + + weight_of_carcasses_allocations = sum( + allocation.get('weight_of_carcasses', 0) for allocation in serializer) + + receiver_real_weight_of_carcasses_allocations = sum( + allocation.get('receiver_real_weight_of_carcasses', 0) for allocation in serializer) + + allocations_aggregates = allocations.aggregate( + total_count=Count('id'), + total_weight=Sum('real_weight_of_carcasses'), + total_steward_weight=Sum('real_weight_of_carcasses', filter=Q(to_steward__isnull=False)), + total_guild_weight=Sum('real_weight_of_carcasses', filter=Q(to_guilds__isnull=False)), + ) + + value_header_list2 = [ + allocations_aggregates['total_count'] or 0, + int(allocations_aggregates['total_weight'] or 0), + int(allocations_aggregates['total_steward_weight'] or 0), + int(allocations_aggregates['total_guild_weight'] or 0), + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_amount, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def sevrence_kill_house_steward_allocation_excel(request): + filterset_class = StewardAllocationDashboardFilterSet + + role = request.GET.get('role') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + value = request.GET.get('value') + search = request.GET.get('search') + allocations_type = request.GET.get('type') + filters = { + 'trash': False, + 'to_cold_house__isnull': True + } + if allocations_type == 'KillHouse': + filters['kill_house__isnull'] = False + elif allocations_type == 'Steward': + filters['steward__isnull'] = False + + if date1: + filters['date__date__gte'] = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + filters['date__date__lte'] = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter(**filters) + if value and search == 'filter': + if value != 'undefined' and value.strip(): + allocations = allocations.filter( + build_query(filterset_class, value) + ) + serializer = InProvinceAllocationSerializer(allocations, many=True).data + + kill_house_names = list({(allocation.get('kill_house') or {}).get('name') + for allocation in serializer if (allocation.get('kill_house') or {}).get('name')}) + + excel_options = [ + 'ردیف', + 'تاریخ ثبت', + 'نوع تخصیص', + 'فروشنده', + 'تلفن فروشنده', + 'خریدار', + 'تلفن خریدار', + 'نوع فروش', + 'قیمت هر کیلو(ریال)', + 'قیمت کل', + 'وزن تخصیصی', + 'وزن تایید شده', + 'کد احراز', + 'وضعیت کد احراز', + 'وضعیت', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + l = 5 + m = 1 + + if serializer: + for kill_house_name in kill_house_names: + kill_house = KillHouse.objects.get(trash=False, name=kill_house_name) + sheet_name = kill_house.name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد توزیع', + 'وزن کل توزیع', + 'وزن توزیع به مباشر', + 'وزن توزیع به صنف', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'توزیع داخل استان کشتارگاه {sheet_name}', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + red_font = Font(color="C00000", bold=True) + + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + allocations = allocations.filter(kill_house=kill_house) + serializer1 = InProvinceAllocationSerializer(allocations, many=True).data + for allocation in serializer1: + l += 1 + + allocation_type = allocation.get('allocation_type', '') + + seller_name = '' + seller_mobile = '' + buyer_name = '' + buyer_mobile = '' + + kill_house = allocation.get('kill_house', {}) + kill_house_operator = kill_house.get('kill_house_operator', {}) + kill_house_user = kill_house_operator.get('user', {}) + + if allocation_type == 'killhouse_steward': + seller_name = kill_house.get('name', '') + seller_mobile = kill_house_user.get('mobile', '') + allocation_type = 'کشتارگاه به مباشر' + + to_steward = allocation.get('to_steward', {}) + buyer_name = to_steward.get('guilds_name', '') + buyer_mobile = to_steward.get('user', {}).get('mobile', '') + + elif allocation_type == 'killhouse_guild': + seller_name = kill_house.get('name', '') + seller_mobile = kill_house_user.get('mobile', '') + allocation_type = 'کشتارگاه به صنف' + + to_guilds = allocation.get('to_guilds', {}) + if to_guilds: + buyer_name = to_guilds.get('guilds_name', '') + buyer_mobile = to_guilds.get('user', {}).get('mobile', '') + + elif allocation_type == 'killhouse_killhouse': + seller_name = kill_house.get('name', '') + seller_mobile = kill_house_user.get('mobile', '') + allocation_type = 'کشتارگاه به کشتارگاه' + + to_kill_house = allocation.get('to_kill_house', {}) + buyer_name = to_kill_house.get('name', '') + buyer_mobile = to_kill_house.get('kill_house_operator', {}).get('user', {}).get('mobile', '') + + if allocation['sell_type'] == 'exclusive': + sell_type = 'اختصاصی' + else: + sell_type = 'آزاد' + system_registration_code = 'ارسال شده' if allocation[ + 'system_registration_code'] == True else 'ارسال نشده' + state = 'در انتظار تایید' if allocation['state'] == 'pending' else 'تایید شده' + try: + date = datetime.datetime.strptime(allocation['date'], '%Y-%m-%dT%H:%M:%S.%f') + except ValueError: + date = datetime.datetime.strptime(allocation['date'], '%Y-%m-%dT%H:%M:%S') + list1 = [ + m, + str(shamsi_date(date)), + allocation_type, + seller_name, + seller_mobile, + buyer_name, + buyer_mobile, + sell_type, + allocation.get('amount', 0), + allocation.get('total_amount', 0), + allocation.get('weight_of_carcasses', 0), + allocation.get('receiver_real_weight_of_carcasses', 0), + str(allocation.get('registration_code') or '-'), + system_registration_code, + state, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + if isinstance(value, int): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + total_amount = sum( + allocation.get('total_amount', 0) for allocation in serializer1) + + weight_of_carcasses_allocations = sum( + allocation.get('weight_of_carcasses', 0) for allocation in serializer1) + + receiver_real_weight_of_carcasses_allocations = sum( + allocation.get('receiver_real_weight_of_carcasses', 0) for allocation in serializer1) + + allocations_aggregates = allocations.aggregate( + total_count=Count('id'), + total_weight=Sum('real_weight_of_carcasses'), + total_steward_weight=Sum('real_weight_of_carcasses', filter=Q(to_steward__isnull=False)), + total_guild_weight=Sum('real_weight_of_carcasses', filter=Q(to_guilds__isnull=False)), + ) + + value_header_list2 = [ + allocations_aggregates['total_count'] or 0, + int(allocations_aggregates['total_weight'] or 0), + int(allocations_aggregates['total_steward_weight'] or 0), + int(allocations_aggregates['total_guild_weight'] or 0), + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + total_amount, + weight_of_carcasses_allocations, + receiver_real_weight_of_carcasses_allocations, + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def free_sale_out_province_excel(request): + filterset_fields = [ + 'type_car', + 'pelak', + 'clearance_code', + 'kill_house__name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'buyer__fullname', + 'buyer__first_name', + 'buyer__last_name', + 'buyer__mobile', + 'buyer__unit_name', + 'buyer_name', + 'buyer_mobile', + 'province', + 'city', + + ] + + filterset_class = KillHouseFreeSaleBarInformationFilterSet + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if 'type' in request.GET: + role = request.GET['role'] + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + + if role in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin', + 'ImprovingLivestock', 'AdminX', 'Supporter']: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + trash=False) + + elif role in ['CityJahad', 'CityPoultry', 'CityOperator']: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + + + + else: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + buyers = len(kill_house_free_sale_bar_info.values_list('buyer', flat=True).distinct()) + + else: + if role in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin', + 'ImprovingLivestock', 'AdminX', 'Supporter']: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + trash=False) + + + elif role in ['CityJahad', 'CityPoultry', 'CityOperator']: + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__system_address__city=user.city, + trash=False) + + + + else: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + trash=False) + buyers = len(kill_house_free_sale_bar_info.values_list('buyer', flat=True).distinct()) + + if 'search' in request.GET: + kill_house_free_sale_bar_info_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined' and request.GET['value'].strip(): + + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_house_free_sale_bar_info + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_house_free_sale_bar_info) + kill_house_free_sale_bar_info_list = ps.filter() + kill_house_free_sale_bar_info = [] if len( + kill_house_free_sale_bar_info_list) == 0 else kill_house_free_sale_bar_info_list + + + else: + now = datetime.datetime.now().date() + date = datetime.datetime.strptime(str(request.GET['date']), + '%Y-%m-%d').date() if 'date' in request.GET else now + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key']) + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, + date__year=date.year, + date__month=date.month, + date__day=date.day, + trash=False) + buyers = len(kill_house_free_sale_bar_info.values_list('buyer', flat=True).distinct()) + + serializer = KillHouseFreeSaleBarInformationSerializer(kill_house_free_sale_bar_info, many=True).data + + excel_options = [ + 'ردیف', + 'تاریخ', + 'فروشنده', + 'تلفن فروشنده', + 'خریدار', + 'تلفن خریدار', + 'نام واحد', + 'استان', + 'شهر', + 'کد قرنطینه', + 'وزن استعلامی', + 'وزن لاشه' + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد فروش', + 'خریدار', + 'وزن کل لاشه', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'فروش به خارج از استان', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if serializer: + for allocation in serializer: + l += 1 + date = datetime.datetime.strptime(allocation['date'], '%Y-%m-%dT%H:%M:%S') + kill_house = allocation.get('kill_house', {}) + kill_house_operator = kill_house.get('kill_house_operator', {}) + kill_house_user = kill_house_operator.get('user', {}) + buyer = allocation.get('buyer', {}) + + list1 = [ + m, + str(shamsi_date(date)), + kill_house.get('name', ''), + kill_house_user.get('mobile', ''), + buyer.get('fullname', ''), + buyer.get('mobile', ''), + buyer.get('unit_name', ''), + buyer.get('province', ''), + buyer.get('city', ''), + allocation.get('clearance_code', ''), + allocation.get('quarantine_weight_of_carcasses', 0), + allocation.get('real_weight_of_carcasses', 0), + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + total_quarantine_weight = sum( + allocation.get('quarantine_weight_of_carcasses', 0) for allocation in serializer + ) + + total_real_weight = sum( + allocation.get('real_weight_of_carcasses', 0) for allocation in serializer + ) + total_real_weight = sum( + allocation.get('real_weight_of_carcasses', 0) for allocation in serializer + ) + + value_header_list2 = [ + len(kill_house_free_sale_bar_info), + buyers, + total_real_weight, + + ] + + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_quarantine_weight, + total_real_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def steward_free_sale_out_province_excel(request): + filterset_class = StewardFreeSaleBarInformationFilterSet + filterset_fields = [ + 'steward__user__fullname', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__mobile', + 'buyer__user__fullname', + 'buyer__user__first_name', + 'buyer__user__last_name', + 'buyer__user__mobile', + 'province', + 'city', + 'province' + 'buyer_name' + 'buyer_mobile' + + ] + + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + filters = {'trash': False} + role = request.GET.get('role') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if role == 'Steward': + steward = Guilds.objects.get(user=user, trash=False) + filters['steward'] = steward + + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + filters['date__date__gte'] = date1 + filters['date__date__lte'] = date2 + + bars = StewardFreeSaleBarInformation.objects.filter(**filters).order_by('-date') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + bars = bars.filter( + build_query(filterset_class, value) + ) + + serializer = StewardFreeSaleBarInformationSerializer(bars, many=True).data + excel_options = [ + 'ردیف', + 'تاریخ', + 'فروشنده', + 'تلفن فروشنده', + 'خریدار', + 'تلفن خریدار', + 'نام واحد', + 'استان', + 'شهر', + 'کد قرنطینه', + 'وزن استعلامی', + 'وزن لاشه' + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + header_list2 = [ + 'تعداد فروش', + 'خریدار', + 'وزن کل لاشه', + + ] + + for col_num, option in enumerate(header_list2, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + excel_description(worksheet, 'A1', f'فروش به خارج از استان مباشرین', size=11, color='red', + row2='D1') + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + + if serializer: + for allocation in serializer: + l += 1 + date = datetime.datetime.strptime(allocation['date'], '%Y-%m-%dT%H:%M:%S') + steward = allocation.get('steward', {}) + steward_user = steward.get('user', {}) + + buyer = allocation.get('buyer', {}) + + list1 = [ + m, + str(shamsi_date(date, in_value=True)), + steward.get('guilds_name', ''), + steward_user.get('mobile', ''), + buyer.get('fullname', ''), + buyer.get('mobile', ''), + buyer.get('unit_name', ''), + buyer.get('province', ''), + buyer.get('city', ''), + allocation.get('clearance_code', ''), + allocation.get('quarantine_weight_of_carcasses', 0), + allocation.get('weight_of_carcasses', 0), + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + buyers = len(set(bars.values_list('buyer', flat=True).distinct())) + + total_quarantine_weight = sum( + allocation.get('quarantine_weight_of_carcasses', 0) for allocation in serializer + ) + + total_real_weight = sum( + allocation.get('weight_of_carcasses', 0) for allocation in serializer + ) + + value_header_list2 = [ + len(bars), + buyers, + bars.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0, + + ] + + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_quarantine_weight, + total_real_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def total_steward_dashboard_excel(request): + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + stewards = Guilds.objects.filter(trash=False, steward=True, active=True).select_related('user').only('user', + 'guilds_name', + 'steward').order_by( + 'id') + + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted'], + allocation_to_steward__date__date__gte=date1, allocation_to_steward__date__date__lte=date2) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count') + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count') + + stewards1 = list(set(chain(allocation_stewards, free_bar_stewards))) + + else: + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted']) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count') + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count') + + stewards1 = list(set(chain(allocation_stewards, free_bar_stewards))) + + serializer = RealGuildsForDashboardSerializer(stewards1, many=True, context={'request': request}).data + + header_list2 = [ + 'ردیف', + 'خریدار', + 'تلفن خریدار', + 'ماهیت', + 'شهر', + 'مانده انبار فعلی', + 'تعداد کل بارها', + 'وزن کل بارها', + 'تعداد بار وارد شده به انبار', + 'کل وزن ورودی به انبار', + 'تعداد فروش رفته', + 'کل وزن فروش رفته', + 'تعداد بار درون استان', + 'وزن بار درون استان', + 'تعداد بار لاشه خارج استان', + 'وزن بار لاشه خارج استان', + 'وزن فروش داخل استان', + 'وزن فروش خارج استان', + + ] + create_header(worksheet, header_list2, 1, 12, height=21.8, width=20, border_style='thin') + excel_description(worksheet, 'A2', f'اطلاعات جامع انبار', + size=11, color='red', row2='B4') + if serializer: + l = 13 + m = 1 + + for data in serializer: + steward_type = 'مباشر' if data.get('steward') == True else 'صنف' + list1 = [ + m, + data.get('user', {}).get('fullname', ''), + data.get('user', {}).get('mobile', ''), + f'{steward_type}({data.get("guilds_name", "")})', + data.get("address", {}).get('city', {}).get('name'), + data.get('ware_house_info', {}).get('remain_weight', 0), + data.get('ware_house_info', {}).get('total_bars_count', 0), + data.get('ware_house_info', {}).get('total_bars_weight', 0), + data.get('ware_house_info', {}).get('total_entered_bars_count', 0), + data.get('ware_house_info', {}).get('total_entered_bars_weight', 0), + data.get('ware_house_info', {}).get('total_in_out_province_bars_count', 0), + data.get('ware_house_info', {}).get('total_in_out_province_bars_weight', 0), + data.get('ware_house_info', {}).get('input_bars_count', 0), + data.get('ware_house_info', {}).get('input_bars_weight', 0), + data.get('ware_house_info', {}).get('free_bars_count', 0), + data.get('ware_house_info', {}).get('free_bars_weight', 0), + data.get('ware_house_info', {}).get('in_province_bars_weight', 0), + data.get('ware_house_info', {}).get('out_province_bars_weight', 0), + + ] + + create_value(worksheet, list1, l, 1, border_style='thin', m=m) + m += 1 + l += 1 + header_list2 = [ + 'وزن کل بارها', + 'وزن وارد شده به انبار', + 'وزن توزیع شده داخل استان', + 'وزن توزیع شده خارج استان', + 'مانده انبار', + + ] + create_header(worksheet, header_list2, 3, 3, height=21.8, width=20, color='C00000', border_style='thin') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + stewards_filter = {'trash': False, 'steward': True, 'active': True} + + stewards = Guilds.objects.filter(**stewards_filter).select_related('user').only('user', 'guilds_name', + 'steward').order_by( + 'id') + + products = RolesProducts.objects.filter(guild__in=stewards, trash=False, name='مرغ گرم').first() + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted'], + allocation_to_steward__date__date__gte=date1, allocation_to_steward__date__date__lte=date2, + allocation_to_steward__warehouse=True, allocation_to_steward__steward_warehouse=True) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count') + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count') + + stewards = (list(chain(allocation_stewards, free_bar_stewards))) + + allocations = StewardAllocation.objects.filter( + Q(steward__in=stewards) | Q(to_steward__in=stewards), + trash=False, calculate_status=True, to_cold_house__isnull=True, + date__date__gte=date1, date__date__lte=date2, warehouse=True, steward_warehouse=True) + + free_bars = StewardFreeBarInformation.objects.filter(steward__in=stewards, trash=False, + date__date__gte=date1, + date__date__lte=date2, warehouse=True) + free_sale_bars = StewardFreeSaleBarInformation.objects.filter(steward__in=stewards, trash=False, + date__date__gte=date1, + date__date__lte=date2, warehouse=True) + segmentations = PosSegmentation.objects.filter(guild__in=stewards, trash=False, warehouse=True, + date__date__gte=date1, date__date__lte=date2) + transactions = ProductsTransactions.objects.filter(product=products, transaction__paid=True, + transaction__date__date__gte=date1, + transaction__date__date__lte=date2, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(Q(steward__in=stewards) | Q(guild__in=stewards), trash=False, + date__date__gte=date1, date__lte=date2, + warehouse=True) + + + else: + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted'], + allocation_to_steward__warehouse=True, allocation_to_steward__steward_warehouse=True) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count').values_list('id', flat=True) + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count').values_list('id', flat=True) + + stewards = (list(chain(allocation_stewards, free_bar_stewards))) + + allocations = StewardAllocation.objects.filter( + Q(steward__in=stewards) | Q(to_steward__in=stewards), + trash=False, calculate_status=True, to_cold_house__isnull=True, warehouse=True, steward_warehouse=True) + + free_bars = StewardFreeBarInformation.objects.filter(steward__in=stewards, trash=False, warehouse=True) + free_sale_bars = StewardFreeSaleBarInformation.objects.filter(steward__in=stewards, trash=False, + warehouse=True) + segmentations = PosSegmentation.objects.filter(guild__in=stewards, trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product=products, transaction__paid=True, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(Q(steward__in=stewards) | Q(guild__in=stewards), trash=False, + warehouse=True) + + allocations_aggregates = allocations.aggregate( + total_input_bars_count=Count('id', filter=Q(to_steward__isnull=False)), + total_input_bars_weight=Sum('real_weight_of_carcasses', filter=Q(to_steward__isnull=False)), + total_input_governmental_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, quota='governmental')), + total_input_free_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, quota='free')), + total_output_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward__isnull=False, receiver_state__in=('pending', 'accepted'))), + total_output_governmental_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward__isnull=False, + receiver_state__in=('pending', 'accepted'), + quota='governmental')), + total_output_free_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward__isnull=False, + receiver_state__in=('pending', 'accepted'), quota='free')), + total_input_entered_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, receiver_state='accepted')), + + total_input_entered_governmental_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, + receiver_state='accepted', quota='governmental')), + + total_input_entered_free_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, receiver_state='accepted', + quota='free')), + + ) + + free_bars_aggregates = free_bars.aggregate( + total_count=Count('id'), + total_weight=Sum('weight_of_carcasses') + ) + + free_sale_bars_aggregates = free_sale_bars.aggregate( + total_count=Count('id'), + total_weight=Sum('weight_of_carcasses'), + total_governmental_weight=Sum('weight_of_carcasses', quota='governmental'), + total_free_weight=Sum('weight_of_carcasses', quota='free'), + + ) + segmentations_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_governmental_weight = \ + segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_free_weight = \ + segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + + pos_allocated_weight_info = transactions.aggregate( + pos_allocated_weight=Sum('cur_weight'), + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + 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')), + + ) + pos_allocated_weight = pos_allocated_weight_info['pos_allocated_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + + total_in_province_governmental_input_weight = allocations_aggregates[ + 'total_input_entered_governmental_bars_weight'] or 0 + total_in_province_free_input_weight = allocations_aggregates['total_input_entered_free_bars_weight'] or 0 + total_free_buying_input_weight = free_bars_aggregates['total_weight'] or 0 + + total_in_province_governmental_output_weight = allocations_aggregates[ + 'total_output_governmental_bars_weight'] or 0 + total_in_province_free_output_weight = allocations_aggregates['total_output_free_bars_weight'] or 0 + total_governmental_free_sale_weight = free_sale_bars_aggregates['total_governmental_weight'] or 0 + total_free_free_sale_weight = free_sale_bars_aggregates['total_free_weight'] or 0 + 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 + + total_governmental_input_weight = total_in_province_governmental_input_weight + total_free_input_weight = total_in_province_free_input_weight + total_free_buying_input_weight + total_input_weight = total_governmental_input_weight + total_free_input_weight + + total_governmental_output_weight = total_in_province_governmental_output_weight + total_governmental_free_sale_weight + segmentations_governmental_weight + int( + pos_governmental_allocated_weight / 1000) + total_free_output_weight = total_in_province_free_output_weight + total_free_free_sale_weight + segmentations_free_weight + int( + pos_free_allocated_weight / 1000) + total_output_weight = total_governmental_output_weight + total_free_output_weight + + total_governmental_remain_weight = ( + total_governmental_input_weight - total_governmental_output_weight) - archives_governmental_weight if ( + ( + total_governmental_input_weight - total_governmental_output_weight) - archives_governmental_weight) > 0 else 0 + total_free_remain_weight = (total_free_input_weight - total_free_output_weight) - archives_free_weight if ( + ( + total_free_input_weight - total_free_output_weight) - archives_free_weight) > 0 else 0 + total_remain_weight = total_governmental_remain_weight + total_free_remain_weight + + input_allocations_weight = allocations_aggregates['total_input_bars_weight'] or 0 + input_entered_allocations_weight = allocations_aggregates['total_input_entered_bars_weight'] or 0 + output_allocations_weight = allocations_aggregates['total_output_bars_weight'] or 0 + free_bars_weight = free_bars_aggregates['total_weight'] or 0 + free_sale_bars_weight = free_sale_bars_aggregates['total_weight'] or 0 + remain_weight = int( + (input_entered_allocations_weight + free_bars_weight) - ( + free_sale_bars_weight + output_allocations_weight + archives_weight)) + + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + shamsi_date1 = shamsi_date(date1) + shamsi_date2 = shamsi_date(date2) + excel_description(worksheet, 'A2', f' اطلاعات جامع انبار از تاریخ {shamsi_date1} تا تاریخ {shamsi_date2}', + size=11, color='red', row2='B4') + + else: + excel_description(worksheet, 'A2', f'اطلاعات جامع انبار', + size=11, color='red', row2='B4') + + result = { + "total_bars_weight": int(input_allocations_weight + free_bars_weight), + "total_entered_bars_weight": int(input_entered_allocations_weight + free_bars_weight), + "in_province_bars_weight": int(output_allocations_weight), + "out_province_bars_weight": int(free_sale_bars_weight), + "remain_weight": remain_weight, + } + + value_header_list = [ + result['total_bars_weight'], + result['total_entered_bars_weight'], + result['in_province_bars_weight'], + result['out_province_bars_weight'], + result['remain_weight'], + + ] + create_value(worksheet, value_header_list, 4, 3, border_style='thin') + + # محاسبه مجموع هر یک از فیلدها + sum_remain_weight = sum(data.get('ware_house_info', {}).get('remain_weight', 0) for data in serializer) + sum_total_bars_count = sum(data.get('ware_house_info', {}).get('total_bars_count', 0) for data in serializer) + sum_total_bars_weight = sum(data.get('ware_house_info', {}).get('total_bars_weight', 0) for data in serializer) + sum_total_entered_bars_count = sum( + data.get('ware_house_info', {}).get('total_entered_bars_count', 0) for data in serializer) + sum_total_entered_bars_weight = sum( + data.get('ware_house_info', {}).get('total_entered_bars_weight', 0) for data in serializer) + sum_total_in_out_province_bars_count = sum( + data.get('ware_house_info', {}).get('total_in_out_province_bars_count', 0) for data in serializer) + sum_total_in_out_province_bars_weight = sum( + data.get('ware_house_info', {}).get('total_in_out_province_bars_weight', 0) for data in serializer) + sum_input_bars_count = sum(data.get('ware_house_info', {}).get('input_bars_count', 0) for data in serializer) + sum_input_bars_weight = sum(data.get('ware_house_info', {}).get('input_bars_weight', 0) for data in serializer) + sum_free_bars_count = sum(data.get('ware_house_info', {}).get('free_bars_count', 0) for data in serializer) + sum_free_bars_weight = sum(data.get('ware_house_info', {}).get('free_bars_weight', 0) for data in serializer) + sum_in_province_bars_weight = sum( + data.get('ware_house_info', {}).get('in_province_bars_weight', 0) for data in serializer) + sum_out_province_bars_weight = sum( + data.get('ware_house_info', {}).get('out_province_bars_weight', 0) for data in serializer) + sum_warehouse_total_entered_bars = sum( + data.get('ware_house_info', {}).get('warehouse_total_entered_bars', 0) for data in serializer) + # ایجاد لیست نهایی برای ردیف مجموع + summary_list = [ + 'جمع کل==>', + '', + '', + '', + '', + sum_remain_weight, + sum_total_bars_count, + sum_total_bars_weight, + sum_total_entered_bars_count, + sum_total_entered_bars_weight, + sum_total_in_out_province_bars_count, + sum_total_in_out_province_bars_weight, + sum_input_bars_count, + sum_input_bars_weight, + sum_free_bars_count, + sum_free_bars_weight, + sum_in_province_bars_weight, + sum_out_province_bars_weight, + ] + + create_value(worksheet, summary_list, l + 1, 1, color='green') + + 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 + + +def detail_of_killing_and_warehouse_excel(request): + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + red_font = Font(color="C00000", bold=True) + sheet_list = [ + 'تخصیصات بدون بار', + 'بارهای تخلیه نشده', + 'بار های در انتظار ورود به انبار' + ] + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + for name in sheet_list: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + if sheet_name == 'تخصیصات بدون بار': + wage_type = WageType.objects.filter(en_name='province-kill-request').first() + total_check_wage = wage_type.amount + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + union_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name == 'company': + company_wage_percent = percentage_wage_type.percent / 100 + + elif percentage_wage_type.share_type.en_name == 'guilds': + guilds_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name in ['city', 'wallet']: + pass + else: + other_wage_percent = percentage_wage_type.percent / 100 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', + trash=False).first().amount + free_buying_live_weight_amount = total_wage_type.filter(en_name='live-buy', trash=False).first().amount + free_buying_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-buy', + trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', + trash=False).first().amount + worksheet['H3'] = 'در این قسمت تخصیصات فاقد بار نمایش داده میشود' + merge_range1 = 'H3:K3' + worksheet.merge_cells(merge_range1) + worksheet['H3'].font = Font(color="C00000", bold=True) + worksheet['H3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + province_kill_request = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), + return_to_province=False, + archive_wage=False, + first_car_allocated_quantity=0, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).order_by( + 'kill_request__recive_date') + + if wage_counting_type == 'carcass': + header_list = [ + 'تعداد سفارشات', + 'تعداد کل', + 'وزن کل', + 'وزن لاشه ملاک تعرفه', + 'جمع کل تعرفه', + ] + else: + header_list = [ + 'تعداد سفارشات', + 'تعداد کل', + 'وزن کل', + 'وزن ملاک تعرفه', + 'جمع کل تعرفه', + ] + for col_num, option in enumerate(header_list, 3): + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[3].height = 20.8 + if wage_counting_type == 'carcass': + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'وزن لاشه ملاک تعرفه ', + 'تعرفه (ریال)', + 'تعرفه تخصیص(ریال)', + + ] + else: + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'وزن ملاک تعرفه ', + 'تعرفه (ریال)', + 'تعرفه تخصیص(ریال)', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + create_header_freez(worksheet, excel_options, 1, 6, header_row=7, width=20) + # for col_num, option in enumerate(excel_options, 1): + # col_letter = get_column_letter(col_num) + # cell = worksheet.cell(row=6, column=col_num, value=option) + # cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + # cell.fill = blue_fill + # cell.font = Font(size=10, bold=True, color='D9FFFFFF') + # if len(option) > worksheet.column_dimensions[col_letter].width: + # worksheet.column_dimensions[col_letter].width = len(option) + 3 + # + # # تنظیم ارتفاع سطر + # # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + # worksheet.row_dimensions[6].height = 19 + # worksheet.freeze_panes = worksheet['A7'] + # max_col = worksheet.max_column + # range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + # worksheet.auto_filter.ref = range_str + l = 6 + m = 1 + for province_kill in province_kill_request: + + kill_date_1 = shamsi_date(province_kill.province_request.poultry_request.send_date) + + if province_kill.kill_request.slaughter_house is not None: + kill_place = province_kill.kill_request.slaughter_house.name + else: + kill_place = province_kill.kill_request.kill_house.name + + total_amount = province_kill.total_wage_amount + if wage_counting_type == 'carcass': + list1 = [ + m, + str(province_kill.province_request.poultry_request.order_code), + province_kill.province_request.poultry_request.poultry.unit_name, + province_kill.province_request.poultry_request.poultry.user.mobile, + province_kill.province_request.poultry_request.poultry.address.city.name, + str(kill_date_1), + kill_place, + province_kill.province_request.poultry_request.hatching.chicken_breed, + province_kill.total_killed_quantity, + province_kill.total_killed_weight, + province_kill.province_request.poultry_request.Index_weight, + province_kill.total_killed_weight * 0.75, + province_live_wage_amount, + (province_kill.total_killed_weight * 0.75) * province_live_wage_amount, + + ] + else: + list1 = [ + m, + str(province_kill.province_request.poultry_request.order_code), + province_kill.province_request.poultry_request.poultry.unit_name, + province_kill.province_request.poultry_request.poultry.user.mobile, + province_kill.province_request.poultry_request.poultry.address.city.name, + str(kill_date_1), + kill_place, + province_kill.province_request.poultry_request.hatching.chicken_breed, + province_kill.total_killed_quantity, + province_kill.total_killed_weight, + province_kill.province_request.poultry_request.Index_weight, + province_kill.total_killed_weight, + province_live_wage_amount, + (province_kill.total_killed_weight) * province_live_wage_amount, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + m += 1 + total_weight = \ + province_kill_request.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_killed_quantity = \ + province_kill_request.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_wage_amount = \ + province_kill_request.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + if wage_counting_type == 'carcass': + value_list = [ + m - 1, + total_killed_quantity, + total_weight, + total_weight * 0.75, + (total_weight * 0.75) * province_live_wage_amount, + + ] + else: + value_list = [ + m - 1, + total_killed_quantity, + total_weight, + total_weight, + (total_weight) * province_live_wage_amount, + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=4, column=item + 3, value=value_list[item]) + value = value_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + if wage_counting_type == 'carcass': + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_killed_quantity, + total_weight, + '', + total_weight * 0.75, + province_live_wage_amount, + (total_weight * 0.75) * province_live_wage_amount, + + ] + else: + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_killed_quantity, + total_weight, + '', + total_weight, + province_live_wage_amount, + (total_weight) * province_live_wage_amount, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'بارهای تخلیه نشده': + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'province_request', + 'province_request__poultry_request', + 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state').values( + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date', + 'province_request', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + ) + filtered_kill_reqs_not_assigment_but_have_code1 = filtered_kill_reqs.filter( + assignment_state_archive='pending') + poultry_request = ( + PoultryRequest.objects.filter(trash=False, + pk__in=filtered_kill_reqs_not_assigment_but_have_code1.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + all_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + # worksheet['B1'] = f'بارهای تخلیه نشده با کد قرنطینه' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({shamsi_date(date1)}) تا تاریخ:({shamsi_date(date2)})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_not_assigment_but_have_code1.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_not_assigment_but_have_code1.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs_not_assigment_but_have_code1: + for kill in filtered_kill_reqs_not_assigment_but_have_code1: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + + age = (kill['province_request__poultry_request__send_date'].date() - kill[ + 'province_request__poultry_request__hatching__date'].date()).days + 1 + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_not_assigment_but_have_code1.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len( + filtered_kill_reqs_not_assigment_but_have_code1.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_assigment_but_have_code1), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + else: + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + kill_house = KillHouse.objects.filter(trash=False).select_related( + 'system_address__province').first() + + if 'date1' in request.GET and request.GET['date1']: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + else: + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + ware_house_confirmation=False, trash=False, calculate_status=True).order_by( + '-kill_request__recive_date').order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', + 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'bar_document_status__title' + ) + + if 'search' in request.GET: + filtered_kill_reqs = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + filtered_kill_reqs = [] if len(filtered_kill_reqs) == 0 else filtered_kill_reqs + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + 'کشور مقصد', + + ] + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'میانگین وزن ', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + + # برای بالای هدر + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + create_header(worksheet, header_list2, 6, 4, height=21.8, color='green') + + create_header(worksheet, header_list, 9, 4, height=21.8) + + header_list2 = [ + 'ردیف', + 'نام محصول', + 'وزن خریدهای دولتی داخل استان(کیلوگرم)', + 'وزن خریدهای آزاد داخل استان(کیلوگرم)', + 'وزن خریدهای خارج استان(کیلوگرم)', + 'کل ورودی به انبار(کیلوگرم)', + 'کل فروش(کیلوگرم)', + 'مانده انبار(کیلوگرم)', + + ] + create_header(worksheet, header_list2, 6, 1, height=21.8, color='FF0000') + products = RolesProducts.objects.filter(kill_house=kill_house, trash=False) + q = 2 + w = 1 + for product in products: + value_header_list = [ + w, + product.name, + product.province_governmental_carcasses_weight, + product.province_free_carcasses_weight, + product.free_buying_carcasses_weight, + product.total_carcasses_weight, + product.real_allocated_weight, + product.total_remain_weight, + + ] + create_value(worksheet, value_header_list, q, 6) + q += 1 + w += 1 + + kill_house_name = '' + if filtered_kill_reqs.exists(): + kill_house_name = filtered_kill_reqs.first()['killhouse_user__name'] + excel_description(worksheet, 'A1', f'بارهای {kill_house_name} در انتظار ورود به انبار (کشتار داخل استان)', + size=11, color='red', row2='E1') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='C3') + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 7, 8, 20) + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + l = 7 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, + day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + net_weighte, real_quantity, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if weight_loss1 != 0 else 0 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + export_country, + + ] + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=40, different_value='بار حذف شده') + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + 2) if all_weight_loss > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, + 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 5, 6) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def management_all_poultry_and_warehouse(request): + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + sheet_names = ['گزارش جوجه ریزی', 'جوجه ریزی بیش از 60 روز', 'گزارش بارها', 'اطلاعات کشتار روزانه', + 'عملکرد خریداران', 'گزارش سند ها', + 'اطلاعات جامع انبار و توزیع', + 'بارهای بدون مجوز'] + from_date_1 = shamsi_date(date1) + from_date_2 = shamsi_date(date2) + for name in sheet_names: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if sheet_name == 'گزارش جوجه ریزی': + date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + filtered_poultry_hatch = PoultryHatching.objects.filter(Q(date__date__gte=date1, date__date__lte=date2) | + Q(date__date__lte=date1, + archive_date__isnull=True) | Q( + date__date__lte=date1, + archive_date__gte=date1, + archive_date__isnull=False), + trash=False).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن روز', + 'سن بایگانی', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + ] + + from_date_1 = shamsi_date(date1) + from_date_2 = shamsi_date(date2) + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', + 'گزارش جوجه ریزی های فعال از تاریخ {0} تا {1}'.format(from_date_1, from_date_2), + color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + poultry_ids = filtered_poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + if poultry_hatching.archive == True: + archive_age = poultry_hatching.chicken_age + else: + archive_age = '-' + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + f'{poultry_hatching.poultry.user.fullname} ({poultry_hatching.poultry.user.mobile})', + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + archive_age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + chain_company, + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_name == 'جوجه ریزی بیش از 60 روز': + date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + filtered_poultry_hatch = PoultryHatching.objects.filter(Q(date__date__gte=date1, date__date__lte=date2) | + Q(date__date__lte=date1, + archive_date__isnull=True) | Q( + date__date__lte=date1, + archive_date__gte=date1, + archive_date__isnull=False), + trash=False, chicken_age__gte=60).select_related( + 'poultry', + 'poultry__user').order_by( + '-chicken_age') + + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن روز', + 'سن بایگانی', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + ] + + from_date_1 = shamsi_date(date1) + from_date_2 = shamsi_date(date2) + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', + 'گزارش جوجه ریزی های بزرگ تر از 60 روز از تاریخ {0} تا {1}'.format(from_date_1, + from_date_2), + color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + poultry_ids = filtered_poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + if poultry_hatching.archive == True: + archive_age = poultry_hatching.chicken_age + else: + archive_age = '-' + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + f'{poultry_hatching.poultry.user.fullname} ({poultry_hatching.poultry.user.mobile})', + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + archive_age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + chain_company, + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_name == 'گزارش بارها': + date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'province_kill_request__kill_house_price', + 'price', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'province_kill_request__kill_house_price', + 'price', + 'bar_document_status__title' + ) + filtered_kill_reqs = filtered_kill_request + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + 'قیمت پیشنهادی کشتارگاه(ریال)', + 'قیمت تعاونی(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + 'کشور مقصد', + 'اختلاف مجوز', + + ] + + from_date_1 = shamsi_date(date1) + + to_date_1 = shamsi_date(date2) + + # worksheet.sheet_view.rightToLeft = True + # worksheet.insert_rows(1) + # cell = worksheet.cell(row=1, column=1) + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'حجم بارهای ایجاد شده', + 'وزن بارهای ایجاد شده', + 'میانگین وزن بارهای ایجاد شده', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'حجم بارها', + 'وزن بارها', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + header_list3 = [ + 'درصد بارهای دارای کد قرنطینه', + 'درصد تعداد بارهای احراز شده از قرنطینه', + 'درصد تعداد بارهای تکمیل شده کشتارگاه', + 'درصد وزن نهایی در کشتارگاه نسبت به وزن کل', + 'درصد بارهای فاقد کد قرنطینه', + 'درصد بارهای اختلاف دار در قرنطینه و رصدیار', + 'درصد تعداد بارهای ورودی به انبار', + 'درصد وزن لاشه ها در انبار نسبت به وزن کل', + 'درصد وزن لاشه در انبار نسبت به وزن نهایی در کشتارگاه', + + ] + create_header(worksheet, header_list, 9, 2, height=21.8) + + create_header(worksheet, header_list2, 6, 2, height=21.8, color='green') + + create_header(worksheet, header_list3, 6, 5, height=43, color='orange', text_color='0D0D0D') + create_header_freez(worksheet, excel_options, 1, 8, 9, height=21, len_with=True) + + excel_description(worksheet, 'B1', 'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی', color='red', + row2='D1') + + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + excel_description(worksheet, 'B2', f'استان {name}', color='red', row2='D2') + excel_description(worksheet, 'B3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='D3') + + l = 8 + m = 1 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, + day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + if kill['assignment_state_archive'] == 'True' or kill['ware_house_confirmation'] == True: + net_weighte = kill['accepted_real_weight'] + real_quantity = kill['accepted_real_quantity'] + else: + net_weighte = 0 + real_quantity = 0 + net_weighte2, real_quantity2, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = int((weight_loss1 / kill['accepted_real_weight']) * 100) if kill[ + 'accepted_real_weight'] > 0 else 0 + defreent_quarantine = kill['accepted_real_quantity'] - quarantine_quantity if kill[ + 'quarantine_quantity'] != None else 0 + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + + kill.get('province_kill_request__kill_house_price') if kill.get( + 'province_kill_request__kill_house_price') else '-', + + kill.get('price') if kill.get( + 'price') else '-', + + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + round(kill['accepted_real_weight'], 1), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + export_country, + kill['accepted_real_quantity'] - quarantine_quantity if kill[ + 'quarantine_quantity'] != None else quarantine_quantity + + ] + if defreent_quarantine < 0: + different_cell = 51 + different_value = 'اختلاف مجوز' + else: + different_cell = None + different_value = None + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=different_cell, + different_value=different_value) + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + 2) if all_weight_loss > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + + province_kill_request = ProvinceKillRequest.objects.filter( + pk__in=filtered_kill_reqs.values( + 'province_kill_request')).aggregate( + total_quantity_melak=Sum('total_killed_quantity'), + total_weight_melak=Sum('total_killed_weight'), + ) + + accepted_real_quantity_melak = province_kill_request['total_quantity_melak'] or 0 + + accepted_real_wight_melak = province_kill_request['total_weight_melak'] or 0 + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, + 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity_melak, + accepted_real_wight_melak, + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 3, 6) + value_header_list2 = [ + f'%{round((has_code * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((has_qarantine * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((len(bar_complete) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_net_weighte) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((len(hasnt_code1) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((difference_bar * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((all_state_ware_house_confirmation * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_net_weighte), 2) if int(all_net_weighte) > 0 else 0}' + ] + create_value(worksheet, value_header_list2, 6, 6) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + '', + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + elif sheet_name == 'اطلاعات کشتار روزانه': + date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + header_list = [ + 'ردیف', + 'تاریخ', + 'حجم درخواست کشتار مرغدار', + 'وزن درخواست کشتار مرغدار', + 'حجم خرید های مستقیم', + 'وزن خرید های مستقیم', + 'حجم خرید های خارج از استان (زنده)', + 'وزن خرید های خارج از استان (زنده)', + 'وزن خرید های خارج از استان (لاشه)', + 'حجم کل تخصیصات (خرید مستقیم/ مرغدار)', + 'وزن کل تخصیصات (خرید مستقیم/ مرغدار)', + 'حجم فروش به خارج استان', + 'وزن فروش به خارج استان', + 'حجم بارها', + 'وزن بارها', + 'لاشه تولیدی امروز با احتساب 25درصد افت کشتار' + ] + + create_header(worksheet, header_list, 1, 3, height=25, width=25, border_style='thin', + color='C00000') + excel_description(worksheet, 'A1', + 'گزارش کشتار روزانه استان از تاریخ {0} تا {1}'.format(from_date_1, from_date_2), + color='red', + row2='E1') + m = 1 + l = 4 + + current_date = date1 + for day in range((date2 - date1).days + 1): + kill_house_free_bar = KillHouseFreeBarInformation.objects.filter( + trash=False, + archive_wage=False, + date__date=current_date + ).only( + 'quantity', + 'live_weight', + 'number_of_carcasses', + 'weight_of_carcasses', + 'send_date', + 'type', + 'out' + ) + kill_house_free_bar_aggregates = kill_house_free_bar.aggregate( + total_quantity_live=Sum('quantity', filter=Q(create_date__date=current_date, buy_type='live')), + total_weight_live=Sum('live_weight', filter=Q(create_date__date=current_date, buy_type='live')), + total_quantity_carcass=Sum('number_of_carcasses', + filter=Q(date__date=current_date, buy_type='carcass')), + total_weight_carcass=Sum('weight_of_carcasses', + filter=Q(date__date=current_date, buy_type='carcass')), + warehouse_total_weight_carcass=Sum('weight_of_carcasses', filter=Q(date__date=current_date)), + + ) + + poultry_request = PoultryRequest.objects.filter( + trash=False, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + out_province_request_cancel=False, + temporary_trash=False, + temporary_deleted=False, + send_date__date=current_date + ).only( + 'quantity', + 'Index_weight', + 'send_date' + ) + + poultry_request_aggregates = poultry_request.aggregate( + total_quantity=Sum('quantity', + filter=Q(send_date__date=current_date, direct_buying=False, out=False)), + total_weight=Sum(F('quantity') * F('Index_weight'), + filter=Q(send_date__date=current_date, direct_buying=False, out=False)), + total_direct_buying_quantity=Sum('quantity', + filter=Q(send_date__date=current_date, direct_buying=True)), + total_direct_buying_weight=Sum(F('quantity') * F('Index_weight'), + filter=Q(send_date__date=current_date, direct_buying=True)), + poultry_out_province_quantity=Sum('quantity', filter=Q(out=True, send_date__date=current_date)), + poultry_out_province_weight=Sum(F('quantity') * F('Index_weight'), + filter=Q(out=True, send_date__date=current_date)), + total_killing_ave_weight=Avg('Index_weight', filter=Q(send_date__date=current_date)), + # yesterday + + total_killing_ave_weight_yesterday=Avg('Index_weight', filter=Q(send_date__date=current_date)) + ) + + province_kill_request = ProvinceKillRequest.objects.filter( + trash=False, + archive_wage=False, + return_to_province=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=current_date + ).only( + 'total_killed_quantity', + 'total_killed_weight', + 'kill_request__recive_date' + ) + + province_kill_request_aggregates = province_kill_request.aggregate( + + total_quantity=Sum('total_killed_quantity', filter=Q(kill_request__recive_date__date=current_date)), + total_weight_carcass=Sum('total_killed_weight', + filter=Q(kill_request__recive_date__date=current_date)) * 0.75, + province_kill_request_total_weight=Sum('total_killed_weight', + filter=Q(kill_request__recive_date__date=current_date)), + + ) + + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date=current_date, + temporary_trash=False, + temporary_deleted=False + ).select_related('kill_request').only( + 'ware_house_accepted_real_weight', + 'weight_loss', + 'ware_house_confirmation', + 'kill_request__recive_date' + ) + + kill_house_request_aggregates = kill_house_request.aggregate( + + total_quantity=Sum( + 'accepted_real_quantity', + filter=Q(kill_request__recive_date__date=current_date) + ), + + total_weight=Sum( + 'accepted_real_weight', + filter=Q(kill_request__recive_date__date=current_date) + ) + ) + + province_kill_request_weight = province_kill_request_aggregates[ + 'province_kill_request_total_weight'] or 0 + + bars_live_weight = kill_house_free_bar_aggregates['total_weight_live'] or 0 + + bars_carcasses_weight = kill_house_free_bar_aggregates['total_weight_carcass'] or 0 + + total_loss_weight = int( + ((province_kill_request_weight + bars_live_weight) * 0.75) + bars_carcasses_weight) + + list1 = [ + m, + str(shamsi_date(current_date, in_value=True)), + poultry_request_aggregates.get('total_quantity') or 0, + poultry_request_aggregates.get('total_weight') or 0, + poultry_request_aggregates.get('total_direct_buying_quantity') or 0, + poultry_request_aggregates.get('total_direct_buying_weight') or 0, + + kill_house_free_bar_aggregates.get('total_quantity_live') or 0, + kill_house_free_bar_aggregates.get('total_weight_live') or 0, + kill_house_free_bar_aggregates.get('total_weight_carcass') or 0, + province_kill_request_aggregates.get('total_quantity') or 0, + int(province_kill_request_aggregates.get('province_kill_request_total_weight') or 0), + poultry_request_aggregates.get('poultry_out_province_quantity') or 0, + poultry_request_aggregates.get('poultry_out_province_weight') or 0, + kill_house_request_aggregates.get('total_quantity') or 0, + kill_house_request_aggregates.get('total_weight') or 0, + int(total_loss_weight or 0) + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + current_date += datetime.timedelta(days=1) + city_operators = CityOperator.objects.filter(trash=False) + all_admin_all_violation = 0 + city_operator_name = city_operators.values_list('user__fullname', flat=True).distinct() + + city_operator_all_violation_all = PoultryHatching.objects.filter(trash=False, + violation_reporter__isnull=False, + violation_reporter__in=city_operator_name).count() + row_list = l + 7 + row_city = l + 5 + + len_poultry = 0 + len_all_hatching = 0 + all_hathcing_quantitya_all = 0 + all_province_requests_quantity = 0 + all_province_requests_weight = 0 + len_hatching = 0 + all_hatching_quantity = 0 + all_hatching_lest_over = 0 + all_out_poultry_request_quantity = 0 + all_out_poultry_request_weight = 0 + city_operator_poultry_request_quantity_all = 0 + city_operator_poultry_request_weight_all = 0 + direct_bying_poultry_request_quantity_all = 0 + direct_bying_poultry_request_weight_all = 0 + province_operaor_poultry_request_quantity_all = 0 + province_operaor_poultry_request_weight_all = 0 + row_list2 = l + 2 + worksheet[f'D{row_list2}'] = f'اطلاعات کشتار به تفکیک تعاونی ها از تاریخ {from_date_1} تا {from_date_2}' + worksheet[f'D{row_list2}'].font = Font(color="C00000", bold=True, size=12) + worksheet[f'D{row_list2}'].alignment = Alignment(horizontal='center', vertical='center', + wrap_text=True) + merge_range1 = f'D{row_list2}:J{row_list2 + 1}' + worksheet.merge_cells(merge_range1) + for city_operator in city_operators: + poultry_request = PoultryRequest.objects.filter(trash=False, + out_province_request_cancel=False, + province_state='accepted', + poultry__city_operator=city_operator.unit_name) + poultry = Poultry.objects.filter(trash=False, city_operator=city_operator.unit_name) + out_poultry_request = poultry_request.filter(out=True) + city_operator_poultry_request = poultry_request.filter(direct_buying=False, + registrar__role='CityOperator') + province_operaor_poultry_request = poultry_request.filter(~Q(registrar__role='CityOperator'), + direct_buying=False) + direct_bying_poultry_request = poultry_request.filter(direct_buying=True) + + province_requests = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name + , return_to_province=False, + state__in=('accepted', 'pending')) + + province_requests_quantity = \ + province_requests.aggregate( + total=Sum('total_killed_quantity'))[ + 'total'] or 0 + + province_requests_weight = \ + province_requests.aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + + kill_requests = KillHouseRequest.objects.filter(trash=False, + province_kill_request__in=province_requests) + all_hatching = PoultryHatching.objects.filter(trash=False, poultry__in=poultry) + all_violation = all_hatching.filter(violation_reporter__isnull=False) + city_operator_all_violation = all_violation.filter( + violation_reporter=city_operator.user.fullname).count() + admin_all_violation = all_violation.filter(~Q(violation_reporter=city_operator.user.fullname)).count() + + hathcing_quantity_all = \ + all_hatching.aggregate( + total=Sum(F('quantity')))[ + 'total'] or 0 + out_poultry_request_quantity_all = \ + out_poultry_request.aggregate( + total=Sum(F('quantity')))[ + 'total'] or 0 + out_poultry_request_weight_all = \ + out_poultry_request.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + hatching = all_hatching.filter(archive=False, allow_hatching='pending') + hatching_quantity = \ + hatching.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + hatching_lest_over = \ + hatching.aggregate( + total=Sum('left_over'))[ + 'total'] or 0 + city_operator_poultry_request_quantity = \ + city_operator_poultry_request.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + city_operator_poultry_request_weight = \ + city_operator_poultry_request.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + direct_bying_poultry_request_quantity = \ + direct_bying_poultry_request.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + direct_bying_poultry_request_weight = \ + direct_bying_poultry_request.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + province_operaor_poultry_request_quantity = \ + province_operaor_poultry_request.aggregate( + total=Sum('quantity'))[ + 'total'] or 0 + province_operaor_poultry_request_weight = \ + province_operaor_poultry_request.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + all_admin_all_violation += admin_all_violation + + len_poultry += len(poultry) + len_all_hatching += len(all_hatching) + all_hathcing_quantitya_all += hathcing_quantity_all + all_province_requests_quantity += province_requests_quantity + all_province_requests_weight += province_requests_weight + len_hatching += len(hatching) + all_hatching_quantity += hatching_quantity + all_hatching_lest_over += hatching_lest_over + all_out_poultry_request_quantity += out_poultry_request_quantity_all + all_out_poultry_request_weight += out_poultry_request_weight_all + province_requests_date = province_requests.filter( + province_request__poultry_request__send_date__date__gte=date1 + , province_request__poultry_request__send_date__date__lte=date2, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name + ) + city_operator_poultry_request_quantity_all += city_operator_poultry_request_quantity + city_operator_poultry_request_weight_all += city_operator_poultry_request_weight + direct_bying_poultry_request_quantity_all += direct_bying_poultry_request_quantity + direct_bying_poultry_request_weight_all += direct_bying_poultry_request_weight + province_operaor_poultry_request_quantity_all += province_operaor_poultry_request_quantity + province_operaor_poultry_request_weight_all += province_operaor_poultry_request_weight + + list2 = [ + 'ردیف', + 'ماهیت', + 'خریدار', + 'نام و نام خانوادگی مالک', + 'تلفن مالک', + 'شهر', + 'تعداد سفارش', + 'حجم سفارش', + 'تعداد بار ', + 'حجم بار', + 'وزن بار', + 'وزن لاشه', + ] + + for col_num, option in enumerate(list2, 2): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=row_list, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + if option in ['تعداد سفارش', 'حجم سفارش', 'تعداد بار ', 'حجم بار', 'وزن بار', 'وزن لاشه']: + cell.fill = PatternFill(start_color="FF0000", fill_type="solid") + # worksheet.row_dimensions[row_list].height = 35 + worksheet.column_dimensions[col_letter].width = 17 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + m = 1 + kill_houses1 = province_requests_date.values_list('killhouse_user', flat=True).distinct() + kill_houses = KillHouse.objects.filter(id__in=kill_houses1) + len_province_requests_kill = 0 + all_province_quantity = 0 + len_kill_requests_date = 0 + all_accepted_assignment_real_quantity = 0 + all_accepted_assignment_real_weight = 0 + all_ware_house_accepted_real_weight = 0 + for kill_house in kill_houses: + province_requests_kill = province_requests_date.filter(killhouse_user=kill_house) + + province_quantity = \ + province_requests_kill.aggregate( + total=Sum('main_quantity'))[ + 'total'] or 0 + + kill_requests_date = kill_requests.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + killhouse_user=kill_house, + province_kill_request__in=province_requests_kill) + + accepted_assignment_real_quantity = \ + kill_requests_date.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + accepted_assignment_real_weight = \ + kill_requests_date.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + len_province_requests_kill += len(province_requests_kill) + all_province_quantity += province_quantity + len_kill_requests_date += len(kill_requests_date) + all_accepted_assignment_real_quantity += accepted_assignment_real_quantity + all_accepted_assignment_real_weight += int(accepted_assignment_real_weight) + all_ware_house_accepted_real_weight += int(accepted_assignment_real_weight) * 0.75 + # killer='کشتارگاه' if kill_house.killer == False else 'کشتارکن' + if kill_house.killer == True and kill_house.type == 'exclusive': + parent = KillHousePercentage.objects.get(kill_house=kill_house, trash=False) + killer_type = f'کشتارکن اختصاصی {parent.kill_house_for_killer.name}' + elif kill_house.killer == True and kill_house.type == 'public': + killer_type = 'کشتارکن عمومی' + else: + killer_type = 'کشتارگاه' + list1 = [ + m, + killer_type, + kill_house.name, + kill_house.kill_house_operator.user.fullname, + kill_house.kill_house_operator.user.mobile, + kill_house.kill_house_operator.user.city.name, + len(province_requests_kill), + province_quantity, + len(kill_requests_date), + accepted_assignment_real_quantity, + int(accepted_assignment_real_weight), + int(accepted_assignment_real_weight) * 0.75, + ] + for item in range(len(list1)): + cell = worksheet.cell(row=row_list + 1, column=item + 2, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + row_list += 1 + m += 1 + + else: + row_list += 5 + worksheet[f'F{row_city}'] = f'{city_operator.unit_name}' + worksheet[f'F{row_city}'].font = Font(color="C00000", bold=True, size=12) + worksheet[f'F{row_city}'].alignment = Alignment(horizontal='center', vertical='center', + wrap_text=True) + merge_range1 = f'F{row_city}:H{row_city + 1}' + worksheet.merge_cells(merge_range1) + + row_city += len(kill_houses) + 5 + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + len_province_requests_kill, + all_province_quantity, + len_kill_requests_date or 0, + all_accepted_assignment_real_quantity or 0, + all_accepted_assignment_real_weight or 0, + all_ware_house_accepted_real_weight or 0, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=row_city - 2, column=item + 2, value=list2[item]) + value = list2[item] + cell.font = Font(size=10, bold=True, color='FFFFFF') + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'عملکرد خریداران': + 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, active=True, trash=False).exclude( + id__in=kill_house_ids).order_by( + 'id') + + serializer = KillHouseForPerformanceDashboardSerializer(kill_houses, many=True, + context={'date1': date1, 'date2': date2, }).data + + excel_options = [ + 'ردیف', + 'ماهیت', + 'کشتارگاه / کشتارکن', + 'مالک', + 'شهر', + 'تعداد بارهای داخل استان', + 'حجم بارهای داخل استان', + 'وزن بارهای داخل استان', + 'تعداد بارهای خارج استان', + 'حجم بارهای خارج استان', + 'وزن بارهای خارج استان', + 'حجم تخصیصات بدون بار', + 'حجم کل بارها', + 'وزن کل بارها', + 'میانگین وزن', + 'حجم وارد شده به انبار', + 'وزن وارد شده به انبار', + 'حجم وارد نشده به انبار', + 'وزن وارد نشده به انبار' + ] + + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + create_header(worksheet, excel_options, 1, 2, height=25, width=25, border_style='thin', + color='C00000') + + worksheet['B1'] = f'اطلاعات کشتار زنده کشتارگاه' + + worksheet['E1'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'E1:H1' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 2 + m = 1 + + if serializer: + for data in serializer: + list1 = [ + m, # ردیف + 'کشتارگاه' if data['killer'] else 'کشتارکن', # ماهیت + data['name'], # کشتارگاه / کشتارکن + data['kill_house_operator']['user']['fullname'], # مالک + data['kill_house_operator']['user']['city'], # شهر + data['killing_info']['kill_house_requests_count'], # تعداد بارهای داخل استان + data['killing_info']['kill_house_requests_quantity'], # حجم بارهای داخل استان + data['killing_info']['kill_house_requests_weight'], # وزن بارهای داخل استان + data['killing_info']['kill_house_free_bar_count'], # تعداد بارهای خارج استان + data['killing_info']['kill_house_free_bar_quantity'], # حجم بارهای خارج استان + data['killing_info']['kill_house_free_bar_weight'], # وزن بارهای خارج استان + data['killing_info']['province_kill_requests_quantity'], # حجم تخصیصات بدون بار + data['killing_info']['total_quantity'], # حجم کل بارها + data['killing_info']['total_weight'], # وزن کل بارها + data['killing_info']['total_avg_weight'], # میانگین وزن + data['killing_info']['kill_house_requests_ware_house_true_quantity'], # حجم وارد شده به انبار + data['killing_info']['kill_house_requests_ware_house_true_weight'], # وزن وارد شده به انبار + data['killing_info']['kill_house_requests_ware_house_false_quantity'], # حجم وارد نشده به انبار + data['killing_info']['kill_house_requests_ware_house_false_weight'] # وزن وارد نشده به انبار + ] + m += 1 + + create_value(worksheet, list1, l + 1, 1) + l += 1 + + total_province_kill_requests_count = sum( + data['killing_info']['kill_house_requests_count'] for data in serializer) + total_province_kill_requests_quantity = sum( + data['killing_info']['kill_house_requests_quantity'] for data in serializer) + total_province_kill_requests_weight = sum( + data['killing_info']['kill_house_requests_weight'] for data in serializer) + total_kill_house_requests_count = sum( + data['killing_info']['kill_house_free_bar_count'] for data in serializer) + total_kill_house_requests_quantity = sum( + data['killing_info']['kill_house_free_bar_quantity'] for data in serializer) + total_kill_house_requests_weight = sum( + data['killing_info']['kill_house_free_bar_weight'] for data in serializer) + total_quantity = sum(data['killing_info']['province_kill_requests_quantity'] for data in serializer) + total_kill_house_free_bar_quantity = sum( + data['killing_info']['total_quantity'] for data in serializer) + total_kill_house_free_bar_weight = sum( + data['killing_info']['total_weight'] for data in serializer) + total_avg_weight = sum(data['killing_info']['total_avg_weight'] for data in serializer) / len( + serializer) if serializer else 0 + total_ware_house_true_quantity = sum( + data['killing_info']['kill_house_requests_ware_house_true_quantity'] for data in serializer) + total_ware_house_true_weight = sum( + data['killing_info']['kill_house_requests_ware_house_true_weight'] for data in serializer) + total_ware_house_false_quantity = sum( + data['killing_info']['kill_house_requests_ware_house_false_quantity'] for data in serializer) + total_ware_house_false_weight = sum( + data['killing_info']['kill_house_requests_ware_house_false_weight'] for data in serializer) + + # لیست مجموع مقادیر + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + total_province_kill_requests_count, + total_province_kill_requests_quantity, + total_province_kill_requests_weight, + total_kill_house_requests_count, + total_kill_house_requests_quantity, + total_kill_house_requests_weight, + total_quantity, + total_kill_house_free_bar_quantity, + total_kill_house_free_bar_weight, + total_avg_weight, + total_ware_house_true_quantity, + total_ware_house_true_weight, + total_ware_house_false_quantity, + total_ware_house_false_weight + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 2, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + 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, active=True, trash=False).exclude( + id__in=kill_house_ids).order_by( + 'id') + + kill_houses = kill_houses.annotate( + allocation_count=Count( + 'kill_house_steward_allocation', + filter=Q(kill_house_steward_allocation__receiver_state__in=['pending', 'accepted']) + ) + ).order_by( + '-allocation_count' + ) + new_serializer = KillHouseForProvinceWareHouseDashboardSerializer(kill_houses, many=True, + context={'request': request}).data + + excel_options = [ + 'ردیف', + 'خریدار', + 'ماهیت', + 'شهر', + 'مانده انبار فعلی', + 'وزن کل فروش (لاشه)', + 'وزن فروش داخل استان (لاشه)', + 'وزن فروش خارج استان (لاشه)' + ] + + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + new_l = l + 6 + + create_header(worksheet, excel_options, 1, new_l, height=25, width=25, border_style='thin', + color='C00000') + new_m = 1 + worksheet[f'B{new_l - 1}'] = f'اطلاعات توزیع گوشت مرغ کشتارگاه' + + worksheet[f'E{new_l - 1}'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet[f'B{new_l - 1}'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = f'B{new_l - 1}:D{new_l - 1}' + merge_range2 = f'E{new_l - 1}:H{new_l - 1}' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet[f'B{new_l - 1}'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + if new_serializer: + for data in new_serializer: + list1 = [ + new_m, # ردیف + data['name'], # خریدار + 'کشتارگاه' if data['killer'] else 'کشتارکن', # ماهیت + data['kill_house_operator']['user']['city']['name'], # شهر + data['ware_house_info']['product_remain_weight'], # مانده انبار فعلی + data['ware_house_info']['total_sell'], # وزن کل فروش (لاشه) + data['ware_house_info']['total_kill_house_allocations_weight'], # وزن فروش داخل استان (لاشه) + data['ware_house_info']['total_kill_house_free_sale__bar_carcasses_weight'] + # وزن فروش خارج استان (لاشه) + ] + new_m += 1 + + create_value(worksheet, list1, new_l + 1, 1) + new_l += 1 + + total_inventory = sum(data['ware_house_info']['product_remain_weight'] for data in new_serializer) + total_sales = sum(data['ware_house_info']['total_sell'] for data in new_serializer) + total_in_province = sum( + data['ware_house_info']['total_kill_house_allocations_weight'] for data in new_serializer) + total_out_province = sum( + data['ware_house_info']['total_kill_house_free_sale__bar_carcasses_weight'] for data in + new_serializer) + + list2 = [ + 'مجموع ==>', + '', + '', + '', + total_inventory, + total_sales, + total_in_province, + total_out_province + ] + for item in range(len(list2)): + cell = worksheet.cell(row=new_l + 2, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'گزارش سند ها': + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).order_by('id') + kill_house_request = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, temporary_deleted=False) + bar_duc = BarDocumentStatus.objects.filter(trash=False).order_by('id').values_list('title', flat=True) + excel_options = [ + 'ردیف', + 'نام گشتارگاه', + 'تلفن', + 'شهر', + 'تعداد کل بار', + 'بارهای دارای سند', + 'بارهای فاقد سند', + *bar_duc + + ] + + from_date_1 = shamsi_date(date1) + from_date_2 = shamsi_date(date2) + excel_description(worksheet, 'B1', + 'گزارش سند ها از تاریخ {0} تا {1}'.format(from_date_1, from_date_2), + color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + l = 5 + m = 1 + total_counts = {title: 0 for title in bar_duc} + + for kill_house in kill_houses: + kill_house_request1 = kill_house_request.filter( + trash=False, + killhouse_user=kill_house, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False + ) + + # محاسبه تعداد کل بارها + bar_count = kill_house_request1.count() + + # محاسبه تعداد بارهای دارای سند و فاقد سند + bar_assigment_true_count = kill_house_request1.filter(assignment_state_archive='True').count() + bar_assigment_pending_count = kill_house_request1.filter(assignment_state_archive='pending').count() + + # محاسبه تعداد هر وضعیت سند + status_counts = {} + for title in bar_duc: + count = kill_house_request1.filter(bar_document_status__title=title).count() + status_counts[title] = count + total_counts[title] += count + + list1 = [ + m, + kill_house.name, + kill_house.kill_house_operator.user.mobile, + kill_house.kill_house_operator.user.city.name, + bar_count, + bar_assigment_true_count, + bar_assigment_pending_count, + *[status_counts.get(title, 0) for title in bar_duc] + ] + + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + bar_count = kill_house_request.count() + + bar_assigment_true_count = kill_house_request.filter(assignment_state_archive='True').count() + bar_assigment_pending_count = kill_house_request.filter(assignment_state_archive='pending').count() + + list2 = [ + 'مجموع', + '', + '', + '', + bar_count, + bar_assigment_true_count, + bar_assigment_pending_count, + *[total_counts[title] for title in bar_duc] + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + elif sheet_name == 'اطلاعات جامع انبار و توزیع': + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id').annotate( + allocation_count=Count( + 'kill_house_steward_allocation', + filter=Q(kill_house_steward_allocation__receiver_state__in=['pending', 'accepted']) + ) + ).order_by( + '-allocation_count' + ) + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + serializer = KillHouseForProvinceWareHouseDashboardSerializer(kill_houses, many=True, + context={'request': request}).data + header_list2 = [ + 'ردیف', + 'خریدار', + 'تلفن خریدار', + 'ماهیت', + 'شهر', + 'مانده انبار فعلی', + 'کل وزن ورودی به انبار', + 'کل وزن فروش رفته', + 'حجم تخصیصات بدون ماشین', + 'تعداد بار درون استان', + 'حجم بار درون استان', + 'وزن بار درون استان', + 'تعداد بار زنده خارج استان', + 'حجم بار زنده خارج استان', + 'وزن بار زنده خارج استان', + 'تعداد بار لاشه خارج استان', + 'حجم بار لاشه خارج استان', + 'وزن بار لاشه خارج استان', + 'تعداد کل بارها', + 'حجم کل بارها', + 'وزن کل بارها', + 'تعداد بار وارد شده به انبار', + 'تعداد بار وارد نشده به انبار', + 'حجم بار وارد نشده به انبار', + 'وزن بار وارد نشده به انبار', + 'وزن فروش داخل استان', + 'وزن فروش خارج استان', + + ] + create_header(worksheet, header_list2, 1, 6, height=21.8, width=20, border_style='thin') + l = 7 + if serializer: + + m = 1 + + for data in serializer: + list1 = [ + m, + data.get('name', ''), + data.get('kill_house_operator', {}).get('user', {}).get('mobile', ''), + 'کشتارگاه' if not data.get('killer', False) else 'کشتارکن', + data.get('kill_house_operator', {}).get('user', {}).get('city', {}).get('name', ''), + data.get('ware_house_info', {}).get('product_remain_weight', 0), + data.get('ware_house_info', {}).get('warehouse_total_entered_carcasses_weight', 0), + data.get('ware_house_info', {}).get('total_sell', 0), + data.get('ware_house_info', {}).get('province_kill_requests_quantity', 0), + data.get('ware_house_info', {}).get('total_province_bars', 0), + data.get('ware_house_info', {}).get('total_province_bars_quantity', 0), + data.get('ware_house_info', {}).get('total_province_bars_weight', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_bar', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_live_bar_quantity', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_live_bar_weight', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_carcasses_bar', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_bar_carcasses', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_bar_carcasses_weight', 0), + data.get('ware_house_info', {}).get('total_bars', 0), + data.get('ware_house_info', {}).get('warehouse_total_quantity', 0), + data.get('ware_house_info', {}).get('warehouse_total_weight', 0), + int(data.get('ware_house_info', {}).get('warehouse_total_entered_bars', 0)), + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars', 0), + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_quantity', 0), + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_weight', 0), + data.get('ware_house_info', {}).get('total_kill_house_allocations_weight', 0), + data.get('ware_house_info', {}).get('total_kill_house_free_sale__bar_carcasses_weight', 0), + + ] + + create_value(worksheet, list1, l, 1, border_style='thin', m=m) + m += 1 + l += 1 + header_list2 = [ + 'حجم کل بارها', + 'وزن کل بارها', + 'وزن وارد شده به انبار', + 'وزن توزیع شده داخل استان', + 'وزن توزیع شده خارج استان', + 'مانده انبار', + + ] + create_header(worksheet, header_list2, 3, 3, height=21.8, width=20, color='C00000', + border_style='thin') + products = RolesProducts.objects.filter(kill_house__in=kill_houses, trash=False) + product_remain_weight = products.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + shamsi_date1 = shamsi_date(date1) + shamsi_date2 = shamsi_date(date2) + excel_description(worksheet, 'A2', + f' اطلاعات جامع انبار و توزیع کشتارگاه{shamsi_date1} تا تاریخ {shamsi_date2}', + size=11, color='red', row2='B4') + + else: + excel_description(worksheet, 'A2', f'اطلاعات جامع انبار', + size=11, color='red', row2='B4') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False, + trash=False, calculate_status=True) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter( + Q(date__date__gte=date1, + date__date__lte=date2, + buy_type='carcass') | Q( + create_date__date__gte=date1, create_date__date__lte=date2, buy_type='live'), + kill_house__in=kill_houses, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + date__date__gte=date1, + date__date__lte=date2, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, + trash=False, + receiver_state__in=( + 'pending', 'accepted'), + date__date__gte=date1, + date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True) + else: + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses), + temporary_trash=False, + temporary_deleted=False, + trash=False, calculate_status=True) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter( + kill_house__in=kill_houses, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True) + kill_house_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, + trash=False, + receiver_state__in=( + 'pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True) + total_kill_house_requests_quantity = \ + kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + total_kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + total_entered_kill_house_requests_carcasses_weight = \ + kill_house_requests.filter(ware_house_confirmation=True).aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + kill_house_free_bar_informations_live = kill_house_free_bar_informations.filter(buy_type='live') + kill_house_free_bar_informations_carcasses = kill_house_free_bar_informations.filter( + buy_type='carcass') + total_kill_house_free_bar_quantity = \ + kill_house_free_bar_informations_live.aggregate(total=Sum('quantity'))['total'] or 0 + total_kill_house_free_bar_weight = \ + kill_house_free_bar_informations_live.aggregate(total=Sum('live_weight'))['total'] or 0 + total_kill_house_free_bar_carcasses = \ + kill_house_free_bar_informations_carcasses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_kill_house_free_bar_carcasses_weight = \ + kill_house_free_bar_informations_carcasses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_entered_kill_house_free_bar_carcasses_weight = \ + kill_house_free_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_free_sale__bar_carcasses_weight = \ + kill_house_free_Sale_bar_informations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_allocations_weight = \ + kill_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + warehouse_total_weight = total_kill_house_requests_weight + total_kill_house_free_bar_weight + total_kill_house_free_bar_carcasses_weight + warehouse_total_entered_carcasses_weight = total_entered_kill_house_requests_carcasses_weight + total_entered_kill_house_free_bar_carcasses_weight + + result = { + "product_remain_weight": int(warehouse_total_entered_carcasses_weight - ( + total_kill_house_allocations_weight + total_kill_house_free_sale__bar_carcasses_weight)), + "warehouse_total_quantity": int( + total_kill_house_requests_quantity + total_kill_house_free_bar_quantity + total_kill_house_free_bar_carcasses), + "warehouse_total_weight": int(warehouse_total_weight), + "warehouse_total_entered_carcasses_weight": int(warehouse_total_entered_carcasses_weight), + "total_kill_house_allocations_weight": int(total_kill_house_allocations_weight), + "total_kill_house_free_sale_bar_carcasses_weight": int( + total_kill_house_free_sale__bar_carcasses_weight), + + } + + value_header_list = [ + result['warehouse_total_quantity'], # حجم کل بارها + result['warehouse_total_weight'], # وزن کل بارها + result['warehouse_total_entered_carcasses_weight'], # وزن وارد شده به انبار + result['total_kill_house_allocations_weight'], # وزن توزیع شده داخل استان + result['total_kill_house_free_sale_bar_carcasses_weight'], + result['product_remain_weight'] # مانده انبار + ] + create_value(worksheet, value_header_list, 4, 3, border_style='thin') + + # محاسبه مجموع هر یک از فیلدها + sum_product_remain_weight = sum( + data.get('ware_house_info', {}).get('product_remain_weight', 0) for data in serializer) + sum_previous_product_remain_weight = sum( + data.get('ware_house_info', {}).get('previous_product_remain_weight', 0) for data in serializer) + sum_province_kill_requests_quantity = sum( + data.get('ware_house_info', {}).get('province_kill_requests_quantity', 0) for data in + serializer) + sum_total_province_bars = sum( + data.get('ware_house_info', {}).get('total_province_bars', 0) for data in serializer) + sum_total_province_bars_quantity = sum( + data.get('ware_house_info', {}).get('total_province_bars_quantity', 0) for data in serializer) + sum_total_province_bars_weight = sum( + data.get('ware_house_info', {}).get('total_province_bars_weight', 0) for data in serializer) + sum_total_kill_house_free_bar = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_bar', 0) for data in serializer) + sum_total_kill_house_free_live_bar_quantity = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_live_bar_quantity', 0) for data in + serializer) + sum_total_kill_house_free_live_bar_weight = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_live_bar_weight', 0) for data in + serializer) + sum_total_kill_house_free_carcasses_bar = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_carcasses_bar', 0) for data in + serializer) + sum_total_kill_house_free_bar_carcasses = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_bar_carcasses', 0) for data in + serializer) + sum_total_kill_house_free_bar_carcasses_weight = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_bar_carcasses_weight', 0) for data in + serializer) + sum_total_bars = sum(data.get('ware_house_info', {}).get('total_bars', 0) for data in serializer) + sum_warehouse_total_quantity = sum( + data.get('ware_house_info', {}).get('warehouse_total_quantity', 0) for data in serializer) + sum_warehouse_total_weight = sum( + data.get('ware_house_info', {}).get('warehouse_total_weight', 0) for data in serializer) + sum_warehouse_total_entered_bars = sum( + int(data.get('ware_house_info', {}).get('warehouse_total_entered_bars', 0)) for data in + serializer) + sum_warehouse_total_entered_carcasses_weight = sum( + data.get('ware_house_info', {}).get('warehouse_total_entered_carcasses_weight', 0) for data in + serializer) + sum_warehouse_total_not_entered_bars = sum( + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars', 0) for data in + serializer) + sum_warehouse_total_not_entered_bars_quantity = sum( + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_quantity', 0) for data in + serializer) + sum_warehouse_total_not_entered_bars_weight = sum( + data.get('ware_house_info', {}).get('warehouse_total_not_entered_bars_weight', 0) for data in + serializer) + sum_total_kill_house_allocations_weight = sum( + data.get('ware_house_info', {}).get('total_kill_house_allocations_weight', 0) for data in + serializer) + sum_total_kill_house_free_sale__bar_carcasses_weight = sum( + data.get('ware_house_info', {}).get('total_kill_house_free_sale__bar_carcasses_weight', 0) for + data in + serializer) + sum_total_sell = sum( + data.get('ware_house_info', {}).get('total_sell', 0) for data in + serializer) + sum_warehouse_total_entered_bars = sum( + data.get('ware_house_info', {}).get('warehouse_total_entered_bars', 0) for data in + serializer) + + summary_list = [ + 'جمع کل==>', + '', + '', + '', + '', + sum_product_remain_weight, + sum_warehouse_total_entered_bars, + sum_total_sell, + sum_province_kill_requests_quantity, + sum_total_province_bars, + sum_total_province_bars_quantity, + sum_total_province_bars_weight, + sum_total_kill_house_free_bar, + sum_total_kill_house_free_live_bar_quantity, + sum_total_kill_house_free_live_bar_weight, + sum_total_kill_house_free_carcasses_bar, + sum_total_kill_house_free_bar_carcasses, + sum_total_kill_house_free_bar_carcasses_weight, + sum_total_bars, + sum_warehouse_total_quantity, + sum_warehouse_total_weight, + sum_warehouse_total_entered_bars, + sum_warehouse_total_not_entered_bars, + sum_warehouse_total_not_entered_bars_quantity, + sum_warehouse_total_not_entered_bars_weight, + sum_total_kill_house_allocations_weight, + sum_total_kill_house_free_sale__bar_carcasses_weight + ] + + create_value(worksheet, summary_list, l + 1, 1, color='green') + + new_l = l + 7 + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + stewards = Guilds.objects.filter(trash=False, steward=True).select_related('user').only('user', + 'guilds_name', + 'steward').order_by( + 'id') + + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted'], + allocation_to_steward__date__date__gte=date1, + allocation_to_steward__date__date__lte=date2) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count') + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count') + + stewards1 = list(set(chain(allocation_stewards, free_bar_stewards))) + + else: + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted']) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count') + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count') + + stewards1 = list(set(chain(allocation_stewards, free_bar_stewards))) + + serializer = RealGuildsForDashboardSerializer(stewards1, many=True, context={'request': request}).data + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted'], + allocation_to_steward__date__date__gte=date1, + allocation_to_steward__date__date__lte=date2) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count') + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count') + + stewards = (list(chain(allocation_stewards, free_bar_stewards))) + + allocations = StewardAllocation.objects.filter( + Q(steward__in=stewards) | Q(to_steward__in=stewards), + trash=False, calculate_status=True, to_cold_house__isnull=True, + date__date__gte=date1, date__date__lte=date2) + + free_bars = StewardFreeBarInformation.objects.filter(steward__in=stewards, trash=False, + date__date__gte=date1, + date__date__lte=date2) + free_sale_bars = StewardFreeSaleBarInformation.objects.filter(steward__in=stewards, trash=False, + date__date__gte=date1, + date__date__lte=date2) + else: + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted']) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count').values_list('id', flat=True) + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count').values_list('id', flat=True) + + stewards = (list(chain(allocation_stewards, free_bar_stewards))) + + allocations = StewardAllocation.objects.filter( + Q(steward__in=stewards) | Q(to_steward__in=stewards), + trash=False, calculate_status=True, to_cold_house__isnull=True) + + free_bars = StewardFreeBarInformation.objects.filter(steward__in=stewards, trash=False) + free_sale_bars = StewardFreeSaleBarInformation.objects.filter(steward__in=stewards, trash=False) + + header_list2 = [ + 'ردیف', + 'خریدار', + 'تلفن خریدار', + 'ماهیت', + 'شهر', + 'مانده انبار فعلی', + 'تعداد کل بارها', + 'وزن کل بارها', + 'تعداد بار وارد شده به انبار', + 'کل وزن ورودی به انبار', + 'تعداد فروش رفته', + 'کل وزن فروش رفته', + 'تعداد بار درون استان', + 'وزن بار درون استان', + 'تعداد بار لاشه خارج استان', + 'وزن بار لاشه خارج استان', + 'وزن فروش داخل استان', + 'وزن فروش خارج استان', + + ] + create_header(worksheet, header_list2, 1, new_l, height=21.8, width=20, border_style='thin') + + allocations_aggregates = allocations.aggregate( + total_input_bars_count=Count('id', filter=Q(to_steward__isnull=False)), + total_input_bars_weight=Sum('real_weight_of_carcasses', filter=Q(to_steward__isnull=False)), + total_output_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward__isnull=False, + receiver_state__in=('pending', 'accepted'))), + total_input_entered_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, receiver_state='accepted')) + ) + + free_bars_aggregates = free_bars.aggregate( + total_count=Count('id'), + total_weight=Sum('weight_of_carcasses') + ) + + free_sale_bars_aggregates = free_sale_bars.aggregate( + total_count=Count('id'), + total_weight=Sum('weight_of_carcasses'), + + ) + + input_allocations_weight = allocations_aggregates['total_input_bars_weight'] or 0 + input_entered_allocations_weight = allocations_aggregates['total_input_entered_bars_weight'] or 0 + output_allocations_weight = allocations_aggregates['total_output_bars_weight'] or 0 + free_bars_weight = free_bars_aggregates['total_weight'] or 0 + free_sale_bars_weight = free_sale_bars_aggregates['total_weight'] or 0 + remain_weight = int( + (input_entered_allocations_weight + free_bars_weight) - ( + free_sale_bars_weight + output_allocations_weight)) + + if date1: + date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() + shamsi_date1 = shamsi_date(date1) + shamsi_date2 = shamsi_date(date2) + excel_description(worksheet, f'A{new_l - 2}', + f' اطلاعات جامع انبار و توزیع مباشرین از تاریخ {shamsi_date1} تا تاریخ {shamsi_date2}', + size=11, color='red', row2=f'B{new_l - 1}') + + sum_remain_weight = sum(data.get('ware_house_info', {}).get('remain_weight', 0) for data in serializer) + sum_total_bars_count = sum( + data.get('ware_house_info', {}).get('total_bars_count', 0) for data in serializer) + sum_total_bars_weight = sum( + data.get('ware_house_info', {}).get('total_bars_weight', 0) for data in serializer) + sum_total_entered_bars_count = sum( + data.get('ware_house_info', {}).get('total_entered_bars_count', 0) for data in serializer) + sum_total_entered_bars_weight = sum( + data.get('ware_house_info', {}).get('total_entered_bars_weight', 0) for data in serializer) + sum_total_in_out_province_bars_count = sum( + data.get('ware_house_info', {}).get('total_in_out_province_bars_count', 0) for data in serializer) + sum_total_in_out_province_bars_weight = sum( + data.get('ware_house_info', {}).get('total_in_out_province_bars_weight', 0) for data in serializer) + sum_input_bars_count = sum( + data.get('ware_house_info', {}).get('input_bars_count', 0) for data in serializer) + sum_input_bars_weight = sum( + data.get('ware_house_info', {}).get('input_bars_weight', 0) for data in serializer) + sum_free_bars_count = sum(data.get('ware_house_info', {}).get('free_bars_count', 0) for data in serializer) + sum_free_bars_weight = sum( + data.get('ware_house_info', {}).get('free_bars_weight', 0) for data in serializer) + sum_in_province_bars_weight = sum( + data.get('ware_house_info', {}).get('in_province_bars_weight', 0) for data in serializer) + sum_out_province_bars_weight = sum( + data.get('ware_house_info', {}).get('out_province_bars_weight', 0) for data in serializer) + sum_warehouse_total_entered_bars = sum( + data.get('ware_house_info', {}).get('warehouse_total_entered_bars', 0) for data in serializer) + result = { + "total_bars_weight": int(input_allocations_weight + free_bars_weight), + "total_entered_bars_weight": int(input_entered_allocations_weight + free_bars_weight), + "in_province_bars_weight": int(output_allocations_weight), + "out_province_bars_weight": int(free_sale_bars_weight), + "remain_weight": remain_weight, + } + + value_header_list = [ + result['total_bars_weight'], + result['total_entered_bars_weight'], + result['in_province_bars_weight'], + result['out_province_bars_weight'], + result['remain_weight'], + + ] + create_value(worksheet, value_header_list, new_l - 1, 3, border_style='thin') + header_list2 = [ + 'وزن کل بارها', + 'وزن وارد شده به انبار', + 'وزن توزیع شده داخل استان', + 'وزن توزیع شده خارج استان', + 'مانده انبار', + + ] + create_header(worksheet, header_list2, 3, new_l - 2, height=21.8, width=20, color='C00000', + border_style='thin') + if serializer: + m = 1 + for data in serializer: + steward_type = 'مباشر' if data.get('steward') == True else 'صنف' + list1 = [ + m, + data.get('user', {}).get('fullname', ''), + data.get('user', {}).get('mobile', ''), + f'{steward_type}({data.get("guilds_name", "")})', + data.get('user', {}).get('city_name', {}), + data.get('ware_house_info', {}).get('remain_weight', 0), + data.get('ware_house_info', {}).get('total_bars_count', 0), + data.get('ware_house_info', {}).get('total_bars_weight', 0), + data.get('ware_house_info', {}).get('total_entered_bars_count', 0), + data.get('ware_house_info', {}).get('total_entered_bars_weight', 0), + data.get('ware_house_info', {}).get('total_in_out_province_bars_count', 0), + data.get('ware_house_info', {}).get('total_in_out_province_bars_weight', 0), + data.get('ware_house_info', {}).get('input_bars_count', 0), + data.get('ware_house_info', {}).get('input_bars_weight', 0), + data.get('ware_house_info', {}).get('free_bars_count', 0), + data.get('ware_house_info', {}).get('free_bars_weight', 0), + data.get('ware_house_info', {}).get('in_province_bars_weight', 0), + data.get('ware_house_info', {}).get('out_province_bars_weight', 0), + + ] + + create_value(worksheet, list1, new_l + 1, 1, border_style='thin', m=m) + m += 1 + new_l += 1 + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + + summary_list = [ + 'جمع کل==>', + '', + '', + '', + '', + sum_remain_weight, + sum_total_bars_count, + sum_total_bars_weight, + sum_total_entered_bars_count, + sum_total_entered_bars_weight, + sum_total_in_out_province_bars_count, + sum_total_in_out_province_bars_weight, + sum_input_bars_count, + sum_input_bars_weight, + sum_free_bars_count, + sum_free_bars_weight, + sum_in_province_bars_weight, + sum_out_province_bars_weight, + ] + + create_value(worksheet, summary_list, new_l + 1, 1, color='green') + + + else: + date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + temporary_trash=False, + temporary_deleted=False, + clearance_code__isnull=False + ).values_list('clearance_code', flat=True).distinct() + + kill_house_free_sale = PoultryRequest.objects.filter(trash=False, quarantine_code__isnull=False, out=True) \ + .values_list('quarantine_code', flat=True).distinct() + + result = list(kill_house_request) + list(kill_house_free_sale) + + response = requests.post( + f'https://rsibackend.rasadyar.com/app/send_different_bar/?province={base_url_for_sms_report}' + f'&date1={date1}&date2={date2}', + json=result, + headers={'Content-Type': 'application/json'} + ) + + header_list = [ + 'تعداد مرغداران', + 'تعداد کشتارگاه ها', + 'حجم کشتار', + + ] + create_header(worksheet, header_list, 4, 2, height=25, width=25, border_style='thin', + color='C00000') + + excel_options = [ + 'ردیف', + 'نوع بار', + 'تاریخ کشتار', + 'مرغدار', + 'شناسه یکتا مرغدار', + 'شماره مجوز جوجه ریزی', + 'شماره موبایل مرغدار', + 'شهر مرغدار', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد قرنطینه', + 'وضعیت بار', + 'کشتارگاه', + 'شناسه یکتا کشتارگاه', + 'استان', + 'شهر', + 'حجم کشتار', + 'سن کشتار', + + ] + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + unique_poultry_out_false = set() + unique_slaughterhouses_out_false = set() + total_slaughter_out_false = 0 + excel_description(worksheet, 'A1', f'بارهای دارای مغایرت', color='red', + row2='B1') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + from_date2 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ {from_date1} تا {from_date2}', color='red', row2='C3') + for data in response.json(): + if data['Out'] == False: + state = 'داخل استان' + else: + state = 'خارج استان' + vet_farm_mobile = '' + vet_farm_name = '' + vet_farm = VetFarm.objects.filter(trash=False, + poultry__breeding_unique_id=data['hatching']['poultry'][ + 'PartIdCode']).first() + if vet_farm: + vet_farm_mobile = vet_farm.vet.user.mobile + vet_farm_name = vet_farm.vet.user.fullname + unique_poultry_out_false.add(data['hatching']['poultry']['UnitName']) + unique_slaughterhouses_out_false.add(data['DesUnitName']) + total_slaughter_out_false += data['GoodAmount'] + date_str = str(data['Date']).split('T')[0] # جدا کردن بخش تاریخ + date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date() + list1 = [ + m, + state, + str(shamsi_date(date, in_value=True)), + data['hatching']['poultry']['UnitName'], + data['hatching']['poultry']['PartIdCode'], + data['hatching']['RequestCode'], + data['hatching']['poultry']['Mobile'], + data['hatching']['poultry']['City'], + vet_farm_name, + vet_farm_mobile, + data['TrackingCode'], + data['TrackingStatusDescription'], + data['DesUnitName'], + data['DesPartIdCode'], + data['Province'], + data['City'], + data['GoodAmount'], + data['Age'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + value_header_list = [ + len(unique_poultry_out_false), + len(unique_slaughterhouses_out_false), + total_slaughter_out_false + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + quantity = sum( + data['GoodAmount'] for data in response.json() if data['Out'] == False) or 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + quantity, + '', + + ] + + create_value(worksheet, list2, l + 1, 1, color='green') + + workbook.save(output) + output.seek(0) + + response1 = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response1[ + 'Content-Disposition'] = f'attachment; filename="پایش کلی اطلاعات.xlsx"'.encode( + 'utf-8') + response1.write(output.getvalue()) + return response1 + + +def market_requests_excel(request): + filterset_class = KillRequestFilterSet + filterset_fields = [ + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'poultry_request__chicken_breed', + 'poultry_request__order_code', + 'poultry_request__poultry__address__city__name', + 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__user__fullname', + + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + now = datetime.datetime.now().date() + role = request.GET.get('role') + filter = { + 'trash': False, + 'market': True, + 'recive_date__date': now, + } + excel_name = 'سفارشات دریافتی' + excel_options = [ + "ردیف", + "فارم", + "مرغدار", + "تلفن مرغدار", + "شهر", + "ماهیت خریدار", + "خریدار", + "تلفن خریدار", + "آدرس خریدار", + "نژاد", + "سن (روز)", + "تعداد قطعه", + "تاریخ کشتار", + "میانگین وزنی (کیلوگرم)", + "وزن تقریبی (کیلوگرم)", + "مبلغ هر کیلو (ریال)", + "حداکثر مهلت تسویه", + "وضعیت", + + ] + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() + filter['kill_house'] = kill_house + excel_name = 'خریدهای ثبت شده' + excel_options = [ + "ردیف", + "فارم", + "مرغدار", + "تلفن مرغدار", + "شهر", + "نژاد", + "سن (روز)", + "تعداد قطعه", + "تاریخ کشتار", + "میانگین وزنی (کیلوگرم)", + "وزن تقریبی (کیلوگرم)", + "مبلغ هر کیلو (ریال)", + "حداکثر مهلت تسویه", + "وضعیت", + + ] + + elif role in ('CityJahad', 'CityOperator', 'CityCommerce', 'CityVet', 'CitySupervisor', 'CityPoultry'): + filter['poultry__address__city'] = user.city + state_type = request.GET.get('type') + + if state_type and state_type != 'all': + filter['market_state'] = state_type + + kill_requests = KillRequest.objects.filter(**filter).select_related('poultry_hatching', 'poultry').only( + 'poultry_hatching', 'poultry').order_by( + Case( + When(market_state='pending', then=Value(0)), + default=Value(1) + ), + '-create_date' + ) + + if 'search' in request.GET: + kill_requests_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=kill_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=kill_requests) + kill_requests_list = ps.filter() + kill_requests = [] if len( + kill_requests_list) == 0 else kill_requests_list + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد قطعه', + "وزن تقریبی (کیلوگرم)", + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', excel_name, color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + all_wight = 0 + serializer = KillRequestForDirectBuyingSerializer(kill_requests, many=True).data + if serializer: + for data in serializer: + all_wight += int(data['Index_weight'] * data['kill_capacity']) + state = '-' + if data['market_state'] == "pending" and data['market_code_status'] == True and data[ + 'market_final_accept'] == True \ + and data.get('input_market_code'): + state = 'در انتظار ورود کد احراز' + elif data['market_final_accept'] == False: + state = 'در انتظار تایید خریدار' + elif data['market_state'] == "pending": + state = 'در انتظار تایید استان' + elif data['market_state'] == "accepted": + state = 'تایید شده' + elif data['market_state'] == "rejected": + state = 'رد شده' + elif data['market_state'] == "deleted": + state = 'حذف شده' + + if type(data['recive_date']) is str: + try: + # فرمت با کسری ثانیه + str_date = datetime.datetime.strptime(str(data['recive_date']), "%Y-%m-%dT%H:%M:%S.%f").date() + except: + try: + # فرمت بدون کسری ثانیه + str_date = datetime.datetime.strptime(str(data['recive_date']), "%Y-%m-%dT%H:%M:%S").date() + except: + try: + # فقط تاریخ + str_date = datetime.datetime.strptime(str(data['recive_date']), '%Y-%m-%d').date() + except: + # اگر هیچکدام کار نکرد، مقدار پیشفرض قرار دهید + str_date = None + date = shamsi_date(str_date, in_value=True) if str_date else '-' + elif data['recive_date'] is None: + date = '-' + else: + date = shamsi_date(data['recive_date'], in_value=True) + + if type(data['payment_deadline_date']) is str: + try: + # فرمت با کسری ثانیه + str_date = datetime.datetime.strptime(str(data['payment_deadline_date']), + "%Y-%m-%dT%H:%M:%S.%f").date() + except: + try: + # فرمت بدون کسری ثانیه + str_date = datetime.datetime.strptime(str(data['payment_deadline_date']), + "%Y-%m-%dT%H:%M:%S").date() + except: + try: + # فقط تاریخ + str_date = datetime.datetime.strptime(str(data['payment_deadline_date']), '%Y-%m-%d').date() + except: + # اگر هیچکدام کار نکرد، مقدار پیشفرض قرار دهید + str_date = None + payment_deadline_date = shamsi_date(str_date, in_value=True) if str_date else '-' + elif data['payment_deadline_date'] is None: + payment_deadline_date = '-' + else: + payment_deadline_date = shamsi_date(data['payment_deadline_date'], in_value=True) + if role == 'KillHouse': + + list1 = [ + m, + str(data['poultry']['unit_name']), + data['poultry']['fullname'], + data['poultry']['mobile'], + data['poultry']['city'], + data['chicken_breed'], + data['poultry_request']['killing_age'], + data['kill_capacity'], + str(date), + str(data['Index_weight']), + int(data['Index_weight'] * data['kill_capacity']), + data['amount'], + str(payment_deadline_date), + state + ] + else: + killer = 'کشتارکن' if data['kill_house']['killer'] == True else 'کشتارگاه' + list1 = [ + m, + data['poultry']['unit_name'], + data['poultry']['fullname'], + data['poultry']['mobile'], + data['poultry']['city'], + data['chicken_breed'], + killer, + data['kill_house']['name'], + data['kill_house']['mobile'], + data['kill_house']['city'], + data['poultry_request']['killing_age'], + data['kill_capacity'], + str(date), + str(data['Index_weight']), + int(data['Index_weight'] * data['kill_capacity']), + data['amount'], + str(payment_deadline_date), + state + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + kill_capacity = sum( + item['kill_capacity'] for item in serializer) + + value_header_list = [ + kill_capacity, + all_wight, + + ] + create_value(worksheet, value_header_list, 3, 5) + if role == 'KillHouse': + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + kill_capacity, + '', + '', + all_wight, + '', + '', + '', + + ] + else: + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + kill_capacity, + '', + '', + all_wight, + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="{excel_name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def get_more_than_one_role(request): + users = SystemUserProfile.objects.filter(trash=False).annotate(role_count=Count('role')) \ + .filter(role_count__gt=1) + + excel_options = [ + 'ردیف', + 'نام و نام خانوادگی کاربر', + 'موبایل کاربر', + 'نقش', + 'شهرستان', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 1, 2, 20, width=30) + + l = 2 + for user in users: + role_list = [role.name for role in user.role.all()] + list1 = [ + m, + user.fullname, + user.mobile, + str(role_list), + user.city.name if user.city else '-' + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin') + m += 1 + l += 1 + province = users.first().province.name + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="کاربران چند نقشی استان {province} .xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def return_province_request_excel(request): + serializer_class = ReturnProvinceKillRequestSerializer + filterset_class = ReturnProvinceKillRequestFilterSet + filterset_fields = [ + 'province_request__poultry_request__order_code', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__address__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__address__city__name', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + filters = { + 'archive_wage': False, + 'state__in': ('pending', 'accepted'), + 'first_car_allocated_quantity': 0 + } + if role == 'KillHouse': + filters['killhouse_user__kill_house_operator__user'] = user + if date1: + filters['kill_request__recive_date__date__gte'] = date1 + filters['kill_request__recive_date__date__lte'] = date2 + + return_province_kill_requests = ProvinceKillRequest.objects.filter( + Q(trash=False, return_to_province=True) | Q(trash=True, return_trash=True), **filters).order_by('id') + + if 'search' in request.GET: + return_province_kill_requests_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=return_province_kill_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=return_province_kill_requests) + return_province_kill_requests_list = ps.filter() + return_province_kill_requests = [] if len( + return_province_kill_requests_list) == 0 else return_province_kill_requests_list + + serializer = serializer_class(return_province_kill_requests, many=True).data + + header_list2 = [ + 'ردیف', + 'کدسفارش', + 'نوع درخواست', + 'نام فارم', + 'نام مرغدار', + 'شهر مرغدار', + 'تاریخ کشتار', + 'تعداد درخواست', + 'تاریخ ثبت تخصیص', + 'نام کشتارگاه', + 'شهر کشتارگاه', + 'قیمت مرغدار', + 'قیمت کشتارگاه', + 'تعداد تخصیص', + 'وضعیت تایید', + 'وضعیت تخصیص ماشین', + 'مانده قابل تخصیص', + 'برگشت دهنده', + ] + create_header(worksheet, header_list2, 1, 12, height=21.8, width=20, border_style='thin') + excel_description(worksheet, 'A2', f'تخصیصات برگشت داده شده', + size=11, color='red', row2='B4') + if serializer: + l = 13 + m = 1 + + for item in serializer: + state = "" + if item.get('state') == "pending": + state = "در انتظار تایید" + elif item.get('state') == "accepted": + state = "تایید شده" + elif item.get('state') == "rejected": + state = "رد شده" + + request_type = "" + if item.get('market'): + request_type = "پنل معاملات" + elif item.get('direct_buying'): + request_type = "خرید مستقیم" + elif item.get('warehouse'): + request_type = "انبار" + else: + request_type = "اتحادیه" + + poultry_info = "" + if item.get('poultry_fullname') and item.get('poultry_mobile'): + poultry_info = f"{item.get('poultry_fullname')} ({item.get('poultry_mobile')})" + else: + poultry_info = item.get('poultry_fullname', '-') + returner_info = "" + if item.get('returner'): + returner_fullname = item.get('returner', {}).get('fullname', '') + returner_mobile = item.get('returner', {}).get('mobile', '') + modify_date = str(shamsi_date((convert_str_to_date(item.get('modify_date'))), in_value=True)) + returner_info = f"{returner_fullname} ({returner_mobile}) {modify_date}" + else: + returner_info = "سیستم" + + list1 = [ + m, + item.get('order_code') or "-", + request_type, + item.get('poultry_unit_name') or "-", + poultry_info, + item.get('poultry_city') or "-", + str(shamsi_date(convert_str_to_date(item.get('killing_date')), in_value=True)), + item.get('poultry_request_quantity'), + str(shamsi_date(convert_str_to_date(item.get('create_date')), in_value=True)), + item.get('killhouse_user', {}).get('name') or "-", + item.get('killhouse_user', {}).get('city') or "-", + int(float(item.get('poultry_amount') or 0)), + item.get('kill_house_price'), + item.get('quantity'), + state, + "دارد" if item.get('first_car_allocated_quantity', 0) > 0 else "ندارد", + (item.get('quantity', 0) - item.get('total_killed_quantity', 0)), + returner_info + ] + + create_value(worksheet, list1, l, 1, border_style='thin', m=m) + m += 1 + l += 1 + header_list2 = [ + "تعداد کل تخصیصات", + "تعداد تخصیصات بازگشتی کاربر", + "تعداد تخصیصات بازگشتی سیستم", + "حجم کل تخصیصات", + "حجم تخصیصات بازگشتی کاربر", + "حجم تخصیصات بازگشتی سیستم", + "وزن کل تخصیصات", + "وزن بازگشتی کاربر", + "وزن بازگشتی سیستم", + "تعداد کل بارها", + "تعداد بارهای عدم وصول", + "تعداد بارهای بازگشتی سیستمی", + "حجم کل بارها", + "حجم بارهای عدم وصول", + "حجم بارهای بازگشتی سیستمی", + "وزن کل بارها", + "وزن بارهای عدم وصول", + "وزن بارهای بازگشتی سیستمی", + "وزن خریدهای بازگشتی با کارمزد", + "کارمزد خریدهای بازگشتی" + ] + create_header(worksheet, header_list2, 3, 3, height=21.8, width=20, color='C00000', border_style='thin') + + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_type = total_wage_type.filter(en_name='province-kill-request', trash=False).first() + province_live_wage_type_amount = province_live_wage_type.amount if province_live_wage_type.status == True else 0 + + province_kill_request_filters = { + 'archive_wage': False, + 'state__in': ('pending', 'accepted'), + 'first_car_allocated_quantity': 0 + } + + kill_house_request_filters = {} + if date1: + province_kill_request_filters['kill_request__recive_date__date__gte'] = date1 + province_kill_request_filters['kill_request__recive_date__date__lte'] = date2 + kill_house_request_filters['kill_request__recive_date__date__gte'] = date1 + kill_house_request_filters['kill_request__recive_date__date__lte'] = date2 + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + province_kill_request_filters['killhouse_user'] = kill_house + return_kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + Q(non_receipt=True, main_non_receipt=True, non_receipt_state__in=('pending', 'accepted')) | Q( + trash=True, return_trash=True), + **kill_house_request_filters) + else: + return_kill_house_requests = KillHouseRequest.objects.filter( + Q(non_receipt=True, main_non_receipt=True, non_receipt_state__in=('pending', 'accepted')) | Q( + trash=True, return_trash=True), + **kill_house_request_filters) + + return_province_kill_requests = ProvinceKillRequest.objects.filter( + Q(trash=False, return_to_province=True) | Q(trash=True, return_trash=True), + **province_kill_request_filters).order_by('id') + + return_province_kill_requests_aggregates = return_province_kill_requests.aggregate( + total_count=Count('id'), + total_operator_return_count=Count('id', filter=Q(trash=False, return_to_province=True)), + total_system_return_count=Count('id', filter=Q(trash=True, return_trash=True)), + total_quantity=Sum('total_killed_quantity'), + total_operator_return_quantity=Sum('main_quantity', filter=Q(trash=False, return_to_province=True)), + total_system_return_quantity=Sum('total_killed_quantity', filter=Q(trash=True, return_trash=True)), + total_weight=Sum('total_killed_weight'), + total_operator_return_weight=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight'), + filter=Q(trash=False, return_to_province=True)), + total_system_return_weight=Sum('total_killed_weight', filter=Q(trash=True, return_trash=True)), + + ) + return_kill_house_requests_aggregates = return_kill_house_requests.aggregate( + total_count=Count('id'), + total_non_receipt_count=Count('id', filter=Q(non_receipt=True, main_non_receipt=True)), + total_system_return_count=Count('id', filter=Q(trash=True, return_trash=True)), + total_quantity=Sum('accepted_real_quantity'), + total_non_receipt_quantity=Sum('accepted_real_quantity', filter=Q(non_receipt=True, main_non_receipt=True)), + total_system_return_quantity=Sum('accepted_real_quantity', filter=Q(trash=True, return_trash=True)), + total_weight=Sum('accepted_real_weight'), + total_non_receipt_weight=Sum('accepted_real_weight', filter=Q(non_receipt=True, main_non_receipt=True)), + total_system_return_weight=Sum('accepted_real_weight', filter=Q(trash=True, return_trash=True)), + ) + province_kill_request_total_operator_return_quantity = return_province_kill_requests_aggregates[ + 'total_operator_return_quantity'] or 0 + province_kill_request_total_system_return_quantity = return_province_kill_requests_aggregates[ + 'total_system_return_quantity'] or 0 + province_kill_request_total_quantity = province_kill_request_total_operator_return_quantity + province_kill_request_total_system_return_quantity + province_kill_request_total_operator_return_weight = return_province_kill_requests_aggregates[ + 'total_operator_return_weight'] or 0 + province_kill_request_total_system_return_weight = return_province_kill_requests_aggregates[ + 'total_system_return_weight'] or 0 + province_kill_request_total_weight = province_kill_request_total_operator_return_weight + province_kill_request_total_system_return_weight + kill_house_request_total_system_return_weight = return_kill_house_requests_aggregates[ + 'total_system_return_weight'] or 0 + total_return_weight_with_wage = province_kill_request_total_system_return_weight + kill_house_request_total_system_return_weight + result = { + "province_kill_request_total_count": return_province_kill_requests_aggregates['total_count'] or 0, + "province_kill_request_total_operator_return_count": return_province_kill_requests_aggregates[ + 'total_operator_return_count'] or 0, + "province_kill_request_total_system_return_count": return_province_kill_requests_aggregates[ + 'total_system_return_count'] or 0, + "province_kill_request_total_quantity": province_kill_request_total_quantity, + "province_kill_request_total_operator_return_quantity": province_kill_request_total_operator_return_quantity, + "province_kill_request_total_system_return_quantity": province_kill_request_total_system_return_quantity, + "province_kill_request_total_weight": province_kill_request_total_weight, + "province_kill_request_total_operator_return_weight": province_kill_request_total_operator_return_weight, + "province_kill_request_total_system_return_weight": province_kill_request_total_system_return_weight, + "kill_house_request_total_count": return_kill_house_requests_aggregates['total_count'] or 0, + "kill_house_request_total_non_receipt_count": return_kill_house_requests_aggregates[ + 'total_non_receipt_count'] or 0, + "kill_house_request_total_system_return_count": return_kill_house_requests_aggregates[ + 'total_system_return_count'] or 0, + "kill_house_request_total_quantity": return_kill_house_requests_aggregates['total_quantity'] or 0, + "kill_house_request_total_non_receipt_quantity": return_kill_house_requests_aggregates[ + 'total_non_receipt_quantity'] or 0, + "kill_house_request_total_system_return_quantity": return_kill_house_requests_aggregates[ + 'total_system_return_quantity'] or 0, + "kill_house_request_total_weight": return_kill_house_requests_aggregates['total_weight'] or 0, + "kill_house_request_total_non_receipt_weight": return_kill_house_requests_aggregates[ + 'total_non_receipt_weight'] or 0, + "kill_house_request_total_system_return_weight": kill_house_request_total_system_return_weight, + "total_return_weight_with_wage": total_return_weight_with_wage, + "total_return_wage": total_return_weight_with_wage * province_live_wage_type_amount, + } + value_header_list = [ + result.get('province_kill_request_total_count') or 0, + result.get('province_kill_request_total_operator_return_count') or 0, + result.get('province_kill_request_total_system_return_count') or 0, + result.get('province_kill_request_total_quantity') or 0, + result.get('province_kill_request_total_operator_return_quantity') or 0, + result.get('province_kill_request_total_system_return_quantity') or 0, + result.get('province_kill_request_total_weight') or 0, + result.get('province_kill_request_total_operator_return_weight') or 0, + result.get('province_kill_request_total_system_return_weight') or 0, + result.get('kill_house_request_total_count') or 0, + result.get('kill_house_request_total_non_receipt_count') or 0, + result.get('kill_house_request_total_system_return_count') or 0, + result.get('kill_house_request_total_quantity') or 0, + result.get('kill_house_request_total_non_receipt_quantity') or 0, + result.get('kill_house_request_total_system_return_quantity') or 0, + result.get('kill_house_request_total_weight') or 0, + result.get('kill_house_request_total_non_receipt_weight') or 0, + result.get('kill_house_request_total_system_return_weight') or 0, + result.get('total_return_weight_with_wage') or 0, + result.get('total_return_wage') or 0, + + ] + create_value(worksheet, value_header_list, 4, 3, border_style='thin') + + summary_list = [ + 'جمع کل==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + + create_value(worksheet, summary_list, l + 1, 1, color='green') + + 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 + + +def guilds_without_allocation_excel(request): + guilds = Guilds.objects.filter(trash=False, active=True).order_by('id') + + guilds_with_allocation = StewardAllocation.objects.filter( + trash=False + ).values_list('to_steward_id', 'to_guilds_id') + + allocated_guild_ids = set() + for to_steward_id, to_guilds_id in guilds_with_allocation: + if to_steward_id: + allocated_guild_ids.add(to_steward_id) + if to_guilds_id: + allocated_guild_ids.add(to_guilds_id) + + pos_machines_with_paid_transactions = POSTransactions.objects.filter( + trash=False, + paid=True, + pos_machine__isnull=False + ).values_list('pos_machine_id', flat=True).distinct() + + guilds_with_paid_pos = POSMachine.objects.filter( + id__in=pos_machines_with_paid_transactions, + guild__isnull=False + ).values_list('guild_id', flat=True).distinct() + + guilds_to_keep = allocated_guild_ids.union(set(guilds_with_paid_pos)) + + guilds_without_allocation = guilds.exclude(id__in=guilds_to_keep) + + total_guilds_count = guilds.count() + guilds_without_allocation_count = guilds_without_allocation.count() + guilds_with_allocation_count = total_guilds_count - guilds_without_allocation_count + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment_CELL + + header_list = [ + 'تعداد کل صنف‌ها', + 'تعداد صنف‌های دارای توزیع', + 'تعداد صنف‌های بدون توزیع', + ] + create_header(worksheet, header_list, 4, 2, 21, 22) + + excel_description(worksheet, 'A1', f'گزارش صنف‌های بدون توزیع', + size=12, color='red', row2='C1') + + value_header_list = [ + total_guilds_count, + guilds_with_allocation_count, + guilds_without_allocation_count, + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + + excel_options = [ + 'ردیف', + 'نام صنف', + 'کد صنف', + 'شماره مجوز', + 'نام مالک', + 'موبایل', + 'شهر', + 'استان', + 'نوع فعالیت', + 'حوزه فعالیت', + 'مباشر', + 'وضعیت پز', + 'وضعیت فعال', + 'تاریخ ثبت', + ] + + create_header_freez(worksheet, excel_options, 1, 6, 7, 22, width=22) + + l = 7 + m = 1 + for guild in guilds_without_allocation: + steward_status = '✅' if guild.steward else '❌' + has_pos_status = '✅' if guild.has_pos else '❌' + active_status = 'فعال' if guild.active else 'غیرفعال' + + if guild.create_date: + create_date_shamsi = str(shamsi_date(guild.create_date.date(), in_value=True)) + else: + create_date_shamsi = '-' + + list1 = [ + m, + guild.guilds_name if guild.guilds_name else '-', + guild.guilds_id if guild.guilds_id else '-', + guild.license_number if guild.license_number else '-', + guild.user.fullname if guild.user else '-', + guild.user.mobile if guild.user else '-', + guild.user.city.name if guild.user.city else '-', + guild.user.province.name if guild.user.province else '-', + guild.type_activity if guild.type_activity else '-', + guild.area_activity if guild.area_activity else '-', + steward_status, + has_pos_status, + active_status, + create_date_shamsi, + ] + + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=22) + m += 1 + l += 1 + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 \ No newline at end of file diff --git a/panel/ProvinceOperator/helpers.py b/panel/ProvinceOperator/helpers.py new file mode 100644 index 0000000..7cc889d --- /dev/null +++ b/panel/ProvinceOperator/helpers.py @@ -0,0 +1,284 @@ +from django.db.models import Sum, Q +from django.http import HttpResponse + +from LiveStock.models import LiveStockAllocations, Rancher, LiveStockProduct, Cooperative, LiveStockRolseProduct, \ + CooperativeProductsShare +from panel.convert_date import convert_to_miladi +from panel.models import StewardAllocation, StewardFreeBarInformation, StewardFreeSaleBarInformation, \ + PosAllocationTransactions, PosMachineTransactions, PosSegmentation, ProductsTransactions, RolesProducts, \ + WarehouseArchive + + +def guild_steward_free_buying_product_warehousing(product): + guild_steward_free_buying_bars = StewardFreeBarInformation.objects.filter( + Q(guild=product.guild) | Q(steward=product.guild), trash=False,warehouse=True) + product.free_buying_carcasses_quantity = \ + guild_steward_free_buying_bars.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + product.free_buying_carcasses_weight = \ + guild_steward_free_buying_bars.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + product.save() + product.guild.total_out_province_buying_bars_weight = product.free_buying_carcasses_weight + product.guild.save() + + +def guild_steward_free_sale_product_warehousing(product): + guild_steward_free_sale_bars = StewardFreeSaleBarInformation.objects.filter( + Q(guild=product.guild) | Q(steward=product.guild), trash=False,warehouse=True) + + product.out_province_allocated_quantity = guild_steward_free_sale_bars.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + product.out_province_allocated_weight = guild_steward_free_sale_bars.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + out_province_governmental_allocated_weight = guild_steward_free_sale_bars.filter(quota='governmental').aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + out_province_free_allocated_weight = guild_steward_free_sale_bars.filter(quota='free').aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + product.save() + product.guild.total_selling_out_province_governmental_weight=out_province_governmental_allocated_weight + product.guild.total_selling_out_province_free_weight = out_province_free_allocated_weight + product.guild.save() + + +def guild_steward_allocations_product_warehousing(product): + guild_steward_allocations = StewardAllocation.objects.filter( + Q(guilds=product.guild) | Q(to_guilds=product.guild) | Q(steward=product.guild) | Q(to_steward=product.guild), + trash=False, calculate_status=True,warehouse=True,steward_warehouse=True) + + guild_steward_allocated = guild_steward_allocations.filter(Q(guilds=product.guild) | Q(steward=product.guild)) + guild_steward_allocated_from = guild_steward_allocations.filter( + Q(to_guilds=product.guild) | Q(to_steward=product.guild)) + + governmental_guild_steward_allocated_from = guild_steward_allocated_from.filter(quota='governmental') + free_guild_steward_allocated_from = guild_steward_allocated_from.filter(quota='free') + + product.province_allocated_quantity = \ + guild_steward_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate( + total=Sum('real_number_of_carcasses'))[ + 'total'] or 0 + product.province_allocated_weight = \ + guild_steward_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + in_province_governmental_allocated_weight = \ + guild_steward_allocated.filter(receiver_state__in=('pending', 'accepted'),quota='governmental').aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + in_province_free_allocated_weight = \ + guild_steward_allocated.filter(receiver_state__in=('pending', 'accepted'),quota='free').aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + product.receive_governmental_carcasses_quantity = \ + governmental_guild_steward_allocated_from.filter(receiver_state='accepted').aggregate( + total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] or 0 + product.receive_governmental_carcasses_weight = \ + governmental_guild_steward_allocated_from.filter(receiver_state='accepted').aggregate( + total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] or 0 + product.receive_free_carcasses_quantity = \ + free_guild_steward_allocated_from.filter(receiver_state='accepted').aggregate( + total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] or 0 + product.receive_free_carcasses_weight = \ + free_guild_steward_allocated_from.filter(receiver_state='accepted').aggregate( + total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] or 0 + + product.save() + product.guild.total_in_province_governmental_bars_weight = product.receive_governmental_carcasses_weight + product.guild.total_in_province_free_bars_weight = product.receive_free_carcasses_weight + product.guild.total_selling_in_province_governmental_weight = in_province_governmental_allocated_weight + product.guild.total_selling_in_province_free_weight = in_province_free_allocated_weight + product.guild.save() + + +def allocation_calculate_price(allocation): + transactions = PosAllocationTransactions.objects.filter(allocation=allocation, trash=False, paid=True) + allocation.total_amount_paid = transactions.aggregate(total=Sum('price'))['total'] or 0 + allocation.save() + + +def pos_allocation_weight_for_product(product): + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False,warehouse=True) + product.pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0 + product.save() + pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0 + pos_governmental_allocated_weight = transactions.filter(price_approved=True).aggregate(total=Sum('cur_weight'))['total'] or 0 + pos_free_allocated_weight = transactions.filter(price_approved=False).aggregate(total=Sum('cur_weight'))['total'] or 0 + if product.kill_house: + product.kill_house.pos_allocated_weight=int(pos_allocated_weight/1000) + product.kill_house.pos_governmental_allocated_weight=int(pos_governmental_allocated_weight/1000) + product.kill_house.pos_free_allocated_weight=int(pos_free_allocated_weight/1000) + product.kill_house.save() + else: + product.guild.pos_allocated_weight=int(pos_allocated_weight/1000) + product.guild.pos_governmental_allocated_weight=int(pos_governmental_allocated_weight/1000) + product.guild.pos_free_allocated_weight=int(pos_free_allocated_weight/1000) + product.guild.save() + + + +def guild_steward_product_segmentation(product): + if product.kill_house: + segmentations = PosSegmentation.objects.filter(kill_house=product.kill_house, trash=False,warehouse=True) + else: + + segmentations = PosSegmentation.objects.filter(guild=product.guild, trash=False,warehouse=True) + product.segmentation_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + product.save() + if product.kill_house: + product.kill_house.total_segmentation_governmental_weight = segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + product.kill_house.total_segmentation_free_weight = segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + product.kill_house.save() + else: + product.guild.total_segmentation_governmental_weight = segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + product.guild.total_segmentation_free_weight = segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + product.guild.save() + + + +def guild_steward_archive_warehousing(guild): + product = RolesProducts.objects.filter(guild=guild, trash=False, name='مرغ گرم').first() + + archives = WarehouseArchive.objects.filter(Q(steward=guild)|Q(guild=guild),trash=False,warehouse=True) + + archives_info = archives.aggregate( + archives_weight=Sum('weight'), + archives_governmental_weight=Sum('weight', + filter=Q(quota='governmental')), + archives_free_weight=Sum('weight', + filter=Q(quota='free')), + + ) + archives_weight = archives_info['archives_weight'] or 0 + archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 + archives_free_weight = archives_info['archives_free_weight'] or 0 + product.ware_house_archive_weight = archives_weight + product.save() + guild.ware_house_archive_governmental_weight = archives_governmental_weight + guild.ware_house_archive_free_weight = archives_free_weight + guild.save() + + + +def cooperative_warehousing(product): + transactions = ProductsTransactions.objects.filter(live_stack_products=product, transaction__paid=True, trash=False) + output_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0 + product.total_allocated_weight = output_weight + product.save() + + +def rancher_warehousing(transaction): + # todo:دامدار با کد ملی چند تا بر گپمیرگرده باید بر اساس شناسه گله بشه + rancher = Rancher.objects.filter(national_id=transaction.natcode).order_by('herd_code').first() + if rancher: + transactions = ProductsTransactions.objects.filter(transaction=transaction, transaction__paid=True, trash=False) + output_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0 + rancher.total_weight = output_weight + rancher.save() + + +def update_role_product(request): + products=LiveStockProduct.objects.filter(trash=False).exclude(name__in=('جو','سویا','ذرت','سبوس')) + cooperative=Cooperative.objects.filter(trash=False) + for c in cooperative: + for p in products: + live=LiveStockRolseProduct( + parent_product=p, + cooperative=c, + ) + live.save() + return HttpResponse('ok') + + +def update_cooperative_share(request): + products=LiveStockProduct.objects.filter(trash=False).exclude(name__in=('جو','سویا','ذرت','سبوس')) + cooperative=Cooperative.objects.filter(trash=False) + for c in cooperative: + for p in products: + live=CooperativeProductsShare( + product=p, + cooperative=c, + ) + live.save() + return HttpResponse('ok') + + +def calculate_bad_transactions(): + transactions = PosMachineTransactions.objects.filter(trash=False, paid=False, live_stock=True, result='تراکنش موفق', + state=0) + for transaction in transactions: + product_transaction = ProductsTransactions.objects.filter(transaction=transaction, + trash=False, + live_stack_products__isnull=False).first() + if product_transaction: + cooperative_warehousing(product_transaction.live_stack_products) + rancher_warehousing(transaction) + transaction.paid = True + transaction.save() + + + + +def _normalize_fa_ar(text): + """نرمالایز کردن متن فارسی/عربی""" + if not text: + return text + mapping = { + 'ك': 'ک', + 'ي': 'ی', + 'ى': 'ی', + '\u0649': 'ی', + '\u06CC': 'ی', + '\u064A': 'ی', + 'ۀ': 'ه', + 'ة': 'ه', + 'ؤ': 'و', + 'أ': 'ا', + 'إ': 'ا', + 'ٱ': 'ا', + '\u200c': ' ', + } + out = str(text) + for src, dst in mapping.items(): + out = out.replace(src, dst) + return out.strip() + +def parse_yes_no(val): + """تبدیل مقدار به boolean""" + if isinstance(val, bool): + return val + if isinstance(val, str): + return False if val == 'خیر' else True + return bool(val) + +def persian_date_to_datetime(persian_date_str): + """تبدیل تاریخ فارسی به datetime""" + if not persian_date_str: + return None + try: + persian_numbers = '۰۱۲۳۴۵۶۷۸۹' + english_numbers = '0123456789' + translation_table = str.maketrans(persian_numbers, english_numbers) + english_date = persian_date_str.translate(translation_table) + parts = english_date.split('/') + if len(parts) != 3: + return None + year = int(parts[0]) + month = int(parts[1]) + day = int(parts[2]) + return convert_to_miladi(year=year, month=month, day=day) + except: + return None \ No newline at end of file diff --git a/panel/ProvinceOperator/serializers.py b/panel/ProvinceOperator/serializers.py new file mode 100644 index 0000000..0e29d08 --- /dev/null +++ b/panel/ProvinceOperator/serializers.py @@ -0,0 +1,6380 @@ +from datetime import datetime +import json + +from django.db.models import Q, Sum, F, Case, When, FloatField, Count +from jdatetime import timedelta +from rest_framework import serializers +import django_filters +from rest_framework_recursive.fields import RecursiveField + +from LiveStock.Cooperative.serializers import CooperativeForSharesSerializer +from LiveStock.models import LiveStockRolseProduct, Cooperative, CooperativeProductsShare +from authentication.models import SystemUserProfile, ExternalTransaction +from authentication.serializer.serializer import SystemUserProfileSerializer, BankCardSerializer, \ + SystemUserProfileForAutoAllocationSerializer, SystemUserProfileForGuildSerializer, \ + SystemUserProfileForInspectionSerializer, SystemUserProfileForFactorSerializer, \ + SystemUserProfileForPoultryLocSerializer, SystemUserProfileForPoultryScienceSerializer, \ + SystemUserProfileForPoultryScienceWithoutRoleSerializer +from authentication.serializers import UserProfileSerializer, SystemAddressSerializer +from deposit_id import wage_counting_type, out_selling_ignore, new_out_selling_count_wage, \ + new_out_selling_count_wage_date, before_out_buying_count_wage_amount +from deposit_percent import wage_percent, carcases_sell +from general_urls import base_url_for_sms_report +from panel.CityOperator.serializers import CityOperatorForSubSectorTransactionsSerializer +from panel.KillHouse.helpers import get_finance_info, get_difference_carcasses_weight, get_new_wage_for_free_buying +from panel.KillHouse.serializers import VetSerializer, ProvinceKillRequestSerializer, \ + KillHouseAssignmentInformationSerializer, KillHouseSerializer, KillHouseDailyQuotaSerializer, \ + ProvinceKillRequestForAutoAllocationSerializer, KillHouseWareHouseSerializer, KillHouseForProvinceSerializer, \ + KillHouseRequestForColdHouseAllocationsSerializer, KillHouseFreeBarInformationSerializer, \ + KillHouseForKillHouseVetKillHouseSerializer, KillHouseForKillingInformationDiscrepancyReportSerializer, \ + KillHouseForAutoAllocationSerializer, KillHouseForKillHouseGuildRelationSerializer, \ + KillHouseForKillHouseStewardRelationSerializer, KillHouseOperatorForAutoAllocationsSerializer, \ + PosKillHouseForKillingInformationDiscrepancyReportSerializer, KillHouseForCommonlyUsedSerializer, \ + KillHouseForReturnBuyingSerializer +from panel.ProvinceOperator.services.pos_transfer_service import POSTransferService +from panel.models import ( + Pricing, + ProvinceCheckOperatorRequest, + ProvinceCheckInformation, + ProvinceFactorToKillHouse, + KillHouseFactorToProvince, + ProvinceCheckKillHouseFactor, + DepositAllocation, + PovinceInspector, + PriceAnalysis, + WareHouseFactor, + ProvinceOperator, ProvinceRequestAction, ProvincePercentLeftOver, InspectorOperator, ShareOfAllocation, + PaymentDeadLine, MonthlyProfitPercentage, ProvinceFactorToKillHouseForPoultry, KillHouseFactorToPoultry, + Wallet, Itransaction, Debt, Deposit, Penalty, FinancialDocument, FinancialTransaction, Admin, + ProvinceImportKillHouseOutFactors, VetSupervisor, Jahad, ProvincialGovernment, VetCheckAllocations, HourLimit, + SmsLicense, PoultryRequest, PoultryAllowCityProvince, ProvinceAllowKillHouseRegisterCar, + ProvinceAllowPoultryChooseKillHouse, ProvinceAllowPoultryChooseKillHouseTotal, ProvinceAllowPoultrySellFree, + ProvinceAllowPoultrySellFreeTotal, ProvinceCheckOperatorOutRequest, + ProvinceAutoAllocation, KillHouseAssignmentInformation, AutoAcceptProvinceKillRequest, + AutoMakeKillHouseRequest, CityJahad, Guilds, Steward, KillHousePercentageOfLosses, StewardAllocation, + ProvinceAllowKillHouseChooseStewardGuilds, StewardWareHouse, GuildsWareHouse, Commerce, CityCommerce, + HatchingLossesPermission, KillHouse, WagePayment, ProvinceAllowKillHouseDirectBuyingTotal, + ProvinceAllowKillHouseDirectBuying, ProvinceAllowKillHouseRegisterGuilds, ProvinceAllowKillHouseRegisterGuildsTotal, + CityVet, KillHouseHourLimit, AutomaticStewardAllocation, FreeSaleWithinprovince, Observatory, ProvinceSupervisor, + Car, Product, PosVersion, PosItem, GuildRoom, PosCompany, POSId, POSMachine, AdditionalProducts, POSTransactions, + StewardFreeBarInformation, TypeActivity, AreaActivity, EvacuationPermit, SellForFreezing, LiveStockSupport, + ColdHouse, ColdHouseAllocations, OperationLimitation, ApprovedPrice, Announcements, ChickenAgeRange, TimeRange, + CitySupervisor, JahadInspector, SystemWallet, SuperAdmin, PaymentGatewayPercentage, WageType, PercentageOfWageType, + ShareType, TotalWageInformation, ProvinceKillRequest, SlaughterHouseTransaction, ChainCompanyTransaction, + ChainAllocation, KillHouseFreeBarInformation, KillHouseRequest, ChainCompany, InternalTransaction, + TotalPaymentGatewayPercentage, StewardFreeSaleBarInformation, CityLivestock, ImprovingLivestock, Reports, + ReportsUsers, UserReports, ReportSubmissionTime, MovingText, MovingTextDashboardStatus, MovingTextRole, + MovingTextWithRole, NewProduct, AdminX, Supporter, ZarinPalAccounts, PoultryExport, PoultryOutProvinceRequest, + Dispenser, VetFarmAggregatePermission, KillHouseBarLimitation, CityPoultry, KillHouseStewardGuildRelation, + OutOfProvinceSellingCarcassesPermission, OutProvinceCarcassesBuyer, KillHouseFreeSaleBarInformation, + ProductPricingType, KillHousePricePermission, BaseOutProvinceCarcassesBuyer, RolesProducts, + AutomaticDirectBuyingPermission, PosMachineTransactions, BroadcastPrice, OutProvinceSaleLimitation, + PosAllocationTransactions, ParentCompany, POSDeviceSession, PosDeviceVersion, SubSectorTransactions, + SubSectorPercentageOfWageType, PosSegmentation, Vet, CityGuild, DistributionUserLevel, BarDifferenceRequest, + OtherProducts, ProductsTransactions, PriceConfirmation, CompanyBeneficiaryAccount, ProteinGuild, CommonlyUsed, + PercentageDropLimitation, UploadImageLimitation, ApkInfo, DirectBuyingVerification, FinePermission, + ShowMarketRequest, IndexWeightCategory, PoultryScience, PoultryScienceReport, AllowRegisterCodeForGuilds, + GuildsGeneralConfigs, StewardAppLogin, StewardRequest, RestrictionCarcassDistribution, + AllowRegisterCodeForKillHouseFreeSaleBarInformation, AllowRegisterCodeForStewardFreeSaleBarInformation, + LimitationForDirectPurchaseAndBarInformation, WarehouseArchive, SmsRecipient, MarketDailyLimitation, + HatchingArchivePercent, Representative, POSAccessLevel, DispenserInformation +) +from panel.poultry.helpers import market_daily_limitation_info +from panel.poultry.serializers import PoultryRequestSerializer, PoultrySerializer, \ + PoultryRequestForAutoAllocationSerializer, ChainAllocationSerializer, ChainCompanySerializer, \ + PoultryForPoultryRequestLetterSerializer, OutProvincePoultryRequestBuyerSerializer, \ + PoultryRequestForOutRequestTransactionsSerializer, PoultryDetailForPoultryScienceSerializer, \ + PoultryHatchingForPredictionSerializer, PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer + + +# سریالایزر مربوط به اپراتور شهرستان +class ProvinceOperatorSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = ProvinceOperator + exclude = ( + 'id', + 'create_date', + 'modify_date', + # 'trash', + 'created_by', + 'modified_by', + ) + + +class ProvinceOperatorForAllUserSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = ProvinceOperator + fields = ['address', 'user_bank_info', 'identity_documents', 'phone'] + + +class AdminForAllUserSerializer(serializers.ModelSerializer): + class Meta: + model = Admin + fields = ['address', 'identity_documents', 'active'] + + +# سریالایزر مربوط به اپراتور شهرستان +class AdminSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + + class Meta: + model = Admin + exclude = ( + 'id', + 'create_date', + 'modify_date', + # 'trash', + 'created_by', + 'modified_by', + ) + + +class ProvinceCheckOperatorOutRequestSerializer(serializers.ModelSerializer): + poultry_request = PoultryRequestSerializer(read_only=True) + + class Meta: + model = ProvinceCheckOperatorOutRequest + fields = '__all__' + + +# سریالایزر مربوط به تایید یا رد درخواست تایید شده شهرستان +class ProvinceCheckOperatorRequestSerializer(serializers.ModelSerializer): + poultry_request = PoultryRequestSerializer(read_only=True) + + class Meta: + model = ProvinceCheckOperatorRequest + fields = '__all__' + + +class AdditionalProductsSerializer(serializers.ModelSerializer): + class Meta: + model = AdditionalProducts + exclude = ( + 'create_date', + 'modify_date', + 'created_by', + 'modified_by', + ) + + +class ProductSerializer(serializers.ModelSerializer): + product_price = serializers.SerializerMethodField('get_product_price') + product_weight = serializers.SerializerMethodField('get_product_weight') + product_sale_weight = serializers.SerializerMethodField('get_product_sale_weight') + product_remain_weight = serializers.SerializerMethodField('get_product_remain_weight') + product_extra_sale_weight = serializers.SerializerMethodField('get_product_extra_sale_weight') + parent_key = serializers.SerializerMethodField('get_parent_product') + + class Meta: + model = Product + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'trash', + 'guild', + 'steward', + 'kill_house', + 'created_by', + 'modified_by', + ) + # fields = '__all__' + + def get_product_price(self, obj): + try: + price_type = ProductPricingType.objects.filter(trash=False).first() + if price_type and price_type.province == False and obj.name == 'مرغ گرم': + if obj.kill_house is not None: + price = obj.kill_house.kill_house_operator.user.city.product_price / 1000 if obj.kill_house.kill_house_operator.user.city.product_price > 0 else 0 + elif obj.guild is not None: + price = obj.guild.user.city.product_price / 1000 if obj.guild.user.city.product_price > 0 else 0 + + else: + price = obj.steward.guild.user.city.product_price / 1000 if obj.steward.guild.user.city.product_price > 0 else 0 + + + else: + price = obj.price / 1000 if obj.price > 0 else 0 + except: + + price = obj.price / 1000 if obj.price > 0 else 0 + return price + + def get_product_weight(self, obj): + weight = obj.weight * 1000 if obj.weight > 0 else 0 + return weight + + def get_product_sale_weight(self, obj): + sale_weight = obj.sale_weight * 1000 if obj.sale_weight > 0 else 0 + return sale_weight + + def get_product_remain_weight(self, obj): + remain_weight = obj.remain_weight * 1000 if obj.remain_weight > 0 else 0 + return remain_weight + + def get_product_extra_sale_weight(self, obj): + extra_sale_weight = obj.extra_sale_weight * 1000 if obj.extra_sale_weight > 0 else 0 + return extra_sale_weight + + def get_parent_product(self, obj): + parent = AdditionalProducts.objects.filter(name=obj.name, trash=False) + parent_key = parent.first().key if parent else None + return parent_key + + +class ProvinceRequestActionSerializer(serializers.ModelSerializer): + class Meta: + model = ProvinceRequestAction + fields = '__all__' + + +class SmsLicenseSerializer(serializers.ModelSerializer): + class Meta: + model = SmsLicense + fields = '__all__' + + +# سریالایزر مربوط به تایید یا رد اطلاعات بار وارد شده کشتارگاه +class ProvinceCheckInformationSerializer(serializers.ModelSerializer): + kill_house_assignment = KillHouseAssignmentInformationSerializer(read_only=True) + + class Meta: + model = ProvinceCheckInformation + fields = '__all__' + + +# سریالایزر مربوط به قیمت گذاری +class ProvincePercentLeftOverSerializer(serializers.ModelSerializer): + class Meta: + model = ProvincePercentLeftOver + fields = '__all__' + + +# سریالایزر مربوط به قیمت گذاری +class PricingSerializer(serializers.ModelSerializer): + operator = SystemUserProfileSerializer(read_only=True) + + class Meta: + model = Pricing + fields = '__all__' + + +class ProvinceFactorToKillHouseForPoultrySerializer(serializers.ModelSerializer): + province_check_info = ProvinceCheckInformationSerializer(read_only=True) + bank = BankCardSerializer(read_only=True) + + class Meta: + model = ProvinceFactorToKillHouseForPoultry + fields = '__all__' + + +class ProvinceFactorToKillHousePdfSerializer(serializers.ModelSerializer): + class Meta: + model = ProvinceFactorToKillHouse + fields = '__all__' + + +# سریالایزر مربوط به فاکتور استان برای کشتارگاه +class ProvinceFactorToKillHouseSerializer(serializers.ModelSerializer): + province_check_info = ProvinceCheckInformationSerializer(read_only=True) + # province_check_req = ProvinceCheckOperatorRequestSerializer(read_only=True) + bank = BankCardSerializer(read_only=True) + kill_house_factor_to_province = serializers.SerializerMethodField('get_kill_house_factor') + province_factor_to_kill_house = serializers.SerializerMethodField('get_province_factor') + poultry_request = serializers.SerializerMethodField('get_poultry_request') + + class Meta: + model = ProvinceFactorToKillHouse + fields = '__all__' + + def get_poultry_request(self, instance): + poultry_request_dict = None + poultry_request = PoultryRequest.objects.filter( + key=instance.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.province_request.poultry_request.key) + if poultry_request.count() > 0: + poultry_request = poultry_request.last() + + poultry_request_dict = { + "poultry_request_id": poultry_request.id, + "poultry_name": poultry_request.poultry.unit_name, + "send_date": poultry_request.send_date, + "chicken_breed": poultry_request.chicken_breed, + "poultry_user_name": poultry_request.poultry.user.fullname, + "poultry_user_mobile": poultry_request.poultry.user.mobile, + + } + return poultry_request_dict + + def get_kill_house_factor(self, instance): + + factors = KillHouseFactorToProvince.objects.filter(province_factor=instance) + + factor_dict = None + if factors.count() > 0: + factors = factors.last() + factor_dict = { + "factor_key": factors.key, + "payment_code": factors.payment_code, + "factor_state": factors.state, + + } + return factor_dict + + def get_province_factor(self, instance): + factor_dict = None + + user = SystemUserProfile.objects.filter(role__name='ProvinceFinancial', + province=instance.province_check_info.kill_house_assignment.kill_house_request.killhouse_user.system_address.province) + if user.count() > 0: + user = user.last() + province_operator = ProvinceOperator.objects.filter(user=user) + if province_operator.count() > 0: + province_operator = province_operator.last() + if province_operator.user_bank_info != None: + factor_dict = { + "card": province_operator.user_bank_info.card, + "shaba": province_operator.user_bank_info.shaba, + "name_of_bank_user": province_operator.user_bank_info.name_of_bank_user, + "bank_name": province_operator.user_bank_info.bank_name, + + } + assingment = KillHouseAssignmentInformation.objects.get( + key=instance.province_check_info.kill_house_assignment.key) + if assingment.kill_house_request.kill_request.slaughter_house != None: + + kill_place = assingment.kill_house_request.kill_request.slaughter_house.name + else: + kill_place = assingment.kill_house_request.kill_request.kill_house.name + factor_dict.update(({ + "factor_create_date": instance.create_date, + "total_factor_amount": instance.total_price, + "real_amount_factor": instance.total_weight * instance.factor_fee, + "poultry_share": instance.shares['poultry_share'], + "province_share": instance.shares['province_share'], + "kill_place": kill_place, + "real_quantity": assingment.real_quantity, + "bar_quantity": assingment.kill_house_request.quantity, + "net_weight": assingment.net_weight, + })) + + return factor_dict + + +class ProvinceImportKillHouseOutFactorsSerializer(serializers.ModelSerializer): + kill_house_factor = ProvinceFactorToKillHouseSerializer(read_only=True) + kill_house_factor_poultry = ProvinceFactorToKillHouseForPoultrySerializer(read_only=True) + province_check = ProvinceCheckOperatorRequestSerializer(read_only=True) + + class Meta: + model = ProvinceImportKillHouseOutFactors + fields = '__all__' + + +class KillHouseFactorToPoultrySerializer(serializers.ModelSerializer): + province_factor = ProvinceFactorToKillHouseForPoultrySerializer(read_only=True) + + class Meta: + model = KillHouseFactorToPoultry + fields = '__all__' + + +# سریالایزر مربوط به فاکتور کشتارگاه برای استان +class KillHouseFactorToProvinceSerializer(serializers.ModelSerializer): + province_factor = ProvinceFactorToKillHouseSerializer(read_only=True) + + class Meta: + model = KillHouseFactorToProvince + fields = '__all__' + + +# سریالایزر مربوط به بررسی فاکتور کشتارگاه توسط استان +class ProvinceCheckKillHouseFactorSerializer(serializers.ModelSerializer): + kill_house_factor = KillHouseFactorToProvinceSerializer(read_only=True) + + class Meta: + model = ProvinceCheckKillHouseFactor + fields = '__all__' + + +# سریالایزر مربوط به تخصیصات مالی +class DepositAllocationSerializer(serializers.ModelSerializer): + poultry = PoultryRequestSerializer(read_only=True) + + class Meta: + model = DepositAllocation + fields = '__all__' + + +# سریالایزر مربوط به بازرس استان +class InspectorOperatorSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = InspectorOperator + fields = '__all__' + + +class InspectorOperatorForAllUserSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = InspectorOperator + fields = ['address', 'identity_documents', 'active'] + + +# سریالایزر مربوط به بازرس استان +class PovinceInspectorSerializer(serializers.ModelSerializer): + class Meta: + model = PovinceInspector + fields = '__all__' + + +class VetSupervisorSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + vet = VetSerializer(read_only=True) + + class Meta: + model = VetSupervisor + fields = '__all__' + + +class CityVetSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = CityVet + fields = '__all__' + + +class CommerceSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Commerce + fields = '__all__' + + +class CityCommerceSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = CityCommerce + fields = '__all__' + + +class ProvinceSupervisorSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = ProvinceSupervisor + fields = '__all__' + + +class CitySupervisorSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = CitySupervisor + fields = '__all__' + + +class SuperAdminSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = SuperAdmin + fields = '__all__' + + +class JahadInspectorSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = JahadInspector + fields = '__all__' + + +class VetSupervisorForAllUserSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + vet = VetSerializer(read_only=True) + + class Meta: + model = VetSupervisor + fields = ['address', 'vet'] + + +class VetCheckAllocationsSerializer(serializers.ModelSerializer): + vet = VetSerializer(read_only=True) + province_kill_request = ProvinceKillRequestSerializer(read_only=True) + + class Meta: + model = VetCheckAllocations + fields = '__all__' + + +# سریالایزر مربوط به آنالیز قیمت +class PriceAnalysisorSerializer(serializers.ModelSerializer): + class Meta: + model = PriceAnalysis + fields = '__all__' + + +class ShareOfAllocationSerializer(serializers.ModelSerializer): + class Meta: + model = ShareOfAllocation + fields = '__all__' + + +class PaymentDeadLineSerializer(serializers.ModelSerializer): + class Meta: + model = PaymentDeadLine + fields = '__all__' + + +class MonthlyProfitPercentageSerializer(serializers.ModelSerializer): + class Meta: + model = MonthlyProfitPercentage + fields = '__all__' + + +# سریالایزر مربوط به ثبت در خواست مرغ منجمد +class WareHouseFactorSerializer(serializers.ModelSerializer): + first_operator = UserProfileSerializer(read_only=True) + second_operator = UserProfileSerializer(read_only=True) + + class Meta: + model = WareHouseFactor + fields = '__all__' + # extra_kwargs = ['customer', 'national_code', 'date', 'mobile', 'product_type', 'weight', 'fee', 'wage','considerations','' ] + extra_kwargs = {"considerations": {"required": False, "allow_null": True}, + "Complications": {"required": False, "allow_null": True}, + "tax": {"required": False, "allow_null": True}, + "discount": {"required": False, "allow_null": True}, + "name_of_bank_user": {"required": False, "allow_null": True}, + "card": {"required": False, "allow_null": True}, + "shaba": {"required": False, "allow_null": True}, + "account": {"required": False, "allow_null": True} + } + + +class walletSerializer(serializers.ModelSerializer): + class Meta: + model = Wallet + fields = '__all__' + + +class ItransactionSerializer(serializers.ModelSerializer): + wallet = walletSerializer(read_only=True) + + class Meta: + model = Itransaction + fields = '__all__' + + +class DebtSerializer(serializers.ModelSerializer): + class Meta: + model = Debt + fields = '__all__' + + +class PenaltySerializer(serializers.ModelSerializer): + class Meta: + model = Penalty + fields = '__all__' + + +class DepositSerializer(serializers.ModelSerializer): + class Meta: + model = Deposit + fields = '__all__' + + +# class IwalletSerializer(serializers.ModelSerializer): +# class Meta: +# model = Iwallet +# fields = '__all__' + + +class FinancialDocumentSerializer(serializers.ModelSerializer): + class Meta: + model = FinancialDocument + fields = '__all__' + + +# class ItransactionFilter(django_filters.FilterSet): +# class Meta: +# model = Itransaction +# fields = ['wallet',] + +class FinancialTransactionSerializer(serializers.ModelSerializer): + itransaction = ItransactionSerializer(read_only=True) + + class Meta: + model = FinancialTransaction + fields = '__all__' + + +class CarSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = Car + fields = '__all__' + + +class JahadForAllUserSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = Jahad + fields = ['address', 'user_bank_info', 'identity_documents', 'active'] + + +class CityJahadForAllUserSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = CityJahad + fields = ['address', 'user_bank_info', 'identity_documents', 'active'] + + +class CityPoultrySerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = CityPoultry + fields = '__all__' + + +# سریالازر مربوط به جهاد +class JahadSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = Jahad + fields = '__all__' + + +class PosCompanySerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + + class Meta: + model = PosCompany + fields = '__all__' + + +# سریالازر مربوط به استانداری +class ProvincialGovernmentSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = ProvincialGovernment + fields = '__all__' + + +class ProvincialGovernmentForAllUserSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = ProvincialGovernment + fields = ['address', 'user_bank_info', 'identity_documents', 'active'] + + +class HourLimitSerializer(serializers.ModelSerializer): + class Meta: + model = HourLimit + fields = '__all__' + + +class KillHouseHourLimitSerializer(serializers.ModelSerializer): + class Meta: + model = KillHouseHourLimit + fields = '__all__' + + +class PoultryAllowCityProvinceSerializer(serializers.ModelSerializer): + poultry = PoultrySerializer(read_only=True) + + class Meta: + model = PoultryAllowCityProvince + fields = '__all__' + + +class ProvinceAllowKillHouseRegisterCarSerializer(serializers.ModelSerializer): + kill_house = KillHouseSerializer(read_only=True) + + class Meta: + model = ProvinceAllowKillHouseRegisterCar + fields = '__all__' + + +class ProvinceAllowPoultryChooseKillHouseSerializer(serializers.ModelSerializer): + Poultry = PoultrySerializer(read_only=True) + + class Meta: + model = ProvinceAllowPoultryChooseKillHouse + fields = '__all__' + + +class ProvinceAllowPoultryChooseKillHouseTotalSerializer(serializers.ModelSerializer): + class Meta: + model = ProvinceAllowPoultryChooseKillHouseTotal + fields = '__all__' + + +class ProvinceAllowPoultrySellFreeSerializer(serializers.ModelSerializer): + Poultry = PoultrySerializer(read_only=True) + + class Meta: + model = ProvinceAllowPoultrySellFree + fields = '__all__' + + +class ProvinceAllowPoultrySellFreeTotalSerializer(serializers.ModelSerializer): + class Meta: + model = ProvinceAllowPoultrySellFreeTotal + fields = '__all__' + + +class FreeSaleWithinprovinceSerializer(serializers.ModelSerializer): + class Meta: + model = FreeSaleWithinprovince + fields = ['key', 'allow', 'weight', 'percent', 'type'] + + +class ProvinceAutoAllocationSerializer(serializers.ModelSerializer): + poultry_request = PoultryRequestSerializer(read_only=True) + daily_quota = KillHouseDailyQuotaSerializer(read_only=True) + province_kill_request = ProvinceKillRequestSerializer(read_only=True) + + class Meta: + model = ProvinceAutoAllocation + fields = '__all__' + + +class StewardForGuildsSerializer(serializers.ModelSerializer): + class Meta: + model = Steward + fields = ['key'] + + +class GeneralGuildsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'user'] + + +class GeneralGuildsForInspectionsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'user', 'type_activity', 'area_activity'] + + +class GuildsForKillHousePercentageSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['user', 'guilds_name', 'allocation_limit', 'address'] + + +class GuildsForStewardAutoAllocationSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['user', 'guilds_name', 'steward', 'allocation_limit', 'address', 'license_number', + 'type_activity', 'area_activity', 'guilds_id', 'create_date'] + + +class TotalGuildsForPosSerializer(serializers.ModelSerializer): + class Meta: + model = Guilds + fields = ['key'] + + +class GuildInfoForPosSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + products = serializers.SerializerMethodField('get_products') + + class Meta: + model = Guilds + fields = ['user', 'phone', 'key', 'guilds_id', 'license_number', 'guilds_name', 'type_activity', + 'area_activity', + 'products', 'address', 'condition', 'description_condition'] + + def get_products(self, obj): + # pos = Product.objects.filter(guild=obj,trash=False) + products = Product.objects.filter( + Q(general=False, guild=obj) | Q(general=True, guild__isnull=True), + trash=False) + serializer = ProductSerializer(products, many=True) + return serializer.data + + +class POSDeviceSessionForCompaniesSerializer(serializers.ModelSerializer): + class Meta: + model = POSDeviceSession + fields = ['key', 'name', 'serial', 'password', 'session_create_date', 'session_last_seen_date'] + + +class POSMachineForGuildsSerializer(serializers.ModelSerializer): + pos_company = serializers.SerializerMethodField('get_pos_company') + pos_sessions = serializers.SerializerMethodField('get_pos_sessions') + pos_status = serializers.SerializerMethodField('get_pos_status_method') + + class Meta: + model = POSMachine + fields = ['pos_id', 'key', 'receiver_number', 'receiver_number', 'terminal_number', 'pos_company', 'Lat', + 'active', 'Long', 'pos_sessions', 'pos_status', 'serial', 'password'] + + def get_pos_company(self, obj): + pos_company = PosCompany.objects.get(key=obj.pos_company.key, trash=False) + return pos_company.name + + def get_pos_sessions(self, obj): + pos_sessions = POSDeviceSession.objects.filter(pos=obj, trash=False) + serializer = POSDeviceSessionForCompaniesSerializer(pos_sessions, many=True) + return serializer.data + + def get_pos_status_method(self, obj): + if not self.get_pos_sessions(obj): + return False + now = datetime.now().date() - timedelta(days=4) + pos_sessions = POSDeviceSession.objects.filter(pos=obj, trash=False) + active_sessions = pos_sessions.filter(session_last_seen_date__gt=now) + active_count = active_sessions.count() + return active_count > 0 + + +class GuildsForInspectionSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + guild_pos = serializers.SerializerMethodField('get_guild_pos') + number_of_pos = serializers.SerializerMethodField('get_number_of_pos') + ware_house_info = serializers.SerializerMethodField('get_ware_house_quantity') + + class Meta: + model = Guilds + fields = ['user', 'key', 'guilds_id', 'license_number', 'guilds_name', 'type_activity', 'area_activity', + 'guild_pos', 'number_of_pos', 'ware_house_info'] + + def get_guild_pos(self, obj): + pos = POSMachine.objects.filter(guild=obj, trash=False) + serializer = POSMachineForGuildsSerializer(pos, many=True) + return serializer.data + + def get_number_of_pos(self, obj): + pos = POSMachine.objects.filter(guild=obj, trash=False) + return len(pos) + + def get_ware_house_quantity(self, obj): + try: + ware_house = GuildsWareHouse.objects.get(guilds=obj, trash=False) + return { + "quantity": ware_house.remain_total_number_of_carcasses, + "weight": ware_house.remain_total_weight_of_carcasses + } + except: + return { + "quantity": 0, + "weight": 0 + } + + +class GuildsForCompaniesSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + guild_pos = serializers.SerializerMethodField('get_guild_pos') + number_of_pos = serializers.SerializerMethodField('get_number_of_pos') + + class Meta: + model = Guilds + fields = ['user', 'key', 'guilds_id', 'license_number', 'guilds_name', 'type_activity', 'area_activity', + 'guild_pos', 'number_of_pos', 'condition', 'description_condition', 'province_accept_state'] + + def get_guild_pos(self, obj): + pos = POSMachine.objects.filter(guild=obj, pos_company__name=self.context.get('company'), trash=False) + serializer = POSMachineForGuildsSerializer(pos, many=True) + return serializer.data + + def get_number_of_pos(self, obj): + pos = POSMachine.objects.filter(guild=obj, trash=False) + return len(pos) + + +class TypeActivitySerializer(serializers.ModelSerializer): + class Meta: + model = TypeActivity + fields = ['key', 'title'] + + +class AreaActivitySerializer(serializers.ModelSerializer): + class Meta: + model = AreaActivity + fields = ['key', 'title'] + + +class GuildsForDispenserAllocationsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + allocation_limit = serializers.SerializerMethodField('get_allocation_limit') + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'user', 'license_number', 'type_activity', 'area_activity', 'guilds_id', + 'allocation_limit'] + + def get_allocation_limit(self, obj): + guild = self.context.get('guild') + if guild: + relation = KillHouseStewardGuildRelation.objects.filter(guild=guild, steward=guild).first() + if relation: + return { + "allocation_limit": relation.allocation_limit, + "allocation_type": relation.allocation_type + } + return None + + +class GuildsForBroadcastManagementSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'user', 'type_activity', 'area_activity', 'guilds_id', 'steward'] + + +class PosGuildsForBroadcastManagementSerializer(serializers.ModelSerializer): + # user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'type_activity', 'area_activity', 'guilds_id', 'steward'] + + +class GuildsForStewardMenueSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'user'] + + +class GuildsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + guild_area_activity = AreaActivitySerializer(read_only=True) + guild_type_activity = TypeActivitySerializer(read_only=True) + kill_house = serializers.SerializerMethodField('get_kill_house') + # kill_house = KillHouseForAutoAllocationSerializer(many=True,read_only=True) + steward_kill_house = serializers.SerializerMethodField('get_steward_kill_house') + # steward_kill_house = KillHouseForAutoAllocationSerializer(many=True,read_only=True) + stewards = GuildsForDispenserAllocationsSerializer(many=True, read_only=True) + + get_pos_status = serializers.SerializerMethodField('get_pos_status_method') + product_info = serializers.SerializerMethodField('get_info') + + class Meta: + model = Guilds + fields = '__all__' + + def get_kill_house(self, obj): + kill_houses = KillHouse.objects.filter( + pk__in=KillHouseStewardGuildRelation.objects.filter(guild=obj).values_list('kill_house', flat=True)) + serializer = KillHouseForKillHouseGuildRelationSerializer(kill_houses, many=True, context={'guild': obj}) + return serializer.data + + def get_steward_kill_house(self, obj): + kill_houses = KillHouse.objects.filter( + pk__in=KillHouseStewardGuildRelation.objects.filter(guild=obj).values_list('kill_house', flat=True)) + serializer = KillHouseForKillHouseStewardRelationSerializer(kill_houses, many=True, context={'guild': obj}) + return serializer.data + + def get_pos_status_method(self, obj): + has_pos = POSMachine.objects.filter(guild=obj).exists() + if not has_pos: + return { + "len_active_sessions": 0, + "has_pons": False, + "has_active_pons": False, + } + pos_device_ids = POSMachine.objects.filter(guild=obj).values_list('id', flat=True) + now = datetime.now().date() - timedelta(days=4) + sessions = POSDeviceSession.objects.filter(trash=False, pos__id__in=pos_device_ids) + active_sessions = sessions.filter(session_last_seen_date__gt=now) + active_count = active_sessions.count() + return { + "len_active_sessions": active_count, + "has_pons": has_pos, + "has_active_pons": active_count > 0, + } + + def get_info(self, obj): + products = RolesProducts.objects.filter(guild=obj, trash=False).first() + return RolesProductsSerializer(products).data + + +class DistributionUserLevelSerializer(serializers.ModelSerializer): + class Meta: + model = DistributionUserLevel + fields = ['key', 'fa_title', 'en_title'] + + +class RealGuildsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'user', 'guilds_name', 'type_activity', 'area_activity', + ] + + +class RealGuildsForDashboardSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + ware_house_info = serializers.SerializerMethodField('get_ware_house_info') + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'user', 'guilds_name', 'steward', 'ware_house_info', 'address'] + + def get_ware_house_info(self, obj): + + date1 = self.context.get('request').GET.get('date1') + date2 = self.context.get('request').GET.get('date2') + product = RolesProducts.objects.filter(guild=obj, trash=False, name='مرغ گرم').first() + + if date1: + date1 = datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.strptime(str(date2), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter( + Q(steward=obj) | Q(to_steward=obj), + trash=False, calculate_status=True, to_cold_house__isnull=True, + date__date__gte=date1, date__date__lte=date2, warehouse=True, steward_warehouse=True) + + free_bars = StewardFreeBarInformation.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2, steward=obj, warehouse=True) + free_sale_bars = StewardFreeSaleBarInformation.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2, steward=obj, + warehouse=True) + segmentations = PosSegmentation.objects.filter(guild=obj, trash=False, warehouse=True, + date__date__gte=date1, date__date__lte=date2) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, + transaction__date__date__gte=date1, + transaction__date__date__lte=date2, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(Q(steward=obj) | Q(guild=obj), trash=False, + date__date__gte=date1, date__lte=date2, + warehouse=True) + + + else: + allocations = StewardAllocation.objects.filter( + Q(steward=obj) | Q(to_steward=obj), + trash=False, calculate_status=True, to_cold_house__isnull=True, warehouse=True, steward_warehouse=True) + + free_bars = StewardFreeBarInformation.objects.filter(trash=False, steward=obj, warehouse=True) + free_sale_bars = StewardFreeSaleBarInformation.objects.filter(trash=False, steward=obj, warehouse=True) + segmentations = PosSegmentation.objects.filter(guild=obj, trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(Q(steward=obj) | Q(guild=obj), trash=False, warehouse=True) + + allocations_aggregates = allocations.aggregate( + total_input_bars_count=Count('id', filter=Q(to_steward=obj)), + total_output_bars_count=Count('id', filter=Q(steward=obj)), + total_input_bars_weight=Sum('real_weight_of_carcasses', filter=Q(to_steward=obj)), + total_input_governmental_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward=obj, quota='governmental')), + total_input_free_bars_weight=Sum('real_weight_of_carcasses', filter=Q(to_steward=obj, quota='free')), + total_output_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward=obj, receiver_state__in=('pending', 'accepted'))), + total_output_governmental_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward=obj, receiver_state__in=('pending', 'accepted'), + quota='governmental')), + total_output_free_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward=obj, receiver_state__in=('pending', 'accepted'), + quota='free')), + total_input_entered_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward=obj, receiver_state='accepted')), + + total_input_entered_governmental_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward=obj, receiver_state='accepted', + quota='governmental')), + total_input_entered_free_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward=obj, receiver_state='accepted', quota='free')), + total_input_entered_bars_count=Count('id', filter=Q(to_steward=obj, receiver_state='accepted')) + + ) + + free_bars_aggregates = free_bars.aggregate( + total_count=Count('id'), + total_weight=Sum('weight_of_carcasses') + ) + + free_sale_bars_aggregates = free_sale_bars.aggregate( + total_count=Count('id'), + total_weight=Sum('weight_of_carcasses'), + total_governmental_weight=Sum('weight_of_carcasses', filter=Q(quota='governmental')), + total_free_weight=Sum('weight_of_carcasses', filter=Q(quota='free')), + + ) + + segmentations_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_governmental_weight = \ + segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_free_weight = \ + segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + pos_allocated_weight_info = transactions.aggregate( + pos_allocated_weight=Sum('cur_weight'), + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + 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')), + + ) + pos_allocated_weight = pos_allocated_weight_info['pos_allocated_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + + input_allocations_count = allocations_aggregates['total_input_bars_count'] or 0 + input_allocations_weight = allocations_aggregates['total_input_bars_weight'] or 0 + input_governmental_allocations_weight = allocations_aggregates['total_input_governmental_bars_weight'] or 0 + input_free_allocations_weight = allocations_aggregates['total_input_free_bars_weight'] or 0 + input_entered_allocations_weight = allocations_aggregates['total_input_entered_bars_weight'] or 0 + input_entered_governmental_allocations_weight = allocations_aggregates[ + 'total_input_entered_governmental_bars_weight'] or 0 + input_entered_free_allocations_weight = allocations_aggregates['total_input_entered_free_bars_weight'] or 0 + input_entered_allocations_count = allocations_aggregates['total_input_entered_bars_count'] or 0 + output_allocations_weight = allocations_aggregates['total_output_bars_weight'] or 0 + output_governmental_allocations_weight = allocations_aggregates['total_output_governmental_bars_weight'] or 0 + output_free_allocations_weight = allocations_aggregates['total_output_free_bars_weight'] or 0 + output_allocations_count = allocations_aggregates['total_output_bars_count'] or 0 + free_bars_weight = free_bars_aggregates['total_weight'] or 0 + free_bars_count = free_bars_aggregates['total_count'] or 0 + free_sale_bars_weight = free_sale_bars_aggregates['total_weight'] or 0 + free_sale_governmental_bars_weight = free_sale_bars_aggregates['total_governmental_weight'] or 0 + free_sale_free_bars_weight = free_sale_bars_aggregates['total_free_weight'] or 0 + free_sale_bars_count = free_sale_bars_aggregates['total_count'] or 0 + 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 + remain_weight = int( + (input_entered_allocations_weight + free_bars_weight) - (free_sale_bars_weight + output_allocations_weight)) + + total_input_governmental_weight = input_entered_governmental_allocations_weight + total_input_free_weight = input_entered_free_allocations_weight + free_bars_weight + total_input_weight = total_input_governmental_weight + total_input_free_weight + total_output_governmental_weight = output_governmental_allocations_weight + free_sale_governmental_bars_weight + segmentations_governmental_weight + int( + pos_governmental_allocated_weight / 1000) + total_output_free_weight = output_free_allocations_weight + free_sale_free_bars_weight + segmentations_free_weight + int( + pos_free_allocated_weight / 1000) + total_output_weight = total_output_governmental_weight + total_output_free_weight + total_remain_weight = total_input_weight - total_output_weight + total_remain_governmental_weight = ( + total_input_governmental_weight - total_output_governmental_weight) - archives_governmental_weight if ( + ( + total_input_governmental_weight - total_output_governmental_weight) - archives_governmental_weight) > 0 else 0 + total_remain_free_weight = (total_input_free_weight - total_output_free_weight) - archives_free_weight if ( + ( + total_input_free_weight - total_output_free_weight) - archives_free_weight) > 0 else 0 + last_total_remain_free_weight = (( + total_input_free_weight - total_output_free_weight) - archives_free_weight) * -1 if ( + ( + total_input_free_weight - total_output_free_weight) - archives_free_weight) < 0 else 0 + last_total_remain_governmental_weight = ( + ( + total_input_governmental_weight - total_output_governmental_weight) - archives_governmental_weight) * -1 if ( + ( + total_input_governmental_weight - total_output_governmental_weight) - archives_governmental_weight) < 0 else 0 + last_total_remain_weight = last_total_remain_governmental_weight + last_total_remain_free_weight + + result = { + "total_bars_weight": int(input_allocations_weight + free_bars_weight), + "total_bars_count": free_bars_count + input_allocations_count, + "input_bars_weight": int(input_allocations_weight), + "input_governmental_allocations_weight": int(input_governmental_allocations_weight), + "input_free_allocations_weight": int(input_free_allocations_weight), + "input_bars_count": input_allocations_count, + "total_entered_bars_weight": int(input_entered_allocations_weight + free_bars_weight), + "input_entered_governmental_allocations_weight": int(input_entered_governmental_allocations_weight), + "input_entered_free_allocations_weight": int(input_entered_free_allocations_weight), + "total_entered_bars_count": input_entered_allocations_count + free_bars_count, + "in_province_bars_count": output_allocations_count, + "in_province_bars_weight": int(output_allocations_weight), + "in_province_governmental_bars_weight": int(output_governmental_allocations_weight), + "in_province_free_bars_weight": int(output_free_allocations_weight), + "out_province_bars_count": free_sale_bars_count, + "out_province_bars_weight": int(free_sale_bars_weight), + "out_province_governmental_bars_weight": int(free_sale_governmental_bars_weight), + "out_province_free_bars_weight": int(free_sale_free_bars_weight), + "total_in_out_province_bars_weight": int(free_sale_bars_weight) + int(output_allocations_weight), + "total_in_out_province_bars_count": output_allocations_count + free_sale_bars_count, + "free_bars_weight": free_bars_weight, + "free_bars_count": free_bars_count, + "remain_weight": remain_weight, + "segmentations_weight": segmentations_weight, + "segmentations_governmental_weight": segmentations_governmental_weight, + "segmentations_free_weight": segmentations_free_weight, + "total_input_weight": total_input_weight, + "total_input_governmental_weight": total_input_governmental_weight, + "total_input_free_weight": total_input_free_weight, + "total_output_weight": total_output_weight, + "total_output_governmental_weight": total_output_governmental_weight, + "total_output_free_weight": total_output_free_weight, + "total_remain_weight": total_remain_weight, + "total_remain_governmental_weight": total_remain_governmental_weight, + "total_remain_free_weight": total_remain_free_weight, + "last_total_remain_free_weight": last_total_remain_free_weight, + "last_total_remain_governmental_weight": last_total_remain_governmental_weight, + "last_total_remain_weight": last_total_remain_weight, + "pos_allocated_weight": int(pos_allocated_weight / 1000), + "pos_governmental_allocated_weight": int(pos_governmental_allocated_weight / 1000), + "pos_free_allocated_weight": int(pos_free_allocated_weight / 1000), + "archives_weight": archives_weight, + "archives_governmental_weight": archives_governmental_weight, + "archives_free_weight": archives_free_weight, + } + + return result + + +class PosGuildsSerializer(serializers.ModelSerializer): + shop_name = serializers.CharField(source='guilds_name', read_only=True) + fullname = serializers.CharField(source='user.fullname', read_only=True) + mobile = serializers.CharField(source='user.mobile', read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'shop_name', 'fullname', 'mobile', 'steward'] + + +class ColdHouseForStewardSerializer(serializers.ModelSerializer): + steward = GuildsForStewardMenueSerializer(read_only=True) + + class Meta: + model = ColdHouse + fields = ['key', 'kill_house', 'steward', 'total_input_weight', 'total_allocated_weight', + 'total_remain_weight', 'name', 'province', 'city', 'address', 'capacity', 'active', 'broadcast', + 'relocate'] + + +class GuildsForTotalColdHouseSerializer(serializers.ModelSerializer): + cold_houses_info = serializers.SerializerMethodField('get_cold_houses_info') + fullname = serializers.CharField(source='user.fullname', read_only=True) + mobile = serializers.CharField(source='user.mobile', read_only=True) + province = serializers.CharField(source='user.province.name', read_only=True) + city = serializers.CharField(source='user.city.name', read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'fullname', 'mobile', 'province', 'city', 'cold_houses_info'] + + def get_cold_houses_info(self, obj): + cold_houses = ColdHouse.objects.filter(steward=obj, trash=False) + + total_input_weight = cold_houses.aggregate(total=Sum('total_input_weight'))[ + 'total'] or 0 + total_allocated_weight = cold_houses.aggregate(total=Sum('total_allocated_weight'))[ + 'total'] or 0 + total_remain_weight = cold_houses.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + + return { + "total_cold_houses": len(cold_houses), + "total_input_weight": total_input_weight, + "total_allocated_weight": total_allocated_weight, + "total_remain_weight": total_remain_weight, + } + + +class StewardColdHousesSerializer(serializers.ModelSerializer): + cold_houses = serializers.SerializerMethodField('get_cold_houses') + + class Meta: + model = Guilds + fields = ['key', 'cold_houses'] + + def get_cold_houses(self, obj): + cold_houses = ColdHouse.objects.filter(steward=obj, trash=False) + serializer = ColdHouseForStewardSerializer(cold_houses, many=True) + return serializer.data + + +class GuildsForColdHouseSerializer(serializers.ModelSerializer): + fullname = serializers.CharField(source='user.fullname', read_only=True) + mobile = serializers.CharField(source='user.mobile', read_only=True) + province = serializers.CharField(source='user.province.name', read_only=True) + city = serializers.CharField(source='user.city.name', read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'fullname', 'mobile', 'province', 'city'] + + +class GuildsForDistributionManagementSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + city = serializers.CharField(source='address.city.name', read_only=True) + general_infos = serializers.SerializerMethodField('get_general_infos') + kill_house = serializers.SerializerMethodField('get_kill_house') + steward_kill_house = serializers.SerializerMethodField('get_steward_kill_house') + stewards = serializers.SerializerMethodField('get_stewards') + user_level = DistributionUserLevelSerializer(read_only=True, many=True) + transactions = serializers.SerializerMethodField('get_transactions') + + class Meta: + model = Guilds + fields = ['key', 'user', 'city', 'guilds_name', 'type_activity', 'area_activity', 'steward', 'general_infos', + 'kill_house', 'steward_kill_house', 'stewards', 'user_level', 'transactions'] + + def get_kill_house(self, obj): + kill_houses = KillHouse.objects.filter( + pk__in=KillHouseStewardGuildRelation.objects.filter(guild=obj).values_list('kill_house', flat=True)) + serializer = KillHouseForKillHouseGuildRelationSerializer(kill_houses, many=True, context={'guild': obj}) + return serializer.data + + def get_steward_kill_house(self, obj): + kill_houses = KillHouse.objects.filter( + pk__in=KillHouseStewardGuildRelation.objects.filter(guild=obj).values_list('kill_house', flat=True)) + serializer = KillHouseForKillHouseStewardRelationSerializer(kill_houses, many=True, context={'guild': obj}) + return serializer.data + + def get_stewards(self, obj): + stewards = Guilds.objects.filter( + pk__in=KillHouseStewardGuildRelation.objects.filter(guild=obj).values_list('steward', flat=True)) + serializer = GuildsForDispenserAllocationsSerializer(stewards, many=True, context={'guild': obj}) + return serializer.data + + def get_general_infos(self, obj): + + steward_guild_relations = KillHouseStewardGuildRelation.objects.filter(Q(guild=obj) | Q(steward=obj), + trash=False) + + if obj.steward == False: + input_total_allocation_limit = \ + steward_guild_relations.filter(Q(kill_house__isnull=False) | Q(steward__isnull=False), + guild=obj).aggregate(total=Sum('allocation_limit'))['total'] or 0 + output_total_allocation_limit = 0 + else: + input_total_allocation_limit = \ + steward_guild_relations.filter(kill_house__isnull=False, steward=obj).aggregate( + total=Sum('allocation_limit'))['total'] or 0 + output_total_allocation_limit = \ + steward_guild_relations.filter(steward=obj, guild__isnull=False).aggregate( + total=Sum('allocation_limit'))['total'] or 0 + + type_object = self.context.get('type_object') + role_object = self.context.get('role_object') + type = self.context.get('type') + if type_object == 'KillHouse': + if type == 'guild': + relation = steward_guild_relations.filter(guild=obj, kill_house=role_object).first() + else: + relation = steward_guild_relations.filter(steward=obj, kill_house=role_object).first() + else: + relation = steward_guild_relations.filter(guild=obj, steward=role_object).first() + + return { + "self_input_total_allocation_limit": relation.allocation_limit if relation else None, + "self_total_allocation_type": relation.allocation_type if relation else None, + "input_total_allocation_limit": input_total_allocation_limit, + "output_total_allocation_limit": output_total_allocation_limit + } + + def get_transactions(self, obj): + transactions = PosAllocationTransactions.objects.filter(pos__guild=obj, trash=False) + return len(transactions) + + +class TestGuildsSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + kill_house = KillHouseForKillingInformationDiscrepancyReportSerializer(many=True, required=False) + + guilds_steward = serializers.SerializerMethodField('get_steward') + stewarrd_info = serializers.SerializerMethodField('get_stewarrd_info') + kill_house_info = serializers.SerializerMethodField('get_kill_house_info') + + class Meta: + model = Guilds + fields = '__all__' + + def get_steward(self, obj): + steward = Steward.objects.filter(guilds=obj, guilds__steward=True).last() + if steward: + serializer = StewardForGuildsSerializer(steward) + return serializer.data + return None + + def get_stewarrd_info(self, obj): + if obj.centers_allocation != None and len(obj.centers_allocation) != 0: + import uuid + key = obj.centers_allocation[0]['value'] + steward = Steward.objects.filter(key=uuid.UUID(key), guilds__steward=True).last() + if steward: + return steward.guilds.guilds_name + return None + + def get_kill_house_info(self, obj): + kill_house_list = [] + if obj.kill_house_centers_allocation != None: + for kill_house in obj.kill_house_centers_allocation: + kill_house = KillHouse.objects.get(key=kill_house['value'], trash=False) + kill_house_list.append({ + "name": kill_house.name, + "killer": kill_house.killer, + "mobile": kill_house.kill_house_operator.user.mobile + }) + + return kill_house_list + + +class GuildsWareHouseSerializer(serializers.ModelSerializer): + guilds = GuildsSerializer(read_only=True) + + class Meta: + model = GuildsWareHouse + fields = '__all__' + + +class StewardForDispenserAllocationsSerializer(serializers.ModelSerializer): + guilds = GuildsForDispenserAllocationsSerializer(read_only=True) + + class Meta: + model = Steward + fields = ['key', 'guilds'] + + +class StewardSerializer(serializers.ModelSerializer): + guilds = GuildsSerializer(read_only=True) + product_info = serializers.SerializerMethodField('get_info') + + class Meta: + model = Steward + fields = '__all__' + + def get_info(self, obj): + products = RolesProducts.objects.filter(guild=obj.guilds, trash=False).first() + return RolesProductsSerializer(products).data + + +class ProductForStewardFreeBarInformationSerializer(serializers.ModelSerializer): + class Meta: + model = Product + fields = ['key', 'name'] + + +class StewardFreeBarInformationSerializer(serializers.ModelSerializer): + steward = GuildsForStewardAutoAllocationSerializer(read_only=True) + guild = GuildsForStewardAutoAllocationSerializer(read_only=True) + product = ProductForStewardFreeBarInformationSerializer(read_only=True) + + class Meta: + model = StewardFreeBarInformation + fields = '__all__' + + +class PosStewardFreeBarInformationSerializer(serializers.ModelSerializer): + buyer = serializers.SerializerMethodField('get_buyer') + + class Meta: + model = StewardFreeBarInformation + fields = ['key', 'buyer', 'kill_house_name', 'kill_house_mobile', 'province', 'city', 'date', + 'number_of_carcasses', 'weight_of_carcasses', 'bar_image'] + + def get_buyer(self, obj): + buyer = obj.guild if obj.guild else obj.steward + type = 'guild' if obj.guild else 'steward' + return { + "fullname": buyer.user.fullname, + "mobile": buyer.user.mobile, + "shop": buyer.guilds_name, + "type": type, + + } + + +class OutProvinceCarcassesBuyerForStewardSerializer(serializers.ModelSerializer): + steward = GeneralGuildsForInspectionsSerializer(read_only=True) + + class Meta: + model = OutProvinceCarcassesBuyer + fields = ['key', 'fullname', 'first_name', 'last_name', 'mobile', 'unit_name', 'city', 'province', 'active', + 'steward'] + + +class StewardFreeSaleBarInformationSerializer(serializers.ModelSerializer): + buyer = OutProvinceCarcassesBuyerForStewardSerializer(read_only=True) + guild = RealGuildsSerializer(read_only=True) + steward = RealGuildsSerializer(read_only=True) + + class Meta: + model = StewardFreeSaleBarInformation + fields = '__all__' + + +class StewardForStewardAutoAllocationSerializer(serializers.ModelSerializer): + guilds = GuildsForStewardAutoAllocationSerializer(read_only=True) + + class Meta: + model = Steward + fields = ['guilds'] + + +class StewardWareHouseSerializer(serializers.ModelSerializer): + steward = StewardSerializer(read_only=True) + + class Meta: + model = StewardWareHouse + fields = '__all__' + + +class StewardWareHouseForDailyBroadCastOInDetailsSerializer(serializers.ModelSerializer): + informations = serializers.SerializerMethodField('get_informations') + + class Meta: + model = Steward + fields = ['informations', 'key'] + + def get_informations(self, obj): + date1 = datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() + steward_ware_houses = StewardWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(weight_of_free_carcasses__gt=0), date__date__gte=date1, + date__date__lte=date2, steward=obj, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + steward_ware_house__in=steward_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + total_number_of_free_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_free_carcasses'))[ + 'total'] + total_number_of_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + steward_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + steward_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + return { + "buyers": obj.guilds.guilds_name, + "city": obj.guilds.address.city.name, + "incoming_quantity_of_cold_house": 0, + "incoming_weight_of_cold_house": 0, + "total_pre_cold_quantity": 0, + "total_pre_cold_weight": 0, + "total_number_of_free_carcasses": total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + "total_free_weight_of_carcasses": total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + "total_number_of_carcasses": total_number_of_carcasses if total_number_of_carcasses != None else 0, + "total_weight_of_carcasses": total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + "final_total_number_of_carcasses": final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + "final_total_weight_of_carcasses": final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + "total_allocated_quantity": total_allocated_quantity if total_allocated_quantity != None else 0, + "total_allocated_weight": total_allocated_weight if total_allocated_weight != None else 0, + "total_accepted_allocated_quantity": total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + "total_accepted_allocated_weight": total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + "total_remain_quantity": total_remain_quantity if total_remain_quantity != None else 0, + "total_remain_weight": total_remain_weight if total_remain_weight != None else 0, + "number_of_guild": number_of_guild, + } + + +class AutomaticStewardAllocationSerializer(serializers.ModelSerializer): + steward = StewardForStewardAutoAllocationSerializer(read_only=True) + + # guilds = GuildsSerializer(read_only=True) + class Meta: + model = StewardAllocation + fields = ['key', 'steward', 'number_of_carcasses', 'real_number_of_carcasses', 'weight_of_carcasses', + 'real_weight_of_carcasses', 'final_registration', 'registration_code', 'system_registration_code', + 'logged_registration_code', + 'state', 'date'] + + +class DispenserForAllocationsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = Dispenser + exclude = ('created_by', 'modified_by', 'user_bank_info', 'wallet', 'address', 'create_date', + 'modify_date') + + +class DispenserSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + guild = GuildsForStewardAutoAllocationSerializer(read_only=True) + kill_house = KillHouseForKillingInformationDiscrepancyReportSerializer(required=False) + allocations_info = serializers.SerializerMethodField('get_allocations_info') + + class Meta: + model = Dispenser + exclude = ('created_by', 'modified_by', 'user_bank_info', 'wallet', 'address', 'create_date', + 'modify_date') + + def get_allocations_info(self, obj): + today = datetime.now().date() + allocations = StewardAllocation.objects.filter(dispenser=obj, trash=False) + today_allocations = allocations.filter(date__date=today) + total_quantity = allocations.aggregate(total=Sum('number_of_carcasses'))['total'] or 0 + total_weight = allocations.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0 + today_quantity = today_allocations.aggregate(total=Sum('number_of_carcasses'))['total'] or 0 + today_weight = today_allocations.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0 + + return { + "number_of_allocations": len(allocations), + "total_quantity": total_quantity, + "total_weight": total_weight, + "number_of_today_allocations": len(today_allocations), + "total_today_quantity": today_quantity, + "total_today_weight": today_weight, + } + + +class NewDispenserSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + + class Meta: + model = Dispenser + fields = ['key', 'user', 'in_use'] + + +class NewDispenserSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + + class Meta: + model = Dispenser + fields = ['key', 'user', 'in_use'] + + +class DispenserAllocationSerializer(serializers.ModelSerializer): + steward = StewardForDispenserAllocationsSerializer(read_only=True) + guilds = GuildsForDispenserAllocationsSerializer(read_only=True) + dispenser = DispenserForAllocationsSerializer(read_only=True) + seller = serializers.SerializerMethodField('get_seller_info') + index_weight = serializers.SerializerMethodField('get_index_weight') + + class Meta: + model = StewardAllocation + fields = '__all__' + + def get_seller_info(self, obj): + seller_name = None + seller_mobile = None + seller_role = None + if obj.steward != None: + seller_name = obj.steward.guilds.user.fullname + seller_mobile = obj.steward.guilds.user.mobile + seller_role = 'Steward' + else: + seller_name = obj.guilds.user.fullname + seller_mobile = obj.guilds.user.mobile + seller_role = 'Guilds' + + return { + "seller_name": seller_name, + "seller_mobile": seller_mobile, + "seller_role": seller_role + } + + def get_index_weight(self, obj): + + index_weight = round((obj.real_weight_of_carcasses / obj.real_number_of_carcasses), + 2) if obj.real_number_of_carcasses > 0 else 0 + + return index_weight + + +class DispenserInformationSerializer(serializers.ModelSerializer): + class Meta: + model = DispenserInformation + fields = '__all__' + + +class ChildNewProductSerializer(serializers.ModelSerializer): + class Meta: + model = NewProduct + fields = ['key', 'name'] + + +class NewProductSerializer(serializers.ModelSerializer): + child = ChildNewProductSerializer(many=True, read_only=True) + parent = ChildNewProductSerializer(read_only=True) + + class Meta: + model = NewProduct + fields = ['key', 'name', 'parent', 'child'] + + +class PosNewProductSerializer(serializers.ModelSerializer): + class Meta: + model = NewProduct + fields = ['key', 'name', 'sale_type', 'sale_type_package_weight', 'approved_price_status', 'approved_price', + 'sale_limitation_status', 'selling_more_than_inventory', 'image'] + + +class RolesProductsSerializer(serializers.ModelSerializer): + # parent_product = NewProductSerializer(read_only=True) + # kill_house = KillHouseForAutoAllocationSerializer (read_only=True) + # guild = GuildsForStewardMenueSerializer (read_only=True) + + class Meta: + model = RolesProducts + fields = '__all__' + + +class RolesProductsForInspectionSerializer(serializers.ModelSerializer): + class Meta: + model = RolesProducts + fields = ['name', 'total_carcasses_weight', 'real_allocated_weight', + 'total_remain_weight'] + + +class PosRolesProductsSerializer(serializers.ModelSerializer): + parent_product = PosNewProductSerializer(read_only=True) + price = serializers.SerializerMethodField('get_price') + + class Meta: + model = RolesProducts + fields = ['key', 'parent_product', 'name', 'total_carcasses_weight', 'real_allocated_weight', + 'total_remain_weight', 'approved_price_status', 'price', 'segmentation_weight', + 'pos_allocated_weight'] + + def get_price(self, obj): + broad_price = BroadcastPrice.objects.get(trash=False) + price = obj.approved_price if broad_price.active == True else obj.free_price + return price + + +class PosOtherProductsSerializer(serializers.ModelSerializer): + class Meta: + model = OtherProducts + fields = ['key', 'name', 'unit', 'image', 'price', 'active'] + + +class CombinedPosProductSerializer(serializers.ModelSerializer): + price = serializers.SerializerMethodField('get_price') + product_type = serializers.CharField() + + def get_price(self, obj): + if isinstance(obj, RolesProducts): + broad_price = BroadcastPrice.objects.filter(trash=False).first() + # if broad_price and broad_price.active: + # if obj.kill_house: + # if obj.approved_price > 0: + # if obj.approved_price > obj.free_price and obj.free_price > 0: + # return obj.free_price + # else: + # return obj.approved_price + # + # else: + # return obj.free_price + # + # else: + # + # if obj.guild.steward: + # if broad_price.steward_price > 0: + # if broad_price.steward_price > obj.free_price and obj.free_price > 0: + # return obj.free_price + # else: + # return broad_price.steward_price + # else: + # return obj.free_price + # else: + # if broad_price.guild_price > 0: + # if broad_price.guild_price > obj.free_price and obj.free_price > 0: + # return obj.free_price + # else: + # return broad_price.guild_price + # else: + # return obj.free_price + if broad_price and broad_price.active: + if obj.kill_house: + if broad_price.guild_price > 0: + if broad_price.guild_price > obj.free_price and obj.free_price > 0: + return obj.free_price + else: + return broad_price.guild_price + + else: + return obj.free_price + + else: + + if obj.guild.steward: + if broad_price.guild_price > 0: + if broad_price.guild_price > obj.free_price and obj.free_price > 0: + return obj.free_price + else: + return broad_price.guild_price + else: + return obj.free_price + else: + if broad_price.guild_price > 0: + if broad_price.guild_price > obj.free_price and obj.free_price > 0: + return obj.free_price + else: + return broad_price.guild_price + else: + return obj.free_price + + return obj.free_price + elif isinstance(obj, OtherProducts): + return obj.price + elif isinstance(obj, LiveStockRolseProduct): + pos_id = self.context.get('validation_device') + + main_product = obj.parent_product + pos = POSMachine.objects.get(pos_id=pos_id) + share = CooperativeProductsShare.objects.get(product=main_product, cooperative=pos.cooperative, trash=False) + + return share.price + share.shipping_price + share.cooperative_price + share.company_price + share.cooperative.first_sub_cooperative_price + share.cooperative.second_sub_cooperative_price + return None + + def to_representation(self, instance): + if isinstance(instance, RolesProducts): + + data = { + "key": instance.key, + "parent_product": instance.parent_product.key, + "product_type": "roles_product", + "name": instance.name, + "image": instance.parent_product.image, + "price": self.get_price(instance), + "price_approved": instance.approved_price_status, + "selling_more": instance.parent_product.selling_more_than_inventory, + "unit": 'kg', + "total_carcasses_weight": instance.total_carcasses_weight, + "real_allocated_weight": instance.real_allocated_weight, + "total_remain_weight": instance.total_remain_weight, + "segmentation_weight": instance.segmentation_weight, + "pos_allocated_weight": instance.pos_allocated_weight, + "active": True, + "targetunit": "g", + + } + return data + + elif isinstance(instance, OtherProducts): + data = { + "key": instance.key, + "parent_product": None, + "product_type": "other_product", + "name": instance.name, + "image": instance.image, + "price": instance.price, + "price_approved": False, + "selling_more": True, + "unit": instance.unit, + "total_carcasses_weight": 0, + "real_allocated_weight": 0, + "total_remain_weight": 0, + "segmentation_weight": 0, + "pos_allocated_weight": 0, + "active": instance.active, + "targetunit": "g", + + } + return data + elif isinstance(instance, LiveStockRolseProduct): + data = { + "key": instance.key, + "parent_product": instance.parent_product.key, + "product_type": "stock_product", + "name": instance.parent_product.name, + "image": instance.parent_product.image, + "price": self.get_price(instance), + "price_approved": True, + "selling_more": False, + "unit": 'kg', + "total_carcasses_weight": instance.total_weight, + "real_allocated_weight": instance.total_allocated_weight, + "total_remain_weight": instance.total_remain_weight, + "segmentation_weight": 0, + "pos_allocated_weight": 0, + "active": True, + "targetunit": "kg", + + } + return data + return super().to_representation(instance) +class NewCombinedPosProductSerializer(serializers.ModelSerializer): + price = serializers.SerializerMethodField('get_price') + product_type = serializers.CharField() + + def get_price(self, obj): + if isinstance(obj, RolesProducts): + broad_price = BroadcastPrice.objects.filter(trash=False).first() + if broad_price and broad_price.active: + if obj.kill_house: + if broad_price.guild_price > 0: + if broad_price.guild_price > obj.free_price and obj.free_price > 0: + return obj.free_price + else: + return broad_price.guild_price + + else: + return obj.free_price + + else: + + if obj.guild.steward: + if broad_price.guild_price > 0: + if broad_price.guild_price > obj.free_price and obj.free_price > 0: + return obj.free_price + else: + return broad_price.guild_price + else: + return obj.free_price + else: + if broad_price.guild_price > 0: + if broad_price.guild_price > obj.free_price and obj.free_price > 0: + return obj.free_price + else: + return broad_price.guild_price + else: + return obj.free_price + + return obj.free_price + elif isinstance(obj, OtherProducts): + return obj.price + elif isinstance(obj, LiveStockRolseProduct): + pos_id = self.context.get('validation_device') + + main_product = obj.parent_product + pos = POSMachine.objects.get(pos_id=pos_id) + share = CooperativeProductsShare.objects.get(product=main_product, cooperative=pos.cooperative, trash=False) + + return share.price + share.shipping_price + share.cooperative_price + share.company_price + share.cooperative.first_sub_cooperative_price + share.cooperative.second_sub_cooperative_price + return None + + def to_representation(self, instance): + if isinstance(instance, RolesProducts): + + data = { + "key": instance.key, + "parent_product": instance.parent_product.key, + "product_type": "roles_product", + "name": instance.name, + "image": instance.parent_product.image, + "price": self.get_price(instance), + "price_approved": instance.approved_price_status, + "selling_more": instance.parent_product.selling_more_than_inventory, + "unit": 'kg', + "total_carcasses_weight": instance.total_carcasses_weight, + "real_allocated_weight": instance.real_allocated_weight, + "total_remain_weight": instance.total_remain_weight, + "segmentation_weight": instance.segmentation_weight, + "pos_allocated_weight": instance.pos_allocated_weight, + "active": True, + "targetunit": "g", + + } + return data + + elif isinstance(instance, OtherProducts): + data = { + "key": instance.key, + "parent_product": None, + "product_type": "other_product", + "name": instance.name, + "image": instance.image, + "price": instance.price, + "price_approved": False, + "selling_more": True, + "unit": instance.unit, + "total_carcasses_weight": 0, + "real_allocated_weight": 0, + "total_remain_weight": 0, + "segmentation_weight": 0, + "pos_allocated_weight": 0, + "active": instance.active, + "targetunit": "g", + + } + return data + elif isinstance(instance, LiveStockRolseProduct): + data = { + "key": instance.key, + "parent_product": instance.parent_product.key, + "product_type": "stock_product", + "name": instance.parent_product.name, + "image": instance.parent_product.image, + "price": self.get_price(instance), + "price_approved": True, + "selling_more": False, + "unit": 'kg', + "total_carcasses_weight": instance.total_weight, + "real_allocated_weight": instance.total_allocated_weight, + "total_remain_weight": instance.total_remain_weight, + "segmentation_weight": 0, + "pos_allocated_weight": 0, + "active": True, + "targetunit": "kg", + + } + return data + return super().to_representation(instance) + + +class RolesProductsForStewardAllocationsSerializer(serializers.ModelSerializer): + # parent_product = NewProductSerializer(read_only=True) + # kill_house = KillHouseForAutoAllocationSerializer (read_only=True) + # guild = GuildsForStewardMenueSerializer (read_only=True) + + class Meta: + model = RolesProducts + fields = ['name', 'weight_average'] + + +class LiveStockSupportForColdHouseSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = LiveStockSupport + fields = ['key', 'user'] + + +class ColdHouseSerializer(serializers.ModelSerializer): + kill_house = KillHouseForProvinceSerializer(read_only=True) + steward = GuildsForStewardMenueSerializer(read_only=True) + + class Meta: + model = ColdHouse + fields = ['key', 'kill_house', 'steward', 'total_input_weight', 'total_allocated_weight', + 'total_remain_weight', 'name', 'province', 'city', 'address', 'active', 'broadcast', 'relocate', + 'capacity'] + + +class StewardAllocationSerializer(serializers.ModelSerializer): + # steward = StewardSerializer(read_only=True) + product = RolesProductsForStewardAllocationsSerializer(read_only=True) + kill_house = KillHouseForKillingInformationDiscrepancyReportSerializer(required=False) + to_kill_house = KillHouseForKillingInformationDiscrepancyReportSerializer(required=False) + steward = GuildsSerializer(read_only=True) + to_steward = GuildsSerializer(read_only=True) + # ware_house = KillHouseWareHouseSerializer(read_only=True) + guilds = GuildsSerializer(read_only=True) + to_guilds = GuildsSerializer(read_only=True) + to_cold_house = ColdHouseSerializer(read_only=True) + other_cold_house = ColdHouseSerializer(read_only=True) + # seller = serializers.SerializerMethodField('get_seller_info') + index_weight = serializers.SerializerMethodField('get_index_weight') + date_timestamp = serializers.SerializerMethodField('get_date_timestamp') + new_state = serializers.SerializerMethodField('get_new_state') + new_receiver_state = serializers.SerializerMethodField('get_new_receiver_state') + new_allocation_state = serializers.SerializerMethodField('get_new_allocation_state') + + class Meta: + model = StewardAllocation + fields = '__all__' + + # def get_seller_info(self, obj): + # seller_name = None + # seller_mobile = None + # seller_role = None + # if obj.ware_house != None: + # seller_name = obj.ware_house.kill_house.kill_house_operator.user.fullname + # seller_mobile = obj.ware_house.kill_house.kill_house_operator.user.mobile + # seller_role = 'KillHouse' + # else: + # seller_name = obj.steward_ware_house.steward.guilds.user.fullname + # seller_mobile = obj.steward_ware_house.steward.guilds.user.mobile + # seller_role = 'Steward' + # + # return { + # "seller_name": seller_name, + # "seller_mobile": seller_mobile, + # "seller_role": seller_role + # } + + def get_index_weight(self, obj): + + index_weight = round((obj.real_weight_of_carcasses / obj.real_number_of_carcasses), + 2) if obj.real_number_of_carcasses > 0 else 0 + + return index_weight + + def get_date_timestamp(self, obj): + ts = datetime.timestamp(obj.date) + return int(ts) + + def get_new_state(self, obj): + state = None + if obj.state == 'pending': + state = 0 + elif obj.state == 'accepted': + state = 1 + else: + state = -1 + return state + + def get_new_receiver_state(self, obj): + state = None + if obj.receiver_state == 'pending': + state = 0 + elif obj.receiver_state == 'accepted': + state = 1 + else: + state = -1 + return state + + def get_new_allocation_state(self, obj): + state = None + if obj.allocation_state == 'pending': + state = 0 + elif obj.allocation_state == 'accepted': + state = 1 + else: + state = -1 + return state + + +class InProvinceAllocationSerializer(serializers.ModelSerializer): + product = RolesProductsForStewardAllocationsSerializer(read_only=True) + kill_house = KillHouseForKillingInformationDiscrepancyReportSerializer(required=False) + to_kill_house = KillHouseForKillingInformationDiscrepancyReportSerializer(required=False) + steward = RealGuildsSerializer(read_only=True) + to_steward = RealGuildsSerializer(read_only=True) + guilds = RealGuildsSerializer(read_only=True) + to_guilds = RealGuildsSerializer(read_only=True) + steward_pos_status = serializers.SerializerMethodField() + guild_pos_status = serializers.SerializerMethodField() + + class Meta: + model = StewardAllocation + exclude = ('created_by', 'modified_by', 'dispenser', 'car', 'to_cold_house', 'steward_ware_house', 'ware_house', + 'create_date', + 'modify_date', 'temporary_deleted', 'temporary_trash', 'calculate_status', + 'steward_temp_key', 'role') + + def get_steward_pos_status(self, obj): + steward = getattr(obj, 'steward', None) + if not steward: + return 'ندارد' + has_paid_pos = POSTransactions.objects.filter( + paid=True, + pos_machine__guild=steward + ).exists() + return 'دارد' if has_paid_pos else 'ندارد' + + def get_guild_pos_status(self, obj): + steward = getattr(obj, 'steward', None) + to_guilds = getattr(obj, 'to_guilds', None) + if not steward or not to_guilds: + return 'ندارد' + has_paid_pos = POSTransactions.objects.filter( + paid=True, + pos_machine__guild=to_guilds + ).exists() + return 'دارد' if has_paid_pos else 'ندارد' + + +class PosStewardAllocationSerializer(serializers.ModelSerializer): + # kill_house = PosKillHouseForKillingInformationDiscrepancyReportSerializer(required=False) + # to_kill_house = PosKillHouseForKillingInformationDiscrepancyReportSerializer(required=False) + # steward = PosGuildsForBroadcastManagementSerializer(read_only=True) + # to_steward = PosGuildsForBroadcastManagementSerializer(read_only=True) + # guilds = PosGuildsForBroadcastManagementSerializer(read_only=True) + # to_guilds = PosGuildsForBroadcastManagementSerializer(read_only= + allocation_from = serializers.SerializerMethodField('get_allocation_from') + allocation_to = serializers.SerializerMethodField('get_allocation_to') + + class Meta: + model = StewardAllocation + fields = ['key', 'allocation_from', 'allocation_to', 'real_number_of_carcasses', 'real_weight_of_carcasses', + 'receiver_real_number_of_carcasses', 'receiver_real_weight_of_carcasses', 'sell_type', + 'allocation_type', 'system_registration_code', 'logged_registration_code', 'receiver_state', 'date', + 'amount', 'total_amount', 'total_amount_paid', 'total_amount_remain', 'active_expire_date_time', + 'production_date', 'quota', 'approved_price_status'] + + def get_allocation_from(self, obj): + if obj.kill_house: + + return { + "key": obj.kill_house.key, + "name": obj.kill_house.name, + "type_activity": "KillHouse", + } + elif obj.steward: + return { + "key": obj.steward.key, + "name": obj.steward.guilds_name, + "type_activity": "Steward", + } + + else: + return { + "key": obj.guilds.key, + "name": obj.guilds.guilds_name, + "type_activity": "Guild", + } + + def get_allocation_to(self, obj): + if obj.to_kill_house: + + return { + "key": obj.to_kill_house.key, + "name": obj.to_kill_house.name, + "type_activity": "KillHouse", + } + elif obj.to_steward: + return { + "key": obj.to_steward.key, + "name": obj.to_steward.guilds_name, + "type_activity": "Steward", + } + + else: + return { + "key": obj.to_guilds.key, + "name": obj.to_guilds.guilds_name, + "type_activity": "Guild", + } + + +class AutoAcceptProvinceKillRequestSerializer(serializers.ModelSerializer): + class Meta: + model = AutoAcceptProvinceKillRequest + fields = ['allow'] + + +class AutoMakeKillHouseRequestSerializer(serializers.ModelSerializer): + class Meta: + model = AutoMakeKillHouseRequest + fields = ['allow'] + + +class NewProvinceAutoAllocationSerializer(serializers.ModelSerializer): + poultry_request = PoultryRequestForAutoAllocationSerializer(read_only=True) + province_kill_request = ProvinceKillRequestForAutoAllocationSerializer(read_only=True) + + class Meta: + model = ProvinceAutoAllocation + fields = ['key', 'create_date', 'poultry_request', 'province_kill_request'] + + +class KillHousePercentageOfLossesSerializer(serializers.ModelSerializer): + class Meta: + model = KillHousePercentageOfLosses + fields = '__all__' + + +class ProvinceAllowKillHouseChooseStewardGuildsSerializer(serializers.ModelSerializer): + kill_house = KillHouseForProvinceSerializer(read_only=True) + + class Meta: + model = ProvinceAllowKillHouseChooseStewardGuilds + fields = ['key', 'kill_house', 'steward', 'guilds'] + + +class HatchingLossesPermissionSerializer(serializers.ModelSerializer): + class Meta: + model = HatchingLossesPermission + fields = ['key', 'percent', 'allow'] + + +class WagePaymentSerializer(serializers.ModelSerializer): + class Meta: + model = WagePayment + fields = '__all__' + + +class ProvinceAllowKillHouseDirectBuyingTotalSerializer(serializers.ModelSerializer): + class Meta: + model = ProvinceAllowKillHouseDirectBuyingTotal + fields = ['key', 'allow'] + + +class ProvinceAllowKillHouseDirectBuyingSerializer(serializers.ModelSerializer): + kill_house = KillHouseForProvinceSerializer(read_only=True) + + class Meta: + model = ProvinceAllowKillHouseDirectBuying + fields = ['key', 'allow', 'kill_house', 'export_status'] + + +class ProvinceAllowKillHouseRegisterGuildsTotalSerializer(serializers.ModelSerializer): + class Meta: + model = ProvinceAllowKillHouseRegisterGuildsTotal + fields = ['key', 'allow'] + + +class ProvinceAllowKillHouseRegisterGuildsSerializer(serializers.ModelSerializer): + kill_house = KillHouseForProvinceSerializer(read_only=True) + + class Meta: + model = ProvinceAllowKillHouseRegisterGuilds + fields = ['key', 'allow', 'kill_house'] + + +class ObservatorySerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Observatory + fields = '__all__' + + +class PosVersiontSerializer(serializers.ModelSerializer): + class Meta: + model = PosVersion + fields = '__all__' + + +class PosItemSerializer(serializers.ModelSerializer): + class Meta: + model = PosItem + fields = '__all__' + + +class POSIdSerializer(serializers.ModelSerializer): + class Meta: + model = POSId + fields = '__all__' + + +class GuildRoomSerializer(serializers.ModelSerializer): + class Meta: + model = GuildRoom + fields = '__all__' + + +class POSMachineForInspectionSerializer(serializers.ModelSerializer): + guild_info = serializers.SerializerMethodField('get_guild_info') + ware_house_info = serializers.SerializerMethodField('get_ware_house_info') + + class Meta: + model = POSMachine + exclude = ('created_by', 'modified_by', 'user', 'pos_company', 'kill_house', 'guild', 'steward', 'create_date', + 'modify_date', 'trash') + + def get_guild_info(self, obj): + + return { + "fullname": obj.user.fullname, + "mobile": obj.user.mobile, + "city": obj.user.city.name, + "province": obj.user.province.name, + "guild_name": obj.guild.guilds_name, + } + + def get_ware_house_info(self, obj): + try: + ware_house = GuildsWareHouse.objects.get(guilds=obj.guild, trash=False) + return { + "quantity": ware_house.remain_total_number_of_carcasses, + "weight": ware_house.remain_total_weight_of_carcasses + } + except: + return { + "quantity": 0, + "weight": 0 + } + + +class PosDeviceVersionSerializer(serializers.ModelSerializer): + class Meta: + model = PosDeviceVersion + fields = '__all__' + + +class POSMachineSerializer(serializers.ModelSerializer): + class Meta: + model = POSMachine + fields = '__all__' + + +class NewPOSMachineSerializer(serializers.ModelSerializer): + owner = serializers.SerializerMethodField('get_owner') + company_name = serializers.CharField(source='pos_company.name', read_only=True) + + class Meta: + model = POSMachine + fields = '__all__' + + def get_owner(self, obj): + result = None + if obj.kill_house: + result = { + "type": "KillHouse", + "unit_name": obj.kill_house.name, + "fullname": obj.kill_house.kill_house_operator.user.fullname, + "mobile": obj.kill_house.kill_house_operator.user.mobile, + "license_number": '-', + "steward": '-', + } + + + elif obj.steward: + result = { + "type": "Steward", + "unit_name": obj.guild.guilds_name, + "fullname": obj.guild.user.fullname, + "mobile": obj.guild.user.mobile, + "license_number": obj.guild.license_number, + "steward": obj.guild.steward, + } + + + + + elif obj.guild: + result = { + "type": "Guilds", + "unit_name": obj.guild.guilds_name, + "fullname": obj.guild.user.fullname, + "mobile": obj.guild.user.mobile, + "license_number": obj.guild.license_number, + "steward": obj.guild.steward, + } + + else: + pass + return result + + +class POSMachineForLiveStockSerializer(serializers.ModelSerializer): + company_name = serializers.SerializerMethodField('get_company_name') + + class Meta: + model = POSMachine + fields = ['company_name', 'pos_id'] + + def get_company_name(self, obj): + return obj.pos_company.name + + +class POSDeviceSessionSerializer(serializers.ModelSerializer): + class Meta: + model = POSDeviceSession + fields = '__all__' + + +class POSMachineForInspectionsSerializer(serializers.ModelSerializer): + guild = GeneralGuildsForInspectionsSerializer(read_only=True) + products = serializers.SerializerMethodField('get_products') + transactions = serializers.SerializerMethodField('get_transactions') + + class Meta: + model = POSMachine + fields = ['key', 'pos_id', 'guild', 'products', 'transactions', 'create_date'] + + def get_products(self, obj): + products = RolesProducts.objects.filter(guild=obj.guild, trash=False).order_by('id') + serializer = RolesProductsForInspectionSerializer(products, many=True) + return serializer.data + + def get_transactions(self, obj): + transactions = PosMachineTransactions.objects.filter(pos=obj, paid=True, trash=False) + return len(transactions) + + +class POSMachineForTransactionInspectionsSerializer(serializers.ModelSerializer): + guild = GeneralGuildsForInspectionsSerializer(read_only=True) + + class Meta: + model = POSMachine + fields = ['key', 'pos_id', 'guild'] + + +class POSMachineForLiveStockTransactionsSerializer(serializers.ModelSerializer): + cooperative = CooperativeForSharesSerializer(read_only=True) + + class Meta: + model = POSMachine + fields = ['key', 'pos_id', 'cooperative'] + + +class POSDeviceSessionForInspectionSerializer(serializers.ModelSerializer): + pos = POSMachineForInspectionsSerializer(read_only=True) + + class Meta: + model = POSDeviceSession + fields = ['key', 'name', 'pos', 'version', 'session_last_seen_date', 'lng', 'lot'] + + +class POSMachineForServerSerializer(serializers.ModelSerializer): + class Meta: + model = POSMachine + fields = ['pos_id'] + + +class POSTransactionsSerializer(serializers.ModelSerializer): + class Meta: + model = POSTransactions + fields = '__all__' + + +class EvacuationPermitSerializer(serializers.ModelSerializer): + class Meta: + model = EvacuationPermit + fields = '__all__' + + +class SellForFreezingSerializer(serializers.ModelSerializer): + class Meta: + model = SellForFreezing + fields = ['permission'] + + +class LiveStockSupportSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = LiveStockSupport + fields = '__all__' + + +class ColdHouseForRplesSerializer(serializers.ModelSerializer): + sumation_status = serializers.SerializerMethodField('get_sumation_status') + + class Meta: + model = ColdHouse + fields = ['sumation_status', 'total_quantity', 'total_weight', 'name', 'key'] + + def get_sumation_status(self, obj): + allocations = ColdHouseAllocations.objects.filter(state='accepted', cold_house=obj, trash=False).order_by('id') + accepted_quantitys = allocations.aggregate(total=Sum('accepted_quantity'))['total'] or 0 + accepted_weights = allocations.aggregate(total=Sum('accepted_weight'))['total'] or 0 + obj.total_quantity = accepted_quantitys + obj.total_weight = accepted_weights + obj.save() + return "1" + + +class ColdHouseAllocationsSerializer(serializers.ModelSerializer): + cold_house = ColdHouseSerializer(read_only=True) + kill_house_request = KillHouseRequestForColdHouseAllocationsSerializer(read_only=True) + + class Meta: + model = ColdHouseAllocations + fields = '__all__' + + +class OperationLimitationSerializer(serializers.ModelSerializer): + class Meta: + model = OperationLimitation + exclude = ('id', 'key', 'create_date', 'modify_date', 'trash', 'created_by', 'modified_by') + + +class ApprovedPriceSerializer(serializers.ModelSerializer): + class Meta: + model = ApprovedPrice + exclude = ('id', 'key', 'create_date', 'modify_date', 'trash', 'created_by', 'modified_by') + + +class AnnouncementsSerializer(serializers.ModelSerializer): + class Meta: + model = Announcements + exclude = ('id', 'create_date', 'modify_date', 'trash', 'created_by', 'modified_by') + + +class PaymentGatewayPercentageSerializer(serializers.ModelSerializer): + class Meta: + model = PaymentGatewayPercentage + exclude = ('id', 'create_date', 'key', 'modify_date', 'trash', 'created_by', 'modified_by') + + +class TotalPaymentGatewayPercentageSerializer(serializers.ModelSerializer): + class Meta: + model = TotalPaymentGatewayPercentage + exclude = ('id', 'create_date', 'key', 'modify_date', 'trash', 'created_by', 'modified_by') + + +class ChickenAgeRangeSerializer(serializers.ModelSerializer): + class Meta: + model = ChickenAgeRange + fields = ['active', 'maximum', 'minimum'] + + +class TimeRangeSerializer(serializers.ModelSerializer): + class Meta: + model = TimeRange + exclude = ( + 'id', + 'key', + 'trash', + 'created_by', + 'modified_by', + 'create_date', + 'modify_date', + ) + + +class SystemWalletSerializer(serializers.ModelSerializer): + sumation_status = serializers.SerializerMethodField('get_sumation_status') + + class Meta: + model = SystemWallet + exclude = ( + 'id', + 'key', + 'trash', + 'created_by', + 'modified_by', + 'create_date', + 'modify_date' + ) + + def get_sumation_status(self, obj): + status = 0 + if obj.kill_house != None: + transactions = ExternalTransaction.objects.filter(transaction_type='wallet', + kill_house_user=obj.kill_house.kill_house_operator.user, + status='completed', + trash=False).order_by( + 'id') + deposit_transactions = transactions.filter(type='deposit') + withdraw_transactions = transactions.filter(type='withdraw') + deposit = deposit_transactions.aggregate(total=Sum('amount'))['total'] or 0 + withdraw = withdraw_transactions.aggregate(total=Sum('amount'))['total'] or 0 + total = deposit - withdraw if (deposit - withdraw) > 0 else 0 + + obj.balance = total + obj.save() + status = 1 + return status + + +class ShareTypeSerializer(serializers.ModelSerializer): + class Meta: + model = ShareType + exclude = ( + 'trash', + 'created_by', + 'modified_by', + 'create_date', + 'modify_date', + ) + + +class PercentageForWageTypeSerializer(serializers.ModelSerializer): + name = serializers.SerializerMethodField('get_share_name') + + class Meta: + model = PercentageOfWageType + exclude = ( + 'id', + 'trash', + 'created_by', + 'modified_by', + 'create_date', + 'modify_date', + 'wage_type' + ) + + def get_share_name(self, obj): + return obj.share_type.name + + +class WageTypeForPoultryOutProvinceRequestSerializer(serializers.ModelSerializer): + class Meta: + model = WageType + exclude = ( + 'id', + 'name', + 'en_name', + 'amount', + 'key', + 'trash', + 'created_by', + 'modified_by', + 'create_date', + 'modify_date' + ) + + +class WageTypeSerializer(serializers.ModelSerializer): + percentages = serializers.SerializerMethodField('get_percentages') + + class Meta: + model = WageType + exclude = ( + 'id', + 'trash', + 'created_by', + 'modified_by', + 'create_date', + 'modify_date' + ) + + def get_percentages(self, obj): + percentages = PercentageOfWageType.objects.filter(wage_type=obj, trash=False).order_by('id') + serializer = PercentageForWageTypeSerializer(percentages, many=True) + return serializer.data + + +class PercentageOfWageTypeSerializer(serializers.ModelSerializer): + wage_type = WageTypeSerializer(read_only=True) + + class Meta: + model = PercentageOfWageType + fields = '__all__' + + +class SubSectorPercentageOfWageTypeSerializer(serializers.ModelSerializer): + percentage_of_wage_type = PercentageOfWageTypeSerializer(read_only=True) + + class Meta: + model = SubSectorPercentageOfWageType + fields = '__all__' + + +class InternalTransactionSerializer(serializers.ModelSerializer): + kill_house = KillHouseForKillHouseVetKillHouseSerializer(read_only=True) + parent_kill_house = KillHouseForKillHouseVetKillHouseSerializer(read_only=True) + chain_company = ChainCompanySerializer(read_only=True) + poultry_request = PoultryRequestForAutoAllocationSerializer(read_only=True, many=True) + poultry = PoultryForPoultryRequestLetterSerializer(read_only=True) + out_province_poultry_request_buyer = OutProvincePoultryRequestBuyerSerializer(read_only=True) + payer_info = serializers.SerializerMethodField('get_payer_info') + transaction_amount = serializers.SerializerMethodField('get_total_wage_pay') + union_info = serializers.SerializerMethodField('get_union_info') + + class Meta: + model = InternalTransaction + fields = '__all__' + + def get_payer_info(self, obj): + fullname = None + mobile = None + if obj.kill_house != None: + fullname = obj.kill_house.kill_house_operator.user.fullname + mobile = obj.kill_house.kill_house_operator.user.mobile + elif obj.out_province_poultry_request_buyer != None: + fullname = obj.out_province_poultry_request_buyer.user.fullname + mobile = obj.out_province_poultry_request_buyer.user.mobile + elif obj.chain_company != None: + fullname = obj.chain_company.user.fullname + mobile = obj.chain_company.user.mobile + + else: + fullname = obj.user.fullname + mobile = obj.user.mobile + + return { + "fullname": fullname, + "mobile": mobile + } + + def get_total_wage_pay(self, obj): + role = self.context.get('request').GET['role'] + + # if role == 'ProvinceOperator': + # amout = obj.union_share + # elif role == 'Company': + # amout = obj.company_share + # elif role == 'Guilds': + # amout = obj.guilds_share + # elif role == 'SuperAdmin': + # amout = obj.amount - obj.other_share + # else: + # amout = obj.amount + + return obj.amount + + def get_union_info(self, obj): + user = SystemUserProfile.objects.filter(role__name='ProvinceOperator', trash=False).first() + serializer = SystemUserProfileForFactorSerializer(user) + return serializer.data + + +class PoultryOutRequestInternalTransactionSerializer(serializers.ModelSerializer): + poultry_request = PoultryRequestForOutRequestTransactionsSerializer(read_only=True, many=True) + poultry = PoultryForPoultryRequestLetterSerializer(read_only=True) + out_province_poultry_request_buyer = OutProvincePoultryRequestBuyerSerializer(read_only=True) + payer_info = serializers.SerializerMethodField('get_payer_info') + + class Meta: + model = InternalTransaction + fields = '__all__' + + def get_payer_info(self, obj): + fullname = None + mobile = None + if obj.kill_house != None: + fullname = obj.kill_house.kill_house_operator.user.fullname + mobile = obj.kill_house.kill_house_operator.user.mobile + elif obj.out_province_poultry_request_buyer != None: + fullname = obj.out_province_poultry_request_buyer.user.fullname + mobile = obj.out_province_poultry_request_buyer.user.mobile + elif obj.chain_company != None: + fullname = obj.chain_company.user.fullname + mobile = obj.chain_company.user.mobile + + else: + fullname = obj.user.fullname + mobile = obj.user.mobile + + return { + "fullname": fullname, + "mobile": mobile + } + + +# class TotalWageInformationSerializer(serializers.ModelSerializer): +# wage_info = serializers.SerializerMethodField('get_wage_info') +# +# class Meta: +# model = TotalWageInformation +# fields = ['key', 'wage_info'] +# +# def get_wage_info(self, obj): +# +# total_weight = 0 +# total_wage = 0 +# total_paid_wage = 0 +# total_unpaid_wage = 0 +# union_total_weight = 0 +# union_total_wage = 0 +# union_total_paid_wage = 0 +# union_total_unpaid_wage = 0 +# union_province_kill_request_total_wage = 0 +# union_poultry_request_out_total_wage = 0 +# freezing_union_province_kill_request_total_wage = 0 +# union_kill_house_free_live_bar_total_wage = 0 +# union_kill_house_free_carcases_bar_total_wage = 0 +# union_chain_allocation_total_wage = 0 +# union_province_kill_request_total_weight = 0 +# union_poultry_request_out_total_weight = 0 +# freezing_union_province_kill_request_total_weight = 0 +# union_kill_house_free_live_bar_total_weight = 0 +# union_kill_house_free_carcases_bar_total_weight = 0 +# union_chain_allocation_total_weight = 0 +# +# company_total_weight = 0 +# company_total_wage = 0 +# company_total_paid_wage = 0 +# company_total_unpaid_wage = 0 +# company_province_kill_request_total_wage = 0 +# freezing_company_province_kill_request_total_wage = 0 +# company_kill_house_free_live_bar_total_wage = 0 +# company_kill_house_free_carcases_bar_total_wage = 0 +# company_chain_allocation_total_wage = 0 +# company_province_kill_request_total_weight = 0 +# freezing_company_province_kill_request_total_weight = 0 +# company_kill_house_free_live_bar_total_weight = 0 +# company_kill_house_free_carcases_bar_total_weight = 0 +# company_chain_allocation_total_weight = 0 +# company_poultry_request_out_total_wage = 0 +# company_poultry_request_out_total_weight = 0 +# +# guilds_total_weight = 0 +# guilds_total_wage = 0 +# guilds_total_paid_wage = 0 +# guilds_total_unpaid_wage = 0 +# guilds_province_kill_request_total_wage = 0 +# freezing_guilds_province_kill_request_total_wage = 0 +# guilds_kill_house_free_live_bar_total_wage = 0 +# guilds_kill_house_free_carcases_bar_total_wage = 0 +# guilds_chain_allocation_total_wage = 0 +# guilds_province_kill_request_total_weight = 0 +# freezing_guilds_province_kill_request_total_weight = 0 +# guilds_kill_house_free_live_bar_total_weight = 0 +# guilds_kill_house_free_carcases_bar_total_weight = 0 +# guilds_chain_allocation_total_weight = 0 +# guilds_poultry_request_out_total_wage = 0 +# guilds_poultry_request_out_total_weight = 0 +# province_kill_request_total_wage = 0 +# province_kill_request_total_weight = 0 +# poultry_request_out_total_wage = 0 +# poultry_request_out_total_weight = 0 +# freezing_province_kill_requests_total_wage = 0 +# freezing_province_kill_requests_total_weight = 0 +# chain_total_wage = 0 +# chain_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 +# role = self.context.get('request').GET['role'] +# user = SystemUserProfile.objects.get(user=self.context.get('request').user) +# if role == 'KillHouse': +# kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() +# province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, +# state__in=('pending', 'accepted'), trash=False, +# return_to_province=False, +# first_car_allocated_quantity=0, +# archive_wage=False, +# ) +# freezing_province_kill_requests = province_kill_requests.filter( +# province_request__poultry_request__freezing=True) +# +# 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 +# ) +# freezing_kill_house_requests = kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=True) +# +# # kill_house_requests = KillHouseRequest.objects.filter( +# # killer=kill_house, archive_wage=False,killer__isnull=False, +# # trash=False +# # ).exclude( +# # province_kill_request__in=province_kill_requests +# # ) +# +# free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, archive_wage=False, +# trash=False) +# free_bars_live = free_bars.filter(buy_type='live', trash=False) +# free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False) +# province_kill_requests_total_wage = \ +# province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( +# total=Sum('total_wage_amount'))[ +# 'total'] or 0 +# freezing_province_kill_request_total_wage = \ +# freezing_province_kill_requests.aggregate(total=Sum('total_wage_amount'))['total'] or 0 +# +# total_wage += province_kill_requests_total_wage + freezing_province_kill_request_total_wage +# province_kill_requests_total_weight = \ +# province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# freezing_province_kill_request_total_weight = \ +# freezing_province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 +# total_weight += province_kill_requests_total_weight + freezing_province_kill_request_total_weight +# kill_house_reqest_total_wage = \ +# kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ +# 'total'] or 0 +# freezing_kill_house_reqest_total_wage = \ +# freezing_kill_house_requests.aggregate( +# total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ +# 'total'] or 0 +# total_wage += kill_house_reqest_total_wage + freezing_kill_house_reqest_total_wage +# +# kill_house_reqest_total_weight = kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# freezing_kill_house_reqest_total_weight = \ +# freezing_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# total_weight += kill_house_reqest_total_weight + freezing_kill_house_reqest_total_weight +# +# free_bars_live_total_wage = free_bars_live.aggregate(total=Sum('total_wage_amount'))[ +# 'total'] or 0 +# total_wage += free_bars_live_total_wage +# free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ +# 'total'] or 0 +# total_weight += free_bars_live_total_weight +# free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum('total_wage_amount'))[ +# 'total'] or 0 +# total_wage += free_bars_carcases_total_wage +# free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ +# 'total'] or 0 +# total_weight += free_bars_carcases_total_weight +# +# 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 +# +# return { +# "total_weight": total_weight, +# "total_wage": total_wage, +# "total_paid_wage": total_paid_wage, +# "total_unpaid_wage": total_wage - total_paid_wage, +# "province_kill_requests_total_wage": province_kill_requests_total_wage + kill_house_reqest_total_wage, +# "province_kill_requests_total_weight": province_kill_requests_total_weight + kill_house_reqest_total_weight, +# "freezing_province_kill_requests_total_wage": freezing_province_kill_request_total_wage + freezing_kill_house_reqest_total_wage, +# "freezing_province_kill_requests_total_weight": freezing_province_kill_request_total_weight + freezing_kill_house_reqest_total_weight, +# "free_bars_live_total_wage": free_bars_live_total_wage, +# "free_bars_live_total_weight": free_bars_live_total_weight, +# "free_bars_carcases_total_wage": free_bars_carcases_total_wage, +# "free_bars_carcases_total_weight": free_bars_carcases_total_weight, +# } +# elif role == 'ChainCompany': +# chain_company = ChainCompany.objects.get(user=user, trash=False) +# chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, state='accepted', +# trash=False) +# chain_allocations_total_wage = chain_allocations.aggregate(total=Sum('total_wage_amount'))[ +# 'total'] or 0 +# total_wage += chain_allocations_total_wage +# chain_allocations_total_weight = chain_allocations.aggregate(total=Sum('weight'))[ +# 'total'] or 0 +# total_weight += chain_allocations_total_weight +# +# chain_company_transactions = InternalTransaction.objects.filter(chain_company=chain_company, +# status='completed', trash=False) +# total_paid_wage += chain_company_transactions.aggregate(total=Sum('amount'))[ +# 'total'] or 0 +# +# return { +# "total_weight": total_weight, +# "total_wage": total_wage, +# "chain_allocations_total_wage": chain_allocations_total_wage, +# "chain_allocations_total_weight": chain_allocations_total_weight, +# "total_paid_wage": total_paid_wage, +# "total_unpaid_wage": total_wage - total_paid_wage +# } +# +# else: +# +# if role == 'ProvinceOperator': +# type = 'union_share' +# share_type = 'union_share' +# out_poultry_requests = PoultryRequest.objects.filter(out=True, trash=False, wage_pay=True, +# union_share__gt=0) +# poultry_request_out_total_weight = \ +# out_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ +# 'total'] or 0 +# poultry_request_out_total_wage = out_poultry_requests.aggregate( +# total=Sum( +# ((F('quantity') * F('Index_weight')) * F('wage')) * ( +# F('union_share_percent') / 100)))[ +# 'total'] or 0 +# province_kill_requests = ProvinceKillRequest.objects.filter( +# state__in=('pending', 'accepted'), trash=False, +# first_car_allocated_quantity=0, +# return_to_province=False, archive_wage=False, union_share__gt=0) +# freezing_province_kill_requests = province_kill_requests.filter( +# province_request__poultry_request__freezing=True) +# kill_house_requests = KillHouseRequest.objects.filter(trash=False, archive_wage=False, +# province_kill_request__union_share__gt=0) +# freezing_kill_house_requests = kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=True) +# +# chain_allocations = ChainAllocation.objects.filter(union_share__gt=0, state='accepted', trash=False) +# free_bars = KillHouseFreeBarInformation.objects.filter(union_share__gt=0, archive_wage=False, +# trash=False) +# +# province_kill_requests_total_weight = \ +# province_kill_requests.aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# freezing_province_kill_requests_total_weight = \ +# freezing_province_kill_requests.aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# province_kill_requests_total_weight += \ +# kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# freezing_province_kill_requests_total_weight += \ +# freezing_kill_house_requests.aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# total_weight += province_kill_requests_total_weight + freezing_province_kill_requests_total_weight + poultry_request_out_total_weight +# +# province_kill_requests_total_wage = \ +# province_kill_requests.filter( +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('union_share'))[ +# 'total'] or 0 +# province_kill_requests_total_wage += \ +# kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__union_share_percent') / 100)))[ +# 'total'] or 0 +# +# freezing_province_kill_requests_total_wage = \ +# freezing_province_kill_requests.aggregate(total=Sum('union_share'))[ +# 'total'] or 0 +# freezing_province_kill_requests_total_wage += \ +# freezing_kill_house_requests.aggregate(total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__union_share_percent') / 100)))[ +# 'total'] or 0 +# total_wage += province_kill_requests_total_wage + freezing_province_kill_requests_total_wage + poultry_request_out_total_wage +# +# free_bars_live = free_bars.filter(buy_type='live', trash=False) +# free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False) +# +# chain_allocations_total_wage = chain_allocations.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += chain_allocations_total_wage +# chain_allocations_total_weight = chain_allocations.aggregate(total=Sum('weight'))[ +# 'total'] or 0 +# total_weight += chain_allocations_total_weight +# free_bars_live_total_wage = free_bars_live.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += free_bars_live_total_wage +# free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ +# 'total'] or 0 +# total_weight += free_bars_live_total_weight +# free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += free_bars_carcases_total_wage +# free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ +# 'total'] or 0 +# total_weight += free_bars_carcases_total_weight +# slaughter_transactions = InternalTransaction.objects.filter(payer_type='kill_house', status='completed', +# union_share__gt=0, +# trash=False) +# +# total_paid_wage += slaughter_transactions.aggregate(total=Sum(share_type))[ +# 'total'] or 0 +# chain_company_transactions = InternalTransaction.objects.filter(payer_type='chain_company', +# status='completed', union_share__gt=0, +# trash=False) +# total_paid_wage += chain_company_transactions.aggregate(total=Sum(share_type))[ +# 'total'] or 0 +# +# +# +# elif role == 'Guilds': +# type = 'guilds_share' +# share_type = 'guilds_share' +# out_poultry_requests = PoultryRequest.objects.filter(out=True, trash=False, wage_pay=True, +# guilds_share__gt=0) +# poultry_request_out_total_weight = \ +# out_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ +# 'total'] or 0 +# poultry_request_out_total_wage = out_poultry_requests.aggregate( +# total=Sum( +# ((F('quantity') * F('Index_weight')) * F('wage')) * ( +# F('guilds_share_percent') / 100)))[ +# 'total'] or 0 +# province_kill_requests = ProvinceKillRequest.objects.filter( +# state__in=('pending', 'accepted'), trash=False, +# first_car_allocated_quantity=0, +# +# return_to_province=False, archive_wage=False, guilds_share__gt=0) +# freezing_province_kill_requests = province_kill_requests.filter( +# province_request__poultry_request__freezing=True) +# +# kill_house_requests = KillHouseRequest.objects.filter(trash=False, archive_wage=False, +# province_kill_request__guilds_share__gt=0) +# freezing_kill_house_requests = kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=True) +# +# chain_allocations = ChainAllocation.objects.filter(guilds_share__gt=0, state='accepted', trash=False) +# free_bars = KillHouseFreeBarInformation.objects.filter(guilds_share__gt=0, archive_wage=False, +# trash=False) +# +# province_kill_requests_total_weight = \ +# province_kill_requests.filter( +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# freezing_province_kill_requests_total_weight = \ +# freezing_province_kill_requests.aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# province_kill_requests_total_weight += \ +# kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# freezing_province_kill_requests_total_weight += \ +# freezing_kill_house_requests.aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# total_weight += province_kill_requests_total_weight + freezing_province_kill_requests_total_weight + poultry_request_out_total_weight +# +# province_kill_requests_total_wage = \ +# province_kill_requests.filter( +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('union_share'))[ +# 'total'] or 0 +# province_kill_requests_total_wage += \ +# kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__guilds_share_percent') / 100)))[ +# 'total'] or 0 +# +# freezing_province_kill_requests_total_wage = \ +# freezing_province_kill_requests.aggregate(total=Sum('guilds_share'))[ +# 'total'] or 0 +# freezing_province_kill_requests_total_wage += \ +# freezing_kill_house_requests.aggregate(total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__guilds_share_percent') / 100)))[ +# 'total'] or 0 +# total_wage += province_kill_requests_total_wage + freezing_province_kill_requests_total_wage + poultry_request_out_total_wage +# +# free_bars_live = free_bars.filter(buy_type='live', trash=False) +# free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False) +# +# chain_allocations_total_wage = chain_allocations.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += chain_allocations_total_wage +# chain_allocations_total_weight = chain_allocations.aggregate(total=Sum('weight'))[ +# 'total'] or 0 +# total_weight += chain_allocations_total_weight +# free_bars_live_total_wage = free_bars_live.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += free_bars_live_total_wage +# free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ +# 'total'] or 0 +# total_weight += free_bars_live_total_weight +# free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += free_bars_carcases_total_wage +# free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ +# 'total'] or 0 +# total_weight += free_bars_carcases_total_weight +# slaughter_transactions = InternalTransaction.objects.filter(payer_type='kill_house', status='completed', +# guilds_share__gt=0, +# trash=False) +# +# total_paid_wage += slaughter_transactions.aggregate(total=Sum(share_type))[ +# 'total'] or 0 +# chain_company_transactions = InternalTransaction.objects.filter(payer_type='chain_company', +# status='completed', guilds_share__gt=0, +# trash=False) +# total_paid_wage += chain_company_transactions.aggregate(total=Sum(share_type))[ +# 'total'] or 0 +# +# +# elif role == 'Company': +# type = 'company_share' +# share_type = 'company_share' +# out_poultry_requests = PoultryRequest.objects.filter(out=True, trash=False, wage_pay=True, +# company_share__gt=0) +# poultry_request_out_total_weight = \ +# out_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ +# 'total'] or 0 +# poultry_request_out_total_wage = out_poultry_requests.aggregate( +# total=Sum( +# ((F('quantity') * F('Index_weight')) * F('wage')) * ( +# F('company_share_percent') / 100)))[ +# 'total'] or 0 +# province_kill_requests = ProvinceKillRequest.objects.filter( +# state__in=('pending', 'accepted'), trash=False, +# first_car_allocated_quantity=0, +# return_to_province=False, archive_wage=False, company_share__gt=0) +# freezing_province_kill_requests = province_kill_requests.filter( +# province_request__poultry_request__freezing=True) +# +# kill_house_requests = KillHouseRequest.objects.filter(trash=False, archive_wage=False, +# province_kill_request__company_share__gt=0) +# freezing_kill_house_requests = kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=True) +# +# chain_allocations = ChainAllocation.objects.filter(company_share__gt=0, state='accepted', trash=False) +# free_bars = KillHouseFreeBarInformation.objects.filter(company_share__gt=0, archive_wage=False, +# trash=False) +# +# province_kill_requests_total_weight = \ +# province_kill_requests.filter( +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# freezing_province_kill_requests_total_weight = \ +# freezing_province_kill_requests.aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# province_kill_requests_total_weight += \ +# kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# freezing_province_kill_requests_total_weight += \ +# freezing_kill_house_requests.aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# total_weight += province_kill_requests_total_weight + freezing_province_kill_requests_total_weight + poultry_request_out_total_weight +# +# province_kill_requests_total_wage = \ +# province_kill_requests.filter( +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('union_share'))[ +# 'total'] or 0 +# province_kill_requests_total_wage += \ +# kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__company_share_percent') / 100)))[ +# 'total'] or 0 +# +# freezing_province_kill_requests_total_wage = \ +# freezing_province_kill_requests.aggregate(total=Sum('company_share'))[ +# 'total'] or 0 +# freezing_province_kill_requests_total_wage += \ +# freezing_kill_house_requests.aggregate(total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__company_share_percent') / 100)))[ +# 'total'] or 0 +# total_wage += province_kill_requests_total_wage + freezing_province_kill_requests_total_wage + poultry_request_out_total_wage +# +# free_bars_live = free_bars.filter(buy_type='live', trash=False) +# free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False) +# +# chain_allocations_total_wage = chain_allocations.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += chain_allocations_total_wage +# chain_allocations_total_weight = chain_allocations.aggregate(total=Sum('weight'))[ +# 'total'] or 0 +# total_weight += chain_allocations_total_weight +# free_bars_live_total_wage = free_bars_live.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += free_bars_live_total_wage +# free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ +# 'total'] or 0 +# total_weight += free_bars_live_total_weight +# free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += free_bars_carcases_total_wage +# free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ +# 'total'] or 0 +# total_weight += free_bars_carcases_total_weight +# slaughter_transactions = InternalTransaction.objects.filter(payer_type='kill_house', status='completed', +# company_share__gt=0, +# trash=False) +# +# total_paid_wage += slaughter_transactions.aggregate(total=Sum(share_type))[ +# 'total'] or 0 +# chain_company_transactions = InternalTransaction.objects.filter(payer_type='chain_company', +# status='completed', company_share__gt=0, +# trash=False) +# total_paid_wage += chain_company_transactions.aggregate(total=Sum(share_type))[ +# 'total'] or 0 +# +# +# else: +# type = 'total_wage_amount' +# share_type = 'amount' +# out_poultry_requests = PoultryRequest.objects.filter(out=True, trash=False, wage_pay=True) +# poultry_request_out_total_weight = \ +# out_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ +# 'total'] or 0 +# poultry_request_out_total_wage = out_poultry_requests.aggregate( +# total=Sum( +# (F('quantity') * F('Index_weight')) * F('wage')))[ +# 'total'] or 0 +# province_kill_requests = ProvinceKillRequest.objects.filter( +# state__in=('pending', 'accepted'), trash=False, archive_wage=False, +# first_car_allocated_quantity=0, +# return_to_province=False) +# freezing_province_kill_requests = province_kill_requests.filter( +# province_request__poultry_request__freezing=True) +# +# kill_house_requests = KillHouseRequest.objects.filter(trash=False, archive_wage=False) +# freezing_kill_house_requests = kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=True) +# +# chain_allocations = ChainAllocation.objects.filter(trash=False, state='accepted') +# free_bars = KillHouseFreeBarInformation.objects.filter(archive_wage=False, trash=False) +# total_slaughter_transactions = InternalTransaction.objects.filter(payer_type='kill_house', +# status='completed', +# trash=False) +# total_chain_company_transactions = InternalTransaction.objects.filter(payer_type='chain_company', +# status='completed', trash=False) +# +# province_kill_requests_total_weight = \ +# province_kill_requests.filter( +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# freezing_province_kill_requests_total_weight = \ +# freezing_province_kill_requests.aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# province_kill_requests_total_weight += \ +# kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# freezing_province_kill_requests_total_weight += \ +# freezing_kill_house_requests.aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# total_weight += province_kill_requests_total_weight + freezing_province_kill_requests_total_weight + poultry_request_out_total_weight +# +# province_kill_requests_total_wage = \ +# province_kill_requests.filter( +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('union_share'))[ +# 'total'] or 0 +# province_kill_requests_total_wage += \ +# kill_house_requests.filter( +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ +# 'total'] or 0 +# +# freezing_province_kill_requests_total_wage = \ +# freezing_province_kill_requests.aggregate(total=Sum(type))[ +# 'total'] or 0 +# freezing_province_kill_requests_total_wage += \ +# freezing_kill_house_requests.aggregate( +# total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ +# 'total'] or 0 +# total_wage += province_kill_requests_total_wage + freezing_province_kill_requests_total_wage + poultry_request_out_total_wage +# +# free_bars_live = free_bars.filter(buy_type='live', trash=False) +# free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False) +# +# chain_allocations_total_wage = chain_allocations.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += chain_allocations_total_wage +# chain_allocations_total_weight = chain_allocations.aggregate(total=Sum('weight'))[ +# 'total'] or 0 +# total_weight += chain_allocations_total_weight +# free_bars_live_total_wage = free_bars_live.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += free_bars_live_total_wage +# free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ +# 'total'] or 0 +# total_weight += free_bars_live_total_weight +# free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum(type))[ +# 'total'] or 0 +# total_wage += free_bars_carcases_total_wage +# free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ +# 'total'] or 0 +# total_weight += free_bars_carcases_total_weight +# slaughter_transactions = InternalTransaction.objects.filter(payer_type='kill_house', status='completed', +# trash=False) +# +# total_paid_wage += slaughter_transactions.aggregate(total=Sum(share_type))[ +# 'total'] or 0 +# chain_company_transactions = InternalTransaction.objects.filter(payer_type='chain_company', +# status='completed', +# trash=False) +# total_paid_wage += chain_company_transactions.aggregate(total=Sum(share_type))[ +# 'total'] or 0 +# +# union_poultry_request_out_total_weight = \ +# out_poultry_requests.filter(union_share__gt=0).aggregate(total=Sum(F('quantity') * F('Index_weight')))[ +# 'total'] or 0 +# union_poultry_request_out_total_wage = out_poultry_requests.aggregate( +# total=Sum( +# ((F('quantity') * F('Index_weight')) * F('wage')) * ( +# F('union_share_percent') / 100)))[ +# 'total'] or 0 +# +# union_province_kill_request_total_weight = \ +# province_kill_requests.filter(union_share__gt=0, +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# freezing_union_province_kill_request_total_weight = \ +# freezing_province_kill_requests.filter(union_share__gt=0).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# union_province_kill_request_total_weight += \ +# kill_house_requests.filter(province_kill_request__union_share__gt=0, +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# freezing_union_province_kill_request_total_weight += \ +# freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# union_province_kill_request_total_wage = \ +# province_kill_requests.filter(union_share__gt=0, +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('union_share'))[ +# 'total'] or 0 +# union_province_kill_request_total_wage += \ +# kill_house_requests.filter(province_kill_request__union_share__gt=0, +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__union_share_percent') / 100)))[ +# 'total'] or 0 +# +# freezing_union_province_kill_request_total_wage = \ +# freezing_province_kill_requests.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ +# 'total'] or 0 +# freezing_union_province_kill_request_total_wage += \ +# freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate(total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__union_share_percent') / 100)))[ +# 'total'] or 0 +# union_chain_allocation_total_weight = \ +# chain_allocations.filter(union_share__gt=0).aggregate(total=Sum('weight'))[ +# 'total'] or 0 +# union_chain_allocation_total_wage = \ +# chain_allocations.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ +# 'total'] or 0 +# union_kill_house_free_live_bar_total_weight = \ +# free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('live_weight'))[ +# 'total'] or 0 +# union_kill_house_free_live_bar_total_wage = \ +# free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('union_share'))[ +# 'total'] or 0 +# +# union_kill_house_free_carcases_bar_total_weight = \ +# free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('weight_of_carcasses'))[ +# 'total'] or 0 +# union_kill_house_free_carcases_bar_total_wage = \ +# free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('union_share'))[ +# 'total'] or 0 +# union_total_paid_wage += \ +# total_slaughter_transactions.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ +# 'total'] or 0 +# union_total_paid_wage += \ +# total_chain_company_transactions.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ +# 'total'] or 0 +# union_total_weight = union_province_kill_request_total_weight + freezing_union_province_kill_request_total_weight + union_chain_allocation_total_weight + union_kill_house_free_live_bar_total_weight + union_kill_house_free_carcases_bar_total_weight + union_poultry_request_out_total_weight +# union_total_wage = union_province_kill_request_total_wage + freezing_union_province_kill_request_total_wage + union_chain_allocation_total_wage + union_kill_house_free_live_bar_total_wage + union_kill_house_free_carcases_bar_total_wage +# union_total_unpaid_wage = union_total_wage - ( +# union_total_paid_wage + union_poultry_request_out_total_wage) +# +# company_poultry_request_out_total_weight = \ +# out_poultry_requests.filter(company_share__gt=0).aggregate( +# total=Sum(F('quantity') * F('Index_weight')))[ +# 'total'] or 0 +# company_poultry_request_out_total_wage = out_poultry_requests.filter(company_share__gt=0).aggregate( +# total=Sum( +# ((F('quantity') * F('Index_weight')) * F('wage')) * ( +# F('company_share_percent') / 100)))[ +# 'total'] or 0 +# +# company_province_kill_request_total_weight = \ +# province_kill_requests.filter(company_share__gt=0, +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# company_province_kill_request_total_weight += \ +# kill_house_requests.filter(province_kill_request__company_share__gt=0, +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# freezing_company_province_kill_request_total_weight = \ +# freezing_province_kill_requests.filter(company_share__gt=0).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# freezing_company_province_kill_request_total_weight += \ +# freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# company_province_kill_request_total_wage = \ +# province_kill_requests.filter(company_share__gt=0, +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('company_share'))[ +# 'total'] or 0 +# company_province_kill_request_total_wage += \ +# kill_house_requests.filter(province_kill_request__company_share__gt=0, +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__company_share_percent') / 100)))[ +# 'total'] or 0 +# freezing_company_province_kill_request_total_wage = \ +# freezing_province_kill_requests.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ +# 'total'] or 0 +# freezing_company_province_kill_request_total_wage += \ +# freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate(total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__company_share_percent') / 100)))[ +# 'total'] or 0 +# company_chain_allocation_total_weight = \ +# chain_allocations.filter(company_share__gt=0).aggregate(total=Sum('weight'))[ +# 'total'] or 0 +# company_chain_allocation_total_wage = \ +# chain_allocations.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ +# 'total'] or 0 +# company_kill_house_free_live_bar_total_weight = \ +# free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('live_weight'))[ +# 'total'] or 0 +# company_kill_house_free_live_bar_total_wage = \ +# free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('company_share'))[ +# 'total'] or 0 +# +# company_kill_house_free_carcases_bar_total_weight = \ +# free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate( +# total=Sum('weight_of_carcasses'))[ +# 'total'] or 0 +# company_kill_house_free_carcases_bar_total_wage = \ +# free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate(total=Sum('company_share'))[ +# 'total'] or 0 +# company_total_paid_wage += \ +# total_slaughter_transactions.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ +# 'total'] or 0 +# company_total_paid_wage += \ +# total_chain_company_transactions.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ +# 'total'] or 0 +# company_total_weight = company_province_kill_request_total_weight + freezing_company_province_kill_request_total_weight + company_chain_allocation_total_weight + company_kill_house_free_live_bar_total_weight + company_kill_house_free_carcases_bar_total_weight + company_poultry_request_out_total_weight +# company_total_wage = company_province_kill_request_total_wage + freezing_company_province_kill_request_total_wage + company_chain_allocation_total_wage + company_kill_house_free_live_bar_total_wage + company_kill_house_free_carcases_bar_total_wage +# company_total_unpaid_wage = company_total_wage - (company_total_paid_wage + company_poultry_request_out_total_wage) +# +# +# guilds_poultry_request_out_total_weight = \ +# out_poultry_requests.filter(guilds_share__gt=0).aggregate( +# total=Sum(F('quantity') * F('Index_weight')))[ +# 'total'] or 0 +# guilds_poultry_request_out_total_wage = out_poultry_requests.filter(guilds_share__gt=0).aggregate( +# total=Sum( +# ((F('quantity') * F('Index_weight')) * F('wage')) * ( +# F('guilds_share_percent') / 100)))[ +# 'total'] or 0 +# +# +# guilds_province_kill_request_total_weight = \ +# province_kill_requests.filter(guilds_share__gt=0, +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# guilds_province_kill_request_total_weight += \ +# kill_house_requests.filter(province_kill_request__guilds_share__gt=0, +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# +# freezing_guilds_province_kill_request_total_weight = \ +# freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate( +# total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# freezing_guilds_province_kill_request_total_weight += \ +# freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate( +# total=Sum('accepted_real_weight'))[ +# 'total'] or 0 +# guilds_province_kill_request_total_wage = \ +# province_kill_requests.filter(guilds_share__gt=0, +# province_request__poultry_request__freezing=False).aggregate( +# total=Sum('guilds_share'))[ +# 'total'] or 0 +# guilds_province_kill_request_total_wage += \ +# kill_house_requests.filter(province_kill_request__guilds_share__gt=0, +# province_kill_request__province_request__poultry_request__freezing=False).aggregate( +# total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__guilds_share_percent') / 100)))[ +# 'total'] or 0 +# freezing_guilds_province_kill_request_total_wage = \ +# freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ +# 'total'] or 0 +# freezing_guilds_province_kill_request_total_wage += \ +# freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate(total=Sum( +# F('accepted_real_weight') * F('province_kill_request__wage') * ( +# F('province_kill_request__guilds_share_percent') / 100)))[ +# 'total'] or 0 +# guilds_chain_allocation_total_weight = \ +# chain_allocations.filter(guilds_share__gt=0).aggregate(total=Sum('weight'))[ +# 'total'] or 0 +# guilds_chain_allocation_total_wage = \ +# chain_allocations.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ +# 'total'] or 0 +# guilds_kill_house_free_live_bar_total_weight = \ +# free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('live_weight'))[ +# 'total'] or 0 +# guilds_kill_house_free_live_bar_total_wage = \ +# free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ +# 'total'] or 0 +# +# guilds_kill_house_free_carcases_bar_total_weight = \ +# free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate( +# total=Sum('weight_of_carcasses'))[ +# 'total'] or 0 +# guilds_kill_house_free_carcases_bar_total_wage = \ +# free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ +# 'total'] or 0 +# guilds_total_paid_wage += \ +# total_slaughter_transactions.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ +# 'total'] or 0 +# guilds_total_paid_wage += \ +# total_chain_company_transactions.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ +# 'total'] or 0 +# guilds_total_weight = guilds_province_kill_request_total_weight + freezing_guilds_province_kill_request_total_weight + guilds_chain_allocation_total_weight + guilds_kill_house_free_live_bar_total_weight + guilds_kill_house_free_carcases_bar_total_weight + guilds_poultry_request_out_total_weight +# guilds_total_wage = guilds_province_kill_request_total_wage + freezing_guilds_province_kill_request_total_wage + guilds_chain_allocation_total_wage + guilds_kill_house_free_live_bar_total_wage + guilds_kill_house_free_carcases_bar_total_wage +# guilds_total_unpaid_wage = guilds_total_wage - (guilds_total_paid_wage + guilds_poultry_request_out_total_wage) +# +# if role == 'SuperAdmin': +# return { +# "total_weight": total_weight, +# "total_wage": total_wage, +# "total_paid_wage": total_paid_wage, +# "total_unpaid_wage": total_wage - total_paid_wage, +# "province_kill_requests_total_wage": province_kill_requests_total_wage, +# "province_kill_requests_total_weight": province_kill_requests_total_weight, +# "freezing_province_kill_requests_total_wage": freezing_province_kill_requests_total_wage, +# "freezing_province_kill_requests_total_weight": freezing_province_kill_requests_total_weight, +# "chain_allocations_total_wage": chain_allocations_total_wage, +# "chain_allocations_total_weight": chain_allocations_total_weight, +# "free_bars_live_total_wage": free_bars_live_total_wage, +# "free_bars_live_total_weight": free_bars_live_total_weight, +# "free_bars_carcases_total_wage": free_bars_carcases_total_wage, +# "free_bars_carcases_total_weight": free_bars_carcases_total_weight, +# "poultry_request_out_total_wage" :poultry_request_out_total_wage, +# "poultry_request_out_total_weight" :poultry_request_out_total_weight, +# "shares": { +# "union_total_weight": union_total_weight, +# "union_total_wage": union_total_wage, +# "union_total_paid_wage": union_total_paid_wage, +# "union_total_unpaid_wage": union_total_unpaid_wage, +# "union_province_kill_request_total_wage": union_province_kill_request_total_wage, +# "union_kill_house_free_live_bar_total_wage": union_kill_house_free_live_bar_total_wage, +# "union_kill_house_free_carcases_bar_total_wage": union_kill_house_free_carcases_bar_total_wage, +# "union_chain_allocation_total_wage": union_chain_allocation_total_wage, +# "union_province_kill_request_total_weight": union_province_kill_request_total_weight, +# "union_kill_house_free_live_bar_total_weight": union_kill_house_free_live_bar_total_weight, +# "union_kill_house_free_carcases_bar_total_weight": union_kill_house_free_carcases_bar_total_weight, +# "union_chain_allocation_total_weight": union_chain_allocation_total_weight, +# "freezing_union_province_kill_request_total_wage": freezing_union_province_kill_request_total_wage, +# "freezing_union_province_kill_request_total_weight": freezing_union_province_kill_request_total_weight, +# "union_poultry_request_out_total_wage":union_poultry_request_out_total_wage, +# "union_poultry_request_out_total_weight":union_poultry_request_out_total_weight, +# +# "company_total_weight": company_total_weight, +# "company_total_wage": company_total_wage, +# "company_total_paid_wage": company_total_paid_wage, +# "company_total_unpaid_wage": company_total_unpaid_wage, +# "company_province_kill_request_total_wage": company_province_kill_request_total_wage, +# "company_kill_house_free_live_bar_total_wage": company_kill_house_free_live_bar_total_wage, +# "company_kill_house_free_carcases_bar_total_wage": company_kill_house_free_carcases_bar_total_wage, +# "company_chain_allocation_total_wage": company_chain_allocation_total_wage, +# "company_province_kill_request_total_weight": company_province_kill_request_total_weight, +# "company_kill_house_free_live_bar_total_weight": company_kill_house_free_live_bar_total_weight, +# "company_kill_house_free_carcases_bar_total_weight": company_kill_house_free_carcases_bar_total_weight, +# "company_chain_allocation_total_weight": company_chain_allocation_total_weight, +# "freezing_company_province_kill_request_total_wage": freezing_company_province_kill_request_total_wage, +# "freezing_company_province_kill_request_total_weight": freezing_company_province_kill_request_total_weight, +# "company_poultry_request_out_total_wage":company_poultry_request_out_total_wage, +# "company_poultry_request_out_total_weight":company_poultry_request_out_total_weight, +# +# "guilds_total_weight": guilds_total_weight, +# "guilds_total_wage": guilds_total_wage, +# "guilds_total_paid_wage": guilds_total_paid_wage, +# "guilds_total_unpaid_wage": guilds_total_unpaid_wage, +# "guilds_province_kill_request_total_wage": guilds_province_kill_request_total_wage, +# "guilds_kill_house_free_live_bar_total_wage": guilds_kill_house_free_live_bar_total_wage, +# "guilds_kill_house_free_carcases_bar_total_wage": guilds_kill_house_free_carcases_bar_total_wage, +# "guilds_chain_allocation_total_wage": guilds_chain_allocation_total_wage, +# "guilds_province_kill_request_total_weight": guilds_province_kill_request_total_weight, +# "guilds_kill_house_free_live_bar_total_weight": guilds_kill_house_free_live_bar_total_weight, +# "guilds_kill_house_free_carcases_bar_total_weight": guilds_kill_house_free_carcases_bar_total_weight, +# "guilds_chain_allocation_total_weight": guilds_chain_allocation_total_weight, +# "freezing_guilds_province_kill_request_total_wage": freezing_guilds_province_kill_request_total_wage, +# "freezing_guilds_province_kill_request_total_weight": freezing_guilds_province_kill_request_total_weight, +# "guilds_poultry_request_out_total_wage" :guilds_poultry_request_out_total_wage, +# "guilds_poultry_request_out_total_weight" :guilds_poultry_request_out_total_weight, +# } +# } +# +# return { +# "total_weight": total_weight, +# "total_wage": total_wage, +# "total_paid_wage": total_paid_wage, +# "total_unpaid_wage": total_wage - total_paid_wage, +# "province_kill_requests_total_wage": province_kill_requests_total_wage, +# "province_kill_requests_total_weight": province_kill_requests_total_weight, +# "freezing_province_kill_requests_total_wage": freezing_province_kill_requests_total_wage, +# "freezing_province_kill_requests_total_weight": freezing_province_kill_requests_total_weight, +# "chain_allocations_total_wage": chain_allocations_total_wage, +# "chain_allocations_total_weight": chain_allocations_total_weight, +# "free_bars_live_total_wage": free_bars_live_total_wage, +# "free_bars_live_total_weight": free_bars_live_total_weight, +# "free_bars_carcases_total_wage": free_bars_carcases_total_wage, +# "free_bars_carcases_total_weight": free_bars_carcases_total_weight, +# "poultry_request_out_total_wage": poultry_request_out_total_wage, +# "poultry_request_out_total_weight": poultry_request_out_total_weight, +# } + + +class TotalWageInformationSerializer(serializers.ModelSerializer): + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = TotalWageInformation + fields = ['key', 'wage_info'] + + def get_wage_info(self, obj): + 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 + company_before_total_out_live_buying_province_carcasses_price = 0 + before_total_out_live_buying_province_carcasses_price = 0 + company_before_total_out_live_buying_province_carcasses_weight = 0 + extra_company_amount = 0 + total_weight = 0 + total_wage = 0 + total_paid_wage = 0 + shares_list = [] + total_unpaid_wage = 0 + union_total_weight = 0 + union_total_wage = 0 + union_total_paid_wage = 0 + union_total_unpaid_wage = 0 + union_province_kill_request_total_wage = 0 + freezing_union_province_kill_request_total_wage = 0 + union_kill_house_free_live_bar_total_wage = 0 + union_kill_house_free_carcases_bar_total_wage = 0 + union_chain_allocation_total_wage = 0 + union_province_kill_request_total_weight = 0 + freezing_union_province_kill_request_total_weight = 0 + union_kill_house_free_live_bar_total_weight = 0 + union_kill_house_free_carcases_bar_total_weight = 0 + union_chain_allocation_total_weight = 0 + + company_total_weight = 0 + company_total_wage = 0 + company_total_paid_wage = 0 + company_total_unpaid_wage = 0 + company_province_kill_request_total_wage = 0 + freezing_company_province_kill_request_total_wage = 0 + company_kill_house_free_live_bar_total_wage = 0 + company_kill_house_free_carcases_bar_total_wage = 0 + company_chain_allocation_total_wage = 0 + company_province_kill_request_total_weight = 0 + freezing_company_province_kill_request_total_weight = 0 + company_kill_house_free_live_bar_total_weight = 0 + company_kill_house_free_carcases_bar_total_weight = 0 + company_chain_allocation_total_weight = 0 + + guilds_total_weight = 0 + guilds_total_wage = 0 + guilds_total_paid_wage = 0 + guilds_total_unpaid_wage = 0 + guilds_province_kill_request_total_wage = 0 + freezing_guilds_province_kill_request_total_wage = 0 + guilds_kill_house_free_live_bar_total_wage = 0 + guilds_kill_house_free_carcases_bar_total_wage = 0 + guilds_chain_allocation_total_wage = 0 + guilds_province_kill_request_total_weight = 0 + freezing_guilds_province_kill_request_total_weight = 0 + guilds_kill_house_free_live_bar_total_weight = 0 + guilds_kill_house_free_carcases_bar_total_weight = 0 + guilds_chain_allocation_total_weight = 0 + + other_total_weight = 0 + other_total_wage = 0 + other_total_paid_wage = 0 + other_total_unpaid_wage = 0 + other_province_kill_request_total_wage = 0 + freezing_other_province_kill_request_total_wage = 0 + other_kill_house_free_live_bar_total_wage = 0 + other_kill_house_free_carcases_bar_total_wage = 0 + other_chain_allocation_total_wage = 0 + other_province_kill_request_total_weight = 0 + freezing_other_province_kill_request_total_weight = 0 + other_kill_house_free_live_bar_total_weight = 0 + other_kill_house_free_carcases_bar_total_weight = 0 + other_chain_allocation_total_weight = 0 + + province_kill_request_total_wage = 0 + province_kill_request_total_weight = 0 + freezing_province_kill_requests_total_wage = 0 + freezing_province_kill_requests_total_weight = 0 + chain_total_wage = 0 + chain_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 + real_free_sale_wage = 0 + union_real_free_sale_wage = 0 + company_real_free_sale_wage = 0 + guilds_real_free_sale_wage = 0 + other_real_free_sale_wage = 0 + total_check_wage = 0 + union_wage_percent = 0 + company_wage_percent = 0 + guilds_wage_percent = 0 + other_wage_percent = 0 + date1 = None + date2 = None + role = None + if self.context: + role = self.context.get('request').GET.get('role') + if self.context.get('request').GET.get('date1'): + date1 = datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + + wage_type = WageType.objects.filter(en_name='province-kill-request').first() + total_check_wage = wage_type.amount + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + union_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name == 'company': + company_wage_percent = percentage_wage_type.percent / 100 + + elif percentage_wage_type.share_type.en_name == 'guilds': + guilds_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name in ['city', 'wallet']: + pass + else: + other_wage_percent = percentage_wage_type.percent / 100 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_buying_live_weight_amount = total_wage_type.filter(en_name='live-buy', trash=False).first().amount + free_buying_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-buy', trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + out_province_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', + trash=False).first().amount + + if role == 'KillHouse': + try: + user = SystemUserProfile.objects.get(user=self.context.get('request').user) + except: + user = SystemUserProfile.objects.get(key=self.context.get('request').GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if date1: + finance_info = get_finance_info(kill_house, date1, date2) + slaughter_transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), date__date__gte=date1, + date__date__lte=date2, status='completed', + trash=False) + + else: + finance_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 + + return { + "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": province_live_wage_amount, + "free_buying_live_weight_amount": free_buying_live_weight_amount, + "free_buying_carcesses_weight_amount": free_buying_carcesses_weight_amount, + "free_sell_carcesses_weight_amount": free_sell_carcesses_weight_amount, + "finance_info": finance_info, + "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'], + } + + elif role == 'ChainCompany': + try: + user = SystemUserProfile.objects.get(user=self.context.get('request').user) + except: + user = SystemUserProfile.objects.get(key=self.context.get('request').GET['key']) + chain_company = ChainCompany.objects.get(user=user, trash=False) + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, state='accepted', + trash=False) + chain_allocations_total_wage = chain_allocations.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_wage += chain_allocations_total_wage + chain_allocations_total_weight = chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + total_weight += chain_allocations_total_weight + + chain_company_transactions = InternalTransaction.objects.filter(chain_company=chain_company, + status='completed', trash=False) + total_paid_wage += chain_company_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + return { + "total_weight": total_weight, + "total_wage": total_wage, + "chain_allocations_total_wage": chain_allocations_total_wage, + "chain_allocations_total_weight": chain_allocations_total_weight, + "total_paid_wage": total_paid_wage, + "total_unpaid_wage": total_wage - total_paid_wage + } + + + + + else: + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + if date1: + + 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') + return_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, + 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__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, + 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__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, + 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(kill_house__in=kill_houses, + 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__in=kill_houses, + archive_wage=False, calculate_status=True, date__date__gte=date1, date__date__lte=date2, + trash=False) + + slaughter_transactions = InternalTransaction.objects.filter( + kill_house__in=kill_houses, status='completed', date__date__gte=date1, date__date__lte=date2, + trash=False) + poultry_transactions = InternalTransaction.objects.filter( + poultry__isnull=False, status='completed', date__date__gte=date1, date__date__lte=date2, + trash=False) + + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, + temporary_trash=False, send_date__date__gte=date1, + send_date__date__lte=date2, + wage_pay=True, has_wage=True, + temporary_deleted=False) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + create_date__date__gte=date1, + create_date__date__lte=date2, + state='accepted') + else: + 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') + return_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, + 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__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 + ) + return_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=True, return_trash=True, calculate_status=True + ) + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, + archive_wage=False, + calculate_status=True, + trash=False) + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + archive_wage=False, calculate_status=True, + trash=False) + + slaughter_transactions = InternalTransaction.objects.filter( + kill_house__in=kill_houses, status='completed', + trash=False) + poultry_transactions = InternalTransaction.objects.filter( + poultry__isnull=False, status='completed', + trash=False) + + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, + temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted') + + out_province_poultry_request_weight = \ + poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + union_out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('union_share'))[ + 'total'] or 0 + company_out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('company_share'))[ + 'total'] or 0 + guilds_out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + other_out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('other_share'))[ + 'total'] or 0 + + off = kill_houses.aggregate(total=Sum('off'))[ + 'total'] or 0 + + total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + total_paid_wage += poultry_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 + # total_out_selling_province_quarantine_carcasses_weight = \ + # kill_house_free_sale_bar_info.aggregate(total=Sum('quarantine_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 + if date1: + total_pure_province_carcasses_weight = total_province_carcasses_weight - get_difference_carcasses_weight( + kill_houses, date1, date2) + else: + total_pure_province_carcasses_weight = total_province_carcasses_weight - get_difference_carcasses_weight( + kill_houses) + 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 + company_before_total_out_live_buying_province_carcasses_weight = before_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 + + 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_amount + difference_requests_price = difference_requests_weight * province_live_wage_amount + total_return_pure_province_carcasses_price = return_total_province_live_weight * province_live_wage_amount + total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_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_amount)) + + before_total_out_live_buying_province_carcasses_price = before_total_out_live_buying_province_carcasses_weight * before_out_buying_count_wage_amount + else: + total_out_live_buying_province_carcasses_price = total_out_live_buying_province_carcasses_weight * free_buying_live_weight_amount + + # total_out_live_buying_province_carcasses_price = total_out_live_buying_province_carcasses_weight * free_buying_live_weight_amount + total_out_carcasses_buying_province_carcasses_price = total_out_carcasses_buying_province_carcasses_weight * free_buying_carcesses_weight_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 + out_province_poultry_request_wage + extra_company_amount + total_return_pure_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 + + 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 + union_out_province_poultry_request_wage + return_union_province_kill_request_wage + union_total_paid_wage = slaughter_transactions.aggregate(total=Sum('union_share'))['total'] or 0 + union_total_paid_wage += poultry_transactions.aggregate(total=Sum('union_share'))['total'] or 0 + union_total_unpaid_wage = union_total_wage - union_total_paid_wage + + shares_list.append({ + "name": "اتحادیه", + "out_province_poultry_request_wage": union_out_province_poultry_request_wage, + "province_kill_request_wage": union_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + + }) + + 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) + 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 + company_out_province_poultry_request_wage + return_company_province_kill_request_wage + company_total_paid_wage = slaughter_transactions.aggregate(total=Sum('company_share'))['total'] or 0 + company_total_paid_wage += poultry_transactions.aggregate(total=Sum('company_share'))['total'] or 0 + # company_total_pure_paid_wage = company_total_paid_wage - (company_total_paid_wage * 0.08)) + company_total_unpaid_wage = company_total_wage - company_total_paid_wage + + shares_list.append({ + "name": "شرکت", + "out_province_poultry_request_wage": company_out_province_poultry_request_wage, + "province_kill_request_wage": company_province_kill_request_wage, + "return_province_kill_request_wage": return_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, + + }) + + 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 = total_return_pure_province_carcasses_price * guilds_province_kill_request_percent + 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_out_province_poultry_request_wage + guilds_total_paid_wage = slaughter_transactions.aggregate(total=Sum('guilds_share'))['total'] or 0 + guilds_total_paid_wage += poultry_transactions.aggregate(total=Sum('guilds_share'))['total'] or 0 + guilds_total_unpaid_wage = guilds_total_wage - guilds_total_paid_wage + + shares_list.append({ + "name": "صنف پروتئین", + "out_province_poultry_request_wage": guilds_out_province_poultry_request_wage, + "province_kill_request_wage": guilds_province_kill_request_wage, + "return_province_kill_request_wage": 0, + "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, + + }) + + 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 = total_return_pure_province_carcasses_price * other_province_kill_request_percent + 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_out_province_poultry_request_wage + other_total_paid_wage = slaughter_transactions.aggregate(total=Sum('other_share'))['total'] or 0 + other_total_paid_wage += poultry_transactions.aggregate(total=Sum('other_share'))['total'] or 0 + other_total_unpaid_wage = other_total_wage - other_total_paid_wage + + shares_list.append({ + "name": "دامپزشک", + "out_province_poultry_request_wage": other_out_province_poultry_request_wage, + "province_kill_request_wage": other_province_kill_request_wage, + "return_province_kill_request_wage": 0, + "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, + + }) + + return { + "wage_counting_type": wage_counting_type, + "total_wage": total_price, + "total_paid_wage": total_paid_wage, + "off": off, + "total_unpaid_wage": total_price - (total_paid_wage + off), + "out_province_poultry_request_weight": out_province_poultry_request_weight, + "out_province_poultry_request_wage": out_province_poultry_request_wage, + "province_kill_requests_total_wage": total_pure_province_carcasses_price, + "province_kill_requests_total_weight": total_pure_province_carcasses_weight, + "free_bars_live_total_wage": total_out_live_buying_province_carcasses_price, + "free_bars_live_total_weight": real_total_out_live_buying_province_carcasses_weight, + "free_bars_carcases_total_wage": total_out_carcasses_buying_province_carcasses_price, + "free_bars_carcases_total_weight": total_out_carcasses_buying_province_carcasses_weight, + "free_bars_out_province_carcases_total_wage": total_out_selling_province_carcasses_price, + "free_bars_out_province_carcases_total_weight": total_out_selling_province_carcasses_weight, + "total_province_live_weight": total_province_live_weight, + "total_province_carcasses_weight": total_province_carcasses_weight, + "province_live_wage_amount": province_live_wage_amount, + "free_buying_live_weight_amount": free_buying_live_weight_amount, + "free_buying_carcesses_weight_amount": free_buying_carcesses_weight_amount, + "free_sell_carcesses_weight_amount": free_sell_carcesses_weight_amount, + "out_province_poultry_request_wage_amount": out_province_poultry_request_wage_amount, + "extra_company_amount": extra_company_amount, + "shares": shares_list, + "return_total_province_live_weight": return_total_province_live_weight, + "total_return_pure_province_carcasses_price": total_return_pure_province_carcasses_price, + } + + +class ParentCompanyTotalWageInformationSerializer(serializers.ModelSerializer): + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = TotalWageInformation + fields = ['key', 'wage_info'] + + def get_wage_info(self, obj): + shares_list = [] + total_weight = 0 + total_wage = 0 + total_paid_wage = 0 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_buying_live_weight_amount = total_wage_type.filter(en_name='live-buy', trash=False).first().amount + free_buying_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-buy', trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + out_province_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', + trash=False).first().amount + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + 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') + 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_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, + archive_wage=False, calculate_status=True, + trash=False) + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( + kill_house__in=kill_houses, + archive_wage=False, calculate_status=True, + trash=False) + + slaughter_transactions = InternalTransaction.objects.filter( + kill_house__in=kill_houses, status='completed', + trash=False) + + poultry_transactions = InternalTransaction.objects.filter( + poultry__isnull=False, status='completed', + trash=False) + + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False) + + out_province_poultry_request_weight = \ + poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + union_out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('union_share'))[ + 'total'] or 0 + company_out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('company_share'))[ + 'total'] or 0 + guilds_out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + other_out_province_poultry_request_wage = poultry_requests.aggregate(total=Sum('other_share'))[ + 'total'] or 0 + + off = kill_houses.aggregate(total=Sum('off'))[ + 'total'] or 0 + + total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + total_paid_wage += poultry_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 + if wage_counting_type == 'live': + total_province_carcasses_weight = total_province_live_weight + total_pure_province_carcasses_weight = total_province_carcasses_weight + else: + + total_province_carcasses_weight = total_province_live_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 + total_pure_province_carcasses_weight = total_province_carcasses_weight - get_difference_carcasses_weight( + kill_houses) + total_out_live_buying_province_carcasses_weight = \ + kill_house_free_bar_info.filter(buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0 + 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_amount + total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_amount + total_out_live_buying_province_carcasses_price = total_out_live_buying_province_carcasses_weight * free_buying_live_weight_amount + total_out_carcasses_buying_province_carcasses_price = total_out_carcasses_buying_province_carcasses_weight * free_buying_carcesses_weight_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 + out_province_poultry_request_wage + + 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 + union_free_buying_live_wage = 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 + union_out_province_poultry_request_wage + union_total_paid_wage = slaughter_transactions.aggregate(total=Sum('union_share'))['total'] or 0 + union_total_paid_wage += poultry_transactions.aggregate(total=Sum('union_share'))['total'] or 0 + union_total_unpaid_wage = union_total_wage - union_total_paid_wage + + shares_list.append({ + "name": "اتحادیه", + "out_province_poultry_request_wage": union_out_province_poultry_request_wage, + "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, + + }) + + company_province_kill_request_wage = total_pure_province_carcasses_price * company_province_kill_request_percent + company_free_buying_live_wage = total_out_live_buying_province_carcasses_price * company_free_buying_live_percent + 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 + company_out_province_poultry_request_wage + company_total_paid_wage = slaughter_transactions.aggregate(total=Sum('company_share'))['total'] or 0 + company_total_paid_wage += poultry_transactions.aggregate(total=Sum('company_share'))['total'] or 0 + # company_total_pure_paid_wage = company_total_paid_wage - (company_total_paid_wage * 0.08)) + company_total_unpaid_wage = company_total_wage - company_total_paid_wage + + shares_list.append({ + "name": "شرکت", + "out_province_poultry_request_wage": company_out_province_poultry_request_wage, + "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, + + }) + + guilds_province_kill_request_wage = total_pure_province_carcasses_price * guilds_province_kill_request_percent + guilds_free_buying_live_wage = 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_out_province_poultry_request_wage + guilds_total_paid_wage = slaughter_transactions.aggregate(total=Sum('guilds_share'))['total'] or 0 + guilds_total_paid_wage += poultry_transactions.aggregate(total=Sum('guilds_share'))['total'] or 0 + guilds_total_unpaid_wage = guilds_total_wage - guilds_total_paid_wage + + shares_list.append({ + "name": "صنف پروتئین", + "out_province_poultry_request_wage": guilds_out_province_poultry_request_wage, + "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, + + }) + + other_province_kill_request_wage = total_pure_province_carcasses_price * other_province_kill_request_percent + other_free_buying_live_wage = 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_out_province_poultry_request_wage + other_total_paid_wage = slaughter_transactions.aggregate(total=Sum('other_share'))['total'] or 0 + other_total_paid_wage += poultry_transactions.aggregate(total=Sum('other_share'))['total'] or 0 + other_total_unpaid_wage = other_total_wage - other_total_paid_wage + + shares_list.append({ + "name": "دامپزشک", + "out_province_poultry_request_wage": other_out_province_poultry_request_wage, + "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, + + }) + + return { + "wage_counting_type": wage_counting_type, + "total_wage": total_price, + "total_paid_wage": total_paid_wage, + "off": off, + "total_unpaid_wage": total_price - (total_paid_wage + off), + "out_province_poultry_request_weight": out_province_poultry_request_weight, + "out_province_poultry_request_wage": out_province_poultry_request_wage, + "province_kill_requests_total_wage": total_pure_province_carcasses_price, + "province_kill_requests_total_weight": total_pure_province_carcasses_weight, + "free_bars_live_total_wage": total_out_live_buying_province_carcasses_price, + "free_bars_live_total_weight": total_out_live_buying_province_carcasses_weight, + "free_bars_carcases_total_wage": total_out_carcasses_buying_province_carcasses_price, + "free_bars_carcases_total_weight": total_out_carcasses_buying_province_carcasses_weight, + "free_bars_out_province_carcases_total_wage": total_out_selling_province_carcasses_price, + "free_bars_out_province_carcases_total_weight": total_out_selling_province_carcasses_weight, + "total_province_live_weight": total_province_live_weight, + "total_province_carcasses_weight": total_province_carcasses_weight, + "province_live_wage_amount": province_live_wage_amount, + "free_buying_live_weight_amount": free_buying_live_weight_amount, + "free_buying_carcesses_weight_amount": free_buying_carcesses_weight_amount, + "free_sell_carcesses_weight_amount": free_sell_carcesses_weight_amount, + "out_province_poultry_request_wage_amount": out_province_poultry_request_wage_amount, + "shares": shares_list, + } + + +class CityLivestockSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = CityLivestock + fields = ['address', 'user_bank_info', 'identity_documents', 'active'] + + +class ImprovingLivestockSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = ImprovingLivestock + fields = '__all__' + + +class ReportSubmissionTimeSerializer(serializers.ModelSerializer): + class Meta: + model = ReportSubmissionTime + fields = '__all__' + + +class ReportsSerializer(serializers.ModelSerializer): + class Meta: + model = Reports + fields = ['title', 'key', 'description'] + + +class UserReportsForReportsUsersSerializer(serializers.ModelSerializer): + report = ReportsSerializer(read_only=True) + + class Meta: + model = UserReports + fields = ['report', 'active', 'key'] + + +class ReportsUsersSerializer(serializers.ModelSerializer): + user_reports = serializers.SerializerMethodField('get_user_reports') + + class Meta: + model = ReportsUsers + fields = '__all__' + + def get_user_reports(self, obj): + user_reports = UserReports.objects.filter(user=obj).order_by('id') + serializer = UserReportsForReportsUsersSerializer(user_reports, many=True) + return serializer.data + + +class UserReportsSerializer(serializers.ModelSerializer): + class Meta: + model = UserReports + fields = '__all__' + + +class MovingTextDashboardStatusSerializer(serializers.ModelSerializer): + class Meta: + model = MovingTextDashboardStatus + fields = ['active'] + + +class MovingTextRoleSerializer(serializers.ModelSerializer): + class Meta: + model = MovingTextRole + fields = '__all__' + + +class MovingTextRoleForMovingTextWithRoleSerializer(serializers.ModelSerializer): + class Meta: + model = MovingTextRole + fields = ['role'] + + +class MovingTextWithRoleForMovingTextSerializer(serializers.ModelSerializer): + role = serializers.SerializerMethodField('get_role') + + class Meta: + model = MovingTextWithRole + fields = ['key', 'active', 'role'] + + def get_role(self, obj): + return obj.role.role + + +class MovingTextSerializer(serializers.ModelSerializer): + roles = serializers.SerializerMethodField('get_roles') + + class Meta: + model = MovingText + fields = ['key', 'id', 'moving_text', 'active', 'roles'] + + def get_roles(self, obj): + moving_text_with_roles = MovingTextWithRole.objects.filter(moving_text=obj).order_by('id') + serializer = MovingTextWithRoleForMovingTextSerializer(moving_text_with_roles, many=True) + return serializer.data + + +class MovingTextWithRoleSerializer(serializers.ModelSerializer): + moving_text = MovingTextSerializer(read_only=True) + role = MovingTextRoleSerializer(read_only=True) + + class Meta: + model = MovingTextWithRole + fields = '__all__' + + +class MovingTextForDashboardSerializer(serializers.ModelSerializer): + class Meta: + model = MovingText + fields = ['moving_text'] + + +class AdminXSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = AdminX + fields = '__all__' + + +class SupporterSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Supporter + fields = '__all__' + + +class ZarinPalAccountsSerializer(serializers.ModelSerializer): + class Meta: + model = ZarinPalAccounts + fields = ['key', 'name', 'account', 'en_name'] + + +class PoultryExportSerializer(serializers.ModelSerializer): + class Meta: + model = PoultryExport + fields = ['key', 'allow', 'limitation_status', 'limitation'] + + +class PoultryOutProvinceRequestSerializer(serializers.ModelSerializer): + class Meta: + model = PoultryOutProvinceRequest + fields = ['key', 'allow', 'limitation_status', 'limitation'] + + +class VetFarmAggregatePermissionSerializer(serializers.ModelSerializer): + class Meta: + model = VetFarmAggregatePermission + fields = ['key', 'allow', 'limitation'] + + +class KillHouseBarLimitationSerializer(serializers.ModelSerializer): + class Meta: + model = KillHouseBarLimitation + fields = ['key', 'allow', 'limitation'] + + +class ProductPricingTypeSerializer(serializers.ModelSerializer): + class Meta: + model = ProductPricingType + fields = ['key', 'province'] + + +class OutOfProvinceSellingCarcassesPermissionSerializer(serializers.ModelSerializer): + class Meta: + model = OutOfProvinceSellingCarcassesPermission + fields = ['key', 'active', 'type', 'percent'] + + +class KillHouseDistributionManagementStewardGuildSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + distribution_info = serializers.SerializerMethodField('get_distribution_info') + + class Meta: + model = KillHouse + fields = ['key', 'name', 'kill_house_operator', 'distribution_info'] + + def get_distribution_info(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter( + return_to_province=False, state__in=('pending', 'accepted'), first_car_allocated_quantity=0, + trash=False).order_by( + 'kill_request__recive_date') + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=obj, killer__isnull=True) | Q(killer=obj), trash=False).order_by( + 'kill_request__recive_date') + total_weight = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + total_weight += province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + dates = kill_house_requests.values_list('kill_request__recive_date__date').distinct() + province_kill_requests_dates = province_kill_requests.values_list('kill_request__recive_date__date').distinct() + kill_house_relations = KillHouseStewardGuildRelation.objects.filter(kill_house=obj, trash=False) + stewards = len(kill_house_relations.filter(steward__isnull=False)) + guilds = len(kill_house_relations.filter(guild__isnull=False)) + total_daily_weight = kill_house_relations.aggregate(total=Sum('allocation_limit'))['total'] or 0 + optional_daily_weight = \ + kill_house_relations.filter(allocation_type='optional').aggregate(total=Sum('allocation_limit'))[ + 'total'] or 0 + force_daily_weight = \ + kill_house_relations.filter(allocation_type='force').aggregate(total=Sum('allocation_limit'))['total'] or 0 + + return { + "stewards": stewards, + "guilds": guilds, + "total_daily_weight": total_daily_weight, + "optional_daily_weight": optional_daily_weight, + "force_daily_weight": force_daily_weight, + "kill_house_requests": len(kill_house_requests), + "total_weight": total_weight * 0.75 if total_weight > 0 else 0, + "days": len(set(dates)) + len(set(province_kill_requests_dates)), + "ave_total_daily_weight": round(total_weight / (len(set(dates)) + len(set(province_kill_requests_dates))), + 2) if (len(set(dates)) + len(set(province_kill_requests_dates))) > 0 else 0, + } + + +class StewardDistributionManagementGuildSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForAutoAllocationsSerializer(read_only=True) + distribution_info = serializers.SerializerMethodField('get_distribution_info') + + class Meta: + model = Guilds + fields = ['key', 'name', 'kill_house_operator', 'distribution_info'] + + def get_distribution_info(self, obj): + allocations = StewardAllocation.objects.filter(guilds=obj, kill_house__isnull=False, trash=False).order_by('id') + total_weight = allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + dates = allocations.values_list('date__date').distinct() + steward_relations = KillHouseStewardGuildRelation.objects.filter(steward=obj, trash=False) + guilds = len(steward_relations.filter(guild__isnull=False)) + total_daily_weight = steward_relations.aggregate(total=Sum('allocation_limit'))['total'] or 0 + optional_daily_weight = steward_relations.aggregate(total=Sum('allocation_limit'))['total'] or 0 + force_daily_weight = steward_relations.aggregate(total=Sum('allocation_limit'))['total'] or 0 + + return { + "guilds": guilds, + "total_daily_weight": total_daily_weight, + "optional_daily_weight": optional_daily_weight, + "force_daily_weight": force_daily_weight, + "kill_house_requests": len(allocations), + "total_weight": total_weight, + "days": len(set(dates)), + "ave_total_daily_weight": round(total_weight / len(set(dates)), 2) if len(set(dates)) > 0 else 0, + } + + +class BaseOutProvinceCarcassesBuyerSerializer(serializers.ModelSerializer): + class Meta: + model = BaseOutProvinceCarcassesBuyer + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by' + ) + + +class BaseOutProvinceCarcassesBuyerFordispensersSerializer(serializers.ModelSerializer): + kill_houses = serializers.SerializerMethodField('get_kill_houses') + requests_info = serializers.SerializerMethodField('get_requests_info') + + class Meta: + model = BaseOutProvinceCarcassesBuyer + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by' + ) + + def get_kill_houses(self, obj): + kill_houses = OutProvinceCarcassesBuyer.objects.filter(trash=False, buyer=obj) + kill_houses = kill_houses.values_list('Kill_house__name', flat=True).distinct() if kill_houses else [] + return kill_houses + + def get_requests_info(self, obj): + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, buyer__buyer=obj) + + total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + return { + "number_of_requests": len(free_sales), + "total_quantity": total_quantity, + "total_weight": total_weight, + } + + +class OutProvinceCarcassesBuyerrSerializer(serializers.ModelSerializer): + type_activity = TypeActivitySerializer(read_only=True) + Kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + steward = GeneralGuildsSerializer(read_only=True) + + class Meta: + model = OutProvinceCarcassesBuyer + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by' + ) + + +class OutProvinceCarcassesBuyerForChoosingBuyerSerializer(serializers.ModelSerializer): + class Meta: + model = OutProvinceCarcassesBuyer + fields = ['key', 'fullname', 'mobile', 'unit_name', 'city', 'province'] + + +class OutProvinceCarcassesBuyerForBuyerRequestSerializer(serializers.ModelSerializer): + # type_activity = TypeActivitySerializer(read_only=True) + Kill_house = KillHouseForAutoAllocationSerializer(read_only=True) + # steward = GeneralGuildsSerializer(read_only=True) + buyer = BaseOutProvinceCarcassesBuyerSerializer(read_only=True) + requests_info = serializers.SerializerMethodField('get_requests_info') + + class Meta: + model = OutProvinceCarcassesBuyer + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by' + ) + + def get_requests_info(self, obj): + role = self.context.get('request').GET['role'] + total_quantity = 0 + total_weight = 0 + total_weight = 0 + if role == 'KillHouse': + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, buyer=obj) + else: + free_sales = StewardFreeSaleBarInformation.objects.filter(trash=False, buyer=obj) + + total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + return { + "number_of_requests": len(free_sales), + "total_quantity": total_quantity, + "total_weight": total_weight, + } + + +class KillHousePricePermissionSerializer(serializers.ModelSerializer): + class Meta: + model = KillHousePricePermission + fields = ['allow'] + + +class AutomaticDirectBuyingPermissionSerializer(serializers.ModelSerializer): + class Meta: + model = AutomaticDirectBuyingPermission + fields = '__all__' + + +class ProductsTransactionsSerializer(serializers.ModelSerializer): + class Meta: + model = ProductsTransactions + fields = '__all__' + + +class NewPosMachineTransactionsSerializer(serializers.ModelSerializer): + products = serializers.SerializerMethodField('get_products') + + class Meta: + model = PosMachineTransactions + fields = '__all__' + + def get_products(self, obj): + transactions = ProductsTransactions.objects.filter(transaction=obj, trash=False) + serializer = ProductsTransactionsSerializer(transactions, many=True) + return serializer.data + + +class PosMachineTransactionsForLiveStockSerializer(serializers.ModelSerializer): + products = serializers.SerializerMethodField('get_products') + shares = serializers.SerializerMethodField('get_shares') + pos = POSMachineForLiveStockTransactionsSerializer(read_only=True) + + class Meta: + model = PosMachineTransactions + fields = '__all__' + + def get_products(self, obj): + transactions = ProductsTransactions.objects.filter(transaction=obj, trash=False) + serializer = ProductsTransactionsSerializer(transactions, many=True) + return serializer.data + + def get_shares(self, obj): + product_transaction = ProductsTransactions.objects.get( + trash=False, + live_stack_products__isnull=False, + transaction=obj + ) + + total_union_price = 0 + total_company_price = 0 + + additional_data = json.loads(obj.additional) + for share in additional_data.get('shares', []): + share_price = int(share.get('price', 0)) + if share.get('name') == 'union': + total_union_price = share_price * product_transaction.cur_weight + else: + total_company_price = share_price * product_transaction.cur_weight + total_cooperative_price = additional_data.get('cooperative_price', 0) + cur_heavy = additional_data.get('cur_heavy', 0) + cur_light = additional_data.get('cur_light', 0) + weight = product_transaction.cur_weight + + dict_result = { + 'totalCooperativePrice': total_cooperative_price, + 'totalUnionPrice': total_union_price, + 'totalCompanyPrice': total_company_price, + 'curHeavy': cur_heavy, + 'curLight': cur_light, + 'curWeight': weight, + } + return dict_result + + +class PosMachineTransactionsSerializer(serializers.ModelSerializer): + class Meta: + model = PosMachineTransactions + fields = '__all__' + + +class PosMachineTransactionsForInspectionSerializer(serializers.ModelSerializer): + pos = POSMachineForTransactionInspectionsSerializer(read_only=True) + product = RolesProductsForInspectionSerializer(read_only=True) + + class Meta: + model = PosMachineTransactions + fields = '__all__' + + +class PosAllocationTransactionsSerializer(serializers.ModelSerializer): + class Meta: + model = PosAllocationTransactions + fields = '__all__' + + # cart = serializers.CharField(allow_null=True, allow_blank=True, required=False) + # refnum = serializers.CharField(allow_null=True, allow_blank=True, required=False) + # terminal = serializers.CharField(allow_null=True, allow_blank=True,required=False) + # additional = serializers.CharField(allow_null=True, allow_blank=True,required=False) + + +class BroadcastPriceSerializer(serializers.ModelSerializer): + class Meta: + model = BroadcastPrice + fields = ['active', 'kill_house_price', 'steward_price', 'guild_price'] + + +class OutProvinceSaleLimitationSerializer(serializers.ModelSerializer): + class Meta: + model = OutProvinceSaleLimitation + fields = ['active', 'kill_house', 'steward', 'guild'] + + +class ParentCompanySerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = ParentCompany + fields = '__all__' + + +class CityGuildSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = CityGuild + fields = '__all__' + + +class CityGuildForSubSectorSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = CityGuild + fields = ['key', 'user', 'wage_info'] + + def get_wage_info(self, obj): + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) + other_province_kill_request_percent = percentages_wage_type.filter( + wage_type__en_name='province-kill-request', share_type__en_name='other').first().percent / 100 + if self.context.get('request').GET.get('date1'): + date1 = datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + transactions = PosMachineTransactions.objects.filter(paid=True, pos__guild__user__city=obj.user.city, + trash=False, date__date__gte=date1, + date__date__lte=date2) + allocations = StewardAllocation.objects.filter(trash=False, to_guilds__user__city=obj.user.city, + calculate_status=True, temporary_trash=False, + temporary_deleted=False, receiver_state='accepted', + date__date__gte=date1, date__date__lte=date2) + sub_transactions = SubSectorTransactions.objects.filter(trash=False, city_guild=obj, date__date__gte=date1, + date__date__lte=date2) + else: + transactions = PosMachineTransactions.objects.filter(paid=True, pos__guild__user__city=obj.user.city, + trash=False) + allocations = StewardAllocation.objects.filter(trash=False, to_guilds__user__city=obj.user.city, + calculate_status=True, temporary_trash=False, + temporary_deleted=False, receiver_state='accepted') + sub_transactions = SubSectorTransactions.objects.filter(trash=False, city_guild=obj) + allocations_weight = allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + transactions_weight = transactions.aggregate(total=Sum('weight'))[ + 'total'] or 0 + transactions_weight = transactions_weight / 1000 if transactions_weight > 0 else 0 + total_wage = transactions_weight * (province_live_wage_amount * other_province_kill_request_percent) + + sub_transactions_amount = sub_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + remain_wage = total_wage - sub_transactions_amount + + result = { + "buy_weight": allocations_weight, + "sell_weight": transactions_weight, + "total_wage": total_wage, + "guild_deposit": sub_transactions_amount, + "remain_wage": remain_wage + } + return result + + +class CityGuildForSubsectorTransactionSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = CityGuild + fields = ['key', 'user'] + + +class VetForSubSectorTransactionsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = Vet + fields = ['key', 'user'] + + +class SubSectorTransactionsSerializer(serializers.ModelSerializer): + city_operator = CityOperatorForSubSectorTransactionsSerializer(read_only=True) + vet = VetForSubSectorTransactionsSerializer(read_only=True) + city_guild = CityGuildForSubsectorTransactionSerializer(read_only=True) + + class Meta: + model = SubSectorTransactions + fields = '__all__' + + +class PosSegmentationSerializer(serializers.ModelSerializer): + buyer = serializers.SerializerMethodField('get_buyer') + + class Meta: + model = PosSegmentation + fields = ['key', 'buyer', 'date', 'weight', 'production_date', 'distribution_type', 'amount', 'total_amount', + 'sale_type', 'quota'] + + # def get_buyer(self, obj): + # buyer = obj.guild + # type = 'guild' + # return { + # "fullname": buyer.user.fullname, + # "mobile": buyer.user.mobile, + # "shop": buyer.guilds_name, + # "type": type, + # + # } + def get_buyer(self, obj): + buyer = obj.guild if obj.guild else obj.kill_house + type = 'guild' if obj.guild else 'kill_house' + return { + "fullname": buyer.user.fullname if obj.guild else buyer.kill_house_operator.user.fullname, + "mobile": buyer.user.mobile if obj.guild else buyer.kill_house_operator.user.mobile, + "shop": buyer.guilds_name if obj.guild else buyer.name, + "type": type, + + } + + +class AppSegmentationSerializer(serializers.ModelSerializer): + buyer = serializers.SerializerMethodField('get_buyer') + to_guild = GuildsForBroadcastManagementSerializer(read_only=True) + + class Meta: + model = PosSegmentation + fields = ['key', 'buyer', 'date', 'weight', 'to_guild', 'sale_type', 'quota', 'production_date', 'amount', + 'total_amount'] + + def get_buyer(self, obj): + buyer = obj.guild if obj.guild else obj.kill_house + type = 'guild' if obj.guild else 'kill_house' + return { + "fullname": buyer.user.fullname if obj.guild else buyer.kill_house_operator.user.fullname, + "mobile": buyer.user.mobile if obj.guild else buyer.kill_house_operator.user.mobile, + "shop": buyer.guilds_name if obj.guild else buyer.name, + "type": type, + + } + + +class GuildsPosMachineForTransactionsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + transaction = serializers.SerializerMethodField() + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'user', 'transaction'] + + def get_transaction(self, obj): + request = self.context.get('request') + date1, date2 = self._get_dates_from_request(request) + + pos_data = self._get_pos_transaction_data(obj, date1, date2) + allocation_data = self._get_allocation_data(obj, date1, date2) + product_data = self._get_product_data(obj, allocation_data) + + return { + **pos_data, + **product_data, + } + + def _get_dates_from_request(self, request): + date1_str = request.GET.get('date1') + date2_str = request.GET.get('date2') + + date1 = datetime.strptime(date1_str, '%Y-%m-%d').date() if date1_str else None + date2 = datetime.strptime(date2_str, '%Y-%m-%d').date() if date2_str else None + + return date1, date2 + + def _get_pos_transaction_data(self, guild, date1, date2): + pos_transactions = PosMachineTransactions.objects.filter( + trash=False, pos__guild=guild, paid=True + ) + + if date1 and date2: + pos_transactions = pos_transactions.filter( + date__date__gte=date1, date__date__lte=date2 + ) + + len_pos = pos_transactions.count() + total_price = pos_transactions.aggregate(total=Sum('price'))['total'] or 0 + real_allocated_weight = pos_transactions.aggregate(total=Sum('weight'))['total'] or 0 + if real_allocated_weight > 0: + real_allocated_weight = round(real_allocated_weight / 1000, 1) + + return { + "len_transaction": len_pos, + "total_price": total_price, + "real_allocated_weight": real_allocated_weight, + } + + def _get_allocation_data(self, guild, date1, date2): + allocations = StewardAllocation.objects.filter( + (Q(to_steward=guild) | Q(steward=guild)), + trash=False, calculate_status=True, + receiver_state__in=('pending', 'accepted') + ).order_by('id') + + free_sale_bars = StewardFreeSaleBarInformation.objects.filter( + (Q(guild=guild) | Q(steward=guild)), trash=False + ) + + if date1 and date2: + allocations = allocations.filter(date__date__gte=date1, date__date__lte=date2) + free_sale_bars = free_sale_bars.filter(date__date__gte=date1, date__date__lte=date2) + + return { + "allocations": allocations, + "free_sale_bars": free_sale_bars, + } + + def _get_product_data(self, guild, allocation_data): + allocations = allocation_data["allocations"] + free_sale_bars = allocation_data["free_sale_bars"] + + product = RolesProducts.objects.filter(trash=False, guild=guild).first() + + if product: + recive_allocation = allocations.filter(to_steward=guild, receiver_state__in=('pending', 'accepted')) + + real_weight_of_carcasses = recive_allocation.aggregate( + total=Sum('real_weight_of_carcasses') + )['total'] or 0 + + weight_free_sale_bars = free_sale_bars.aggregate( + total=Sum('weight_of_carcasses') + )['total'] or 0 + + product_total_carcasses_weight = real_weight_of_carcasses + weight_free_sale_bars + + return { + "product": product.name, + "total_carcasses_weight": product_total_carcasses_weight, + "total_remain_weight": product.total_remain_weight, + } + else: + return { + "product": '-', + "total_carcasses_weight": 0, + "total_remain_weight": 0, + "real_allocated_weight": 0, + } + + +class CooperativeForAllocationsReportSerializer(serializers.ModelSerializer): + user = SystemUserProfileForInspectionSerializer(read_only=True) + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = Cooperative + fields = ['key', 'user', 'name', 'info'] + + def get_info(self, obj): + products = { + "bran": "سبوس", + "barley": "جو", + "soy": "سویا", + "corn": "ذرت", + "sheep_concentrate": "کنسانتره گوسفندی", + "high_cow_concentrate": "کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate": "کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate": "کنسانتره گوساله پرواری", + } + name = products[self.context.get('request').GET.get('name')] + cooperative_roles = LiveStockRolseProduct.objects.get(cooperative=obj, parent_product__name=name) + product_transactions = ProductsTransactions.objects.filter(live_stack_products=cooperative_roles, + transaction__paid=True) + transactions = PosMachineTransactions.objects.filter( + pk__in=product_transactions.values_list('transaction', flat=True), trash=False) + transactions_amount = product_transactions.aggregate( + total=Sum('total_price') + )['total'] or 0 + + total_transactions_weight = product_transactions.aggregate( + total=Sum('cur_weight') + )['total'] or 0 + + total_weight = cooperative_roles.total_weight + total_receipt_weight = cooperative_roles.total_receipt_weight + total_allocated_weight = cooperative_roles.total_allocated_weight + total_remain_weight = cooperative_roles.total_remain_weight + return { + "total_transactions_price": transactions_amount, + "total_transactions_weight": total_transactions_weight, + "transactions": len(transactions), + "total_weight": total_weight, + "total_receipt_weight": total_receipt_weight, + "total_allocated_weight": total_allocated_weight, + "total_remain_weight": total_remain_weight, + } + + +class PriceConfirmationSerializer(serializers.ModelSerializer): + class Meta: + model = PriceConfirmation + fields = ['key', 'poultry_status'] + + +class CityGuildForSubSectorSerializerForExcel(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = CityGuild + fields = ['key', 'user', 'wage_info'] + + def get_wage_info(self, obj): + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) + other_province_kill_request_percent = percentages_wage_type.filter( + wage_type__en_name='province-kill-request', share_type__en_name='other').first().percent / 100 + if self.context.get('request').GET['date1']: + date1 = datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + transactions = PosMachineTransactions.objects.filter(paid=True, pos__guild__user__city=obj.user.city, + trash=False, date__date__gte=date1, + date__date__lte=date2) + allocations = StewardAllocation.objects.filter(trash=False, to_guilds__user__city=obj.user.city, + calculate_status=True, temporary_trash=False, + temporary_deleted=False, receiver_state='accepted', + date__date__gte=date1, date__date__lte=date2) + sub_transactions = SubSectorTransactions.objects.filter(trash=False, city_guild=obj, date__date__gte=date1, + date__date__lte=date2) + else: + transactions = PosMachineTransactions.objects.filter(paid=True, pos__guild__user__city=obj.user.city, + trash=False) + allocations = StewardAllocation.objects.filter(trash=False, to_guilds__user__city=obj.user.city, + calculate_status=True, temporary_trash=False, + temporary_deleted=False, receiver_state='accepted') + + sub_transactions = SubSectorTransactions.objects.filter(trash=False, city_guild=obj) + + allocations_weight = allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + transactions_weight = transactions.aggregate(total=Sum('weight'))[ + 'total'] or 0 + transactions_weight = transactions_weight / 1000 if transactions_weight > 0 else 0 + total_wage = transactions_weight * (province_live_wage_amount * other_province_kill_request_percent) + + sub_transactions_amount = sub_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + remain_wage = total_wage - sub_transactions_amount + + result = { + "buy_weight": allocations_weight, + "sell_weight": transactions_weight, + "total_wage": total_wage, + "guild_deposit": sub_transactions_amount, + "remain_wage": remain_wage + } + return result + + +class ProductsTransactionsSerializerForExcel(serializers.ModelSerializer): + class Meta: + model = ProductsTransactions + fields = ['name', 'cur_weight', 'cur_weight'] + + +class PosMachineTransactionsForLiveStockSerializerForExcel(serializers.ModelSerializer): + products = serializers.SerializerMethodField('get_products') + pos = POSMachineForLiveStockTransactionsSerializer(read_only=True) + + class Meta: + model = PosMachineTransactions + fields = ['fullname', 'additional', 'date', 'natcode', 'mobile', 'pos', 'result', 'products', 'price'] + + def get_products(self, obj): + transactions = ProductsTransactions.objects.filter(transaction=obj, trash=False) + serializer = ProductsTransactionsSerializerForExcel(transactions, many=True) + return serializer.data + + +class CompanyBeneficiaryAccountSerializer(serializers.ModelSerializer): + class Meta: + model = CompanyBeneficiaryAccount + fields = ['key', 'name', 'shaba', 'percent', 'in_province', 'out_province'] + + +class POSMachineForCompanySerializer(serializers.ModelSerializer): + pos_company = serializers.SerializerMethodField('get_pos_company') + user_info = serializers.SerializerMethodField('get_user_info') + + class Meta: + model = POSMachine + fields = ['pos_id', 'key', 'receiver_number', 'receiver_number', 'terminal_number', 'Lat', + 'active', 'Long', 'serial', 'password', 'user_info', 'pos_company'] + + def get_pos_company(self, obj): + pos_company = PosCompany.objects.get(key=obj.pos_company.key, trash=False) + return pos_company.name + + def get_user_info(self, obj): + if obj.kill_house: + dict_info = { + 'name': obj.kill_house.name, + 'mobile': obj.kill_house.kill_house_operator.user.mobile, + 'fullname': obj.kill_house.kill_house_operator.user.fullname, + 'national_code': obj.kill_house.kill_house_operator.user.national_code, + 'type': 'کشتارگاه', + } + elif obj.guild: + dict_info = { + 'name': obj.guild.guilds_name, + 'mobile': obj.guild.user.mobile, + 'fullname': obj.guild.user.fullname, + 'national_code': obj.guild.user.national_code, + 'type': 'صنف', + } + else: + dict_info = { + 'name': obj.cooperative.name, + 'mobile': obj.cooperative.user.mobile, + 'fullname': obj.cooperative.user.fullname, + 'national_code': obj.cooperative.user.national_code, + 'type': 'سامانه دام', + } + return dict_info + + +class POSDeviceSessionForCompanySerializer(serializers.ModelSerializer): + pos = POSMachineForCompanySerializer(read_only=True) + + class Meta: + model = POSDeviceSession + fields = ['key', 'name', 'serial', 'password', 'session_create_date', 'session_last_seen_date', 'pos'] + + +class ProteinGuildSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = ProteinGuild + fields = ['key', 'user', 'address', 'user_bank_info'] + + +class PosCompanyForPosVersionSerializer(serializers.ModelSerializer): + class Meta: + model = PosCompany + fields = ['id', 'active', 'name', 'en_name', 'trash', 'key'] + + +class PosDeviceVersionForOneCompanySerializer(serializers.ModelSerializer): + company = PosCompanyForPosVersionSerializer(read_only=True) + + class Meta: + model = PosDeviceVersion + fields = ["key", "trash", "name", "id", "code", "description", "enable", "remove", "company"] + + +class CommonlyUsedSerializer(serializers.ModelSerializer): + kill_house = KillHouseForCommonlyUsedSerializer(read_only=True) + guild = GuildsForBroadcastManagementSerializer(read_only=True) + steward = GuildsForBroadcastManagementSerializer(read_only=True) + exclusive = serializers.SerializerMethodField('get_exclusive') + + class Meta: + model = CommonlyUsed + fields = ["key", "kill_house", "guild", "steward", "exclusive"] + + def get_exclusive(self, obj): + if obj.kill_house: + kill_house = obj.kill_house + + guild_ids = list(kill_house.guild_kill_houses.values_list('id', flat=True)) + steward_ids = list(kill_house.steward_kill_houses.values_list('id', flat=True)) + + combined_ids = guild_ids + steward_ids + else: + steward = obj.steward + guild_ids = list(steward.guild_stewards.all().values_list('id', flat=True)) + combined_ids = guild_ids + + guilds_exist = Guilds.objects.filter( + id__in=combined_ids, + trash=False, + active=True + ).exists() + + return guilds_exist + + +class GetAllGuildsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForPoultryLocSerializer(read_only=True) + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'user'] + + +class GuildsForGeneralConfigsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForPoultryLocSerializer(read_only=True) + + class Meta: + model = Guilds + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'trash', + 'created_by', + 'modified_by', + 'address', + 'user_bank_info', + 'wallet', + 'guild_area_activity', + 'guild_type_activity', + 'cars', + 'kill_house', + 'steward_kill_house', + 'stewards', + 'user_level', + + ) + + +class PercentageDropLimitationSerializer(serializers.ModelSerializer): + class Meta: + model = PercentageDropLimitation + fields = ['key', 'kill_house_limit_percent_down', 'kill_house_limit_percent_up'] + + +class UploadImageLimitationSerializer(serializers.ModelSerializer): + class Meta: + model = UploadImageLimitation + fields = ['key', 'kill_house_allocation', 'kill_house_free_sale', 'steward_allocation', 'steward_free_sale'] + + +class ApkInfoSerializer(serializers.ModelSerializer): + class Meta: + model = ApkInfo + fields = ['key', 'info', 'download_link'] + + +class DirectBuyingVerificationSerializer(serializers.ModelSerializer): + class Meta: + model = DirectBuyingVerification + fields = ['key', 'poultry_code_mandatory', 'payment_deadline', 'payment_deadline_days'] + + +class FinePermissionSerializer(serializers.ModelSerializer): + class Meta: + model = FinePermission + fields = ['key', 'name', 'start_time', 'end_time', 'fine_coefficient', 'fine'] + + +class ShowMarketRequestSerializer(serializers.ModelSerializer): + class Meta: + model = ShowMarketRequest + fields = ['key', 'allow', 'start_time', 'end_time'] + + +class IndexWeightCategorySerializer(serializers.ModelSerializer): + class Meta: + model = IndexWeightCategory + fields = ['key', 'name', 'min_value', 'max_value'] + + +class GuildsGeneralConfigsSerializer(serializers.ModelSerializer): + class Meta: + model = GuildsGeneralConfigs + fields = '__all__' + + +class PoultryScienceSerializer(serializers.ModelSerializer): + user = SystemUserProfileForPoultryScienceWithoutRoleSerializer(read_only=True) + poultry = PoultryDetailForPoultryScienceSerializer(read_only=True, many=True) + + class Meta: + model = PoultryScience + fields = '__all__' + + +class PoultryScienceForReportSerializer(serializers.ModelSerializer): + user = SystemUserProfileForPoultryScienceWithoutRoleSerializer(read_only=True) + + class Meta: + model = PoultryScience + fields = '__all__' + + +class PoultryScienceReportSerializer(serializers.ModelSerializer): + poultry_science = PoultryScienceForReportSerializer(read_only=True) + hatching = PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer(read_only=True) + user = SystemUserProfileForPoultryScienceWithoutRoleSerializer(read_only=True) + + class Meta: + model = PoultryScienceReport + fields = '__all__' + + +class AllowRegisterCodeForGuildsSerializer(serializers.ModelSerializer): + class Meta: + model = AllowRegisterCodeForGuilds + fields = '__all__' + + +class StewardAppLoginSerializer(serializers.ModelSerializer): + class Meta: + model = StewardAppLogin + fields = '__all__' + + +class StewardRequestSerializer(serializers.ModelSerializer): + class Meta: + model = StewardRequest + fields = '__all__' + + +class RestrictionCarcassDistributionSerializer(serializers.ModelSerializer): + class Meta: + model = RestrictionCarcassDistribution + fields = '__all__' + + +class AllowRegisterCodeForKillHouseFreeSaleBarInformationSerializer(serializers.ModelSerializer): + class Meta: + model = AllowRegisterCodeForKillHouseFreeSaleBarInformation + fields = '__all__' + + +class AllowRegisterCodeForStewardFreeSaleBarInformationSerializer(serializers.ModelSerializer): + class Meta: + model = AllowRegisterCodeForStewardFreeSaleBarInformation + fields = '__all__' + + +class LimitationForDirectPurchaseAndBarInformationSerializer(serializers.ModelSerializer): + class Meta: + model = LimitationForDirectPurchaseAndBarInformation + fields = '__all__' + + +class GuildsPosMachineForTransactionsNewSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + transaction = serializers.SerializerMethodField() + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'user', 'transaction', 'guilds_id', 'license_number', 'type_activity', + 'area_activity'] + + def get_transaction(self, obj): + request = self.context.get('request') + date1, date2 = self._get_dates_from_request(request) + + pos_data = self._get_pos_transaction_data(obj, date1, date2) + allocation_data = self._get_allocation_data(obj, date1, date2) + product_data = self._get_product_data(obj, allocation_data) + + return { + **pos_data, + **product_data, + } + + def _get_dates_from_request(self, request): + date1_str = request.GET.get('date1') + date2_str = request.GET.get('date2') + + date1 = datetime.strptime(date1_str, '%Y-%m-%d').date() if date1_str else None + date2 = datetime.strptime(date2_str, '%Y-%m-%d').date() if date2_str else None + + return date1, date2 + + def _get_pos_transaction_data(self, guild, date1, date2): + pos_transactions = PosMachineTransactions.objects.filter( + trash=False, pos__guild=guild, paid=True + ) + pos_segmentation = PosSegmentation.objects.filter(trash=False, guild=guild) + + if date1 and date2: + pos_transactions = pos_transactions.filter( + date__date__gte=date1, date__date__lte=date2 + ) + pos_segmentation = pos_segmentation.filter( + date__date__gte=date1, date__date__lte=date2 + ) + + len_pos = pos_transactions.count() + total_price = pos_transactions.aggregate(total=Sum('price'))['total'] or 0 + real_allocated_weight = pos_transactions.aggregate(total=Sum('weight'))['total'] or 0 + if real_allocated_weight > 0: + real_allocated_weight = round(real_allocated_weight / 1000, 1) + pos_segmentation_weight = pos_segmentation.aggregate(total=Sum('weight'))['total'] or 0 + if pos_segmentation_weight > 0: + pos_segmentation_weight = round(pos_segmentation_weight / 1000, 1) + return { + "len_transaction": len_pos, + "total_price": total_price, + "real_allocated_weight": real_allocated_weight + pos_segmentation_weight, + } + + def _get_allocation_data(self, guild, date1, date2): + allocations = StewardAllocation.objects.filter( + to_guilds=guild, + trash=False, calculate_status=True, + receiver_state__in=('pending', 'accepted') + ).order_by('id') + + # allocations = StewardAllocation.objects.filter( + # (Q(to_steward=guild) | Q(to_guilds=guild)), + # trash=False, calculate_status=True, + # receiver_state__in=('pending', 'accepted') + # ).order_by('id') + + # free_sale_bars = StewardFreeSaleBarInformation.objects.filter( + # (Q(guild=guild) | Q(steward=guild)), trash=False + # ) + + if date1 and date2: + allocations = allocations.filter(date__date__gte=date1, date__date__lte=date2) + # free_sale_bars = free_sale_bars.filter(date__date__gte=date1, date__date__lte=date2) + + return { + "allocations": allocations, + # "free_sale_bars": free_sale_bars, + } + + def _get_product_data(self, guild, allocation_data): + allocations = allocation_data["allocations"] + # free_sale_bars = allocation_data["free_sale_bars"] + + product = RolesProducts.objects.filter(trash=False, guild=guild).first() + + if product: + recive_allocation = allocations + + real_weight_of_carcasses = recive_allocation.aggregate( + total=Sum('real_weight_of_carcasses') + )['total'] or 0 + + # weight_free_sale_bars = free_sale_bars.aggregate( + # total=Sum('weight_of_carcasses') + # )['total'] or 0 + + # product_total_carcasses_weight = real_weight_of_carcasses + weight_free_sale_bars + product_total_carcasses_weight = real_weight_of_carcasses + + return { + "product": product.name, + "total_carcasses_weight": product_total_carcasses_weight, + "total_remain_weight": product.total_remain_weight, + } + else: + return { + "product": '-', + "total_carcasses_weight": 0, + "total_remain_weight": 0, + "real_allocated_weight": 0, + } + + +# class GuildsPosMachineForTransactionsNewSerializer(serializers.ModelSerializer): +# # user = SystemUserProfileForAutoAllocationSerializer(read_only=True) +# fullname = serializers.CharField(source='user.fullname', read_only=True) +# mobile = serializers.CharField(source='user.mobile', read_only=True) +# city = serializers.CharField(source='user.city.name', read_only=True) +# transaction = serializers.SerializerMethodField() +# +# class Meta: +# model = Guilds +# fields = ['key', 'guilds_name', 'fullname','mobile','city','guilds_id','license_number','type_activity','area_activity','transaction'] +# +# def get_transaction(self, obj): +# # Read precomputed map passed by the view +# precomputed = self.context.get('precomputed_transactions', {}) +# # obj.id is the guild id +# data = precomputed.get(obj.id) +# if not data: +# return { +# "len_transaction": 0, +# "total_price": 0, +# "real_allocated_weight": 0, +# "product": '-', +# "total_carcasses_weight": 0, +# "total_remain_weight": 0, +# } +# return data + + +class WarehouseArchiveSerializer(serializers.ModelSerializer): + kill_house = KillHouseForReturnBuyingSerializer(read_only=True) + steward = GuildsForStewardMenueSerializer(read_only=True) + guild = GuildsForStewardMenueSerializer(read_only=True) + + class Meta: + model = WarehouseArchive + fields = '__all__' + + +class SmsRecipientSerializer(serializers.ModelSerializer): + class Meta: + model = SmsRecipient + fields = ['id', 'phone_number', 'name', 'is_active', 'create_date', 'modify_date'] + read_only_fields = ['id', 'create_date', 'modify_date'] + + +class TotalStewardRemainWeightSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'info'] + + def get_info(self, obj): + product = RolesProducts.objects.filter(guild=obj, trash=False, name='مرغ گرم').first() + archives = WarehouseArchive.objects.filter(Q(steward=obj) | Q(guild=obj), trash=False) + guild_steward_allocations = StewardAllocation.objects.filter( + Q(guilds=obj) | Q(to_guilds=obj) | Q(steward=obj) | Q(to_steward=obj), + trash=False, calculate_status=True, warehouse=True, steward_warehouse=True + ) + output_steward_allocations = guild_steward_allocations.filter(Q(guilds=obj) | Q(steward=obj)) + input_steward_allocations = guild_steward_allocations.filter(Q(to_guilds=obj) | Q(to_steward=obj)) + + steward_free_bar_informations = StewardFreeBarInformation.objects.filter( + steward=obj, trash=False, temporary_trash=False, temporary_deleted=False, warehouse=True + ) + steward_free_Sale_bar_informations = StewardFreeSaleBarInformation.objects.filter( + steward=obj, trash=False, temporary_trash=False, temporary_deleted=False, warehouse=True + ) + segmentations = PosSegmentation.objects.filter(guild=obj, trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False, + warehouse=True) + + days_set = set() + days_set.update(input_steward_allocations.values_list('date__date', flat=True)) + days_set.update(output_steward_allocations.values_list('production_date__date', flat=True)) + days_set.update(steward_free_bar_informations.values_list('date__date', flat=True)) + days_set.update(steward_free_Sale_bar_informations.values_list('production_date__date', flat=True)) + days_set.update(segmentations.values_list('production_date__date', flat=True)) + days_set.update(transactions.values_list('transaction__date__date', flat=True)) + days_set.update(archives.values_list('date__date', flat=True)) + days_set = {day for day in days_set if day is not None} + + days = sorted(days_set) + today = datetime.now().date() + yesterday = today - timedelta(days=1) + two_days_ago = yesterday - timedelta(days=1) + date_list = [two_days_ago, yesterday, two_days_ago] + + governmental_list = [] + free_list = [] + final_dict = {} + + for day in days: + input_steward_allocations_info = input_steward_allocations.aggregate( + total_input_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(receiver_state='accepted', + quota='governmental', date__date=day)), + total_input_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(receiver_state='accepted', quota='free', + date__date=day)) + ) + output_steward_allocations_info = output_steward_allocations.aggregate( + total_output_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental', + production_date__date=day)), + total_output_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free', production_date__date=day)) + ) + steward_free_bar_info = steward_free_bar_informations.aggregate( + total_free_bar_weight=Sum('weight_of_carcasses', filter=Q(date__date=day)), + ) + steward_free_Sale_bar_info = steward_free_Sale_bar_informations.aggregate( + total_free_Sale_bar_governmental_weight=Sum('weight_of_carcasses', + filter=Q(quota='governmental', production_date__date=day)), + total_free_Sale_bar_free_weight=Sum('weight_of_carcasses', + filter=Q(quota='free', production_date__date=day)) + ) + segmentations_info = segmentations.aggregate( + segmentations_governmental_weight=Sum('weight', + filter=Q(quota='governmental', production_date__date=day)), + segmentations_free_weight=Sum('weight', filter=Q(quota='free', production_date__date=day)), + ) + pos_allocated_weight_info = transactions.aggregate( + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True, transaction__date__date=day)), + pos_free_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=False, transaction__date__date=day)), + ) + archives_info = archives.aggregate( + archives_governmental_weight=Sum('weight', + filter=Q(quota='governmental', date__date=day)), + archives_free_weight=Sum('weight', + filter=Q(quota='free', date__date=day)), + ) + + total_input_steward_allocations_governmental_weight = input_steward_allocations_info[ + 'total_input_allocations_governmental_weight'] or 0 + total_input_steward_allocations_free_weight = input_steward_allocations_info[ + 'total_input_allocations_free_weight'] or 0 + total_steward_free_buying_bars_weight = steward_free_bar_info['total_free_bar_weight'] or 0 + total_output_steward_allocations_governmental_weight = output_steward_allocations_info[ + 'total_output_allocations_governmental_weight'] or 0 + total_output_steward_allocations_free_weight = output_steward_allocations_info[ + 'total_output_allocations_free_weight'] or 0 + total_steward_free_sale_bars_governmental_weight = steward_free_Sale_bar_info[ + 'total_free_Sale_bar_governmental_weight'] or 0 + total_steward_free_sale_bars_free_weight = steward_free_Sale_bar_info[ + 'total_free_Sale_bar_free_weight'] or 0 + segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 + segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 + archives_free_weight = archives_info['archives_free_weight'] or 0 + + total_governmental_input = total_input_steward_allocations_governmental_weight + total_free_input = total_input_steward_allocations_free_weight + total_steward_free_buying_bars_weight + total_governmental_output = total_output_steward_allocations_governmental_weight + total_steward_free_sale_bars_governmental_weight + segmentations_governmental_weight + int( + pos_governmental_allocated_weight / 1000) + total_free_output = total_output_steward_allocations_free_weight + total_steward_free_sale_bars_free_weight + segmentations_free_weight + int( + pos_free_allocated_weight / 1000) + + governmental_amount = ( + total_governmental_input - total_governmental_output) - archives_governmental_weight + free_amount = (total_free_input - total_free_output) - archives_free_weight + + governmental_data = { + 'day': day, + 'amount': governmental_amount, + } + free_data = { + 'day': day, + 'amount': free_amount, + } + + if day not in date_list: + + if governmental_amount > 0: + governmental_list.append(governmental_data) + if free_amount > 0: + free_list.append(free_data) + + final_dict['governmental'] = governmental_list + final_dict['free'] = free_list + + return (final_dict) + + +# class TotalStewardRemainWeightSerializer(serializers.ModelSerializer): +# info = serializers.SerializerMethodField() +# +# class Meta: +# model = Guilds +# fields = [ +# 'id', +# 'guilds_name', +# 'user', +# 'steward', +# 'total_remain_warehouse_weight', +# 'info', +# ] +# +# def get_info(self, obj): +# precomputed = self.context.get('precomputed_data', {}) +# data = precomputed.get(obj.id, {}) +# +# governmental = data.get('governmental', []) +# free = data.get('free', []) +# +# return { +# 'governmental': [ +# {'day': item['day'], 'amount': float(item['amount'])} for item in governmental +# ], +# 'free': [ +# {'day': item['day'], 'amount': float(item['amount'])} for item in free +# ], +# } + + +class TotalGuildStewardWarehouseArchiveDashboardSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = Guilds + fields = ['key', 'guilds_name', 'info'] + + def get_info(self, obj): + date1 = self.context.get('date1') + date2 = self.context.get('date2') + owner_type = self.context.get('owner_type') + if date1: + if owner_type == 'steward': + archives = WarehouseArchive.objects.filter(trash=False, steward=obj, create_date__date__gte=date1, + create_date__date__lte=date2) + else: + archives = WarehouseArchive.objects.filter(trash=False, guild=obj, create_date__date__gte=date1, + create_date__date__lte=date2) + + else: + if owner_type == 'steward': + archives = WarehouseArchive.objects.filter(trash=False, steward=obj) + else: + archives = WarehouseArchive.objects.filter(trash=False, guild=obj) + + archives_info = archives.aggregate( + total_count=Count('id'), + total_governmental_count=Count('id', filter=Q(quota='governmental')), + total_free_count=Count('id', filter=Q(quota='free')), + total_weight=Sum('weight'), + total_governmental_weight=Sum('weight', filter=Q(quota='governmental')), + total_free_weight=Sum('weight', filter=Q(quota='free')), + ) + + total_count = archives_info['total_count'] or 0 + total_governmental_count = archives_info['total_governmental_count'] or 0 + total_free_count = archives_info['total_free_count'] or 0 + total_weight = archives_info['total_weight'] or 0 + total_governmental_weight = archives_info['total_governmental_weight'] or 0 + total_free_weight = archives_info['total_free_weight'] or 0 + + result = { + 'total_count': total_count, + 'total_governmental_count': total_governmental_count, + 'total_free_count': total_free_count, + 'total_weight': total_weight, + 'total_governmental_weight': total_governmental_weight, + 'total_free_weight': total_free_weight, + } + return result + + +class MarketDailyLimitationSerializer(serializers.ModelSerializer): + market = serializers.SerializerMethodField('get_market') + + class Meta: + model = MarketDailyLimitation + fields = ['key', 'active', 'quantity', 'register_role', 'register_fullname', 'register_mobile', 'market'] + + def get_market(self, obj): + return market_daily_limitation_info() + + +class HatchingArchivePercentSerializer(serializers.ModelSerializer): + class Meta: + model = HatchingArchivePercent + fields = ['key', 'active', 'percent'] + + +class POSMachineTransferSerializer(serializers.Serializer): + recipient_type = serializers.ChoiceField( + choices=['owner', 'current_user', 'representative'] + ) + recipient_key = serializers.CharField() + + def validate(self, data): + recipient_type = data['recipient_type'] + key = data['recipient_key'] + + if recipient_type in ['owner', 'current_user']: + data['recipient'] = SystemUserProfile.objects.get(key=key, trash=False) + + elif recipient_type == 'representative': + data['recipient'] = Representative.objects.get(key=key, trash=False) + + return data + + def save(self, **kwargs): + pos = self.context['pos'] + user = self.context['request'].user + + return POSTransferService.transfer( + pos=pos, + recipient_type=self.validated_data['recipient_type'], + recipient=self.validated_data['recipient'], + performed_by=user + ) + + +class POSAccessLevelSerializer(serializers.ModelSerializer): + class Meta: + model = POSAccessLevel + fields = '__all__' + + +class POSMachineReadSerializer(serializers.ModelSerializer): + access_levels = POSAccessLevelSerializer(many=True, read_only=True) + + class Meta: + model = POSMachine + fields = '__all__' + + +class StewardForRepresentativeSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = Steward + fields = ['key', 'user', 'city'] + + +class RepresentativeSerializer(serializers.ModelSerializer): + kill_house = KillHouseForReturnBuyingSerializer(read_only=True) + steward = StewardForRepresentativeSerializer(read_only=True) + + class Meta: + model = Representative + fields = '__all__' + + +class UserPOSMachineSerializer(serializers.ModelSerializer): + owner = SystemUserProfileForGuildSerializer(read_only=True) + current_user = SystemUserProfileForGuildSerializer(read_only=True) + current_representative = RepresentativeSerializer(read_only=True) + access_levels = POSAccessLevelSerializer(many=True, read_only=True) + + class Meta: + model = POSMachine + fields = '__all__' diff --git a/panel/ProvinceOperator/services/__init__.py b/panel/ProvinceOperator/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/ProvinceOperator/services/pos_transfer_service.py b/panel/ProvinceOperator/services/pos_transfer_service.py new file mode 100644 index 0000000..d92cf50 --- /dev/null +++ b/panel/ProvinceOperator/services/pos_transfer_service.py @@ -0,0 +1,71 @@ +import secrets + +from panel.models import POSAuditLog, POSAccessLevel, POSMachine +from django.db import transaction + + +def make_unique_id(): + while True: + random_number = ''.join(str(secrets.randbelow(10)) for _ in range(6)) + if not POSMachine.objects.filter(pos_unique_id=random_number).exists(): + return random_number + + +class POSTransferService: + ACTION_MAP = { + 'owner': 'CHANGE_OWNER', + 'current_user': 'CHANGE_CURRENT_USER', + 'representative': 'CHANGE_REPRESENTATIVE', + } + + @staticmethod + @transaction.atomic + def transfer(pos, recipient_type, recipient, performed_by): + old_state = { + "owner": pos.owner_id, + "current_user": pos.current_user_id, + "current_representative": pos.current_representative_id, + } + + pos.current_user = None + pos.current_representative = None + + if recipient_type == 'owner': + pos.owner = recipient + pos.current_user = None + pos.current_representative = None + if not pos.pos_unique_id: + pos.pos_unique_id = make_unique_id() + elif recipient_type == 'current_user': + pos.current_user = recipient + pos.current_representative = None + + elif recipient_type == 'representative': + pos.current_representative = recipient + pos.current_user = None + + pos.save() + + if recipient_type == 'owner': + POSAccessLevel.objects.filter(pos=pos).delete() + user_roles = recipient.role.all() + for role in user_roles: + if role.name in ['KillHouse', 'Steward', 'Guilds']: + POSAccessLevel.objects.create( + pos=pos, + name=role.name + ) + + POSAuditLog.objects.create( + pos=pos, + action=POSTransferService.ACTION_MAP[recipient_type], + performed=performed_by, + old_value=old_state, + new_value={ + "recipient_type": recipient_type, + "recipient_id": recipient.id + }, + description="انتقال دستگاه پوز" + ) + + return pos diff --git a/panel/ProvinceOperator/views.py b/panel/ProvinceOperator/views.py new file mode 100644 index 0000000..9486a31 --- /dev/null +++ b/panel/ProvinceOperator/views.py @@ -0,0 +1,27737 @@ +import json +import logging +import math +# import time +import threading +import traceback +from collections import defaultdict +from io import BytesIO +from itertools import chain +import difflib + +import openpyxl +from django.db import transaction +from django.db.models import Count +from django.db.models import Sum, F, Q, Prefetch +from django.db.models.functions import Cast +from django.http import QueryDict +from django.shortcuts import get_object_or_404 +from django.utils.timezone import now +from num2fawords import words +from rest_framework.generics import GenericAPIView +from rest_framework.pagination import PageNumberPagination +from rest_framework.views import APIView + +from GateWay import PaymentGateway, PaymentGatewayZarinPal +from LiveStock.helpers import build_query +from LiveStock.models import LiveStockRolseProduct, Cooperative +from RasadyaarBale.models import User_Bale +from RasadyaarBale.views import send_transaction +from authentication.arvan_image.arvan_storage import upload_object, upload_object_resize +from authentication.helper.helper import register_user +from authentication.sahandsms.sms import price_reminder +from authentication.sms_management import province_kill_request_reject_sms, allow_poultry_city_province_sms, \ + allow_poultry_city_for_poultry_sms, \ + allow_poultry_province_for_poultry_sms, steward_allocation_sms, transaction_sms_threading, \ + transaction_sms_threading_for_company, transaction_sms_threading_appreciation, province_out_request_transaction_sms, \ + send_sms_for_final_approval_out_province_threading, confirmation_of_the_need_for_slaughterhouse_sms_threading, \ + confirm_price_poultry_request_direct_buying_sms, \ + operator_out_poultry_request_sms, transaction_sms_threading_in_province, send_sms_for_guild, send_sms_for_sale_bar, \ + send_sms_for_sale_bar_for_steward +from bot_eata import bot_eitaa_for_each_province_kill_request, bot_eitaa_out_province_live_bar, transaction_for_eata +from deposit_id import sha_deposit_id, arta_deposit_id, ar_deposit_id, ha_deposit_id, ma_deposit_id, guilds_deposit_id, \ + wage_counting_type +from general_urls import base_pos_id, base_url_for_sms_report +from panel.KillHouse.helpers import kill_house_cold_house_allocations_product_warehousing, \ + kill_house_allocations_product_warehousing, get_finance_info, kill_house_cold_house_allocations, \ + get_difference_carcasses_weight, get_kill_house_percent, cold_house_warehousing, kill_house_archive_warehousing +from panel.ProvinceOperator.helpers import guild_steward_allocations_product_warehousing, \ + guild_steward_free_buying_product_warehousing, guild_steward_free_sale_product_warehousing, \ + allocation_calculate_price, pos_allocation_weight_for_product, guild_steward_product_segmentation, \ + cooperative_warehousing, rancher_warehousing, guild_steward_archive_warehousing, _normalize_fa_ar +from panel.ProvinceOperator.serializers import ( + PricingSerializer, + ProvinceCheckOperatorRequestSerializer, + ProvinceCheckInformationSerializer, + ProvinceFactorToKillHouseSerializer, + KillHouseFactorToProvinceSerializer, + ProvinceCheckKillHouseFactorSerializer, + DepositAllocationSerializer, + PovinceInspectorSerializer, + PriceAnalysisorSerializer, + WareHouseFactorSerializer, + ProvinceOperatorSerializer, ProvinceRequestActionSerializer, ProvincePercentLeftOverSerializer, + InspectorOperatorSerializer, ShareOfAllocationSerializer, + PaymentDeadLineSerializer, MonthlyProfitPercentageSerializer, ProvinceFactorToKillHouseForPoultrySerializer, + KillHouseFactorToPoultrySerializer, + walletSerializer, + ItransactionSerializer, + DebtSerializer, + PenaltySerializer, + DepositSerializer, + # IwalletSerializer, + FinancialDocumentSerializer, + FinancialTransactionSerializer, AdminSerializer, ProvinceImportKillHouseOutFactorsSerializer, + VetSupervisorSerializer, JahadSerializer, ProvincialGovernmentSerializer, VetCheckAllocationsSerializer, + HourLimitSerializer, SmsLicenseSerializer, PoultryAllowCityProvinceSerializer, + ProvinceAllowKillHouseRegisterCarSerializer, ProvinceAllowPoultryChooseKillHouseSerializer, + ProvinceAllowPoultryChooseKillHouseTotalSerializer, ProvinceAllowPoultrySellFreeSerializer, + ProvinceAllowPoultrySellFreeTotalSerializer, ProvinceCheckOperatorOutRequestSerializer, + ProvinceAutoAllocationSerializer, AutoAcceptProvinceKillRequestSerializer, AutoMakeKillHouseRequestSerializer, + CityJahadForAllUserSerializer, GuildsSerializer, StewardSerializer, KillHousePercentageOfLossesSerializer, + StewardAllocationSerializer, ProvinceAllowKillHouseChooseStewardGuildsSerializer, StewardWareHouseSerializer, + GuildsWareHouseSerializer, CommerceSerializer, CityCommerceSerializer, HatchingLossesPermissionSerializer, + GuildsForKillHousePercentageSerializer, WagePaymentSerializer, ProvinceAllowKillHouseDirectBuyingSerializer, + ProvinceAllowKillHouseDirectBuyingTotalSerializer, ProvinceAllowKillHouseRegisterGuildsSerializer, + ProvinceAllowKillHouseRegisterGuildsTotalSerializer, CityVetSerializer, KillHouseHourLimitSerializer, + AutomaticStewardAllocationSerializer, FreeSaleWithinprovinceSerializer, ObservatorySerializer, + ProvinceSupervisorSerializer, CarSerializer, ProductSerializer, PosItemSerializer, PosVersiontSerializer, + GuildRoomSerializer, PosCompanySerializer, POSIdSerializer, POSMachineSerializer, GuildsForCompaniesSerializer, + AdditionalProductsSerializer, GuildsForInspectionSerializer, POSTransactionsSerializer, + POSMachineForServerSerializer, TotalGuildsForPosSerializer, GuildInfoForPosSerializer, + StewardFreeBarInformationSerializer, StewardWareHouseForDailyBroadCastOInDetailsSerializer, TypeActivitySerializer, + AreaActivitySerializer, POSMachineForInspectionSerializer, EvacuationPermitSerializer, SellForFreezingSerializer, + LiveStockSupportSerializer, ColdHouseSerializer, ColdHouseAllocationsSerializer, OperationLimitationSerializer, + ApprovedPriceSerializer, AnnouncementsSerializer, ChickenAgeRangeSerializer, + TimeRangeSerializer, CitySupervisorSerializer, JahadInspectorSerializer, SystemWalletSerializer, + SuperAdminSerializer, PaymentGatewayPercentageSerializer, WageTypeSerializer, PercentageOfWageTypeSerializer, + ShareTypeSerializer, TotalWageInformationSerializer, InternalTransactionSerializer, + TotalPaymentGatewayPercentageSerializer, WageTypeForPoultryOutProvinceRequestSerializer, + StewardFreeSaleBarInformationSerializer, CityLivestockSerializer, ImprovingLivestockSerializer, ReportsSerializer, + ReportsUsersSerializer, UserReportsSerializer, ReportSubmissionTimeSerializer, MovingTextSerializer, + MovingTextForDashboardSerializer, MovingTextDashboardStatusSerializer, MovingTextWithRoleSerializer, + NewProductSerializer, AdminXSerializer, SupporterSerializer, ZarinPalAccountsSerializer, PoultryExportSerializer, + PoultryOutProvinceRequestSerializer, DispenserSerializer, DispenserAllocationSerializer, GeneralGuildsSerializer, + TestGuildsSerializer, VetFarmAggregatePermissionSerializer, + KillHouseBarLimitationSerializer, CityPoultrySerializer, KillHouseDistributionManagementStewardGuildSerializer, + GuildsForDistributionManagementSerializer, StewardDistributionManagementGuildSerializer, + OutOfProvinceSellingCarcassesPermissionSerializer, OutProvinceCarcassesBuyerrSerializer, + OutProvinceCarcassesBuyerForBuyerRequestSerializer, ProductPricingTypeSerializer, + PoultryOutRequestInternalTransactionSerializer, KillHousePricePermissionSerializer, + BaseOutProvinceCarcassesBuyerSerializer, OutProvinceCarcassesBuyerForChoosingBuyerSerializer, + BaseOutProvinceCarcassesBuyerFordispensersSerializer, RolesProductsSerializer, + GuildsForBroadcastManagementSerializer, AutomaticDirectBuyingPermissionSerializer, PosRolesProductsSerializer, + PosGuildsForBroadcastManagementSerializer, PosStewardAllocationSerializer, PosMachineTransactionsSerializer, + BroadcastPriceSerializer, PosGuildsSerializer, OutProvinceSaleLimitationSerializer, + PosAllocationTransactionsSerializer, ParentCompanySerializer, ParentCompanyTotalWageInformationSerializer, + GuildsForColdHouseSerializer, GuildsForTotalColdHouseSerializer, StewardColdHousesSerializer, + POSDeviceSessionSerializer, PosDeviceVersionSerializer, SubSectorTransactionsSerializer, + SubSectorPercentageOfWageTypeSerializer, PosStewardFreeBarInformationSerializer, PosSegmentationSerializer, + POSDeviceSessionForInspectionSerializer, CityGuildSerializer, + CityGuildForSubSectorSerializer, CityGuildForSubsectorTransactionSerializer, + PosMachineTransactionsForInspectionSerializer, GuildsPosMachineForTransactionsSerializer, RealGuildsSerializer, + PosOtherProductsSerializer, CombinedPosProductSerializer, NewPosMachineTransactionsSerializer, + PosMachineTransactionsForLiveStockSerializer, CooperativeForAllocationsReportSerializer, + PriceConfirmationSerializer, + POSMachineForLiveStockSerializer, CompanyBeneficiaryAccountSerializer, POSDeviceSessionForCompanySerializer, + ProteinGuildSerializer, PosCompanyForPosVersionSerializer, + PosDeviceVersionForOneCompanySerializer, CommonlyUsedSerializer, InProvinceAllocationSerializer, + GetAllGuildsSerializer, RealGuildsForDashboardSerializer, PercentageDropLimitationSerializer, + UploadImageLimitationSerializer, ApkInfoSerializer, AppSegmentationSerializer, DirectBuyingVerificationSerializer, + FinePermissionSerializer, ShowMarketRequestSerializer, IndexWeightCategorySerializer, PoultryScienceSerializer, + PoultryScienceReportSerializer, AllowRegisterCodeForGuildsSerializer, GuildsGeneralConfigsSerializer, + GuildsForGeneralConfigsSerializer, StewardAppLoginSerializer, StewardRequestSerializer, + RestrictionCarcassDistributionSerializer, AllowRegisterCodeForKillHouseFreeSaleBarInformationSerializer, + AllowRegisterCodeForStewardFreeSaleBarInformationSerializer, LimitationForDirectPurchaseAndBarInformationSerializer, + GuildsPosMachineForTransactionsNewSerializer, WarehouseArchiveSerializer, SmsRecipientSerializer, + NewPOSMachineSerializer, TotalStewardRemainWeightSerializer, TotalGuildStewardWarehouseArchiveDashboardSerializer, + MarketDailyLimitationSerializer, HatchingArchivePercentSerializer, POSMachineReadSerializer, + POSMachineTransferSerializer, UserPOSMachineSerializer, DispenserInformationSerializer, NewDispenserSerializer, + RepresentativeSerializer, NewCombinedPosProductSerializer) +from panel.ProvinceOperator.services.pos_transfer_service import POSTransferService +from panel.ReportingPanel.views import get_gid +from panel.admin import PROJECT_API_KEY +from panel.poultry.helpers import poultry_prediction, create_update_chicken_commission_prices +from panel.validate_headers import get_client_ip, PosDeviceValidator + +# test +from ticket.helper import send_image_to_server, send_image_to_server_for_poultry_science + +logger = logging.getLogger(__name__) + + +def update_out_province_hatching(poultry_hatching): + poultry_requests = PoultryRequest.objects.filter(trash=False, hatching=poultry_hatching, state_process='accepted', + province_state='accepted', out_province_request_cancel=False, + wage_pay=True) + total_killed_quantity = poultry_requests.aggregate(total=Sum('quantity'))['total'] or 0 + total_killed_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))['total'] or 0 + + poultry_hatching.out_province_killed_quantity = total_killed_quantity + poultry_hatching.out_province_killed_weight = total_killed_weight + poultry_hatching.save() + + +def update_steward_allocations_on_role_change(system_profile, guilds, is_steward_now): + if not guilds: + return + + allocations = StewardAllocation.objects.filter( + Q(guilds=guilds) | Q(to_guilds=guilds) | Q(steward=guilds) | Q(to_steward=guilds), + trash=False + ) + + for allocation in allocations: + + is_sender = (allocation.guilds == guilds) or (allocation.steward == guilds) + is_receiver = (allocation.to_guilds == guilds) or (allocation.to_steward == guilds) + + if is_steward_now: + if is_sender: + + if allocation.guilds == guilds: + allocation.steward = guilds + allocation.guilds = None + + if is_receiver: + + if allocation.to_guilds == guilds: + allocation.to_steward = guilds + allocation.to_guilds = None + + else: + + if is_sender: + + if allocation.steward == guilds: + allocation.guilds = guilds + allocation.steward = None + + if is_receiver: + + if allocation.to_steward == guilds: + allocation.to_guilds = guilds + allocation.to_steward = None + + if allocation.to_cold_house or allocation.other_cold_house: + + pass + elif allocation.to_steward: + if allocation.steward: + allocation.type = 'steward_steward' + elif allocation.kill_house: + allocation.type = 'killhouse_steward' + elif allocation.to_guilds: + if allocation.steward: + allocation.type = 'steward_guild' + elif allocation.kill_house: + allocation.type = 'killhouse_guild' + + allocation.save() + + product = RolesProducts.objects.filter(trash=False, guild=guilds).first() + guild_steward_allocations_product_warehousing(product) + + +from panel.KillHouse.serializers import ( + KillHouseADDCARSerializer, + KillRequestSerializer, TotalKillHouseRemainWeightViewSetSerializer, + TotalKillHouseWarehouseArchiveDashboardSerializer +) + +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, +) +from authentication.models import UserProfile, User, UserMessage, BankCard, Province, SystemAddress, ExternalTransaction + +from panel.helper import UNION_NUMBER, COMPANY_NUMBER, GUILD_NUMBER +from province_orderid import sha_order_id, test_order_id, ha_order_id, ar_order_id, ma_order_id + +ARTA_URL_REGISTER = "https://userbackend.rasadyar.com/api/register/" + +from rest_framework.response import Response +from django.contrib.auth.models import Group + +from panel.models import ( + CityOperatorCheckRequest, + PoultryRequest, + Pricing, + KillHouse, + KillHouseRequest, + KillRequest, + ProvinceCheckOperatorRequest, + ProvinceCheckInformation, + KillHouseAssignmentInformation, + ProvinceFactorToKillHouse, + KillHouseFactorToProvince, + KillHouseCheckRequest, + ProvinceCheckKillHouseFactor, + DepositAllocation, + PovinceInspector, + PriceAnalysis, + WareHouseFactor, + ProvinceKillRequest, + ProvinceOperator, + ProvinceRequestAction, + PoultryRequestAuction, + ProvincePercentLeftOver, + KillHouseADDCAR, + KillHouseDriver, InspectorOperator, ShareOfAllocation, KillHouseOperator, Vet, KillHouseVet, PoultryHatching, + VetFarm, KillHouseRequestActionWinner, PaymentDeadLine, MonthlyProfitPercentage, + ProvinceFactorToKillHouseForPoultry, KillHouseFactorToPoultry, Poultry, + Wallet, + Itransaction, + Debt, + Penalty, + Deposit, CityOperator, FinancialDocument, FinancialTransaction, Admin, KillHouseComplaint, + ProvinceImportKillHouseOutFactors, VetSupervisor, Jahad, ProvincialGovernment, VetCheckAllocations, HourLimit, + SmsLicense, KillRequestFactorPayment, KillRequestFactor, PoultryAllowCityProvince, + ProvinceAllowKillHouseRegisterCar, ProvinceAllowPoultryChooseKillHouse, ProvinceAllowPoultryChooseKillHouseTotal, + ProvinceAllowPoultrySellFree, ProvinceAllowPoultrySellFreeTotal, ProvinceCheckOperatorOutRequest, + KillHousePercentage, KillHouseDailyQuota, ProvinceAutoAllocation, AutoAcceptProvinceKillRequest, + AutoMakeKillHouseRequest, CityJahad, Guilds, Steward, KillHousePercentageOfLosses, StewardAllocation, + KillHouseWareHouse, ProvinceAllowKillHouseChooseStewardGuilds, StewardWareHouse, GuildsWareHouse, Commerce, + CityCommerce, HatchingLossesPermission, WagePayment, ProvinceAllowKillHouseDirectBuying, + ProvinceAllowKillHouseDirectBuyingTotal, ProvinceAllowKillHouseRegisterGuilds, + ProvinceAllowKillHouseRegisterGuildsTotal, CityVet, KillHouseHourLimit, AutomaticStewardAllocation, + FreeSaleWithinprovince, Observatory, ProvinceSupervisor, Car, Product, PosVersion, PosItem, GuildRoom, PosCompany, + POSId, POSMachine, AdditionalProducts, POSTransactions, StewardFreeBarInformation, TypeActivity, AreaActivity, + EvacuationPermit, SellForFreezing, LiveStockSupport, ColdHouse, ColdHouseAllocations, OperationLimitation, + ApprovedPrice, Announcements, ChickenAgeRange, TimeRange, CitySupervisor, JahadInspector, SystemWallet, SuperAdmin, + PaymentGatewayPercentage, SlaughterHouseTransaction, WageType, PercentageOfWageType, ShareType, + TotalWageInformation, InternalTransaction, ChainCompany, ChainAllocation, + TotalPaymentGatewayPercentage, StewardFreeSaleBarInformation, CityLivestock, + ImprovingLivestock, OutProvincePoultryRequestBuyer, Reports, ReportsUsers, UserReports, + ReportSubmissionTime, MovingText, MovingTextDashboardStatus, MovingTextWithRole, MovingTextRole, NewProduct, AdminX, + Supporter, ZarinPalAccounts, PoultryExport, PoultryOutProvinceRequest, Dispenser, VetFarmAggregatePermission, + KillHouseBarLimitation, CityPoultry, KillHouseStewardGuildRelation, + OutOfProvinceSellingCarcassesPermission, OutProvinceCarcassesBuyer, ProductPricingType, KillHousePricePermission, + BaseOutProvinceCarcassesBuyer, RolesProducts, AutomaticDirectBuyingPermission, PosMachineTransactions, + BroadcastPrice, OutProvinceSaleLimitation, PosAllocationTransactions, ParentCompany, POSDeviceSession, + PosDeviceVersion, SubSectorTransactions, SubSectorPercentageOfWageType, PosSegmentation, CityGuild, + BarDifferenceRequest, OtherProducts, ProductsTransactions, PriceConfirmation, + CompanyBeneficiaryAccount, ProteinGuild, CommonlyUsed, PercentageDropLimitation, UploadImageLimitation, ApkInfo, + DirectBuyingVerification, FinePermission, ShowMarketRequest, IndexWeightCategory, PoultryScience, + PoultryScienceReport, AllowRegisterCodeForGuilds, AllowRegisterCodeForStewardAllocation, GuildsGeneralConfigs, + StewardAppLogin, StewardRequest, RestrictionCarcassDistribution, + AllowRegisterCodeForKillHouseFreeSaleBarInformation, AllowRegisterCodeForStewardFreeSaleBarInformation, + KillHouseFreeBarInformation, KillHouseFreeSaleBarInformation, LimitationForDirectPurchaseAndBarInformation, + WarehouseArchive, SmsRecipient, MarketDailyLimitation, HatchingArchivePercent, Representative, DispenserInformation + +) +from authentication.models import City +from url_filter.integrations.drf import DjangoFilterBackend +from panel.filterset import (PoultryFilterSet, ProvinceOperatorFilterSet, KillHouseFilterSet, + VetFilterSet, CityOperatorFilterSet, KillHouseOperatorFilterSet, KillHouseDriverFilterSet, + InspectorOperatorFilterSet, GuildsFilterSet, WagePaymentFilterSet, + InternalTransactionFilterSet, ReportsUsersFilterSet, DispenserFilterSet, + DispenserAllocationFilterSet, TestGuildsFilterSet, OutProvinceCarcassesBuyerFilterSet, + BaseOutProvinceCarcassesBuyerFilterSet, StewardAllocationFilterSet, + ColdHouseAllocationsFilterSet, ColdHouseFilterSet, SubSectorTransactionsFilterSet, + StewardFreeBarInformationFilterSet, PosSegmentationFilterSet, CooperativeFilterSet, + PosMachineTransactionsFilterSet, GuildsForPostationFilterSet, + POSDeviceSessionForCompanyFilterSet, CommonlyUsedFilterSet, + StewardFreeSaleBarInformationFilterSet, StewardAllocationDashboardFilterSet, + PoultryScienceFilterSet, PoultryScienceReportFilterSet, GuildsForGeneralConfigsFilterSet, + WarehouseArchiveFilterSet, POSMachineFilterSet, GuildsForArchiveFilterSet, + DispenserInformationFilterSet, RepresentativeFilterSet) +from authentication.models import SystemUserProfile +from panel.KillHouse.serializers import ( + KillHouseSerializer, +) +from panel.poultry.serializers import PoultryRequestSerializer, PoultrySerializer, GetAllPoultrySerializer, \ + GetAllPoultryForPoultryScienceSerializer, PoultryDetailForPoultryScienceSerializer, \ + PoultryHatchingForBazrasiSerializer, PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer +from rest_framework.decorators import api_view, permission_classes, action +from django.views.decorators.csrf import csrf_exempt +from rest_framework.permissions import AllowAny +from rest_framework import viewsets +from rest_framework import status +# from datetime import datetime +# import datetime +from datetime import datetime, timedelta, timezone +# from backports.datetime_fromisoformat import MonkeyPatch +# import pandas as pd +import jdatetime +from datetime import date +import pytz +import string +import random +import requests + +ARTA_URL_CHANGE_MOBILE_NUMBER = "https://userbackend.rasadyar.com/change_mobile_number/" +ARTA_URL_REMOVE_USER_ROLE = "https://userbackend.rasadyar.com/api/remove_user_role/" + +ARVAN_Kill_house_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' +ARVAN_poultry_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' +ARVAN_deposit_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' +ARVAN_Kill_house_Factor_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' +# arta_shaba_id='IR200120020000009055694184' +# ha_shaba_id='IR540160000000000318967648' +# ma_shaba_id='IR580160000000000656171877' +# guilds_shaba_id='IR200120020000009055694184' + +# ARVAN_Kill_house_URL = 'https://kill-house-gallery.s3.ir-thr-at1.arvanstorage.ir/' +# ARVAN_poultry_URL = 'https://poultry-gallery.s3.ir-thr-at1.arvanstorage.ir/' +# ARVAN_deposit_URL = 'https://deposit-gallery.s3.ir-thr-at1.arvanstorage.ir/' +# ARVAN_Kill_house_Factor_URL = 'https://kill-house-factor-gallery.s3.ir-thr-at1.arvanstorage.ir/' + +utc = pytz.UTC + + +# MonkeyPatch.patch_fromisoformat() + + +class CustomPagination(PageNumberPagination): + page_size = 10 + + +class EvacuationPermitViewSet(viewsets.ModelViewSet): + queryset = EvacuationPermit.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = EvacuationPermitSerializer + + def list(self, request, *args, **kwargs): + evacuation_permit = EvacuationPermit.objects.all().first() + serializer = self.serializer_class(evacuation_permit) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + evacuation_permit = EvacuationPermit.objects.all().first() + serializer = self.serializer_class(evacuation_permit) + serializer.update(instance=evacuation_permit, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class SellForFreezingViewSet(viewsets.ModelViewSet): + queryset = SellForFreezing.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = SellForFreezingSerializer + + def list(self, request, *args, **kwargs): + sell_for_freezing = SellForFreezing.objects.all().first() + serializer = self.serializer_class(sell_for_freezing) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + sell_for_freezing = SellForFreezing.objects.all().first() + serializer = self.serializer_class(sell_for_freezing) + serializer.update(instance=sell_for_freezing, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProductViewSet(viewsets.ModelViewSet): + queryset = Product.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProductSerializer + + +class CarViewSet(viewsets.ModelViewSet): + queryset = Car.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CarSerializer + + # def create(self, request, *args, **kwargs): + # user = SystemUserProfile.objects.get(user=request.user, trash=False) + # role = request.data['role'] + # request.data.pop('role') + # kill_house = None + # guild = None + # if 'kill_house_key' in request.data.keys(): + # if request.data['kill_house_key'] != None: + # kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) + # request.data.pop('kill_house_key') + # elif 'guild_key' in request.data.keys(): + # if request.data['guild_key'] != None: + # kill_house = Guilds.objects.get(key=request.data['guild_key']) + # request.data.pop('guild_key') + # if role == 'KillHouse': + # kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + # kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + # elif role == 'Guilds': + # guild = Guilds.objects.get(user=user,trash=False) + # person = SystemUserProfile.objects.get(user=request.user) + # group = Group.objects.get(name__exact="Driver") + # city = City.objects.get(name=request.data['city_name']) + # province = Province.objects.get(key=user.province.key) + # request.data.pop('city_name') + # if Car.objects.filter(pelak=request.data['pelak'], trash=False).exists(): + # return Response({"result": "این ماشین قبلا ثبت شده!"}, status=status.HTTP_403_FORBIDDEN) + # system_profile = SystemUserProfile.objects.filter(mobile=request.data['driver_mobile'], trash=False) + # if system_profile.count() > 0: + # system_profile = system_profile.last() + # if group not in system_profile.role.all(): + # system_profile.role.add(group) + # + # else: + # + # password = "00100" + # data = { + # "username": request.data['driver_mobile'], + # "password": password, + # "api_key": PROJECT_API_KEY + # } + # req = requests.post( + # url=ARTA_URL_REGISTER, + # data=data, + # verify=False + # ) + # if req.status_code == 200: + # user = User(username=request.data['driver_mobile'], first_name=request.data['first_name'], + # last_name=request.data['last_name']) + # user.save() + # base_id = SystemUserProfile.objects.all() + # if base_id.count() > 0: + # base_id = int(base_id.last().base_order) + 1 + # else: + # base_id = 1000 + # system_profile = SystemUserProfile( + # mobile=request.data['driver_mobile'], + # first_name=request.data['first_name'], + # last_name=request.data['last_name'], + # fullname=request.data['first_name'] + " " + request.data['last_name'], + # user=user, + # base_order=base_id, + # password=password, + # city=city, + # province=province + # ) + # system_profile.save() + # system_profile.role.add(group) + # + # + # else: + # return Response({"result": "در ثبت کاربر مشکلی پیش آمده است!"}, status=status.HTTP_403_FORBIDDEN) + # + # wallet = Wallet() + # wallet.save() + # serializer = self.serializer_class(data=request.data) + # if serializer.is_valid(): + # full_name = request.data['first_name'] + " " + request.data['last_name'] + # request.data.pop('first_name') + # request.data.pop('last_name') + # car = serializer.create(validated_data=request.data) + # car.user = system_profile + # car.wallet = wallet + # car.registrar = { + # "role": role, + # "full_name": person.fullname, + # "mobile": person.mobile, + # "date": str(car.create_date) + # } + # car.driver_name = full_name + # car.save() + # if kill_house != None: + # if KillHouseADDCAR.objects.filter(kill_house__in=kill_house, driver=kill_house_driver, + # trash=False).exists(): + # return Response({"result": "این ماشین قبلا برای کشتارگاه ثبت شده!"}, + # status=status.HTTP_403_FORBIDDEN) + # else: + # add_car = KillHouseADDCAR( + # kill_house=kill_house.last(), + # driver=kill_house_driver + # ) + # add_car.save() + # else: + # kill_houses = KillHouse.objects.filter(kill_house_operator__user__province=user.province, trash=False) + # for kill_house in kill_houses: + # add_car = KillHouseADDCAR( + # kill_house=kill_house, + # driver=kill_house_driver + # ) + # add_car.save() + # + # return Response({"result": "ماشین با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + # return Response(serializer.errors) + + +class HatchingLossesPermissionViewSet(viewsets.ModelViewSet): + queryset = HatchingLossesPermission.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = HatchingLossesPermissionSerializer + + def list(self, request, *args, **kwargs): + hatching_losses = HatchingLossesPermission.objects.all().last() + if not hatching_losses: + hatching_losses = HatchingLossesPermission() + hatching_losses.save() + serializer = self.serializer_class(hatching_losses) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + hatching_losses = HatchingLossesPermission.objects.get(key=request.data['permission_key'], trash=False) + request.data.pop('permission_key') + serializer = self.serializer_class(hatching_losses) + serializer.update(instance=hatching_losses, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# def auto_steward_allocation(kill_house_key, quantity, weight, date): +# kill_house = KillHouse.objects.get(key=kill_house_key, trash=False) +# stewards = Steward.objects.filter(guilds__steward=True, trash=False).order_by('id') +# stewards_list = [] +# allocatated_quantity = 0 +# kill_house_total_quantity = 0 +# for steward in stewards: +# if steward.centers_allocation != None: +# for center_allocation in steward.centers_allocation: +# if str(kill_house.key) == center_allocation['value']: +# kill_house_total_quantity += steward.allocation_limit +# stewards_list.append(steward) +# if len(stewards_list) > 0: +# for steward_list in stewards_list: +# allocatated_quantity = (steward_list.allocation_limit / kill_house_total_quantity) * quantity +# auto_allocation = StewardAllocation( +# kill_house=kill_house, +# steward=steward_list, +# number_of_carcasses=allocatated_quantity, +# real_number_of_carcasses=allocatated_quantity, +# weight_of_carcasses=int(allocatated_quantity * weight), +# real_weight_of_carcasses=int(allocatated_quantity * weight), +# type='auto', +# date=date +# ) +# auto_allocation.save() + + +class ProvinceCheckDirectBuyingViewSet(viewsets.ModelViewSet): + queryset = KillRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillRequestSerializer + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = None + kill_request = KillRequest.objects.get(key=request.data['kill_request_key']) + if kill_request.trash: + return Response({"result": "به علت بدهی درخواست شما حذف گردید!"}, status=status.HTTP_403_FORBIDDEN) + free_sale_in_province = False if kill_request.free_direct_buying == False else True + + request.data.pop('kill_request_key') + state = request.data['state'] + request.data.pop('state') + if 'role' in request.data.keys(): + role = request.data['role'] + if state == 'accepted': + kill_request.kill_capacity = int(request.data['quantity']) + kill_request.remain_quantity = int(request.data['quantity']) + + request.data.pop('quantity') + poultry_requests = PoultryRequest.objects.filter(poultry__user=kill_request.poultry.user, + trash=False).order_by( + 'create_date') + # hatching = PoultryHatching.objects.filter(poultry=kill_request.poultry, state='pending', archive=False, + # allow_hatching='pending', trash=False).order_by( + # 'left_over').last() + + hatching = kill_request.poultry_hatching + + free_sale_with_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_with_province.allow == True: + if ('out' in request.data.keys() and request.data['out'] == True) or ( + 'free_sale_in_province' in request.data.keys() and request.data[ + 'free_sale_in_province'] == True): + poultry_requests_for_free_sale = PoultryRequest.objects.filter( + Q(direct_buying=True) | Q(out=True, wage_pay=True) | Q(free_sale_in_province=True), + state_process='accepted', province_state='accepted', trash=False, hatching=hatching) + poultry_requests_for_free_sale_sum = \ + poultry_requests_for_free_sale.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + if poultry_requests_for_free_sale_sum + request.data[ + 'quantity'] > hatching.total_free_commitment_quantity: + return Response({"result": "مجموع حجم کشتار آزاد از حجم کل تعهد آزاد بیشتر است "}, + status=status.HTTP_403_FORBIDDEN) + poultry = Poultry.objects.get(key=kill_request.poultry.key, trash=False) + vet_farm = VetFarm.objects.filter(trash=False, poultry=poultry).first() + last_poultry_request = PoultryRequest.objects.all() + if last_poultry_request.count() > 0: + general_order_code = last_poultry_request.last().general_order_code + 1 + else: + general_order_code = 1 + + if poultry_requests.count() > 0: + order_code = poultry_requests.last().order_code + 1 + else: + order_code = int(str(poultry.user.base_order) + '0001') + city_operator = CityOperator.objects.filter(unit_name=poultry.city_operator, trash=False).last() + if not city_operator: + city_operator = CityOperator.objects.filter(unit_name='اتحادیه استان (فاقد تعاونی)', trash=False).last() + if hatching.left_over < kill_request.kill_capacity: + return Response({"result": "تعداد جوجه در سالن کمتر از تعداد درخواستی است"}, + status=status.HTTP_403_FORBIDDEN) + if kill_request.kill_house.max_kill_limit and kill_request.kill_house.total_kill_capacity > 0: + + if kill_request.kill_house.max_kill_limit and kill_request.kill_house.total_kill_capacity > 0: + total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + killhouse_user=kill_request.kill_house, + kill_request__recive_date__date=kill_request.recive_date.date()) + total_province_kill_requests_quantity = \ + total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + if kill_request.kill_house.total_kill_capacity < total_province_kill_requests_quantity + kill_request.kill_capacity: + return Response({"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + kill_request.save() + poultry_request = PoultryRequest( + hatching=hatching, + order_code=order_code, + general_order_code=general_order_code, + city_operator=city_operator, + poultry=poultry, + previous_quantity=kill_request.kill_capacity, + remain_quantity=kill_request.kill_capacity, + quantity=kill_request.kill_capacity, + first_quantity=kill_request.kill_capacity, + chicken_breed=hatching.chicken_breed, + Index_weight=kill_request.Index_weight, + state_process='accepted', + province_state='accepted', + direct_buying=True, + amount=kill_request.amount, + free_sale_in_province=free_sale_in_province, + send_date=kill_request.recive_date + ) + poultry_request.save() + kill_request.poultry_request = poultry_request + poultry_prediction(poultry_request.poultry) + + if kill_request.export_status == True: + poultry_request.export = True + + poultry_request.state = { + "city_operator": city_operator.user.fullname, + "city_state": poultry_request.state_process, + "city_operator_mobile": city_operator.user.mobile, + "province_operator": "", + "province_state": "" + } + poultry_request.registrar = { + "role": role, + "fullname": user.fullname, + "date": str(poultry_request.create_date) + } + poultry_request.killing_age = (poultry_request.send_date.date() - hatching.date.date()).days + 1 + + poultry_request.save() + + city_operator_check_request = CityOperatorCheckRequest( + city_operator_system=poultry_request.city_operator, + poultry_request=poultry_request, + state='accept', + province_accept=True, + province_state='accept', + allow_hatching=True + + ) + city_operator_check_request.save() + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + + check = ProvinceCheckOperatorRequest( + province_operator_system=province_operator, + poultry_request=poultry_request, + city_request_Poultry=city_operator_check_request, + quantity=poultry_request.quantity, + + state='accept', + ) + check.save() + wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first() + wage = wage_type.amount if wage_type.status == True else 0 + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + province_killrequest = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + kill_request=kill_request, + province_request=check, + quantity=kill_request.kill_capacity, + total_killed_quantity=kill_request.kill_capacity, + total_killed_weight=int(kill_request.kill_capacity * poultry_request.Index_weight), + main_quantity=kill_request.kill_capacity, + wage=wage, + direct_buying=True, + total_wage_amount=wage * int(kill_request.kill_capacity * poultry_request.Index_weight), + ) + province_killrequest.save() + # fine = FinePermission.objects.filter(trash=False).first() + # time_for_fine = datetime.now().time().replace(second=0, microsecond=0) + # if fine.direct_buying: + # if fine.direct_buying_start_time < time_for_fine < fine.direct_buying_end_time: + # province_killrequest.direct_buying_fine = True + # province_killrequest.direct_buying_fine_amount = ( + # fine.direct_buying_fine_coefficient - 1) * province_killrequest.total_wage_amount if fine.direct_buying_fine_coefficient > 1 else province_killrequest.total_wage_amount + # province_killrequest.direct_buying_fine_coefficient = fine.direct_buying_fine_coefficient + create_update_chicken_commission_prices() + if wage_type and wage_type.status == True and percentages_wage_type: + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + province_killrequest.union_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.union_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'company': + province_killrequest.company_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.company_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'guilds': + province_killrequest.guilds_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.guilds_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'city': + province_killrequest.city_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.city_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'other': + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + + elif percentage_wage_type.share_type.en_name == 'wallet': + province_killrequest.wallet_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.wallet_share_percent = percentage_wage_type.percent + + else: + province_killrequest.other_share = int( + (percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount) + province_killrequest.other_share_percent = percentage_wage_type.percent + province_killrequest.save() + + tomorrow = datetime.now().date() + timedelta(days=1) + if not KillHouseWareHouse.objects.filter(kill_house=kill_request.kill_house, date__date=tomorrow).exists(): + ware_house_date = datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day, hour=1, + minute=12, second=20) + kill_house_ware_house = KillHouseWareHouse( + kill_house=kill_request.kill_house, + date=ware_house_date + ) + kill_house_ware_house.save() + kill_house_check = KillHouseCheckRequest( + province_kill_request=province_killrequest, + state='accepted' + ) + + kill_house_check.save() + province_killrequest.state = 'accepted' + if kill_request.payment_deadline: + province_killrequest.payment_deadline = True + province_killrequest.payment_deadline_date = kill_request.payment_deadline_date + province_killrequest.save() + check.quantity = 0 + check.save() + + if poultry_request.export == True: + hatching.export_killed_weight += int(kill_request.kill_capacity * poultry_request.Index_weight) + hatching.export_killed_quantity += kill_request.kill_capacity + + + elif poultry_request.free_sale_in_province == True: + hatching.free_killed_quantity += int(kill_request.kill_capacity * poultry_request.Index_weight) + hatching.free_quantity += kill_request.kill_capacity + + else: + hatching.governmental_killed_quantity += int(kill_request.kill_capacity * poultry_request.Index_weight) + hatching.governmental_quantity += kill_request.kill_capacity + hatching.killed_quantity += kill_request.kill_capacity + hatching.save() + poultry_request.remain_quantity = 0 + poultry_request.direct_buying_kill_place = kill_request.kill_house.name + poultry_request.direct_buying_buyer_info = { + "buyer_fullname": kill_request.kill_house.kill_house_operator.user.fullname, + "buyer_mobile": kill_request.kill_house.kill_house_operator.user.mobile, + } + poultry_request.save() + if kill_request.export_status == True: + kill_request.export_state = 'accepted' + kill_request.direct_buying_message = request.data['direct_buying_message'] + + else: + kill_request.direct_buying_state = 'accepted' + + kill_request.accept_reject_date = datetime.now() + + kill_request.save() + # kill_house_key = kill_request.kill_house.key + # quantity = province_killrequest.main_quantity + # weight = poultry_request.Index_weight + # date = province_killrequest.create_date + # automatic_allocation = threading.Thread(target=auto_steward_allocation, + # args=( + # kill_house_key, quantity, weight, date)) + # automatic_allocation.start() + bot_eitaa_for_each_province_kill_request(province_killrequest, vet_farm) + poultry_fullname = poultry.unit_name + poultry_mobile = poultry.user.mobile if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile + quantity = kill_request.kill_capacity + chicken_breed = kill_request.chicken_breed + request_kill_house = kill_request.kill_house.name + date_str = kill_request.recive_date + # clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0] + # send_date = datetime.strptime(str(clean_date_str), '%Y-%m-%d %H:%M:%S').date() + if isinstance(date_str, str): + clean_date_str = date_str.split('.')[0] + clean_date_str = clean_date_str.replace('T', ' ') + clean_date_str = clean_date_str.replace('Z', '') + + send_date = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date() + + elif isinstance(date_str, datetime): + send_date = date_str.date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + code = "-" + send_date = separate.join(date_list) + confirm_price_poultry_request = threading.Thread( + target=confirm_price_poultry_request_direct_buying_sms, + args=( + poultry_mobile, poultry_fullname, + quantity, chicken_breed, + send_date, + kill_request.free_direct_buying, + kill_request.amount, request_kill_house, + code)) + confirm_price_poultry_request.start() + + else: + if kill_request.export_status == True: + kill_request.export_state = 'rejected' + else: + kill_request.direct_buying_state = 'rejected' + kill_request.direct_buying_message = request.data['direct_buying_message'] + kill_request.province_state = 'rejected' + kill_request.accept_reject_date = datetime.now() + kill_request.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_200_OK) + + +# ویوست مربوط یه اپراتور استان +class ProvinceOperatorViewSet(viewsets.ModelViewSet): + queryset = ProvinceOperator.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceOperatorSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + operator = user.province_operator_user.all() + + # send to serializer + serializer = self.serializer_class(operator[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + operator = ProvinceOperator.objects.get(key=request.data['operator_key'], trash=False) + request.data.pop('operator_key') + serializer = self.serializer_class(operator) + serializer.update(instance=operator, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به جهاد +class JahadViewSet(viewsets.ModelViewSet): + queryset = Jahad.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = JahadSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + jahad = user.jahad_user.all() + + # send to serializer + serializer = self.serializer_class(jahad[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class POSIdViewSet(viewsets.ModelViewSet): + queryset = POSId.objects.all() + permission_classes = [AllowAny] + serializer_class = POSIdSerializer + + +class PosCompanyViewSet(viewsets.ModelViewSet): + queryset = PosCompany.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PosCompanySerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + pos_company = user.pos_company_user.all() + + # send to serializer + serializer = self.serializer_class(pos_company[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CommerceViewSet(viewsets.ModelViewSet): + queryset = Commerce.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CommerceSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + commerce = user.commerce_user.all() + + # send to serializer + serializer = self.serializer_class(commerce[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProvinceSupervisorViewSet(viewsets.ModelViewSet): + queryset = ProvinceSupervisor.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceSupervisorSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + province_supervisor = user.province_supervisor_user.all() + + # send to serializer + serializer = self.serializer_class(province_supervisor[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CitySupervisorViewSet(viewsets.ModelViewSet): + queryset = CitySupervisor.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CitySupervisorSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + city_supervisor = user.city_supervisor_user.all() + + # send to serializer + serializer = self.serializer_class(city_supervisor[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class SuperAdminViewSet(viewsets.ModelViewSet): + queryset = SuperAdmin.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = SuperAdminSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + super_admin = user.super_admin_user.all() + + # send to serializer + serializer = self.serializer_class(super_admin[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class JahadInspectorViewSet(viewsets.ModelViewSet): + queryset = JahadInspector.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = JahadInspectorSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + jahad_inspector = user.jahad_inspector_user.all() + + # send to serializer + serializer = self.serializer_class(jahad_inspector[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityCommerceViewSet(viewsets.ModelViewSet): + queryset = CityCommerce.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityCommerceSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + city_commerce = user.city_commerce_user.all() + + # send to serializer + serializer = self.serializer_class(city_commerce[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityJahadViewSet(viewsets.ModelViewSet): + queryset = CityJahad.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityJahadForAllUserSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + jahad = user.city_jahad_user.all() + + # send to serializer + serializer = self.serializer_class(jahad[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityPoultryViewSet(viewsets.ModelViewSet): + queryset = CityPoultry.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityPoultrySerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + city_poultry = SystemUserProfile.objects.get(user=request.user, trash=False).city_poultry_user.first() + + serializer = self.serializer_class(city_poultry) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class DispenserDashboardViewSet(viewsets.ModelViewSet): + queryset = Dispenser.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = DispenserSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + dispensers = Dispenser.objects.filter(kill_house=kill_house, trash=False).order_by('id') + elif request.GET['role'] in ['Guilds', 'Steward']: + guild = Guilds.objects.get(user=user, trash=False) + dispensers = Dispenser.objects.filter(guild=guild, trash=False).order_by('id') + else: + dispensers = Dispenser.objects.filter(trash=False).order_by('id') + + today = datetime.now().date() + allocations = StewardAllocation.objects.filter(dispenser__in=dispensers, trash=False) + today_allocations = allocations.filter(date__date=today) + total_quantity = allocations.aggregate(total=Sum('number_of_carcasses'))['total'] or 0 + total_weight = allocations.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0 + today_quantity = today_allocations.aggregate(total=Sum('number_of_carcasses'))['total'] or 0 + today_weight = today_allocations.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0 + + allocation_info = { + "number_of_dispensers": len(dispensers), + "number_of_allocations": len(allocations), + "total_quantity": total_quantity, + "total_weight": total_weight, + "number_of_today_allocations": len(today_allocations), + "total_today_quantity": today_quantity, + "total_today_weight": today_weight, + } + return Response(allocation_info, status=status.HTTP_200_OK) + + +class DispenserViewSet(viewsets.ModelViewSet): + queryset = Dispenser.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = NewDispenserSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = DispenserFilterSet + filterset_fields = [ + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'user__mobile', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'guild__user__mobile', + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'pelak', + + ] + + def retrieve(self, request, pk=None, *args, **kwargs): + + if 'profile' in request.GET: + dispenser = SystemUserProfile.objects.get(user=request.user, trash=False).dispenser_user.first() + + serializer = self.serializer_class(dispenser) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + with transaction.atomic(): + kill_house = None + steward = None + birthday_str = None + user = SystemUserProfile.objects.get(user=request.user, trash=False) + group = Group.objects.get(name__exact="Dispenser") + all_cities_cache = list(City.objects.filter(trash=False).values('id', 'name')) + first_name = request.data.get('firstName') + last_name = request.data.get('lastName') + father_name = request.data.get('fatherName') + gender = request.data.get('gender') + identity_no = request.data.get('identityNo') + birth_date = request.data.get('birthDate') + city_name = request.data.get('city') + is_alive = request.data.get('isLive') + mobile = request.data.get('mobile') + national_code = request.data.get('nationalCode') + role = request.data['role'] + city = City.objects.filter(name__icontains=city_name, trash=False).first() + if not city: + normalized_city = _normalize_fa_ar(city_name) + city = City.objects.filter(name__icontains=normalized_city, trash=False).first() + if not city: + alt_city = str(city_name or '') + alt_city = alt_city.replace('ک', 'ك').replace('ی', 'ي') + city = City.objects.filter(name__icontains=alt_city, trash=False).first() + if not city: + try: + target = _normalize_fa_ar(city_name or '') + best_id = None + best_ratio = 0.0 + for c in all_cities_cache: + cand = _normalize_fa_ar(c.get('name', '') or '') + ratio = difflib.SequenceMatcher(None, target, cand).ratio() + if ratio > best_ratio: + best_ratio = ratio + best_id = c['id'] + if best_id is not None and best_ratio >= 0.72: + city = City.objects.filter(id=best_id, trash=False).first() + except Exception: + city = None + + if birth_date: + try: + jalali_date = jdatetime.datetime.strptime(birth_date, "%Y/%m/%d").togregorian().date() + birthday_str = jalali_date.strftime("%Y-%m-%d") + except: + pass + + if not city: + return Response({"result": "شهر مورد نظر یافت نشد!"}, status=status.HTTP_403_FORBIDDEN) + + province = Province.objects.get(key=city.province.key) + + if role == 'ProvinceOperator': + if 'kill_house_key' in request.data.keys(): + kill_house = KillHouse.objects.filter(trash=False, key=request.data['kill_house_key']).first() + request.data.pop('kill_house_key') + else: + steward = Steward.objects.get(key=request.data['steward_key'], trash=False) + request.data.pop('steward_key') + + else: + if role == "KillHouse": + kill_house = KillHouse.objects.filter(trash=False, kill_house_operator__user=user).first() + else: + steward = Steward.objects.get(user=user, trash=False) + + password = "2025" + data = { + "username": mobile, + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + system_user = User(username=mobile, first_name=first_name, + last_name=last_name) + system_user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=first_name + " " + last_name, + user=system_user, + base_order=base_id, + password=password, + national_code=identity_no, + national_id=national_code, + gender=national_code, + is_alive=is_alive, + father_name=father_name, + birthday=birthday_str, + city=city, + province=province + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) + system_profile.role.add(group) + wallet = Wallet() + wallet.save() + request.data.pop('role') + request.data.pop('firstName') + request.data.pop('lastName') + request.data.pop('fatherName') + request.data.pop('gender') + request.data.pop('identityNo') + request.data.pop('birthDate') + request.data.pop('city') + request.data.pop('mobile') + request.data.pop('nationalCode') + request.data.pop('isLive') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + dispenser = serializer.create(validated_data=request.data) + dispenser.user = system_profile + dispenser.wallet = wallet + dispenser.registrar = user.fullname + dispenser_info = DispenserInformation(dispenser=dispenser) + if kill_house is not None: + dispenser_info.kill_house = kill_house + else: + dispenser_info.steward = steward + + dispenser_info.fullname = system_profile.fullname + dispenser_info.national_id = system_profile.national_code + dispenser_info.first_name = system_profile.first_name + dispenser_info.last_name = system_profile.last_name + dispenser_info.mobile = system_profile.mobile + dispenser_info.city = system_profile.city.name + dispenser_info.province = system_profile.province.name + dispenser_info.save() + dispenser.in_use = True + dispenser.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + with transaction.atomic(): + dispenser_key = request.data.pop('key') + mobile = request.data.pop('mobile') + dispenser = Dispenser.objects.get(key=dispenser_key, trash=False) + dispenser_info = DispenserInformation.objects.filter(key=dispenser_key, active=True, trash=False).first() + system_user_profile = SystemUserProfile.objects.get(key=dispenser.user.key, trash=False) + if mobile: + first_mobile_number = system_user_profile.mobile + second_mobile_number = mobile + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = second_mobile_number + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + if dispenser_info: + dispenser_info.mobile = second_mobile_number + dispenser_info.save() + serializer = self.serializer_class(dispenser) + serializer.update(instance=dispenser, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + dispenser_list = [] + dispensers = Dispenser.objects.filter(trash=False).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=dispensers + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=dispensers) + dispenser_list = ps.filter() + dispensers = [] if len(dispenser_list) == 0 else dispenser_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(dispensers) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(dispensers, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class DispenserInformationViewSet(viewsets.ModelViewSet): + queryset = DispenserInformation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = DispenserInformationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = DispenserInformationFilterSet + filterset_fields = [ + 'dispenser__user__first_name', + 'dispenser__user__last_name', + 'dispenser__user__fullname', + 'dispenser__user__mobile', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'steward__user__mobile', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'first_name', + 'last_name', + 'fullname', + 'mobile', + 'city', + 'province', + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + role = request.GET.get('role') + dispenser_type = request.GET.get('type') + + dispenser_filter = { + 'trash': False + } + role_filters = { + 'KillHouse': 'kill_house__kill_house_operator__user', + 'Steward': 'steward__user', + } + type_filter = { + 'KillHouse': 'kill_house__isnull', + 'Steward': 'steward__isnull', + } + filter_key = role_filters.get(role) + type_key = type_filter.get(dispenser_type) + if filter_key: + dispenser_filter[filter_key] = user + if type_key: + dispenser_filter[type_key] = False + dispenser_list = [] + + dispensers = DispenserInformation.objects.filter(**dispenser_filter).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=dispensers + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=dispensers) + dispenser_list = ps.filter() + dispensers = [] if len(dispenser_list) == 0 else dispenser_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(dispensers) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(dispensers, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + dispenser_info_key = request.data['key'] + dispenser_info = DispenserInformation.objects.get(key=dispenser_info_key, trash=False) + serializer = self.serializer_class(dispenser_info) + serializer.update(instance=dispenser_info, validated_data=request.data) + if 'active' in request.data.keys(): + active = request.data['active'] + if not active: + dispenser_info.dispenser.in_use = False + dispenser_info.dispenser.save() + return Response(serializer.data, status=status.HTTP_200_OK) + +class RepresentativeViewSet(viewsets.ModelViewSet): + queryset = Representative.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = RepresentativeSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = RepresentativeFilterSet + filterset_fields = [ + 'first_name', + 'last_name', + 'mobile', + 'city', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'steward__user__mobile', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname' + ] + + def create(self, request, *args, **kwargs): + with transaction.atomic(): + kill_house = None + steward = None + owner_type = request.data.pop('owner_type', None) + owner_key = request.data.pop('owner_key', None) + role = request.data.pop('role', None) + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + elif role == 'Steward': + steward = Steward.objects.get(user=user, trash=False) + + else: + if owner_type == 'KillHouse': + kill_house = KillHouse.objects.get(key=owner_key, trash=False) + else: + steward = Steward.objects.get(key=owner_key, trash=False) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + representative = serializer.create(validated_data=request.data) + + if kill_house is not None: + representative.kill_house = kill_house + else: + representative.steward = steward + representative.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + representative = Representative.objects.get(key=request.data['key'], trash=False) + serializer = self.serializer_class(representative) + serializer.update(instance=representative, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + + user = SystemUserProfile.objects.get(user=request.user) + role = request.GET.get('role') + representative_type = request.GET.get('type') + + representative_filter = { + 'trash': False + } + role_filters = { + 'KillHouse': 'kill_house__kill_house_operator__user', + 'Steward': 'steward__user', + } + type_filter = { + 'KillHouse': 'kill_house__isnull', + 'Steward': 'steward__isnull', + } + filter_key = role_filters.get(role) + type_key = type_filter.get(representative_type) + if filter_key: + representative_filter[filter_key] = user + if type_key: + representative_filter[type_key] = False + + representative_list = [] + representatives = Representative.objects.filter(**representative_filter).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=representatives + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=representatives) + representative_list = ps.filter() + representatives = [] if len(representative_list) == 0 else representative_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(representatives) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(representatives, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class LiveStockSupportViewSet(viewsets.ModelViewSet): + queryset = LiveStockSupport.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = LiveStockSupportSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + support = user.live_stock_support_user.all() + + # send to serializer + serializer = self.serializer_class(support[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به استانداری +class ProvincialGovernmentViewSet(viewsets.ModelViewSet): + queryset = ProvincialGovernment.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvincialGovernmentSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + government = user.government_user.all() + + # send to serializer + serializer = self.serializer_class(government[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +def products_for_guild(guild): + additional_products = AdditionalProducts.objects.filter(trash=False).exclude(name='سایر محصولات').order_by('id') + if additional_products: + for additional_product in additional_products: + show = True if additional_product.name == 'مرغ گرم' else False + product = Product( + name=additional_product.name, + image=additional_product.image, + unit_of_measurement=additional_product.unit_of_measurement, + priority=additional_product.priority, + guild=guild, + selling_free_price=additional_product.selling_free_price, + selling_approved_price=additional_product.selling_approved_price, + selling_more_than_inventory=additional_product.selling_more_than_inventory, + selling_other_products=additional_product.selling_other_products, + price=additional_product.price, + show=show, + ) + product.save() + + +class TotalGuildsForPosViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [AllowAny] + serializer_class = TotalGuildsForPosSerializer + + def list(self, request, *args, **kwargs): + if 'total' in request.GET: + guilds = Guilds.objects.filter(trash=False).order_by('id') + serializer = TotalGuildsForPosSerializer(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + guilds = Guilds.objects.get(key=request.GET['guild-key']) + serializer = GuildInfoForPosSerializer(guilds) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TypeActivityViewSet(viewsets.ModelViewSet): + queryset = TypeActivity.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = TypeActivitySerializer + + +class AreaActivityViewSet(viewsets.ModelViewSet): + queryset = AreaActivity.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = AreaActivitySerializer + + +def persian_to_gregorian_datetime(jdate_str): + y, m, d = map(int, jdate_str.split('/')) + g_date = jdatetime.date(y, m, d).togregorian() + return datetime( + g_date.year, g_date.month, g_date.day, + 15, 48, 8, 0, + tzinfo=timezone(timedelta(hours=3, minutes=30)) + ) + + +class GuildsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = GuildsSerializer + + # pagination_class = CustomPagination + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + guilds = user.guilds_user.all() + + serializer = self.serializer_class(guilds[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + father_name = request.data['father_name'] + gender = request.data['gender'] + is_alive = request.data['is_alive'] + user_login = SystemUserProfile.objects.get(trash=False, user=request.user) + allow_register_code = AllowRegisterCodeForGuilds.objects.filter(trash=False, active=True).first() + # if request.data['role'] not in ('ProvinceOperator', 'SuperAdmin', 'AdminX'): + # return Response({"result": "مجاز به ثبت واحد صنفی نمی باشید!"}, status=status.HTTP_403_FORBIDDEN) + + group = Group.objects.get(name__exact="Guilds") + steward_role = Group.objects.get(name__exact="Steward") + city = City.objects.get(key=request.data['city']) + request.data.pop('city') + province = city.province + system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last() + if system_profile: + if Guilds.objects.filter(user=system_profile, trash=False).exists(): + return Response({"result": "این صنف قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + + else: + password = "00100" + data = { + "username": request.data['mobile'], + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + + user = User(username=request.data['mobile'], first_name=request.data['first_name'], + last_name=request.data['last_name']) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=request.data['mobile'], + first_name=request.data['first_name'], + last_name=request.data['last_name'], + fullname=request.data['first_name'] + " " + request.data['last_name'], + user=user, + base_order=base_id, + password=password, + national_id=request.data['national_id'], + city=city, + province=province, + father_name=father_name, + gender=gender, + is_alive=is_alive + + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) + address = SystemAddress(city=city, province=province, address=request.data['address'], + postal_code=request.data['postal_code']) + address.save() + system_profile.role.add(group) + wallet = Wallet() + wallet.save() + role = request.data['role'] + type_activity_name = request.data['type_activity_name'] + type_activity = TypeActivity.objects.filter(title__icontains=type_activity_name, trash=False).first() + if not type_activity: + type_activity = TypeActivity.objects.filter(trash=False).first() + + area_activity = AreaActivity.objects.filter(trash=False).first() + request.data.pop('role') + request.data.pop('type_activity_name') + request.data.pop('mobile') + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('national_id') + request.data.pop('postal_code') + request.data.pop('type_activity') + request.data.pop('area_activity') + request.data.pop('father_name') + request.data.pop('is_alive') + request.data.pop('gender') + + # license_number = data.get("license_number"), + # license_type = data.get("license_type"), + # license_status = data.get("license_status"), + # license_issue_date = license_issue_date, + # license_expire_date = license_expire_date, + # company_name = data.get("company_name"), + # company_identifier = data.get("company_identifier"), + # is_foreign_national = parse_bool(data.get("is_foreign_national")), + # has_partner = parse_bool(data.get("has_partner")), + # has_inquiry = parse_bool(data.get("has_inquiry")), + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + guilds = serializer.create(validated_data=request.data) + guilds.user = system_profile + guilds.registerar_fullname = user_login.fullname + guilds.registerar_mobile = user_login.mobile + guilds.registerar_role = role + guilds.address = address + guilds.wallet = wallet + guilds.type_activity = type_activity.title + guilds.area_activity = area_activity.title + guilds.province_accept_state = 'pending' + guilds.guild_type_activity = type_activity + guilds.guild_area_activity = area_activity + guilds.license_issue_date = persian_to_gregorian_datetime(request.data['license_issue_date']) + guilds.license_expire_date = persian_to_gregorian_datetime(request.data['license_expire_date']) + guilds.save() + if allow_register_code: + number = random.randint(10000, 99000) + guilds.register_code = number + guilds.active_register_code = True + guilds.register_date_register_code = datetime.now() + if allow_register_code.has_time: + guilds.expire_time_register_code = datetime.now() + timedelta(minutes=int(allow_register_code.time)) + guilds.save() + try: + send_sms_for_guild(guilds) + except: + pass + + parent_product = NewProduct.objects.all().first() + # approved_type = True if parent_product.approved_price_status == True else False + # approved_price = parent_product.approved_price + + price = BroadcastPrice.objects.filter(trash=False).first() + + approved_price = price.steward_price if guilds.steward else price.guild_price + approved_type = price.active if approved_price > 0 else False + + product = RolesProducts( + parent_product=parent_product, + guild=guilds, + name='مرغ گرم', + approved_price_status=approved_type, + approved_price=approved_price, + ) + product.save() + + # if guilds.steward == True: + # steward = Steward( + # guilds=guilds + # ) + # steward.save() + # system_profile.role.add(steward_role) + + if role == 'KillHouse': + user = SystemUserProfile.objects.get(user=request.user) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).order_by( + 'id').first() + guilds.kill_house_centers_allocation = [ + {"label": kill_house.name, "value": str(kill_house.key)}] + guilds.province_accept_state = 'pending' + guilds.kill_house_register = True + + guilds.save() + + if guilds.steward == True: + guilds.steward_kill_house.add(kill_house) + + else: + guilds.kill_house.add(kill_house) + + # if guilds.steward == True: + # steward.centers_allocation = [ + # {"label": kill_house.name, "value": str(kill_house.key)}] + # steward.allocation_limit = guilds.allocation_limit + # steward.province_accept_state = 'pending' + # steward.kill_house_register = True + # steward.save() + elif role == 'Guilds': + user = SystemUserProfile.objects.get(user=request.user) + steward = Steward.objects.get(guilds__user=user, trash=False) + + guilds.centers_allocation = [ + {"label": steward.guilds.user.fullname, "value": str(steward.key)}] + guilds.province_accept_state = 'pending' + guilds.steward_register = True + guilds.save() + + elif role == 'PosCompany': + guilds.province_accept_state = 'pending' + guilds.pos_company_register = True + guilds.save() + + # guild_products = threading.Thread(target=products_for_guild, + # args=(guilds,)) + # + # guild_products.start() + + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + guilds = Guilds.objects.get(key=request.data['guilds_key'], trash=False) + system_user_profile = SystemUserProfile.objects.get(key=guilds.user.key, trash=False) + address = SystemAddress.objects.get(key=guilds.address.key, trash=False) + if 'KillHouseList' in request.data.keys(): + kill_houses = KillHouse.objects.filter(key__in=request.data['KillHouseList']).order_by('id') + guilds.kill_house.set(kill_houses) + KillHouseStewardGuildRelation.objects.filter(guild=guilds, kill_house__isnull=False).delete() + + relations = [ + KillHouseStewardGuildRelation(guild=guilds, kill_house=kill_house) + for kill_house in kill_houses + ] + + KillHouseStewardGuildRelation.objects.bulk_create(relations) + # guilds.guild_kill_houses.clear() + # guilds.guild_kill_houses.add(*kill_houses) + if 'StewardList' in request.data.keys(): + stewards = Guilds.objects.filter(key__in=request.data['StewardList']).order_by('id') + guilds.stewards.set(stewards) + request.data.pop('StewardList') + + if 'StewardKillHouseList' in request.data.keys(): + kill_houses = KillHouse.objects.filter(key__in=request.data['StewardKillHouseList']).order_by('id') + guilds.steward_kill_house.set(kill_houses) + request.data.pop('StewardKillHouseList') + + if 'type_activity' in request.data.keys(): + type_activity = TypeActivity.objects.get(title=request.data['type_activity']) + area_activity = AreaActivity.objects.get(title=request.data['area_activity']) + guilds.type_activity = type_activity.title + guilds.area_activity = area_activity.title + guilds.guild_type_activity = type_activity + guilds.guild_area_activity = area_activity + guilds.save() + request.data.pop('type_activity') + request.data.pop('area_activity') + + if 'first_name' in request.data.keys(): + system_user_profile.first_name = request.data['first_name'] + system_user_profile.last_name = request.data['last_name'] + system_user_profile.fullname = request.data['first_name'] + " " + request.data['last_name'] + system_user_profile.national_id = request.data['national_id'] + system_user_profile.save() + first_mobile_number = system_user_profile.mobile + second_mobile_number = request.data['mobile'] + request.data.pop('mobile') + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = second_mobile_number + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + + city = City.objects.get(name=request.data['city']) + province = Province.objects.get(key=city.province.key) + address.city = city + address.province = province + address.address = request.data['address'] + address.postal_code = request.data['postal_code'] + address.save() + request.data.pop('guilds_key') + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('national_id') + request.data.pop('city') + if 'active' in request.data: + role = request.data['role'] + activation_role = guilds.role_activation + if request.data['active']: + if activation_role: + if (activation_role == 'AdminX' and role != 'AdminX') or \ + (activation_role == 'SuperAdmin' and role not in ('AdminX', 'SuperAdmin')): + return Response( + {"result": "شما دسترسی ویرایش صنف را ندارید!"}, + status=status.HTTP_403_FORBIDDEN + ) + guilds.role_activation = role + guilds.save() + + request.data.pop('guilds_key') + request.data.pop('role') + serializer = self.serializer_class(guilds) + serializer.update(instance=guilds, validated_data=request.data) + return Response({"result": "با موفقیت ویرایش شد"}, status=status.HTTP_200_OK) + + guilds.is_registered = False + guilds.logged_register_code = None + guilds.register_code = None + guilds.save() + serializer = self.serializer_class(guilds) + serializer.update(instance=guilds, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + if 'psp_pos' in request.GET: + base_queryset = ( + Guilds.objects.filter(trash=False, active=True, has_inquiry=True) + .select_related('user', 'address__city') + .values( + 'key', + 'guilds_name', + 'guilds_id', + 'license_number', + 'type_activity', + 'area_activity', + 'steward', + 'user__fullname', + 'user__mobile', + 'address__city__name', + ) + ) + + raw_data = base_queryset.order_by('steward') + guilds_data = [ + { + "key": g["key"], + "guilds_name": g["guilds_name"], + "steward": g["steward"], + "guilds_id": g["guilds_id"], + "license_number": g["license_number"], + "type_activity": g["type_activity"], + "area_activity": g["area_activity"], + "user": { + "fullname": g["user__fullname"], + "mobile": g["user__mobile"], + "city": g["address__city__name"], + } + } + for g in raw_data + ] + + return Response(guilds_data, status=status.HTTP_200_OK) + + if 'commonly_used' in request.GET: + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + commonly_used = CommonlyUsed.objects.filter(kill_house=kill_house, trash=False).values_list('guild', + flat=True) + else: + steward = Guilds.objects.get(user=user, steward=True, active=True, trash=False) + commonly_used = CommonlyUsed.objects.filter(steward=steward, trash=False).values_list('guild', + flat=True) + guilds = Guilds.objects.filter(trash=False, active=True).order_by('-steward').exclude(id__in=commonly_used) + serializer = GuildsForBroadcastManagementSerializer(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + if 'dispenser' in request.GET: + guilds = Guilds.objects.filter(steward=True, trash=False) + serializer = GeneralGuildsSerializer(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + if 'type' in request.GET: + guilds = [] + kill_house_percentage = KillHousePercentage.objects.get(key=request.GET["percentage_key"], + trash=False) + guilds_list = Guilds.objects.filter(kill_house_centers_allocation__isnull=False, trash=False) + if guilds_list: + for guild in guilds_list: + if len(guild.kill_house_centers_allocation) == 0 or guild.kill_house_centers_allocation == None: + continue + if guild.kill_house_centers_allocation[0]['value'] == str( + kill_house_percentage.kill_house.key): + guilds.append(guild) + serializer = GuildsForKillHousePercentageSerializer(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'steward_sub_guilds' in request.GET: + guilds_list = [] + now = datetime.now().date() + date = datetime.strptime(str(request.GET['date']), + '%Y-%m-%d').date() if 'date' in request.GET else now + steward = Steward.objects.get(guilds__user=user, active=True, trash=False) + steward_ware_house = StewardWareHouse.objects.filter(steward=steward, date__date=date, trash=False).first() + guilds = Guilds.objects.filter(trash=False, steward=False).order_by('id') + for guild in guilds: + if guild.centers_allocation != None: + for center_allocation in guild.centers_allocation: + if str(steward.key) == center_allocation['value']: + if not StewardAllocation.objects.filter(date__date=date, + guilds=guild, + steward_ware_house=steward_ware_house).exists(): + guilds_list.append(guild) + guilds = guilds_list + elif 'other_guilds_for_steward' in request.GET: + guilds_list = [] + now = datetime.now().date() + date = datetime.strptime(str(request.GET['date']), + '%Y-%m-%d').date() if 'date' in request.GET else now + steward = Steward.objects.get(guilds__user=user, active=True, trash=False) + steward_ware_house = StewardWareHouse.objects.filter(steward=steward, date__date=date, trash=False).first() + guilds = Guilds.objects.filter(trash=False, steward=False).order_by('id') + for guild in guilds: + if guild.centers_allocation == None: + guilds_list.append(guild) + else: + + for center_allocation in guild.centers_allocation: + if str(steward.key) != center_allocation['value']: + if not StewardAllocation.objects.filter(date__date=date, + guilds=guild, + steward_ware_house=steward_ware_house).exists(): + guilds_list.append(guild) + guilds = guilds_list + + elif 'role' in request.GET: + + if request.GET['role'] == 'CityCommerce': + guilds = Guilds.objects.filter(trash=False, address__city=user.city).order_by('id') + + + elif request.GET['role'] == 'ProvinceOperator': + guilds = Guilds.objects.filter(trash=False, steward=False, address__province=user.province).order_by( + 'id') + + elif request.GET['role'] == 'Steward': + is_free = request.GET.get('free') == 'true' + all = request.GET.get('all') == 'true' + steward = Guilds.objects.select_related('user').get(user=user, active=True, trash=False) + base_queryset = ( + Guilds.objects.filter(trash=False, active=True) + .select_related('user', 'address__city') + .values( + 'key', + 'guilds_name', + 'steward', + 'user__fullname', + 'user__mobile', + 'address__city__name', + ) + ) + if not all: + if is_free: + raw_data = base_queryset.filter(trash=False, active=True).exclude(id=steward.id).order_by( + 'steward') + else: + raw_data = base_queryset.filter( + stewards=steward, + trash=False, + province_accept_state__in=('pending', 'accepted'), + steward=False, + active=True + ).order_by('id') + else: + raw_data = base_queryset.order_by('steward') + guilds_data = [ + { + "key": g["key"], + "guilds_name": g["guilds_name"], + "steward": g["steward"], + "user": { + "fullname": g["user__fullname"], + "mobile": g["user__mobile"], + "city": g["address__city__name"], + } + } + for g in raw_data + ] + + return Response(guilds_data, status=status.HTTP_200_OK) + + + # elif request.GET['role'] == 'PosCompany': + # + # # steward = Guilds.objects.select_related('user').get(user=user, trash=False) + # base_queryset = ( + # Guilds.objects + # .select_related('user', 'address__city') + # .values( + # 'key', + # 'guilds_name', + # 'guilds_id', + # 'type_activity', + # 'area_activity', + # 'steward', + # 'user__fullname', + # 'user__mobile', + # 'address__city__name', + # ) + # ) + # + # raw_data = base_queryset.order_by('steward') + # guilds_data = [ + # { + # "key": g["key"], + # "guilds_name": g["guilds_name"], + # "steward": g["steward"], + # "guilds_id": g["guilds_id"], + # "type_activity": g["type_activity"], + # "area_activity": g["area_activity"], + # "user": { + # "fullname": g["user__fullname"], + # "mobile": g["user__mobile"], + # "city": g["address__city__name"], + # } + # } + # for g in raw_data + # ] + # + # return Response(guilds_data, status=status.HTTP_200_OK) + + else: + guilds_list = [] + guilds = Guilds.objects.filter(steward=False, active=True, trash=False).order_by('id') + if 'kill_house_key' in request.GET: + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + now = datetime.now().date() + date = datetime.strptime(str(request.GET['date']), + '%Y-%m-%d').date() if 'date' in request.GET else now + for guild in guilds: + if guild.kill_house_centers_allocation != None: + for kill_house_center_allocation in guild.kill_house_centers_allocation: + if request.GET['kill_house_key'] == kill_house_center_allocation['value']: + if not StewardAllocation.objects.filter(date__year=date.year, + date__month=date.month, + date__day=date.day, guilds=guild, + ware_house__kill_house=kill_house).exists(): + guilds_list.append(guild) + else: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + all = request.GET.get('all') == 'true' + if all: + base_queryset = ( + Guilds.objects + .filter(trash=False, active=True).select_related('user', 'address__city') + .values( + 'key', + 'guilds_name', + 'steward', + 'user__fullname', + 'user__mobile', + 'address__city__name', + ) + ) + raw_data = base_queryset.order_by('steward') + guilds_data = [ + { + "key": g["key"], + "guilds_name": g["guilds_name"], + "steward": g["steward"], + "user": { + "fullname": g["user__fullname"], + "mobile": g["user__mobile"], + "city": g["address__city__name"], + } + } + for g in raw_data + ] + + return Response(guilds_data, status=status.HTTP_200_OK) + # if 'free' in request.GET: + if request.GET['free'] == 'true': + guild_kill_ids = set(kill_house.guild_kill_houses.values_list('id', flat=True)) + steward_kill_ids = set(kill_house.steward_kill_houses.values_list('id', flat=True)) + all_exclude_ids = guild_kill_ids | steward_kill_ids + + guilds = Guilds.objects.filter( + trash=False, + active=True + ).exclude(id__in=all_exclude_ids).select_related('user__city') \ + .only('key', 'guilds_name', 'type_activity', 'area_activity', 'guilds_id', 'steward', + 'user') \ + .order_by('steward') + else: + guilds = Guilds.objects.filter( + Q(id__in=kill_house.guild_kill_houses.all().values_list('id', flat=True)) | Q( + id__in=kill_house.steward_kill_houses.all().values_list('id', flat=True)), + active=True, trash=False).order_by( + 'steward') + serializer = GuildsForBroadcastManagementSerializer(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + # + # counter = 0 + # for guild in guilds: + # if guild.kill_house_centers_allocation != None: + # if len(guild.kill_house_centers_allocation) == 0: + # continue + # for kill_house_center_allocation in guild.kill_house_centers_allocation: + # if str(kill_house.key) != kill_house_center_allocation['value']: + # counter += 1 + # if guild not in guilds_list and counter == len(guild.kill_house_centers_allocation): + # guilds_list.append(guild) + # else: + # guilds_list.append(guild) + + guilds = guilds_list + + serializer = GuildsSerializer(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class RealGuildsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.filter(trash=False) + permission_classes = [TokenHasReadWriteScope] + serializer_class = RealGuildsSerializer + + def create(self, request, *args, **kwargs): + allocation_limit = None + allocation_type = None + owner_key = None + role_type = None + group = Group.objects.get(name__exact="Guilds") + role = request.data['role'] + type_activity = TypeActivity.objects.get(title=request.data['type_activity']) + area_activity = AreaActivity.objects.get(title=request.data['area_activity']) + register = register_user(group, request.data['city'], request.data['mobile'], request.data['first_name'], + request.data['last_name'], request.data['national_id'], request.data['postal_code'], + request.data['address']) + if 'allocation_limit' in request.data.keys(): + allocation_limit = request.data['allocation_limit'] + allocation_type = request.data['allocation_type'] + request.data.pop('allocation_limit') + request.data.pop('allocation_type') + + if 'owner_key' in request.data.keys(): + owner_key = request.data['owner_key'] + request.data.pop('owner_key') + + if 'role_type' in request.data.keys(): + role_type = request.data['role_type'] + request.data.pop('role_type') + + if not register: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است"}, status=status.HTTP_403_FORBIDDEN) + request.data.pop('city') + request.data.pop('role') + request.data.pop('mobile') + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('national_id') + request.data.pop('postal_code') + request.data.pop('type_activity') + request.data.pop('area_activity') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + guilds = serializer.create(validated_data=request.data) + guilds.user = register["system_profile"] + guilds.address = register["address"] + guilds.wallet = register["wallet"] + guilds.type_activity = type_activity.title + guilds.area_activity = area_activity.title + guilds.guild_type_activity = type_activity + guilds.guild_area_activity = area_activity + guilds.save() + parent_product = NewProduct.objects.all().first() + approved_type = True if parent_product.approved_price_status == True else False + approved_price = parent_product.approved_price + product = RolesProducts( + parent_product=parent_product, + guild=guilds, + name='مرغ گرم', + approved_price_status=approved_type, + approved_price=approved_price, + ) + product.save() + if role == 'KillHouse': + user = SystemUserProfile.objects.get(user=request.user) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).order_by( + 'id').first() + guilds.province_accept_state = 'pending' + guilds.kill_house_register = True + + guilds.save() + + if guilds.steward == True: + guilds.steward_kill_house.add(kill_house) + relation = KillHouseStewardGuildRelation(steward=guilds, kill_house=kill_house, + allocation_limit=allocation_limit, + allocation_type=allocation_type) + relation.save() + + + + + else: + guilds.kill_house.add(kill_house) + relation = KillHouseStewardGuildRelation(guild=guilds, kill_house=kill_house, + allocation_limit=allocation_limit, + allocation_type=allocation_type) + relation.save() + + + elif role == 'Steward': + user = SystemUserProfile.objects.get(user=request.user) + steward = Steward.objects.get(guilds__user=user, trash=False) + guilds.stewards.add(steward) + relation = KillHouseStewardGuildRelation(guild=guilds, steward=steward, + allocation_limit=allocation_limit, + allocation_type=allocation_type) + relation.save() + guilds.province_accept_state = 'pending' + guilds.steward_register = True + guilds.save() + + + elif role == 'PosCompany': + guilds.province_accept_state = 'pending' + guilds.pos_company_register = True + guilds.save() + else: + if role_type == 'KillHouse': + kill_house = KillHouse.objects.get(key=owner_key) + + if guilds.steward == True: + guilds.steward_kill_house.add(kill_house) + relation = KillHouseStewardGuildRelation(steward=guilds, kill_house=kill_house, + allocation_limit=allocation_limit, + allocation_type=allocation_type) + relation.save() + else: + guilds.kill_house.add(kill_house) + relation = KillHouseStewardGuildRelation(guild=guilds, kill_house=kill_house, + allocation_limit=allocation_limit, + allocation_type=allocation_type) + relation.save() + else: + steward = Steward.objects.get(key=owner_key, trash=False) + guilds.stewards.add(steward) + relation = KillHouseStewardGuildRelation(guild=guilds, steward=steward, + allocation_limit=allocation_limit, + allocation_type=allocation_type) + relation.save() + + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(trash=False, user=request.user) + role = request.GET.get('role') + role_type = request.GET.get('role_type') + key = request.GET.get('key') + guild_type = request.GET.get('type') + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(trash=False, kill_house_operator__user=user).first() + if guild_type == 'guild': + guilds = Guilds.objects.filter(trash=False, province_accept_state__in=('pending', 'accepted'), + steward=False).exclude( + id__in=kill_house.guild_kill_houses.all().values_list('id', flat=True)) + else: + guilds = Guilds.objects.filter(trash=False, province_accept_state__in=('pending', 'accepted'), + steward=True).exclude( + id__in=kill_house.steward_kill_houses.all().values_list('id', flat=True)) + + elif role == 'Steward': + steward = Guilds.objects.get(user=user, steward=True, trash=False) + guilds = steward.guild_stewards.all().filter(trash=False, province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + + else: + if role_type == 'KillHouse': + kill_house = KillHouse.objects.get(key=key) + if guild_type == 'guild': + guilds = Guilds.objects.filter(trash=False, province_accept_state__in=('pending', 'accepted'), + steward=False).exclude( + id__in=kill_house.guild_kill_houses.all().values_list('id', flat=True)) + else: + guilds = Guilds.objects.filter(trash=False, province_accept_state__in=('pending', 'accepted'), + steward=True).exclude( + id__in=kill_house.steward_kill_houses.all().values_list('id', flat=True)) + + else: + steward = Guilds.objects.get(key=key) + guilds = steward.guild_stewards.all().filter(trash=False, province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + + serializer = self.serializer_class(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + guilds = Guilds.objects.get(key=request.data['guilds_key'], trash=False) + system_user_profile = SystemUserProfile.objects.get(key=guilds.user.key, trash=False) + address = SystemAddress.objects.get(key=guilds.address.key, trash=False) + + if 'choose' in request.data.keys(): + role_type = request.data['type'] + if role_type == 'KillHouse': + kill_house = KillHouse.objects.get(key=request.data['owner_key']) + if request.data['choose_type'] == 'guild': + guilds.kill_house.add(kill_house) + relation = KillHouseStewardGuildRelation(guild=guilds, kill_house=kill_house, + allocation_limit=request.data['allocation_limit'], + allocation_type=request.data['allocation_type']) + else: + guilds.steward_kill_house.add(kill_house) + relation = KillHouseStewardGuildRelation(steward=guilds, kill_house=kill_house, + allocation_limit=request.data['allocation_limit'], + allocation_type=request.data['allocation_type']) + + relation.save() + + else: + + steward = Guilds.objects.get(key=request.data['owner_key']) + guilds.stewards.add(steward) + relation = KillHouseStewardGuildRelation(guild=guilds, steward=steward, + allocation_limit=request.data['allocation_limit'], + allocation_type=request.data['allocation_type']) + relation.save() + request.data.pop('choose') + request.data.pop('type') + request.data.pop('owner_key') + request.data.pop('allocation_limit') + request.data.pop('allocation_type') + request.data.pop('choose_type') + + if 'KillHouseList' in request.data.keys(): + kill_houses = KillHouse.objects.filter(key__in=request.data['KillHouseList']).order_by('id') + guilds.kill_house.set(kill_houses) + KillHouseStewardGuildRelation.objects.filter(guild=guilds, kill_house__isnull=False).delete() + + relations = [ + KillHouseStewardGuildRelation(guild=guilds, kill_house=kill_house) + for kill_house in kill_houses + ] + + KillHouseStewardGuildRelation.objects.bulk_create(relations) + # guilds.guild_kill_houses.clear() + # guilds.guild_kill_houses.add(*kill_houses) + if 'StewardList' in request.data.keys(): + stewards = Guilds.objects.filter(key__in=request.data['StewardList']).order_by('id') + guilds.stewards.set(stewards) + request.data.pop('StewardList') + + if 'StewardKillHouseList' in request.data.keys(): + kill_houses = KillHouse.objects.filter(key__in=request.data['StewardKillHouseList']).order_by('id') + guilds.steward_kill_house.set(kill_houses) + request.data.pop('StewardKillHouseList') + + if 'type_activity' in request.data.keys(): + type_activity = TypeActivity.objects.get(title=request.data['type_activity']) + area_activity = AreaActivity.objects.get(title=request.data['area_activity']) + guilds.type_activity = type_activity.title + guilds.area_activity = area_activity.title + guilds.guild_type_activity = type_activity + guilds.guild_area_activity = area_activity + guilds.save() + request.data.pop('type_activity') + request.data.pop('area_activity') + + if 'first_name' in request.data.keys(): + system_user_profile.first_name = request.data['first_name'] + system_user_profile.last_name = request.data['last_name'] + system_user_profile.fullname = request.data['first_name'] + " " + request.data['last_name'] + system_user_profile.national_id = request.data['national_id'] + system_user_profile.save() + first_mobile_number = system_user_profile.mobile + second_mobile_number = request.data['mobile'] + request.data.pop('mobile') + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = second_mobile_number + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + + city = City.objects.get(name=request.data['city']) + province = Province.objects.get(key=city.province.key) + address.city = city + address.province = province + address.address = request.data['address'] + address.postal_code = request.data['postal_code'] + address.save() + request.data.pop('guilds_key') + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('national_id') + request.data.pop('city') + serializer = self.serializer_class(guilds) + serializer.update(instance=guilds, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class RegisterGuildsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.filter(trash=False) + permission_classes = [TokenHasReadWriteScope] + serializer_class = RealGuildsSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsFilterSet + + def build_query(self, value): + from django.db.models import Q + query = Q() + for field in self.filterset_class.Meta.fields: + query |= Q(**{f"{field}__icontains": value}) + return query + + def set_filter(self, role, status): + filters = {'trash': False} + if status == 'temporary_registration': + filters['temporary_registration'] = True + + return filters + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + group = Group.objects.get(name__exact="Guilds") + role = request.data.pop('role', None) + city = request.data.pop('city', None) + mobile = request.data.pop('mobile', None) + first_name = request.data.pop('first_name', None) + last_name = request.data.pop('last_name', None) + address = request.data.pop('address', None) + national_id = request.data.pop('national_id', None) + postal_code = request.data.pop('postal_code', None) + type_activity = request.data.pop('type_activity', None) + area_activity = request.data.pop('area_activity', None) + license_file = request.data.pop('license_file', None) + type_activity = TypeActivity.objects.get(title=type_activity) + area_activity = AreaActivity.objects.get(title=area_activity) + register = register_user(group, city, mobile, first_name, + last_name, national_id, postal_code, + address) + if not register: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است"}, status=status.HTTP_403_FORBIDDEN) + + if register == 'exist': + return Response({"result": "این صنف قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + guilds = serializer.create(validated_data=request.data) + guilds.user = register["system_profile"] + guilds.address = register["address"] + guilds.wallet = register["wallet"] + guilds.type_activity = type_activity.title + guilds.area_activity = area_activity.title + guilds.guild_type_activity = type_activity + guilds.guild_area_activity = area_activity + guilds.registerar_role = role + guilds.registerar_fullname = user.fullname + guilds.registerar_mobile = user.mobile + if license_file: + guilds.license_file = send_image_to_server(license_file) + guilds.license = True + guilds.final_accept = True + else: + guilds.temporary_registration = True + + guilds.save() + + if guilds.license_file: + parent_product = NewProduct.objects.all().first() + approved_type = True if parent_product.approved_price_status == True else False + approved_price = parent_product.approved_price + product = RolesProducts( + parent_product=parent_product, + guild=guilds, + name='مرغ گرم', + approved_price_status=approved_type, + approved_price=approved_price, + ) + product.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + role = request.GET.get('role') + status = request.GET.get('status') + filters = self.set_filter(role, status) if role and status else {} + guilds = Guilds.objects.filter(**filters).order_by('id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + guilds = guilds.filter( + self.build_query(value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(guilds.distinct()) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class StewardForColdHouseViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PosGuildsSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsFilterSet + + def list(self, request, *args, **kwargs): + if 'total' in request.GET: + guilds = Guilds.objects.filter(trash=False, steward=True, + pk__in=ColdHouse.objects.filter(steward__isnull=False).values_list('steward', + flat=True)).order_by( + 'id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + guilds = guilds.filter( + self.build_query(value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(guilds.distinct()) + if page is not None: + serializer = GuildsForTotalColdHouseSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = GuildsForTotalColdHouseSerializer(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + guilds = Guilds.objects.filter(trash=False, steward=True).exclude( + pk__in=ColdHouse.objects.filter(steward__isnull=False).values_list('steward', flat=True)).order_by( + 'id').select_related('user', 'user__city', 'user__province').only('user', 'user__city', 'user__province') + serializer = GuildsForColdHouseSerializer(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def build_query(self, value): + from django.db.models import Q + query = Q() + for field in self.filterset_class.Meta.fields: + query |= Q(**{f"{field}__icontains": value}) + return query + + +class StewardColdHousesViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardColdHousesSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + steward = Guilds.objects.get(user=user, trash=False) + serializer = self.get_serializer(steward) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PosGuildsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [AllowAny] + serializer_class = PosGuildsSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsFilterSet + + def list(self, request, *args, **kwargs): + pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False) + rel_type = request.GET.get('rel_type') + type = request.GET.get('type') + + if pos.kill_house: + if rel_type and type: + if rel_type == "free": + if type == 'guild': + guilds = Guilds.objects.filter(trash=False, steward=False, active=True).exclude( + id__in=pos.kill_house.guild_kill_houses.values_list('id', flat=True) + ).order_by('id').only( + 'guilds_name', 'type_activity', 'area_activity', 'guilds_id', 'steward' + ) + else: + guilds = Guilds.objects.filter(trash=False, steward=True, active=True).exclude( + id__in=pos.kill_house.steward_kill_houses.values_list('id', flat=True)).order_by('id').only( + 'guilds_name', 'type_activity', 'area_activity', 'guilds_id', 'steward' + ) + + else: + if type == 'guild': + guilds = Guilds.objects.filter( + id__in=pos.kill_house.guild_kill_houses.all().values_list('id', flat=True), + steward=False, active=True).order_by( + 'id').only('guilds_name', 'user', 'type_activity', 'area_activity', 'guilds_id', 'steward') + + else: + guilds = Guilds.objects.filter( + id__in=pos.kill_house.steward_kill_houses.all().values_list('id', flat=True), + steward=True, active=True).order_by( + 'steward').only('guilds_name', 'user', 'type_activity', 'area_activity', 'guilds_id', + 'steward') + + else: + guilds = Guilds.objects.filter(trash=False) + + else: + if rel_type and type: + if rel_type == "free": + if type == 'guild': + guilds = Guilds.objects.filter(trash=False, steward=False, active=True).exclude( + id__in=Guilds.objects.filter(stewards=pos.guild, trash=False, + province_accept_state__in=('pending', 'accepted')).values_list( + 'id', + flat=True)).only( + 'guilds_name', 'user', 'type_activity', 'area_activity', 'guilds_id', 'steward') + + else: + + guilds = Guilds.objects.filter(trash=False, steward=True, active=True).exclude( + id=pos.guild.id).only( + 'guilds_name', 'user', 'type_activity', 'area_activity', 'guilds_id', 'steward') + + else: + if type == 'guild': + guilds = Guilds.objects.filter(stewards=pos.guild, trash=False, + province_accept_state__in=('pending', 'accepted'), + steward=False, active=True).order_by('id').only( + 'guilds_name', 'user', 'type_activity', 'area_activity', 'guilds_id', 'steward') + else: + guilds = Guilds.objects.filter(stewards=pos.guild, trash=False, + province_accept_state__in=('pending', 'accepted'), + steward=True, active=True).order_by( + 'id').only( + 'guilds_name', 'user', 'type_activity', 'area_activity', 'guilds_id', 'steward') + else: + guilds = Guilds.objects.filter(trash=False).order_by('steward') + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + guilds = guilds.filter( + self.build_query(value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(guilds.distinct()) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = PosGuildsForBroadcastManagementSerializer(guilds.distinct(), many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def build_query(self, value): + from django.db.models import Q + query = Q() + for field in self.filterset_class.Meta.fields: + query |= Q(**{f"{field}__icontains": value}) + return query + + +class ProvinceCheckKillHouseGuildsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = GuildsSerializer + + def create(self, request, *args, **kwargs): + guilds = Guilds.objects.get(key=request.data['guilds_key']) + request.data.pop('guilds_key') + role = request.data.pop('role') + + steward = Steward.objects.filter(guilds=guilds, trash=False).last() + if request.data['state'] == 'accepted': + guilds.province_accept_state = 'accepted' + if guilds.active_register_code and guilds.logged_register_code is None: + code = request.data.get('code') + if code != guilds.register_code: + return Response({'result': "کد وارد شده معتبر نمیباشد!"}, status=status.HTTP_403_FORBIDDEN) + if role not in ['AdminX', 'SuperAdmin', 'ProvinceOperator']: + guilds.province_accept_state = 'pending' + guilds.logged_register_code = code + guilds.active_register_code = True + guilds.is_registered = True + guilds.save() + if steward: + steward.province_accept_state = 'accepted' + steward.save() + + else: + guilds.province_accept_state = 'rejected' + guilds.province_message = request.data['message'] + guilds.save() + if steward: + steward.province_accept_state = 'rejected' + steward.save() + + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_200_OK) + + +class TotalGuildsForCompaniesViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = GuildsForCompaniesSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsFilterSet + filterset_fields = [ + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'address__city__name', + 'guilds_name', + 'type_activity', + 'area_activity', + + ] + + def update(self, request, pk=None, *args, **kwargs): + guild = Guilds.objects.get(key=request.data['guild_key'], trash=False) + request.data.pop('guild_key') + serializer = self.serializer_class(guild) + serializer.update(instance=guild, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def build_query(self, value): + from django.db.models import Q + query = Q() + for field in self.filterset_class.Meta.fields: + query |= Q(**{f"{field}__icontains": value}) + return query + + def list(self, request, *args, **kwargs): + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + pos_company = PosCompany.objects.get(user=user, trash=False) + # pos = POSMachine.objects.filter(pos_company=pos_company, trash=False).select_related('guild').only( + # 'guild').values_list('guild', flat=True).distinct() + + guilds = Guilds.objects.filter(trash=False, + address__province=user.province).order_by('-has_pos') + # guilds = Guilds.objects.filter(Q(id__in=pos) | Q(has_pos=False), trash=False, + # address__province=user.province).order_by('-has_pos') + + if 'value' in request.GET and request.GET['value'] == 'undefined': + pass + else: + value = request.GET.get('value') + search = request.GET.get('search') + guilds_list = [] + if value and search == 'filter': + if value != 'undefined' and value.strip(): + guilds = guilds.filter( + self.build_query(value) + ) + # if request.GET['search'] == 'filter': + # if request.GET['value'] != "": + # for item in self.filterset_fields: + # query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + # if (self.filterset_class( + # data=query, + # queryset=guilds + # ) + # ).filter(): + # ps = self.filterset_class(data=query, queryset=guilds) + # guilds_list = ps.filter() + # guilds = [] if len(guilds_list) == 0 else guilds_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(guilds) + if page is not None: + serializer = self.get_serializer(page, context={'company': pos_company.name}, many=True) + return self.get_paginated_response(serializer.data) + + serializer = GuildsForCompaniesSerializer(guilds, context={'company': pos_company.name}, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalGuildsForInspectionViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [AllowAny] + serializer_class = GuildsForCompaniesSerializer + + def list(self, request, *args, **kwargs): + guilds = Guilds.objects.filter(trash=False, province_accept_state='accepted') + serializer = GuildsForInspectionSerializer(guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalGuildsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = GuildsSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsFilterSet + + def list(self, request, *args, **kwargs): + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if request.GET['role'] in ['CityCommerce', 'CityOperator', 'CityJahad', 'CityPoultry']: + guilds = Guilds.objects.filter(trash=False, province_accept_state='accepted', + address__city=user.city).exclude(user__national_id='0').order_by('id') + elif request.GET['role'] == 'Steward': + + steward = Guilds.objects.get(user=user, trash=False).exclude(user__national_id='0') + guilds = Guilds.objects.filter(stewards=steward).exclude(user__national_id='0').order_by('id') + + + elif request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if 'steward' in request.GET and request.GET['steward'] == 'true': + guilds = kill_house.steward_kill_houses.all().filter(trash=False, steward=True, + province_accept_state__in=( + 'pending', 'accepted')).exclude( + user__national_id='0').order_by( + '-is_registered', '-id') + else: + # guilds = kill_house.guild_kill_houses.all().filter(trash=False, + # province_accept_state__in=( + # 'pending', 'accepted')).order_by('id') + guilds = Guilds.objects.filter( + Q(id__in=kill_house.guild_kill_houses.all().values_list('id', flat=True)) | Q( + id__in=kill_house.steward_kill_houses.all().values_list('id', flat=True))).exclude( + user__national_id='0').order_by( + '-is_registered', '-id') + + else: + if 'check' in request.GET: + if request.GET['state'] == 'pending': + guilds = Guilds.objects.filter( + # Q(kill_house_register=True) | Q(steward_register=True) | Q(pos_company_register=True), + province_accept_state='pending', + trash=False).exclude(user__national_id='0').order_by('-id') + else: + guilds = Guilds.objects.filter(kill_house_register=True, + trash=False).exclude(user__national_id='0').order_by('id') + else: + is_real_person = request.GET.get('is_real_person') + filters = {"province_accept_state": "accepted", "trash": False} + active = request.GET.get('active_state') + if active == 'active': + filters['active'] = True + elif active == 'deactive': + filters['active'] = False + if is_real_person: + if is_real_person == 'false': + filters["is_real_person"] = False + else: + filters["is_real_person"] = True + if 'steward' in request.GET and request.GET['steward'] == 'true': + guilds = Guilds.objects.filter(**filters, steward=True).exclude(user__national_id='0').order_by( + 'id') + else: + guilds = Guilds.objects.filter(**filters).exclude(user__national_id='0').order_by('id') + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + guilds = guilds.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(guilds.distinct()) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = GuildsSerializer(guilds.distinct(), many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def build_query(self, value): + from django.db.models import Q + query = Q() + for field in self.filterset_class.Meta.fields: + query |= Q(**{f"{field}__icontains": value}) + return query + + +# class TotalGuildsDistributionManagementViewSet(viewsets.ModelViewSet): +# queryset = Guilds.objects.all() +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = GuildsForDistributionManagementSerializer +# pagination_class = CustomPagination +# filter_backends = [DjangoFilterBackend] +# filterset_class = GuildsFilterSet +# +# def build_query(self, value): +# from django.db.models import Q +# query = Q() +# for field in self.filterset_class.Meta.fields: +# query |= Q(**{f"{field}__icontains": value}) +# return query +# +# def list(self, request, *args, **kwargs): +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# management_type = request.GET.get('management_type') +# role_type = request.GET.get('role_type') +# type = request.GET.get('type') +# +# if role_type == 'KillHouse': +# kill_house = KillHouse.objects.get(key=request.GET.get('key')) +# if management_type == 'subcategories': +# if type == 'guild': +# guilds = kill_house.guild_kill_houses.all().filter(trash=False, province_accept_state__in=( +# 'pending', 'accepted')).order_by('id') +# elif type == 'steward': +# guilds = kill_house.steward_kill_houses.all().filter(trash=False, steward=True, +# province_accept_state__in=( +# 'pending', 'accepted')).order_by('id') +# else: +# guilds = Guilds.objects.filter( +# Q(id__in=kill_house.guild_kill_houses.all().values_list('id', flat=True)) | Q( +# id__in=kill_house.steward_kill_houses.all().values_list('id', flat=True))).order_by( +# 'steward') +# else: +# if type == 'guild': +# guilds = Guilds.objects.filter(trash=False, steward=False, +# province_accept_state__in=('pending', 'accepted')).exclude( +# kill_house.guild_kill_houses.all()).order_by('id') +# elif type == 'steward': +# guilds = Guilds.objects.filter(trash=False, steward=True, +# province_accept_state__in=('pending', 'accepted')).exclude( +# kill_house.steward_kill_houses.all()).order_by('id') +# else: +# guilds = Guilds.objects.filter(trash=False, steward=True, +# province_accept_state__in=('pending', 'accepted')).exclude( +# Q(id__in=kill_house.guild_kill_houses.all().values_list('id', flat=True)) | Q( +# id__in=kill_house.steward_kill_houses.all().values_list('id', flat=True))).order_by( +# 'steward') +# else: +# steward = Guilds.objects.get(key=request.GET.get('key')) +# if management_type == 'subcategories': +# guilds = steward.guild_stewards.all().filter(trash=False, province_accept_state__in=( +# 'pending', 'accepted')).order_by('id') +# +# else: +# guilds = Guilds.objects.filter(trash=False, steward=True, +# province_accept_state__in=('pending', 'accepted')).exclude( +# id__in=steward.guild_stewards.all().values_list('id', flat=True)).order_by('id') +# +# value = request.GET.get('value') +# search = request.GET.get('search') +# if value and search == 'filter': +# if value != 'undefined' and value.strip(): +# guilds = guilds.filter( +# self.build_query(value) +# ) +# +# page_size = request.query_params.get('page_size', None) +# if page_size: +# self.pagination_class.page_size = int(page_size) +# +# page = self.paginate_queryset(guilds.distinct()) +# if page is not None: +# if management_type == 'subcategories' and role_type == 'KillHouse': +# serializer = self.get_serializer(page, many=True, +# context={'role_type': 'KillHouse', 'role_object': kill_house, +# 'type': type}) +# elif management_type == 'subcategories' and role_type == 'Steward': +# serializer = self.get_serializer(page, many=True, +# context={'role_type': 'Steward', 'role_object': steward}) +# else: +# serializer = self.get_serializer(page, many=True, context={'role_type': None}) +# return self.get_paginated_response(serializer.data) +# if management_type == 'subcategories' and role_type == 'KillHouse': +# serializer = GuildsForDistributionManagementSerializer(guilds.distinct(), many=True, +# context={'role_type': 'KillHouse', +# 'role_object': kill_house, 'type': type}) +# elif management_type == 'subcategories' and role_type == 'Steward': +# serializer = GuildsForDistributionManagementSerializer(guilds.distinct(), many=True, +# context={'role_type': 'Steward', +# 'role_object': steward}) +# else: +# +# serializer = GuildsForDistributionManagementSerializer(guilds.distinct(), many=True, +# context={'role_type': None}) +# return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalGuildsDistributionManagementViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = GuildsForDistributionManagementSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsFilterSet + + def build_query(self, value): + from django.db.models import Q + query = Q() + for field in self.filterset_class.Meta.fields: + query |= Q(**{f"{field}__icontains": value}) + return query + + def create(self, request, *args, **kwargs): + group = Group.objects.get(name__exact="Guilds") + role = request.data['role'] + type_activity = TypeActivity.objects.get(title=request.data['type_activity']) + area_activity = AreaActivity.objects.get(title=request.data['area_activity']) + register = register_user(group, request.data['city'], request.data['mobile'], request.data['first_name'], + request.data['last_name'], request.data['national_id'], request.data['postal_code'], + request.data['address']) + if not register: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است"}, status=status.HTTP_403_FORBIDDEN) + request.data.pop('city') + request.data.pop('role') + request.data.pop('mobile') + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('address') + request.data.pop('national_id') + request.data.pop('postal_code') + request.data.pop('type_activity') + request.data.pop('area_activity') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + guilds = serializer.create(validated_data=request.data) + guilds.user = register["system_profile"] + guilds.address = register["address"] + guilds.wallet = register["wallet"] + guilds.type_activity = type_activity.title + guilds.area_activity = area_activity.title + guilds.guild_type_activity = type_activity + guilds.guild_area_activity = area_activity + guilds.save() + parent_product = NewProduct.objects.all().first() + approved_type = True if parent_product.approved_price_status == True else False + approved_price = parent_product.approved_price + product = RolesProducts( + parent_product=parent_product, + guild=guilds, + name='مرغ گرم', + approved_price_status=approved_type, + approved_price=approved_price, + ) + product.save() + if role == 'KillHouse': + user = SystemUserProfile.objects.get(user=request.user) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).order_by( + 'id').first() + guilds.kill_house_centers_allocation = [ + {"label": kill_house.name, "value": str(kill_house.key)}] + guilds.province_accept_state = 'pending' + guilds.kill_house_register = True + + guilds.save() + + if guilds.steward == True: + guilds.steward_kill_house.add(kill_house) + + else: + guilds.kill_house.add(kill_house) + + elif role == 'Guilds': + user = SystemUserProfile.objects.get(user=request.user) + steward = Steward.objects.get(guilds__user=user, trash=False) + + guilds.centers_allocation = [ + {"label": steward.guilds.user.fullname, "value": str(steward.key)}] + guilds.province_accept_state = 'pending' + guilds.steward_register = True + guilds.save() + + elif role == 'PosCompany': + guilds.province_accept_state = 'pending' + guilds.pos_company_register = True + guilds.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + type = request.GET.get('type') + role = request.GET.get('role') + role_type = request.GET.get('role_type') + key = request.GET.get('key') + city_name = request.GET.get('city_name') + type_activity = request.GET.get('type_activity') + user_level = request.GET.get('user_level') + role_object = None + type_object = None + + if role == 'KillHouse': + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if type == 'guild': + guilds = kill_house.guild_kill_houses.all().filter(trash=False, province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + + else: + guilds = kill_house.steward_kill_houses.all().filter(trash=False, steward=True, + province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + role_object = kill_house + type_object = 'KillHouse' + + + elif role == 'Steward': + steward = Guilds.objects.get(user=user, trash=False) + guilds = steward.guild_stewards.all().filter(trash=False, province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + role_object = steward + type_object = 'Steward' + + + else: + if key: + if role_type == 'KillHouse': + kill_house = KillHouse.objects.get(key=key, trash=False) + if type == 'guild': + guilds = kill_house.guild_kill_houses.all().filter(trash=False, province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + + else: + guilds = kill_house.steward_kill_houses.all().filter(trash=False, steward=True, + province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + role_object = kill_house + type_object = 'KillHouse' + else: + steward = Guilds.objects.get(key=key, trash=False) + guilds = steward.guild_stewards.all().filter(trash=False, province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + + role_object = steward + type_object = 'Steward' + else: + if type == 'guild': + + guilds = Guilds.objects.filter(trash=False, steward=False, + province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + + else: + guilds = Guilds.objects.filter(trash=False, steward=True, + province_accept_state__in=( + 'pending', 'accepted')).order_by('id') + + if city_name: + guilds = guilds.filter(user__city__name__icontains=city_name) + + if type_activity: + guilds = guilds.filter(type_activity__icontains=type_activity) + if user_level: + guilds = guilds.filter(user_level__fa_title__icontains=user_level) + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + guilds = guilds.filter( + self.build_query(value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(guilds.distinct()) + if page is not None: + serializer = self.get_serializer(page, many=True, + context={'role_object': role_object, 'type_object': type_object, + 'type': type}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(guilds.distinct(), many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TestTotalGuildsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = TestGuildsSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = TestGuildsFilterSet + + def list(self, request, *args, **kwargs): + guilds = Guilds.objects.filter(province_accept_state='accepted', trash=False).order_by('id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + filtered_guilds = guilds.filter( + self.build_query(value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(filtered_guilds) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = GuildsSerializer(filtered_guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def build_query(self, value): + from django.db.models import Q + query = Q() + for field in self.filterset_class.Meta.fields: + query |= Q(**{f"{field}__icontains": value}) + return query + + +# class StewardViewSet(viewsets.ModelViewSet): +# # queryset = Steward.objects.all() +# # permission_classes = [TokenHasReadWriteScope] +# # serializer_class = StewardSerializer +# queryset = Guilds.objects.all() +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = GuildsSerializer +# pagination_class = CustomPagination +# filter_backends = [DjangoFilterBackend] +# filterset_class = GuildsFilterSet +# filterset_fields = [ +# 'user__mobile', +# 'user__first_name', +# 'user__last_name', +# 'user__city__name', +# 'user__province__name', +# 'address__city__name', +# 'guilds_name', +# 'type_activity', +# 'area_activity', +# +# ] +# +# def create(self, request, *args, **kwargs): +# guilds = Guilds.objects.get(key=request.data['guilds_key']) +# request.data.pop('guilds_key') +# if Steward.objects.filter(guilds=guilds, trash=False).exists(): +# return Response({"result": "این صنف قبلا به عنوان مباشر ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) +# serializer = self.serializer_class(data=request.data) +# if serializer.is_valid(): +# steward = serializer.create(validated_data=request.data) +# steward.guilds = guilds +# steward.save() +# guilds.steward = True +# guilds.save() +# return Response(serializer.data, status=status.HTTP_201_CREATED) +# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +# +# def update(self, request, pk=None, *args, **kwargs): +# steward = Steward.objects.get(key=request.data['steward_key'], trash=False) +# guild = Guilds.objects.get(key=steward.guilds.key, trash=False) +# if 'allocation_limit' in request.data.keys(): +# if request.data['allocation_limit'] == "": +# steward.allocation_limit = None +# steward.save() +# request.data.pop('allocation_limit') +# request.data.pop('steward_key') +# if 'centers_allocation' in request.data.keys() and request.data['centers_allocation'] != None: +# guild.kill_house_centers_allocation = request.data['centers_allocation'] +# guild.save() +# serializer = self.serializer_class(steward) +# serializer.update(instance=steward, validated_data=request.data) +# return Response(serializer.data, status=status.HTTP_200_OK) +# +# def list(self, request, *args, **kwargs): +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# +# if request.GET['role'] in ['CityCommerce', 'CityJahad', 'CityPoultry']: +# stewards = Guilds.objects.filter(trash=False, address__city=user.city).order_by('id') +# +# elif request.GET['role'] in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin', +# 'ImprovingLivestock', 'AdminX', 'Supporter']: +# stewards = Guilds.objects.filter(trash=False, address__province=user.province, +# steward=True).order_by('id') +# +# else: +# stewards = Guilds.objects.filter(steward=True, trash=False).order_by('id') +# if 'kill_house_key' in request.GET: +# kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) +# else: +# kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() +# # now = datetime.now().date() +# # date = datetime.strptime(str(request.GET['date']), +# # '%Y-%m-%d').date() if 'date' in request.GET else now +# # stewards_list = [] +# # if 'kill_house_key' in request.GET: +# # # if 'allocation' in request.GET: +# # for steward in stewards: +# # if steward.centers_allocation != None: +# # for center_allocation in steward.centers_allocation: +# # if request.GET['kill_house_key'] == center_allocation['value']: +# # if not StewardAllocation.objects.filter( +# # Q(type='manual') | Q(type='auto', +# # system_registration_code=True), date__date=date, +# # steward=steward, +# # ware_house__kill_house=kill_house, trash=False).exists(): +# # stewards_list.append(steward) +# # else: +# # for steward in stewards: +# # if steward.centers_allocation == None: +# # stewards_list.append(steward) +# # else: +# # counter = 0 +# # if len(steward.centers_allocation) == 0: +# # continue +# # for center_allocation in steward.centers_allocation: +# # +# # if str(kill_house.key) != center_allocation['value']: +# # counter += 1 +# # if steward not in stewards_list and counter == len(steward.centers_allocation): +# # stewards_list.append(steward) +# # +# # stewards = stewards_list +# +# if 'search' in request.GET: +# if 'value' in request.GET and request.GET['value'] == 'undefined': +# pass +# else: +# # if 'search' in request.GET: +# steward_list = [] +# if request.GET['search'] == 'filter': +# if request.GET['value'] != "": +# for item in self.filterset_fields: +# query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) +# if (self.filterset_class( +# data=query, +# queryset=stewards +# ) +# ).filter(): +# ps = self.filterset_class(data=query, queryset=stewards) +# steward_list = ps.filter() +# stewards = [] if len(steward_list) == 0 else steward_list +# if 'page_size' in request.GET: +# page_size = request.query_params.get('page_size', None) +# if page_size: +# self.pagination_class.page_size = int(page_size) +# +# page = self.paginate_queryset(stewards) +# if page is not None: +# serializer = self.get_serializer(page, many=True) +# return self.get_paginated_response(serializer.data) +# +# serializer = GuildsForStewardMenueSerializer(stewards, many=True) +# return Response(serializer.data, status=status.HTTP_200_OK) + + +class StewardViewSet(viewsets.ModelViewSet): + queryset = Steward.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardSerializer + + def create(self, request, *args, **kwargs): + guilds = Guilds.objects.get(key=request.data['guilds_key']) + request.data.pop('guilds_key') + if Steward.objects.filter(guilds=guilds, trash=False).exists(): + return Response({"result": "این صنف قبلا به عنوان مباشر ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + steward = serializer.create(validated_data=request.data) + steward.guilds = guilds + steward.save() + guilds.steward = True + guilds.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + steward = Steward.objects.get(key=request.data['steward_key'], trash=False) + guild = Guilds.objects.get(key=steward.guilds.key, trash=False) + if 'allocation_limit' in request.data.keys(): + if request.data['allocation_limit'] == "": + steward.allocation_limit = None + steward.save() + request.data.pop('allocation_limit') + request.data.pop('steward_key') + if 'centers_allocation' in request.data.keys() and request.data['centers_allocation'] != None: + guild.kill_house_centers_allocation = request.data['centers_allocation'] + guild.save() + serializer = self.serializer_class(steward) + serializer.update(instance=steward, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if request.GET['role'] in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin', + 'ImprovingLivestock', 'AdminX', 'Supporter']: + stewards = Steward.objects.filter(trash=False, guilds__address__province=user.province, + guilds__steward=True).exclude( + guilds__user__national_id='0').select_related('guilds').order_by('id') + elif request.GET['role'] == 'CityCommerce': + stewards = Steward.objects.filter(trash=False, guilds__address__city=user.city).exclude( + guilds__user__national_id='0').order_by('id') + + + else: + stewards = Steward.objects.filter(guilds__steward=True, trash=False).exclude( + guilds__user__national_id='0').order_by('id') + if 'kill_house_key' in request.GET: + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + else: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + now = datetime.now().date() + date = datetime.strptime(str(request.GET['date']), + '%Y-%m-%d').date() if 'date' in request.GET else now + stewards_list = [] + if 'kill_house_key' in request.GET: + # if 'allocation' in request.GET: + for steward in stewards: + if steward.centers_allocation != None: + for center_allocation in steward.centers_allocation: + if request.GET['kill_house_key'] == center_allocation['value']: + if not StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', + system_registration_code=True), date__date=date, + steward=steward, + ware_house__kill_house=kill_house, trash=False).exists(): + stewards_list.append(steward) + else: + for steward in stewards: + if steward.centers_allocation == None: + stewards_list.append(steward) + else: + counter = 0 + if len(steward.centers_allocation) == 0: + continue + for center_allocation in steward.centers_allocation: + + if str(kill_house.key) != center_allocation['value']: + counter += 1 + if steward not in stewards_list and counter == len(steward.centers_allocation): + stewards_list.append(steward) + + stewards = stewards_list + + serializer = StewardSerializer(stewards, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +def steward_allocations_sms(allocations_list): + steward_allocations = StewardAllocation.objects.filter(key__in=allocations_list, + trash=False) + for steward_allocation in steward_allocations: + buyer = None + if steward_allocation.to_steward: + buyer = steward_allocation.to_steward.guilds_name + if steward_allocation.to_guilds: + buyer = steward_allocation.to_guilds.guilds_name + + date_str = str(steward_allocation.date.date()) + date = datetime.strptime(date_str, '%Y-%m-%d') + date = jdatetime.datetime.fromgregorian(year=date.year, month=date.month, day=date.day).strftime( + '%Y-%m-%d') + date_list = reversed(date.split('-')) + separate = "-" + date = separate.join(date_list) + number = str(steward_allocation.registration_code) + quantity = str(steward_allocation.number_of_carcasses) + weight = str(int(steward_allocation.weight_of_carcasses)) + # kill_house = str(steward_allocation.ware_house.kill_house.name) + if steward_allocation.kill_house: + seller = steward_allocation.kill_house.name + + elif steward_allocation.to_cold_house: + seller = steward_allocation.to_cold_house.kill_house.name + + elif steward_allocation.steward: + seller = steward_allocation.steward.user.fullname + else: + seller = steward_allocation.guilds.user.fullname + if steward_allocation.interface_number: + mobile = steward_allocation.interface_number + else: + if steward_allocation.to_steward: + mobile = steward_allocation.to_steward.user.mobile + + elif steward_allocation.to_guilds: + mobile = steward_allocation.to_guilds.user.mobile + elif steward_allocation.to_cold_house: + if steward_allocation.to_cold_house.kill_house: + mobile = steward_allocation.to_cold_house.kill_house.kill_house_operator.user.mobile + else: + mobile = steward_allocation.to_cold_house.live_stock_support.user.mobile + + mobile = steward_allocation.to_guilds.user.mobile + else: + mobile = steward_allocation.to_kill_house.kill_house_operator.user.mobile + + steward_allocation_sms(mobile, date, weight, seller, number, buyer, steward_allocation.amount) + + +def automatic_steward_allocations_sms(allocations_list): + steward_allocations = AutomaticStewardAllocation.objects.filter(key__in=allocations_list, + trash=False) + for steward_allocation in steward_allocations: + buyer = None + if steward_allocation.to_steward: + buyer = steward_allocation.to_steward.guilds_name + if steward_allocation.to_guilds: + buyer = steward_allocation.to_guilds.guilds_name + + date_str = str(steward_allocation.date.date()) + date = datetime.strptime(date_str, '%Y-%m-%d') + date = jdatetime.datetime.fromgregorian(year=date.year, month=date.month, day=date.day).strftime( + '%Y-%m-%d') + date_list = reversed(date.split('-')) + separate = "-" + date = separate.join(date_list) + number = str(steward_allocation.registration_code) + quantity = str(steward_allocation.number_of_carcasses) + weight = str(int(steward_allocation.weight_of_carcasses)) + # kill_house = str(steward_allocation.ware_house.kill_house.name) + if steward_allocation.kill_house: + seller = steward_allocation.kill_house.name + + elif steward_allocation.to_cold_house: + seller = steward_allocation.to_cold_house.kill_house.name + + elif steward_allocation.steward: + seller = steward_allocation.steward.user.fullname + else: + seller = steward_allocation.guilds.user.fullname + if steward_allocation.interface_number: + mobile = steward_allocation.interface_number + else: + if steward_allocation.to_steward: + mobile = steward_allocation.to_steward.user.mobile + + elif steward_allocation.to_guilds: + mobile = steward_allocation.to_guilds.user.mobile + elif steward_allocation.to_cold_house: + if steward_allocation.to_cold_house.kill_house: + mobile = steward_allocation.to_cold_house.kill_house.kill_house_operator.user.mobile + else: + mobile = steward_allocation.to_cold_house.live_stock_support.user.mobile + + mobile = steward_allocation.to_guilds.user.mobile + else: + mobile = steward_allocation.to_kill_house.kill_house_operator.user.mobile + + steward_allocation_sms(mobile, date, weight, seller, number, buyer, steward_allocation.amount) + + +def first_auto_steward_allocation(kill_house_key, quantity, weight, date): + kill_house = KillHouse.objects.get(key=kill_house_key, trash=False) + ware_house = KillHouseWareHouse.objects.get(kill_house=kill_house, date__date=date.date()) + stewards = Steward.objects.filter(guilds__steward=True, trash=False).order_by('id') + stewards_list = [] + allocatated_quantity = 0 + kill_house_total_quantity = 0 + for steward in stewards: + if steward.centers_allocation != None: + for center_allocation in steward.centers_allocation: + if str(kill_house.key) == center_allocation['value']: + kill_house_total_quantity += steward.allocation_limit + stewards_list.append(steward) + if len(stewards_list) > 0: + for steward_list in stewards_list: + allocatated_quantity = (steward_list.allocation_limit / kill_house_total_quantity) * quantity + auto_allocation = StewardAllocation.objects.filter(steward=steward_list, allocation_state='pending', + kill_house=kill_house, type='auto', trash=False, + date__date=date.date()).first() + + if auto_allocation: + if StewardAllocation.objects.filter(steward=steward_list, allocation_state='pending', + kill_house=kill_house, type='manual', trash=False, + date__date=date.date()).exists(): + + # auto_allocation.delete() + auto_allocation.trash = True + auto_allocation.save() + else: + auto_allocation.number_of_carcasses = allocatated_quantity + auto_allocation.real_number_of_carcasses = allocatated_quantity + auto_allocation.weight_of_carcasses = int(allocatated_quantity * (weight / quantity)) + auto_allocation.real_weight_of_carcasses = int(allocatated_quantity * (weight / quantity)) + auto_allocation.save() + else: + if not StewardAllocation.objects.filter(steward=steward_list, allocation_state='pending', + kill_house=kill_house, type='manual', trash=False, + date__date=date.date()).exists(): + auto_allocation = StewardAllocation( + kill_house=kill_house, + ware_house=ware_house, + steward=steward_list, + number_of_carcasses=allocatated_quantity, + real_number_of_carcasses=allocatated_quantity, + weight_of_carcasses=int(allocatated_quantity * (weight / quantity)), + real_weight_of_carcasses=int(allocatated_quantity * (weight / quantity)), + type='auto', + date=date + ) + auto_allocation.save() + + +class StewardFreeBarInformationViewSet(viewsets.ModelViewSet): + queryset = StewardFreeBarInformation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardFreeBarInformationSerializer + pagination_class = CustomPagination + filterset_class = StewardFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house_name', + 'kill_house_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'pelak', + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'guild__guilds_name', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'steward__guilds_name', + + ] + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + steward = Guilds.objects.get(user=user, active=True, trash=False) + product = RolesProducts.objects.get(key=request.data['product_key'], trash=False) + request.data.pop('product_key') + dispenser = request.data.pop('dispenser',None) + representative = request.data.pop('representative',None) + try: + image = request.data['bar_image'] + request.data.pop('bar_image') + except: + image = None + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + steward_free_bar_info = serializer.create(validated_data=request.data) + if image != None: + steward_free_bar_info.bar_image = send_image_to_server(image) + steward_free_bar_info.steward = steward + steward_free_bar_info.product = product + steward_free_bar_info.dispenser = dispenser if dispenser else None + steward_free_bar_info.representative = representative if representative else None + steward_free_bar_info.save() + guild_steward_free_buying_product_warehousing(product) + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + guild = Guilds.objects.get(user=user, active=True, trash=False) + if date1: + bars = StewardFreeBarInformation.objects.filter(Q(steward=guild) | Q(guild=guild), + date__date__gte=date1, + date__date__lte=date2, + trash=False).order_by('-date') + else: + bars = StewardFreeBarInformation.objects.filter(Q(steward=guild) | Q(guild=guild), + trash=False).order_by('-date') + + if 'search' in request.GET and 'value' in request.GET: + bars_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=bars + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=bars) + bars_list = ps.filter() + bars = [] if len(bars_list) == 0 else bars_list + if 'page' in request.GET: + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(bars) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(bars, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + free_bar = StewardFreeBarInformation.objects.get(key=request.data['key']) + if 'bar_image' in request.data.keys(): + if request.data['bar_image'] != "" or request.data['bar_image'] != " ": + image = request.data['bar_image'] + free_bar.bar_image = send_image_to_server(image) + free_bar.save() + request.data.pop('bar_image') + + serializer = self.serializer_class(free_bar) + serializer.update(instance=free_bar, validated_data=request.data) + guild_steward_free_buying_product_warehousing(free_bar.product) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + free_bar = StewardFreeBarInformation.objects.get(key=request.GET['key']) + free_bar.trash = True + free_bar.save() + guild_steward_free_buying_product_warehousing(free_bar.product) + + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class StewardFreeBarInformationDashboardViewSet(viewsets.ModelViewSet): + queryset = StewardFreeBarInformation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardFreeBarInformationSerializer + filterset_class = StewardFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house_name', + 'kill_house_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'pelak', + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'guild__guilds_name', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'steward__guilds_name', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + guild = Guilds.objects.get(user=user, active=True, trash=False) + product = RolesProducts.objects.get(guild=guild, trash=False) + if date1: + bars = StewardFreeBarInformation.objects.filter(Q(steward=guild) | Q(guild=guild), + date__date__gte=date1, + date__date__lte=date2, + trash=False).order_by('-date') + else: + bars = StewardFreeBarInformation.objects.filter(Q(steward=guild) | Q(guild=guild), + trash=False).order_by('-date') + + if 'search' in request.GET and 'value' in request.GET: + bars_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=bars + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=bars) + bars_list = ps.filter() + bars = [] if len(bars_list) == 0 else bars_list + total_quantity = bars.aggregate(total=Sum('number_of_carcasses'))['total'] + total_weight = bars.aggregate(total=Sum('weight_of_carcasses'))['total'] + result = { + "product": product.key, + "total_bars": len(bars), + "total_quantity": total_quantity, + "total_weight": total_weight, + } + + return Response(result, status=status.HTTP_200_OK) + + +class PosStewardFreeBarInformationViewSet(viewsets.ModelViewSet): + queryset = StewardFreeBarInformation.objects.all() + permission_classes = [AllowAny] + serializer_class = PosStewardFreeBarInformationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = StewardFreeBarInformationFilterSet + filterset_fields = [ + 'kill_house_name', + 'kill_house_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'pelak', + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'guild__guilds_name', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'steward__guilds_name', + + ] + + def create(self, request, *args, **kwargs): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device, trash=False) + steward = Guilds.objects.get(id=pos.guild.id, trash=False) + product = RolesProducts.objects.get(key=request.data['product_key'], trash=False) + request.data.pop('product_key') + try: + image = request.data['bar_image'] + request.data.pop('bar_image') + except: + image = None + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + steward_free_bar_info = serializer.create(validated_data=request.data) + if image != None: + steward_free_bar_info.bar_image = send_image_to_server(image) + steward_free_bar_info.steward = steward + steward_free_bar_info.product = product + steward_free_bar_info.date = datetime.now() + steward_free_bar_info.save() + guild_steward_free_buying_product_warehousing(product) + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device, trash=False) + bars = StewardFreeBarInformation.objects.filter(Q(steward=pos.guild) | Q(guild=pos.guild), + date__date__gte=date1, + date__date__lte=date2, + trash=False) + + if 'search' in request.GET and 'value' in request.GET: + bars_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=bars + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=bars) + bars_list = ps.filter() + bars = [] if len(bars_list) == 0 else bars_list + if 'page' in request.GET: + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(bars) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(bars, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + bar = StewardFreeBarInformation.objects.get(key=request.data['key']) + if 'bar_image' in request.data.keys(): + if request.data['bar_image'] != "" or request.data['bar_image'] != " ": + image = request.data['bar_image'] + bar.bar_image = send_image_to_server(image) + bar.save() + request.data.pop('bar_image') + + serializer = self.serializer_class(bar) + serializer.update(instance=bar, validated_data=request.data) + guild_steward_free_buying_product_warehousing(bar.product) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + free_bar = StewardFreeBarInformation.objects.get(key=request.GET['key']) + free_bar.trash = True + free_bar.save() + guild_steward_free_buying_product_warehousing(free_bar.product) + + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class StewardFreeSaleBarInformationViewSet(viewsets.ModelViewSet): + queryset = StewardFreeSaleBarInformation.objects.all() + serializer_class = StewardFreeSaleBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filterset_class = StewardFreeSaleBarInformationFilterSet + filterset_fields = [ + 'steward__user__fullname', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__mobile', + 'buyer__user__fullname', + 'buyer__user__first_name', + 'buyer__user__last_name', + 'buyer__user__mobile', + 'province', + 'city', + 'province' + 'buyer_name' + 'buyer_mobile' + + ] + + def create(self, request, *args, **kwargs): + now_time = datetime.now().time() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + steward = Guilds.objects.get(user=user, active=True, trash=False) + product = RolesProducts.objects.get(key=request.data.pop('product_key', None), trash=False) + buyer = OutProvinceCarcassesBuyer.objects.get(key=request.data.pop('buyer_key', None), trash=False) + date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date() + production_date = datetime.strptime(str(request.data['production_date']), '%Y-%m-%d').date() + dispenser = request.data.pop('dispenser',None) + representative = request.data.pop('representative',None) + date = datetime(year=date.year, month=date.month, day=date.day, hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + production_date = datetime(year=production_date.year, month=production_date.month, day=production_date.day, + hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + carcass_distribution = RestrictionCarcassDistribution.objects.filter(trash=False, + distribution_type='Steward', + allow=True, + out=True).first() + if carcass_distribution and datetime.now().time() > carcass_distribution.time: + return Response({"result": "لطفا در ساعات مجاز اقدام نمایید!"}, + status=status.HTTP_403_FORBIDDEN) + request.data.pop('date') + request.data.pop('production_date') + quota = request.data['quota'] + if request.data['sale_type'] == 'free': + quota = request.data['quota'] + if quota == 'governmental': + if not steward.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + if steward.total_input_warehouse_governmental_weight < ( + steward.total_selling_warehouse_governmental_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward.total_input_warehouse_free_weight < ( + steward.total_selling_warehouse_free_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + free_sale_type = request.data['sale_type'] + if steward.governmental_selling_permission: + if free_sale_type == 'free': + if not steward.free_sale_form_governmental_quota: + if steward.total_commitment_selling_in_province_governmental_weight > steward.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward.total_commitment_selling_in_province_governmental_weight > steward.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + if steward.total_commitment_selling_out_province_governmental_weight > 0: + if steward.total_selling_out_province_governmental_weight + request.data[ + 'weight_of_carcasses'] > steward.total_commitment_selling_out_province_governmental_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if steward.free_selling_permission: + if steward.total_commitment_selling_in_province_free_weight > steward.total_selling_in_province_free_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if steward.total_commitment_selling_out_province_free_weight > 0: + if steward.total_selling_out_province_free_weight + request.data[ + 'weight_of_carcasses'] > steward.total_commitment_selling_out_province_free_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + if product.total_remain_weight < request.data['weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار است!"}, status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + steward_free_sale_bar_info = serializer.create(validated_data=request.data) + steward_free_sale_bar_info.steward = steward + steward_free_sale_bar_info.buyer = buyer + steward_free_sale_bar_info.buyer_name = buyer.fullname + steward_free_sale_bar_info.buyer_mobile = buyer.mobile + steward_free_sale_bar_info.city = buyer.city + steward_free_sale_bar_info.province = buyer.province + steward_free_sale_bar_info.date = date + steward_free_sale_bar_info.production_date = production_date + steward_free_sale_bar_info.product = product + steward_free_sale_bar_info.dispenser = dispenser if dispenser else None + steward_free_sale_bar_info.representative = representative if representative else None + steward_free_sale_bar_info.save() + allow_register_code = AllowRegisterCodeForStewardFreeSaleBarInformation.objects.filter(trash=False, + active=True).first() + if allow_register_code: + number = random.randint(10000, 99000) + steward_free_sale_bar_info.registration_code = number + steward_free_sale_bar_info.system_registration_code = True + if int(allow_register_code.time) > 0: + steward_free_sale_bar_info.active_expire_date_time = True + steward_free_sale_bar_info.expire_date_time_registration_code = datetime.now() + timedelta( + minutes=int(allow_register_code.time)) + steward_free_sale_bar_info.save() + send_sms_for_sale_bar_for_steward(steward_free_sale_bar_info) + guild_steward_free_sale_product_warehousing(product) + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + filters = {'trash': False} + role = request.GET.get('role') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + steward_key = request.GET.get('steward_key') + + if role == 'Steward': + steward = Guilds.objects.get(user=user, active=True, trash=False) + filters['steward'] = steward + elif role in ['CityJahad']: + filters['steward__user__city'] = user.city + + if date1: + date1 = datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.strptime(str(date2), '%Y-%m-%d').date() + filters['date__date__gte'] = date1 + filters['date__date__lte'] = date2 + + if steward_key and steward_key != 'all': + filters['steward__key'] = steward_key + + bars = StewardFreeSaleBarInformation.objects.filter(**filters).order_by('-date') + + if 'search' in request.GET and 'value' in request.GET: + bars_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=bars + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=bars) + bars_list = ps.filter() + bars = [] if len(bars_list) == 0 else bars_list + if 'page' in request.GET: + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(bars) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(bars, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + free_sale_bar = StewardFreeSaleBarInformation.objects.get(key=request.data['key']) + allow_register_code = AllowRegisterCodeForStewardFreeSaleBarInformation.objects.filter(trash=False, + active=True).first() + if allow_register_code: + if 'register_code' in request.data.keys(): + code = request.data['register_code'] + if code != free_sale_bar.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + free_sale_bar.logged_registration_code = code + free_sale_bar.save() + request.data.pop('register_code') + if free_sale_bar.quota == 'governmental': + if free_sale_bar.steward.total_input_warehouse_governmental_weight < ( + ( + free_sale_bar.steward.total_selling_warehouse_governmental_weight - free_sale_bar.weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if free_sale_bar.steward.total_input_warehouse_free_weight < ( + (free_sale_bar.steward.total_selling_warehouse_free_weight - free_sale_bar.weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + + if free_sale_bar.product.total_remain_weight + free_sale_bar.weight_of_carcasses < request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار است!"}, status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(free_sale_bar) + serializer.update(instance=free_sale_bar, validated_data=request.data) + + guild_steward_free_sale_product_warehousing(free_sale_bar.product) + + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + free_sale_bar = StewardFreeSaleBarInformation.objects.get(key=request.GET['key']) + free_sale_bar.trash = True + free_sale_bar.save() + guild_steward_free_sale_product_warehousing(free_sale_bar.product) + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class StewardFreeSaleBarInformationDashboardViewSet(viewsets.ModelViewSet): + queryset = StewardFreeSaleBarInformation.objects.all() + serializer_class = StewardFreeSaleBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filterset_class = StewardFreeSaleBarInformationFilterSet + filterset_fields = [ + 'steward__user__fullname', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__mobile', + 'buyer__user__fullname', + 'buyer__user__first_name', + 'buyer__user__last_name', + 'buyer__user__mobile', + 'province', + 'city', + 'province' + 'buyer_name' + 'buyer_mobile' + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + filters = {'trash': False} + role = request.GET.get('role') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + steward_key = request.GET.get('steward_key') + + if role == 'Steward': + steward = Guilds.objects.get(user=user, active=True, trash=False) + filters['steward'] = steward + + elif role in ['CityJahad']: + filters['steward__user__city'] = user.city + + if date1: + date1 = datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.strptime(str(date2), '%Y-%m-%d').date() + filters['date__date__gte'] = date1 + filters['date__date__lte'] = date2 + if steward_key and steward_key != 'all': + filters['steward__key'] = steward_key + + bars = StewardFreeSaleBarInformation.objects.filter(**filters) + if 'search' in request.GET and 'value' in request.GET: + bars_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=bars + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=bars) + bars_list = ps.filter() + bars = [] if len(bars_list) == 0 else bars_list + buyers = len(bars.values_list('buyer', flat=True).distinct()) + + result = { + "number_of_bars": len(bars), + "number_of_buyers": buyers, + "bars_quantity": + bars.aggregate(total=Sum('number_of_carcasses'))['total'] or 0, + "bars_weight": + bars.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0, + + } + + return Response(result, status=status.HTTP_200_OK) + + +class FirstAutomaticStewardAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = AutomaticStewardAllocationSerializer + + def create(self, request, *args, **kwargs): + input_date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date() + one_day_ago = input_date - timedelta(days=1) + # if date_of_now == now: + kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + kill_house_requests = KillHouseRequest.objects.filter(killhouse_user=kill_house, + province_kill_request__kill_request__recive_date__date=one_day_ago, + trash=False).annotate( + total_quantity=Sum('accepted_real_quantity'), + total_weight=Sum('accepted_real_weight')) + + total_requests_quantity = kill_house_requests.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = kill_house_requests.aggregate(total=Sum('total_weight'))['total'] + + if len(kill_house_requests) == 0: + return Response({"result": "به تاریخ امروز برای شما باری وجود ندارد!"}, + status=status.HTTP_400_BAD_REQUEST) + + date = datetime.now().date() + # date = kill_house_requests.last().create_date + timedelta(days=1) + + ware_house = KillHouseWareHouse.objects.get(kill_house=kill_house, date__date=input_date) + stewards = Steward.objects.filter(guilds__steward=True, trash=False).order_by('id') + stewards_list = [] + allocatated_weight = 0 + kill_house_total_weight = 0 + for steward in stewards: + if steward.centers_allocation != None: + for center_allocation in steward.centers_allocation: + if str(kill_house.key) == center_allocation['value']: + kill_house_total_weight += steward.allocation_limit + stewards_list.append(steward) + if len(stewards_list) > 0: + for steward_list in stewards_list: + allocatated_weight = int( + (steward_list.allocation_limit / kill_house_total_weight) * total_requests_weight) + + auto_allocation = StewardAllocation.objects.filter(steward=steward_list, allocation_state='pending', + kill_house=kill_house, type='auto', trash=False, + date__date=input_date).first() + + if auto_allocation: + if StewardAllocation.objects.filter(steward=steward_list, allocation_state='pending', + kill_house=kill_house, type='manual', trash=False, + date__date=input_date).exists(): + + # auto_allocation.delete() + auto_allocation.trash = True + auto_allocation.save() + else: + + auto_allocation.number_of_carcasses = int(allocatated_weight / ( + ware_house.final_total_weight_of_carcasses / ware_house.final_total_number_of_carcasses)) + auto_allocation.real_number_of_carcasses = int(allocatated_weight / ( + ware_house.final_total_weight_of_carcasses / ware_house.final_total_number_of_carcasses)) + auto_allocation.weight_of_carcasses = allocatated_weight + auto_allocation.real_weight_of_carcasses = allocatated_weight + auto_allocation.save() + else: + if not StewardAllocation.objects.filter(steward=steward_list, allocation_state='pending', + kill_house=kill_house, type='manual', trash=False, + date__date=input_date).exists(): + steward_date = datetime(year=date.year, month=date.month, day=date.day, hour=10, + minute=1, second=1) + auto_allocation = StewardAllocation( + kill_house=kill_house, + ware_house=ware_house, + steward=steward_list, + number_of_carcasses=int(allocatated_weight / ( + ware_house.final_total_weight_of_carcasses / ware_house.final_total_number_of_carcasses)), + real_number_of_carcasses=0, + weight_of_carcasses=allocatated_weight, + real_weight_of_carcasses=0, + type='auto', + sell_type='exclusive', + allocation_type='kill_house_broadcast', + seller_type='steward', + date=steward_date + ) + auto_allocation.save() + steward_ware_house = StewardWareHouse.objects.filter(steward=steward_list, + date__date=date).first() + if not steward_ware_house: + steward_ware_house = StewardWareHouse(steward=steward_list, date=steward_date) + steward_ware_house.save() + + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +class AutomaticStewardAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = AutomaticStewardAllocationSerializer + + def list(self, request, *args, **kwargs): + + kill_house = KillHouse.objects.filter(key=request.GET['kill_house_key']) + date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + + auto_allocations = StewardAllocation.objects.filter(date__date=date, kill_house__in=kill_house, + type='auto', trash=False).order_by( + '-real_number_of_carcasses') + serializer = self.serializer_class(auto_allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + + if 'confirm_information' in request.data.keys(): + auto_allocation = StewardAllocation.objects.get(key=request.data['steward_allocation_key']) + request.data.pop('steward_allocation_key') + request.data.pop('confirm_information') + auto_allocation.state = 'accepted' + auto_allocation.save() + serializer = self.serializer_class(auto_allocation) + serializer.update(instance=auto_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + + elif 'send_registration_code' in request.data.keys(): + allocations_list = request.data['steward_allocation_list'] + steward_allocations = StewardAllocation.objects.filter(key__in=allocations_list, + trash=False) + request.data.pop('steward_allocation_list') + for steward_allocation in steward_allocations: + number = random.randint(10000, 99000) + steward_allocation.registration_code = number + steward_allocation.state = 'accepted' + steward_allocation.system_registration_code = True + # steward_allocation.final_registration = True + steward_allocation.save() + steward_ware_house = StewardWareHouse.objects.filter(steward=steward_allocation.steward, + date__date=steward_allocation.date.date()).first() + if not steward_ware_house: + steward_ware_house = StewardWareHouse(steward=steward_allocation.steward, + date=steward_allocation.date) + steward_ware_house.save() + steward_ware_house.bar_quantity += 1 + steward_ware_house.number_of_carcasses += steward_allocation.real_number_of_carcasses + steward_ware_house.weight_of_carcasses += steward_allocation.real_weight_of_carcasses + steward_ware_house.save() + + ware_house = KillHouseWareHouse.objects.get(key=steward_allocation.ware_house.key) + ware_house.allocated_total_number_of_carcasses += steward_allocation.real_number_of_carcasses + ware_house.allocated_total_weight_of_carcasses += steward_allocation.real_weight_of_carcasses + ware_house.save() + + sms_steward_allocations = threading.Thread(target=automatic_steward_allocations_sms, + args=(allocations_list,)) + + sms_steward_allocations.start() + + return Response({"result": "عملیات با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + else: + + auto_allocation = StewardAllocation.objects.get(key=request.data['steward_allocation_key']) + + request.data.pop('steward_allocation_key') + if int(request.data['logged_registration_code']) != auto_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + + auto_allocation.role = { + "role": request.data['role'], + "fullname": user.fullname, + "mobile": user.mobile, + "date_register": str(datetime.now()) + } + request.data.pop('role') + auto_allocation.final_registration = True + auto_allocation.save() + serializer = self.serializer_class(auto_allocation) + serializer.update(instance=auto_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class StewardAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardAllocationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = StewardAllocationFilterSet + filterset_fields = [ + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'to_guilds__user__first_name', + 'to_guilds__user__last_name', + 'to_guilds__user__fullname', + 'to_guilds__user__mobile', + 'to_steward__user__first_name', + 'to_steward__user__last_name', + 'to_steward__user__fullname', + 'to_steward__user__mobile', + 'to_kill_house__kill_house_operator__user__first_name', + 'to_kill_house__kill_house_operator__user__last_name', + 'to_kill_house__kill_house_operator__user__fullname', + 'to_kill_house__kill_house_operator__user__mobile', + 'to_kill_house__name', + ] + + def create(self, request, *args, **kwargs): + now = datetime.now() + now_time = now.time() + production_date = None + dispenser = request.data.pop('dispenser',None) + representative = request.data.pop('representative',None) + date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date() + + date = datetime(year=date.year, month=date.month, day=date.day, hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + if 'production_date' in request.data.keys(): + production_date = datetime.strptime(str(request.data['production_date']), '%Y-%m-%d').date() + production_date = datetime(year=production_date.year, month=production_date.month, day=production_date.day, + hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + request.data.pop('production_date') + request.data.pop('date') + # if OperationLimitation.objects.all().first().kill_house_steward_guild_allocation_limitation == True: + # if now.date() != date: + # return Response({"result": "به علت مغایرت تاریخ امکان تخصیص وجود ندارد!"}, + # status=status.HTTP_403_FORBIDDEN) + product = None + user = SystemUserProfile.objects.get(user=request.user, trash=False) + seller_type = request.data['seller_type'] + buyer_type = request.data['buyer_type'] + request.data.pop('buyer_type') + if seller_type != 'ColdHouse': + product = RolesProducts.objects.get(key=request.data['product_key']) + request.data.pop('product_key') + + if seller_type == 'KillHouse': + carcass_distribution = RestrictionCarcassDistribution.objects.filter(trash=False, + distribution_type='KillHouse', + allow=True, out=False).first() + if carcass_distribution and datetime.now().time() > carcass_distribution.time: + return Response({"result": "لطفا در ساعات مجاز اقدام نمایید!"}, + status=status.HTTP_403_FORBIDDEN) + + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + quota = request.data['quota'] + if not quota: + return Response({"result": "بدون انتخاب سهمیه مجاز به فروش نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if request.data['approved_price_status'] == False: + if quota == 'governmental': + if not kill_house.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + if quota == 'governmental': + if kill_house.total_input_warehouse_governmental_weight < ( + kill_house.total_selling_warehouse_governmental_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_commitment_selling_in_province_free_weight == 0 and not kill_house.free_sale_from_free_quota_in_province: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if kill_house.total_input_warehouse_free_weight < ( + kill_house.total_selling_warehouse_free_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + elif seller_type == 'Steward': + carcass_distribution = RestrictionCarcassDistribution.objects.filter(trash=False, + distribution_type='Steward', + allow=True, + out=False).first() + if carcass_distribution and datetime.now().time() > carcass_distribution.time: + return Response({"result": "لطفا در ساعات مجاز اقدام نمایید!"}, + status=status.HTTP_403_FORBIDDEN) + + steward = Guilds.objects.filter(user=user, steward=True, trash=False, active=True).first() + quota = request.data['quota'] + if not quota: + return Response({"result": "بدون انتخاب سهمیه مجاز به فروش نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if request.data['approved_price_status'] == False: + if quota == 'governmental': + if not steward.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + if quota == 'governmental': + if steward.total_input_warehouse_governmental_weight < ( + steward.total_selling_warehouse_governmental_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward.total_commitment_selling_in_province_free_weight == 0 and not steward.free_sale_from_free_quota_in_province: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if steward.total_input_warehouse_free_weight < ( + steward.total_selling_warehouse_free_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + elif seller_type == 'ColdHouse': + to_cold_house = ColdHouse.objects.get(key=request.data['cold_house_key'], trash=False) + request.data.pop('cold_house_key') + else: + guild = Guilds.objects.filter(user=user, trash=False).first() + + if buyer_type == 'Steward': + to_steward = Guilds.objects.get(key=request.data['steward_key'], trash=False) + request.data.pop('steward_key') + elif buyer_type == 'Guild': + to_guild = Guilds.objects.get(key=request.data['guild_key'], trash=False) + request.data.pop('guild_key') + + elif buyer_type == 'ColdHouse': + if seller_type == 'ColdHouse': + other_cold_house = ColdHouse.objects.get(key=request.data['other_cold_house_key'], trash=False) + request.data.pop('other_cold_house_key') + else: + to_cold_house = ColdHouse.objects.get(key=request.data['cold_house_key'], trash=False) + request.data.pop('cold_house_key') + else: + to_kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + request.data.pop('kill_house_key') + image = None + if 'image' in request.data.keys(): + image = request.data['image'] + request.data.pop('image') + + if seller_type == 'KillHouse' and buyer_type == 'ColdHouse': + quota = request.data['quota'] + kill_house_total_input_warehouse_governmental_weight = kill_house.total_input_warehouse_governmental_weight + kill_house_total_input_warehouse_free_weight = kill_house.total_input_warehouse_free_weight + if quota == 'governmental': + kill_house_sale_type = request.data['approved_price_status'] + if kill_house.governmental_selling_permission: + if kill_house_sale_type: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if not kill_house.free_sale_form_governmental_quota: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + if kill_house.total_commitment_cold_house_governmental_weight > 0: + if kill_house.total_cold_house_governmental_weight + request.data[ + 'weight_of_carcasses'] > kill_house.total_commitment_cold_house_governmental_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if kill_house.free_selling_permission: + if kill_house.total_commitment_selling_in_province_free_weight > kill_house.total_selling_in_province_free_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if kill_house.total_commitment_cold_house_free_weight > 0: + if kill_house.total_cold_house_free_weight + request.data[ + 'weight_of_carcasses'] > kill_house.total_commitment_cold_house_free_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + allocation = serializer.create(validated_data=request.data) + allow = AllowRegisterCodeForStewardAllocation.objects.filter(trash=False, active=True).first() + if allow: + allocation.active_expire_date_time = True + if image and image != "": + allocation.image = send_image_to_server(image) + allocation.date = date + allocation.dispenser = dispenser if dispenser else None + allocation.representative = representative if representative else None + allocation.production_date = production_date if production_date else date + allocation.real_number_of_carcasses = allocation.number_of_carcasses + allocation.real_weight_of_carcasses = int(allocation.weight_of_carcasses) + allocation.weight_of_carcasses = int(request.data['weight_of_carcasses']) + allocation.product = product + if seller_type == 'KillHouse': + allocation.kill_house = kill_house + + elif seller_type == 'Steward': + allocation.steward = steward + + elif seller_type == 'ColdHouse': + allocation.to_cold_house = to_cold_house + + + else: + allocation.guilds = guild + + if buyer_type == 'Steward': + allocation.to_steward = to_steward + elif buyer_type == 'Guild': + allocation.to_guilds = to_guild + + elif buyer_type == 'ColdHouse': + if seller_type == 'ColdHouse': + allocation.other_cold_house = other_cold_house + else: + allocation.to_cold_house = to_cold_house + + else: + allocation.to_kill_house = to_kill_house + + allocation.save() + + if seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(product) + if buyer_type == 'ColdHouse' and to_cold_house.kill_house: + allocation.receiver_state = 'accepted' + allocation.system_registration_code = True + allocation.registration_code = 0 + allocation.save() + kill_house_cold_house_allocations(to_cold_house) + + elif seller_type == 'ColdHouse': + cold_house_warehousing(to_cold_house) + if buyer_type == 'ColdHouse': + allocation.receiver_state = 'accepted' + allocation.system_registration_code = True + allocation.registration_code = 0 + allocation.save() + cold_house_warehousing(other_cold_house) + + + else: + guild_steward_allocations_product_warehousing(product) + return Response({"result": "با موفقیت ثبت شد!"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + if 'steward' in request.data.keys() or 'guild' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + + steward_allocation.save() + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + elif 'check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + seller_product = steward_allocation.product + + if request.data['state'] == 'accepted': + receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + receiver_real_weight_of_carcasses = int(request.data['receiver_real_weight_of_carcasses']) + weight_loss_of_carcasses = 0 + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + if 'weight_loss_of_carcasses' in request.data.keys(): + weight_loss_of_carcasses = request.data['weight_loss_of_carcasses'] + maximum_weight_limit = int(request.data['receiver_real_weight_of_carcasses']) * 0.07 + if weight_loss_of_carcasses > maximum_weight_limit: + return Response({"result": "افت وزن وارد شده بیشتر از حد مجاز است!"}, + status=status.HTTP_403_FORBIDDEN) + + receiver_real_weight_of_carcasses -= weight_loss_of_carcasses + steward_allocation.weight_loss_of_carcasses = weight_loss_of_carcasses + + steward_allocation.receiver_real_number_of_carcasses = receiver_real_number_of_carcasses + steward_allocation.receiver_real_weight_of_carcasses = receiver_real_weight_of_carcasses + steward_allocation.real_number_of_carcasses = receiver_real_number_of_carcasses + steward_allocation.real_weight_of_carcasses = receiver_real_weight_of_carcasses + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + + if steward_allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_steward, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + + elif steward_allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_guilds, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + buyer_product = RolesProducts.objects.get(kill_house=steward_allocation.to_kill_house, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'steward_check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + seller_product = steward_allocation.product + + if request.data['state'] == 'accepted': + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + if steward_allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_steward, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + + elif steward_allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_guilds, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + buyer_product = RolesProducts.objects.get(kill_house=steward_allocation.to_kill_house, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'guild_check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + if request.data['state'] == 'accepted': + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'allocation_key' in request.data.keys() and 'logged_registration_code' not in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], trash=False) + if steward_allocation.receiver_state == 'accepted': + if steward_allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_guildso, trash=False, + parent_product=steward_allocation.product.parent_product) + elif steward_allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_steward, trash=False, + parent_product=steward_allocation.product.parent_product) + + + elif steward_allocation.to_kill_house: + buyer_product = RolesProducts.objects.get(kill_house=steward_allocation.to_kill_house, trash=False, + parent_product=steward_allocation.product.parent_product) + else: + buyer_product = None + + if buyer_product: + if buyer_product.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if steward_allocation.to_cold_house: + if steward_allocation.other_cold_house: + if steward_allocation.other_cold_house.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward_allocation.to_cold_house.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + if steward_allocation.product: + if steward_allocation.product.kill_house: + if steward_allocation.quota == 'governmental': + if steward_allocation.product.kill_house.total_input_warehouse_governmental_weight < ( + ( + steward_allocation.product.kill_house.total_selling_warehouse_governmental_weight - steward_allocation.real_weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward_allocation.product.kill_house.total_input_warehouse_free_weight < ( + ( + steward_allocation.product.kill_house.total_selling_warehouse_free_weight - steward_allocation.real_weight_of_carcasses) + + request.data['weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if steward_allocation.quota == 'governmental': + if steward_allocation.product.guild.total_input_warehouse_governmental_weight < ( + ( + steward_allocation.product.guild.total_selling_warehouse_governmental_weight - steward_allocation.real_weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward_allocation.product.guild.total_input_warehouse_free_weight < ( + ( + steward_allocation.product.guild.total_selling_warehouse_free_weight - steward_allocation.real_weight_of_carcasses) + + request.data['weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + + if steward_allocation.product.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار است!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if steward_allocation.to_cold_house.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + + if steward_allocation.to_cold_house: + steward_allocation.real_weight_of_carcasses = int(request.data['weight_of_carcasses']) + else: + + steward_allocation.real_number_of_carcasses = request.data['number_of_carcasses'] + steward_allocation.real_weight_of_carcasses = int(request.data['weight_of_carcasses']) + steward_allocation.save() + seller_product = steward_allocation.product + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + if steward_allocation.to_cold_house and steward_allocation.to_cold_house.kill_house == steward_allocation.kill_house: + kill_house_cold_house_allocations(steward_allocation.to_cold_house) + + elif steward_allocation.seller_type == 'ColdHouse': + cold_house_warehousing(steward_allocation.to_cold_house) + if steward_allocation.other_cold_house: + cold_house_warehousing(steward_allocation.other_cold_house) + + else: + guild_steward_allocations_product_warehousing(seller_product) + if 'image' in request.data.keys(): + image = request.data['image'] + request.data.pop('image') + if image: + steward_allocation.image = send_image_to_server(image) + steward_allocation.save() + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'steward_allocation_list' in request.data.keys(): + allocations_list_temp = request.data['steward_allocation_list'] + allocations_list = [] + steward_allocations = StewardAllocation.objects.filter(key__in=allocations_list_temp, + trash=False) + request.data.pop('steward_allocation_list') + for steward_allocation in steward_allocations: + if steward_allocation.system_registration_code == True: + continue + number = random.randint(10000, 99000) + steward_allocation.registration_code = number + steward_allocation.system_registration_code = True + allocations_list.append(str(steward_allocation.key)) + steward_allocation.save() + + sms_steward_allocations = threading.Thread(target=steward_allocations_sms, + args=(allocations_list,)) + + sms_steward_allocations.start() + + return Response({"result": "عملیات با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + else: + + steward_allocation = StewardAllocation.objects.filter(key=request.data['steward_allocation_key'], + trash=False).select_related('ware_house__kill_house', + 'ware_house__kill_house__kill_house_operator__user').last() + request.data.pop('steward_allocation_key') + if int(request.data['logged_registration_code']) != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + + steward_allocation.role = { + "role": request.data['role'], + "fullname": user.fullname, + "mobile": user.mobile, + "date_register": str(datetime.now()) + } + if 'logged_registration_code' in request.data.keys(): + steward_allocation.state = 'accepted' + steward_allocation.receiver_state = 'accepted' + steward_allocation.receiver_real_weight_of_carcasses = steward_allocation.real_weight_of_carcasses + steward_allocation.receiver_real_number_of_carcasses = steward_allocation.real_number_of_carcasses + steward_allocation.save() + steward_guild = steward_allocation.to_guilds if steward_allocation.to_guilds else steward_allocation.to_steward + if steward_guild: + buyer_product = RolesProducts.objects.get(guild=steward_guild, trash=False, + parent_product=steward_allocation.product.parent_product) + guild_steward_allocations_product_warehousing(buyer_product) + + request.data.pop('role') + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + allocations = [] + allocations_list = [] + now = datetime.now().date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + allocations_type = request.GET.get('type') + if 'role' in request.GET: + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'cold_house' in request.GET: + cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + + if 'type' in request.GET: + if request.GET['type'] == 'input': + allocations = StewardAllocation.objects.filter( + Q(to_cold_house=cold_house, kill_house__isnull=False) | Q( + other_cold_house=cold_house, + kill_house__isnull=True), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-id', + '-date') + else: + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + kill_house__isnull=True, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-id', + '-date') + else: + allocations = StewardAllocation.objects.filter( + Q(to_cold_house=cold_house) | Q(other_cold_house=cold_house), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-id', '-date') + + else: + allocations = StewardAllocation.objects.filter( + Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-id', '-date') + else: + if 'cold_house' in request.GET: + cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + if 'type' in request.GET: + if request.GET['type'] == 'input': + allocations = StewardAllocation.objects.filter( + Q(to_cold_house=cold_house, kill_house__isnull=False) | Q( + other_cold_house=cold_house, + kill_house__isnull=True), + trash=False).order_by('-id', '-date') + + else: + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + kill_house__isnull=True, + trash=False).order_by('-id', '-date') + else: + + allocations = StewardAllocation.objects.filter( + Q(to_cold_house=cold_house) | Q(other_cold_house=cold_house), + trash=False).order_by('-id', '-date') + + else: + allocations = StewardAllocation.objects.filter( + Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False).order_by('id') + + # kill_house_ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house, date__date=date).last() + # allocations = StewardAllocation.objects.filter( + # Q(type='manual') | Q(type='auto', + # system_registration_code=True), + # kill_house=kill_house, trash=False, + # date__date=date).order_by('id') + elif request.GET['role'] == 'Steward': + guild = Guilds.objects.get(user=user, active=True, trash=False) + if allocations_type: + if allocations_type == 'not_entered': + receiver_state = 'pending' + elif allocations_type == 'all': + receiver_state = ('pending', 'accepted') + else: + receiver_state = 'accepted' + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if allocations_type == 'all': + allocations = StewardAllocation.objects.filter(Q(to_steward=guild) | Q(to_guilds=guild), + date__date__gte=date1, date__date__lte=date2, + trash=False, system_registration_code=True, + receiver_state__in=receiver_state + ).order_by('-id', '-date') + else: + + allocations = StewardAllocation.objects.filter(Q(to_steward=guild) | Q(to_guilds=guild), + date__date__gte=date1, date__date__lte=date2, + trash=False, system_registration_code=True, + receiver_state=receiver_state + ).order_by('-id', '-date') + else: + + if allocations_type == 'all': + allocations = StewardAllocation.objects.filter(Q(to_steward=guild) | Q(to_guilds=guild), + trash=False, + system_registration_code=True, + receiver_state__in=receiver_state + ).order_by('-id', '-date') + else: + allocations = StewardAllocation.objects.filter(Q(to_steward=guild) | Q(to_guilds=guild), + trash=False, + system_registration_code=True, + receiver_state=receiver_state + ).order_by('-id', '-date') + + else: + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter(Q(steward=guild) | Q(guilds=guild), + date__date__gte=date1, date__date__lte=date2, + trash=False, + ).order_by('-id', '-date') + else: + + allocations = StewardAllocation.objects.filter(Q(steward=guild) | Q(guilds=guild), + trash=False, + ).order_by('-id', '-date') + + elif 'guild' in request.GET: + guild = Guilds.objects.get(user=user, active=True, trash=False) + allocations = StewardAllocation.objects.filter( + Q(allocation_type='steward_broadcast') | Q(allocation_type='kill_house_broadcast'), guilds=guild, + trash=False, system_registration_code=True).order_by('-date') + + elif 'steward_guilds_allocations' in request.GET: + steward = Steward.objects.get(guilds__user=user, active=True, trash=False) + steward_ware_house = StewardWareHouse.objects.get(date__date=date, steward=steward, trash=False) + + allocations = StewardAllocation.objects.filter(steward_ware_house__steward=steward, trash=False, + steward_ware_house=steward_ware_house, + date__date=date).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=allocations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=allocations) + allocations_list = ps.filter() + allocations = [] if len(allocations_list) == 0 else allocations_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(allocations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = StewardAllocationSerializer(allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + allocation = StewardAllocation.objects.get(key=request.GET["steward_allocation_key"]) + if allocation.receiver_state == 'accepted': + if allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=allocation.to_steward, trash=False, + parent_product=allocation.product.parent_product) + elif allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=allocation.to_guilds, trash=False, + parent_product=allocation.product.parent_product) + + + elif allocation.to_kill_house: + buyer_product = RolesProducts.objects.get(kill_house=allocation.to_kill_house, trash=False, + parent_product=allocation.product.parent_product) + + else: + buyer_product = None + + if buyer_product: + if buyer_product.total_remain_weight < allocation.real_weight_of_carcasses: + return Response({"result": "وزن حذف شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if allocation.to_cold_house: + if allocation.other_cold_house: + if allocation.other_cold_house.total_remain_weight < allocation.real_weight_of_carcasses: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if allocation.to_cold_house.total_remain_weight < allocation.real_weight_of_carcasses: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + + product = allocation.product + seller_type = allocation.seller_type + to_cold_house = allocation.to_cold_house + other_cold_house = allocation.other_cold_house if allocation.other_cold_house else None + allocation.delete() + if seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(product) + if to_cold_house and to_cold_house.kill_house == product.kill_house: + kill_house_cold_house_allocations(to_cold_house) + + elif seller_type == 'ColdHouse': + cold_house_warehousing(to_cold_house) + if other_cold_house: + cold_house_warehousing(other_cold_house) + + + else: + guild_steward_allocations_product_warehousing(product) + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + +class InProvinceAllocationDashboardViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardAllocationSerializer + filter_backends = [DjangoFilterBackend] + filterset_class = StewardAllocationDashboardFilterSet + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET.get('role') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + value = request.GET.get('value') + search = request.GET.get('search') + trash = request.GET.get('trash') + return_trash = request.GET.get('return_trash') + kill_house_key = request.GET.get('kill_house_key') + steward_key = request.GET.get('steward_key') + + allocations_type = request.GET.get('type') + filters = { + 'to_cold_house__isnull': True, + 'calculate_status': True, + } + if trash == 'true': + filters['trash'] = True + filters['active_expire_date_time'] = True + else: + filters['trash'] = False + + if return_trash == 'true': + filters['return_trash'] = True + + if allocations_type == 'KillHouse': + filters['kill_house__isnull'] = False + elif allocations_type == 'Steward': + filters['steward__isnull'] = False + + if kill_house_key and kill_house_key != 'all': + filters['kill_house__key'] = kill_house_key + if steward_key and steward_key != 'all': + filters['steward__key'] = steward_key + + if date1: + filters['date__date__gte'] = datetime.strptime(str(date1), '%Y-%m-%d').date() + filters['date__date__lte'] = datetime.strptime(str(date2), '%Y-%m-%d').date() + + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + filters['kill_house'] = kill_house + elif role == 'Steward': + steward = Guilds.objects.get(user=user, trash=False) + filters['steward'] = steward + elif role in ['CityJahad']: + if allocations_type == 'KillHouse': + filters['kill_house__kill_house_operator__user__city'] = user.city + else: + filters['steward__user__city'] = user.city + + allocations = StewardAllocation.objects.filter(**filters) + if value and search == 'filter': + if value != 'undefined' and value.strip(): + allocations = allocations.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + allocations_aggregates = allocations.aggregate( + total_count=Count('id', receiver_state__in=('pending', 'accepted')), + total_weight=Sum('real_weight_of_carcasses', filter=Q(receiver_state__in=('pending', 'accepted'))), + total_steward_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, receiver_state__in=('pending', 'accepted'))), + total_guild_weight=Sum('real_weight_of_carcasses', + filter=Q(to_guilds__isnull=False, receiver_state__in=('pending', 'accepted'))), + ) + + result = { + "number_of_allocations": allocations_aggregates['total_count'] or 0, + "total_weight": int(allocations_aggregates['total_weight'] or 0), + "total_steward_weight": int(allocations_aggregates['total_steward_weight'] or 0), + "total_guild_weight": int(allocations_aggregates['total_guild_weight'] or 0), + } + + return Response(result, status=status.HTTP_200_OK) + + +class TotalStewardDashboardViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardAllocationSerializer + filter_backends = [DjangoFilterBackend] + filterset_class = StewardAllocationDashboardFilterSet + + def list(self, request, *args, **kwargs): + role = request.GET.get('role') + stewards_filter = {'trash': False, 'steward': True, 'active': True} + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if role in ['CityJahad']: + stewards_filter['user__city'] = user.city + stewards = Guilds.objects.filter(**stewards_filter).select_related('user').only('user', 'guilds_name', + 'steward').order_by( + 'id') + + products = RolesProducts.objects.filter(guild__in=stewards, trash=False, name='مرغ گرم').first() + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + if date1: + date1 = datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.strptime(str(date2), '%Y-%m-%d').date() + + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted'], + allocation_to_steward__date__date__gte=date1, allocation_to_steward__date__date__lte=date2, + allocation_to_steward__warehouse=True, allocation_to_steward__steward_warehouse=True) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count') + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count') + + stewards = (list(chain(allocation_stewards, free_bar_stewards))) + + allocations = StewardAllocation.objects.filter( + Q(steward__in=stewards) | Q(to_steward__in=stewards), + trash=False, calculate_status=True, to_cold_house__isnull=True, + date__date__gte=date1, date__date__lte=date2, warehouse=True, steward_warehouse=True) + + free_bars = StewardFreeBarInformation.objects.filter(steward__in=stewards, trash=False, + date__date__gte=date1, + date__date__lte=date2, warehouse=True) + free_sale_bars = StewardFreeSaleBarInformation.objects.filter(steward__in=stewards, trash=False, + date__date__gte=date1, + date__date__lte=date2, warehouse=True) + segmentations = PosSegmentation.objects.filter(guild__in=stewards, trash=False, warehouse=True, + date__date__gte=date1, date__date__lte=date2) + transactions = ProductsTransactions.objects.filter(product=products, transaction__paid=True, + transaction__date__date__gte=date1, + transaction__date__date__lte=date2, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(Q(steward__in=stewards) | Q(guild__in=stewards), trash=False, + date__date__gte=date1, date__lte=date2, + warehouse=True) + + + else: + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted'], + allocation_to_steward__warehouse=True, allocation_to_steward__steward_warehouse=True) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count').values_list('id', flat=True) + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count').values_list('id', flat=True) + + stewards = (list(chain(allocation_stewards, free_bar_stewards))) + + allocations = StewardAllocation.objects.filter( + Q(steward__in=stewards) | Q(to_steward__in=stewards), + trash=False, calculate_status=True, to_cold_house__isnull=True, warehouse=True, steward_warehouse=True) + + free_bars = StewardFreeBarInformation.objects.filter(steward__in=stewards, trash=False, warehouse=True) + free_sale_bars = StewardFreeSaleBarInformation.objects.filter(steward__in=stewards, trash=False, + warehouse=True) + segmentations = PosSegmentation.objects.filter(guild__in=stewards, trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product=products, transaction__paid=True, trash=False, + warehouse=True) + archives = WarehouseArchive.objects.filter(Q(steward__in=stewards) | Q(guild__in=stewards), trash=False, + warehouse=True) + + allocations_aggregates = allocations.aggregate( + total_input_bars_count=Count('id', filter=Q(to_steward__isnull=False)), + total_input_bars_weight=Sum('real_weight_of_carcasses', filter=Q(to_steward__isnull=False)), + total_input_governmental_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, quota='governmental')), + total_input_free_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, quota='free')), + total_output_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward__isnull=False, receiver_state__in=('pending', 'accepted'))), + total_output_governmental_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward__isnull=False, + receiver_state__in=('pending', 'accepted'), + quota='governmental')), + total_output_free_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(steward__isnull=False, + receiver_state__in=('pending', 'accepted'), quota='free')), + total_input_entered_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, receiver_state='accepted')), + + total_input_entered_governmental_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, + receiver_state='accepted', quota='governmental')), + + total_input_entered_free_bars_weight=Sum('real_weight_of_carcasses', + filter=Q(to_steward__isnull=False, receiver_state='accepted', + quota='free')), + + ) + + free_bars_aggregates = free_bars.aggregate( + total_count=Count('id'), + total_weight=Sum('weight_of_carcasses') + ) + + free_sale_bars_aggregates = free_sale_bars.aggregate( + total_count=Count('id'), + total_weight=Sum('weight_of_carcasses'), + total_governmental_weight=Sum('weight_of_carcasses', quota='governmental'), + total_free_weight=Sum('weight_of_carcasses', quota='free'), + + ) + segmentations_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_governmental_weight = \ + segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_free_weight = \ + segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + + pos_allocated_weight_info = transactions.aggregate( + pos_allocated_weight=Sum('cur_weight'), + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + 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')), + + ) + pos_allocated_weight = pos_allocated_weight_info['pos_allocated_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + + total_in_province_governmental_input_weight = allocations_aggregates[ + 'total_input_entered_governmental_bars_weight'] or 0 + total_in_province_free_input_weight = allocations_aggregates['total_input_entered_free_bars_weight'] or 0 + total_free_buying_input_weight = free_bars_aggregates['total_weight'] or 0 + + total_in_province_governmental_output_weight = allocations_aggregates[ + 'total_output_governmental_bars_weight'] or 0 + total_in_province_free_output_weight = allocations_aggregates['total_output_free_bars_weight'] or 0 + total_governmental_free_sale_weight = free_sale_bars_aggregates['total_governmental_weight'] or 0 + total_free_free_sale_weight = free_sale_bars_aggregates['total_free_weight'] or 0 + 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 + + total_governmental_input_weight = total_in_province_governmental_input_weight + total_free_input_weight = total_in_province_free_input_weight + total_free_buying_input_weight + total_input_weight = total_governmental_input_weight + total_free_input_weight + + total_governmental_output_weight = total_in_province_governmental_output_weight + total_governmental_free_sale_weight + segmentations_governmental_weight + int( + pos_governmental_allocated_weight / 1000) + total_free_output_weight = total_in_province_free_output_weight + total_free_free_sale_weight + segmentations_free_weight + int( + pos_free_allocated_weight / 1000) + total_output_weight = total_governmental_output_weight + total_free_output_weight + + total_governmental_remain_weight = ( + total_governmental_input_weight - total_governmental_output_weight) - archives_governmental_weight if ( + ( + total_governmental_input_weight - total_governmental_output_weight) - archives_governmental_weight) > 0 else 0 + total_free_remain_weight = (total_free_input_weight - total_free_output_weight) - archives_free_weight if ( + ( + total_free_input_weight - total_free_output_weight) - archives_free_weight) > 0 else 0 + total_remain_weight = total_governmental_remain_weight + total_free_remain_weight + + input_allocations_weight = allocations_aggregates['total_input_bars_weight'] or 0 + input_entered_allocations_weight = allocations_aggregates['total_input_entered_bars_weight'] or 0 + output_allocations_weight = allocations_aggregates['total_output_bars_weight'] or 0 + free_bars_weight = free_bars_aggregates['total_weight'] or 0 + free_sale_bars_weight = free_sale_bars_aggregates['total_weight'] or 0 + remain_weight = int( + (input_entered_allocations_weight + free_bars_weight) - ( + free_sale_bars_weight + output_allocations_weight + archives_weight)) + + result = { + "total_bars_weight": int(input_allocations_weight + free_bars_weight), + "total_entered_bars_weight": int(input_entered_allocations_weight + free_bars_weight), + "in_province_bars_weight": int(output_allocations_weight), + "out_province_bars_weight": int(free_sale_bars_weight), + "remain_weight": remain_weight, + "total_governmental_input_weight": total_governmental_input_weight, + "total_free_input_weight": total_free_input_weight, + "total_input_weight": total_input_weight, + "total_governmental_output_weight": total_governmental_output_weight, + "total_free_output_weight": total_free_output_weight, + "total_output_weight": total_output_weight, + "total_governmental_remain_weight": total_governmental_remain_weight, + "total_free_remain_weight": total_free_remain_weight, + "total_remain_weight": total_remain_weight, + "segmentations_weight": segmentations_weight, + "pos_allocated_weight": int(pos_allocated_weight / 1000), + "pos_governmental_allocated_weight": int(pos_governmental_allocated_weight / 1000), + "pos_free_allocated_weight": int(pos_free_allocated_weight / 1000), + "archives_weight": archives_weight, + "archives_governmental_weight": archives_governmental_weight, + "archives_free_weight": archives_free_weight, + } + + return Response(result, status=status.HTTP_200_OK) + + +class TotalStewardDashboarDetailViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = RealGuildsForDashboardSerializer + pagination_class = CustomPagination + + def list(self, request, *args, **kwargs): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + stewards_filter = {'trash': False, 'steward': True, 'active': True} + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if role in ['CityJahad']: + stewards_filter['user__city'] = user.city + + stewards = Guilds.objects.filter(**stewards_filter).select_related('user').only('user', 'guilds_name', + 'steward').order_by( + 'id') + + if date1: + date1 = datetime.strptime(str(date1), '%Y-%m-%d').date() + date2 = datetime.strptime(str(date2), '%Y-%m-%d').date() + + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted'], + allocation_to_steward__date__date__gte=date1, allocation_to_steward__date__date__lte=date2, + allocation_to_steward__warehouse=True, allocation_to_steward__steward_warehouse=True) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count') + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count') + + stewards = list(set(chain(allocation_stewards, free_bar_stewards))) + + else: + allocation_stewards = stewards.annotate( + allocation_count=Count( + 'allocation_to_steward', + filter=Q(allocation_to_steward__receiver_state__in=['pending', 'accepted'], + allocation_to_steward__warehouse=True, allocation_to_steward__steward_warehouse=True) + ) + ).filter(allocation_count__gt=0).order_by('-allocation_count') + + free_bar_stewards = stewards.annotate( + free_bar_count=Count( + 'free_bar_info_steward' + ) + ).filter(free_bar_count__gt=0).order_by('-free_bar_count') + + stewards = list(set(chain(allocation_stewards, free_bar_stewards))) + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(stewards) + if page is not None: + serializer = self.serializer_class(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + +class InProvinceAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = InProvinceAllocationSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = StewardAllocationDashboardFilterSet + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET.get('role') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + value = request.GET.get('value') + search = request.GET.get('search') + kill_house_key = request.GET.get('kill_house_key') + steward_key = request.GET.get('steward_key') + allocations_type = request.GET.get('type') + trash = request.GET.get('trash') + return_trash = request.GET.get('return_trash') + filters = { + 'to_cold_house__isnull': True, + 'calculate_status': True, + } + if trash == 'true': + filters['trash'] = True + filters['active_expire_date_time'] = True + else: + filters['trash'] = False + + if return_trash == 'true': + filters['return_trash'] = True + + if allocations_type == 'KillHouse': + filters['kill_house__isnull'] = False + elif allocations_type == 'Steward': + filters['steward__isnull'] = False + + if kill_house_key and kill_house_key != 'all': + filters['kill_house__key'] = kill_house_key + if steward_key and steward_key != 'all': + filters['steward__key'] = steward_key + + if date1: + filters['date__date__gte'] = datetime.strptime(str(date1), '%Y-%m-%d').date() + filters['date__date__lte'] = datetime.strptime(str(date2), '%Y-%m-%d').date() + + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + filters['kill_house'] = kill_house + elif role == 'Steward': + steward = Guilds.objects.get(user=user, trash=False) + filters['steward'] = steward + + elif role in ['CityJahad']: + if allocations_type == 'KillHouse': + filters['kill_house__kill_house_operator__user__city'] = user.city + else: + filters['steward__user__city'] = user.city + allocations = StewardAllocation.objects.filter(**filters).order_by('-date') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + allocations = allocations.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(allocations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + # return self.get_paginated_response(serializer.data) + + +class BatchStewardAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardAllocationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = StewardAllocationFilterSet + filterset_fields = [ + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'to_guilds__user__first_name', + 'to_guilds__user__last_name', + 'to_guilds__user__fullname', + 'to_guilds__user__mobile', + 'to_steward__user__first_name', + 'to_steward__user__last_name', + 'to_steward__user__fullname', + 'to_steward__user__mobile', + 'to_kill_house__kill_house_operator__user__first_name', + 'to_kill_house__kill_house_operator__user__last_name', + 'to_kill_house__kill_house_operator__user__fullname', + 'to_kill_house__kill_house_operator__user__mobile', + 'to_kill_house__name', + ] + + def create(self, request, *args, **kwargs): + + # houre = datetime.now().time() + # allocations_list = request.data['allocations_list'] + # + # user = SystemUserProfile.objects.get(user=request.user, trash=False) + # + # main_seller_type = allocations_list[0]['seller_type'] + # product = RolesProducts.objects.get(key=allocations_list[0]['product_key']) + # + # if main_seller_type == 'KillHouse': + # kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # elif main_seller_type == 'Steward': + # steward = Guilds.objects.filter(user=user, steward=True, trash=False).first() + # elif main_seller_type == 'ColdHouse': + # to_cold_house = ColdHouse.objects.get(key=allocations_list[0]['cold_house_key'], trash=False) + # else: + # guild = Guilds.objects.filter(user=user, trash=False).first() + # + # allocation_instances = [] + # + # for allocation_obj in allocations_list: + # date = datetime.strptime(str(allocation_obj['date']), '%Y-%m-%d').date() + # full_date = datetime(year=date.year, month=date.month, day=date.day, + # hour=houre.hour, minute=houre.minute, second=houre.second) + # seller_type = allocation_obj['seller_type'] + # buyer_type = allocation_obj['buyer_type'] + # + # if seller_type == 'KillHouse': + # kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # elif seller_type == 'Steward': + # steward = Guilds.objects.filter(user=user, steward=True, trash=False).first() + # elif seller_type == 'ColdHouse': + # to_cold_house = ColdHouse.objects.get(key=allocation_obj['cold_house_key'], trash=False) + # else: + # guild = Guilds.objects.filter(user=user, trash=False).first() + # + # if buyer_type == 'Steward': + # to_steward = Guilds.objects.get(key=allocation_obj['steward_key'], trash=False) + # elif buyer_type == 'Guild': + # to_guild = Guilds.objects.get(key=allocation_obj['guild_key'], trash=False) + # elif buyer_type == 'ColdHouse': + # to_cold_house = ColdHouse.objects.get(key=allocation_obj['cold_house_key'], trash=False) + # else: + # to_kill_house = KillHouse.objects.get(key=allocation_obj['kill_house_key'], trash=False) + # + # allocation_obj.pop('date', None) + # allocation_obj.pop('product_key', None) + # allocation_obj.pop('steward_key', None) + # allocation_obj.pop('guild_key', None) + # allocation_obj.pop('kill_house_key', None) + # allocation_obj.pop('cold_house_key', None) + # image = None + # if 'image' in allocation_obj.keys() and allocation_obj['image']: + # image = allocation_obj['image'] + # allocation_obj.pop('image', None) + # serializer = self.serializer_class(data=allocation_obj) + # serializer.is_valid(raise_exception=True) + # allocation = StewardAllocation(**serializer.validated_data) + # if image: + # ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15)) + # upload_object_resize(image_data=image, bucket_name="profileimagedefault", + # object_name="{0}.jpg".format(str(ran))) + # + # allocation.image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran)) + # + # allocation.date = full_date + # allocation.real_number_of_carcasses = allocation.number_of_carcasses + # allocation.real_weight_of_carcasses = int(allocation.weight_of_carcasses) + # + # if seller_type == 'KillHouse': + # allocation.kill_house = kill_house + # elif seller_type == 'Steward': + # allocation.steward = steward + # elif seller_type == 'ColdHouse': + # allocation.to_cold_house = to_cold_house + # else: + # allocation.guilds = guild + # + # if buyer_type == 'Steward': + # allocation.to_steward = to_steward + # elif buyer_type == 'Guild': + # allocation.to_guilds = to_guild + # elif buyer_type == 'ColdHouse': + # allocation.to_cold_house = to_cold_house + # else: + # allocation.to_kill_house = to_kill_house + # + # if product: + # allocation.product = product + # + # allocation_instances.append(allocation) + # + # StewardAllocation.objects.bulk_create(allocation_instances) + # + # if main_seller_type == 'KillHouse': + # kill_house_allocations_product_warehousing(product) + # elif main_seller_type == 'ColdHouse': + # cold_house_warehousing(to_cold_house) + # else: + # guild_steward_allocations_product_warehousing(product) + + # return Response({"result": "با موفقیت ثبت شد!"}, status=status.HTTP_201_CREATED) + return Response({"result": "امکان ثبت بصورت موقت غیر فعال می باشد!"}, status=status.HTTP_201_CREATED) + + # houre = datetime.now().time() + # allocations_list=request.data['allocations_list'] + # for allocation_obj in allocations_list: + # date = datetime.strptime(str(allocation_obj['date']), '%Y-%m-%d').date() + # date = datetime(year=date.year, month=date.month, day=date.day, hour=houre.hour, + # minute=houre.minute, + # second=houre.second) + # allocation_obj.pop('date') + # # if OperationLimitation.objects.all().first().kill_house_steward_guild_allocation_limitation == True: + # # if now.date() != date: + # # return Response({"result": "به علت مغایرت تاریخ امکان تخصیص وجود ندارد!"}, + # # status=status.HTTP_403_FORBIDDEN) + # product = None + # user = SystemUserProfile.objects.get(user=request.user, trash=False) + # seller_type = allocation_obj['seller_type'] + # buyer_type = allocation_obj['buyer_type'] + # allocation_obj.pop('buyer_type') + # if seller_type != 'ColdHouse': + # product = RolesProducts.objects.get(key=allocation_obj['product_key']) + # allocation_obj.pop('product_key') + # + # if seller_type == 'KillHouse': + # kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # + # elif seller_type == 'Steward': + # steward = Guilds.objects.filter(user=user, steward=True, trash=False).first() + # + # elif seller_type == 'ColdHouse': + # to_cold_house = ColdHouse.objects.get(key=allocation_obj['cold_house_key'], trash=False) + # allocation_obj.pop('cold_house_key') + # else: + # guild = Guilds.objects.filter(user=user, trash=False).first() + # + # if buyer_type == 'Steward': + # to_steward = Guilds.objects.get(key=allocation_obj['steward_key'], trash=False) + # allocation_obj.pop('steward_key') + # elif buyer_type == 'Guild': + # to_guild = Guilds.objects.get(key=allocation_obj['guild_key'], trash=False) + # allocation_obj.pop('guild_key') + # + # elif buyer_type == 'ColdHouse': + # to_cold_house = ColdHouse.objects.get(key=allocation_obj['cold_house_key'], trash=False) + # allocation_obj.pop('cold_house_key') + # else: + # to_kill_house = KillHouse.objects.get(key=allocation_obj['kill_house_key'], trash=False) + # allocation_obj.pop('kill_house_key') + # + # serializer = self.serializer_class(data=allocation_obj) + # if serializer.is_valid(): + # allocation = serializer.create(validated_data=serializer.validated_data) + # allocation.date = date + # allocation.real_number_of_carcasses = allocation.number_of_carcasses + # allocation.real_weight_of_carcasses = int(allocation.weight_of_carcasses) + # allocation.weight_of_carcasses = int(allocation_obj['weight_of_carcasses']) + # allocation.product = product + # if seller_type == 'KillHouse': + # allocation.kill_house = kill_house + # + # elif seller_type == 'Steward': + # allocation.steward = steward + # + # elif seller_type == 'ColdHouse': + # allocation.to_cold_house = to_cold_house + # + # + # else: + # allocation.guilds = guild + # + # if buyer_type == 'Steward': + # allocation.to_steward = to_steward + # elif buyer_type == 'Guild': + # allocation.to_guilds = to_guild + # + # elif buyer_type == 'ColdHouse': + # allocation.to_cold_house = to_cold_house + # + # else: + # allocation.to_kill_house = to_kill_house + # + # allocation.save() + # + # if seller_type == 'KillHouse': + # kill_house_allocations_product_warehousing(product) + # if buyer_type == 'ColdHouse' and to_cold_house.kill_house: + # allocation.receiver_state = 'accepted' + # allocation.system_registration_code = True + # allocation.registration_code = 0 + # allocation.save() + # kill_house_cold_house_allocations(to_cold_house) + # + # elif seller_type == 'ColdHouse': + # cold_house_warehousing(to_cold_house) + # + # else: + # guild_steward_allocations_product_warehousing(product) + # return Response({"result": "با موفقیت ثبت شد!"}, status=status.HTTP_201_CREATED) + # return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + if 'steward' in request.data.keys() or 'guild' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + + steward_allocation.save() + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + elif 'check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + seller_product = steward_allocation.product + + if request.data['state'] == 'accepted': + receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + receiver_real_weight_of_carcasses = int(request.data['receiver_real_weight_of_carcasses']) + weight_loss_of_carcasses = 0 + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + if 'weight_loss_of_carcasses' in request.data.keys(): + weight_loss_of_carcasses = request.data['weight_loss_of_carcasses'] + maximum_weight_limit = int(request.data['receiver_real_weight_of_carcasses']) * 0.07 + if weight_loss_of_carcasses > maximum_weight_limit: + return Response({"result": "افت وزن وارد شده بیشتر از حد مجاز است!"}, + status=status.HTTP_403_FORBIDDEN) + + receiver_real_weight_of_carcasses -= weight_loss_of_carcasses + steward_allocation.weight_loss_of_carcasses = weight_loss_of_carcasses + + steward_allocation.receiver_real_number_of_carcasses = receiver_real_number_of_carcasses + steward_allocation.receiver_real_weight_of_carcasses = receiver_real_weight_of_carcasses + steward_allocation.real_number_of_carcasses = receiver_real_number_of_carcasses + steward_allocation.real_weight_of_carcasses = receiver_real_weight_of_carcasses + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + + if steward_allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_steward, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + + elif steward_allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_guilds, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + buyer_product = RolesProducts.objects.get(kill_house=steward_allocation.to_kill_house, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'steward_check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + seller_product = steward_allocation.product + + if request.data['state'] == 'accepted': + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + if steward_allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_steward, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + + elif steward_allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_guilds, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + buyer_product = RolesProducts.objects.get(kill_house=steward_allocation.to_kill_house, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'guild_check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + if request.data['state'] == 'accepted': + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'allocation_key' in request.data.keys() and 'logged_registration_code' not in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], trash=False) + if steward_allocation.to_cold_house: + steward_allocation.real_weight_of_carcasses = int(request.data['weight_of_carcasses']) + else: + + steward_allocation.real_number_of_carcasses = request.data['number_of_carcasses'] + steward_allocation.real_weight_of_carcasses = int(request.data['weight_of_carcasses']) + steward_allocation.save() + seller_product = steward_allocation.product + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + if steward_allocation.to_cold_house and steward_allocation.to_cold_house.kill_house == steward_allocation.kill_house: + kill_house_cold_house_allocations(steward_allocation.to_cold_house) + + elif steward_allocation.seller_type == 'ColdHouse': + cold_house_warehousing(steward_allocation.to_cold_house) + + else: + guild_steward_allocations_product_warehousing(seller_product) + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'steward_allocation_list' in request.data.keys(): + allocations_list_temp = request.data['steward_allocation_list'] + allocations_list = [] + steward_allocations = StewardAllocation.objects.filter(key__in=allocations_list_temp, + trash=False) + request.data.pop('steward_allocation_list') + for steward_allocation in steward_allocations: + if steward_allocation.system_registration_code == True: + continue + number = random.randint(10000, 99000) + steward_allocation.registration_code = number + steward_allocation.system_registration_code = True + allocations_list.append(str(steward_allocation.key)) + steward_allocation.save() + + sms_steward_allocations = threading.Thread(target=steward_allocations_sms, + args=(allocations_list,)) + + sms_steward_allocations.start() + + return Response({"result": "عملیات با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + else: + + steward_allocation = StewardAllocation.objects.filter(key=request.data['steward_allocation_key'], + trash=False).select_related('ware_house__kill_house', + 'ware_house__kill_house__kill_house_operator__user').last() + request.data.pop('steward_allocation_key') + if int(request.data['logged_registration_code']) != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + + steward_allocation.role = { + "role": request.data['role'], + "fullname": user.fullname, + "mobile": user.mobile, + "date_register": str(datetime.now()) + } + if 'logged_registration_code' in request.data.keys(): + steward_allocation.state = 'accepted' + steward_allocation.save() + request.data.pop('role') + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + allocations = [] + allocations_list = [] + now = datetime.now().date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + allocations_type = request.GET.get('type') + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'cold_house' in request.GET: + cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + + if 'type' in request.GET: + if request.GET['type'] == 'input': + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + kill_house__isnull=False, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date') + else: + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + kill_house__isnull=True, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date') + else: + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date') + + else: + allocations = StewardAllocation.objects.filter( + Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('id') + else: + if 'cold_house' in request.GET: + cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + if 'type' in request.GET: + if request.GET['type'] == 'input': + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + kill_house__isnull=False, + trash=False).order_by('-date') + else: + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + kill_house__isnull=True, + trash=False).order_by('-date') + else: + + allocations = StewardAllocation.objects.filter(to_cold_house=cold_house, + trash=False).order_by('-date') + + else: + allocations = StewardAllocation.objects.filter( + Q(kill_house=kill_house) | Q(to_kill_house=kill_house), + trash=False).order_by('id') + + # kill_house_ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house, date__date=date).last() + # allocations = StewardAllocation.objects.filter( + # Q(type='manual') | Q(type='auto', + # system_registration_code=True), + # kill_house=kill_house, trash=False, + # date__date=date).order_by('id') + elif request.GET['role'] == 'Steward': + guild = Guilds.objects.get(user=user, trash=False) + if allocations_type: + receiver_state = 'pending' if allocations_type == 'not_entered' else 'accepted' + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter(Q(to_steward=guild) | Q(to_guilds=guild), + date__date__gte=date1, date__date__lte=date2, + trash=False, system_registration_code=True, + receiver_state=receiver_state + ).order_by('-date') + else: + + allocations = StewardAllocation.objects.filter(Q(to_steward=guild) | Q(to_guilds=guild), + trash=False, + system_registration_code=True, + receiver_state=receiver_state + ).order_by('-date') + + else: + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + allocations = StewardAllocation.objects.filter(Q(steward=guild) | Q(guilds=guild), + date__date__gte=date1, date__date__lte=date2, + trash=False, + ).order_by('-date') + else: + + allocations = StewardAllocation.objects.filter(Q(steward=guild) | Q(guilds=guild), + trash=False, + ).order_by('-date') + + elif 'guild' in request.GET: + guild = Guilds.objects.get(user=user, trash=False) + allocations = StewardAllocation.objects.filter( + Q(allocation_type='steward_broadcast') | Q(allocation_type='kill_house_broadcast'), guilds=guild, + trash=False, system_registration_code=True).order_by('-date') + + elif 'steward_guilds_allocations' in request.GET: + steward = Steward.objects.get(guilds__user=user, trash=False) + steward_ware_house = StewardWareHouse.objects.get(date__date=date, steward=steward, trash=False) + + allocations = StewardAllocation.objects.filter(steward_ware_house__steward=steward, trash=False, + steward_ware_house=steward_ware_house, + date__date=date).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=allocations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=allocations) + allocations_list = ps.filter() + allocations = [] if len(allocations_list) == 0 else allocations_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(allocations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = StewardAllocationSerializer(allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + allocation = StewardAllocation.objects.get(key=request.GET["steward_allocation_key"]) + product = allocation.product + seller_type = allocation.seller_type + to_cold_house = allocation.to_cold_house + allocation.delete() + if seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(product) + if to_cold_house and to_cold_house.kill_house == product.kill_house: + kill_house_cold_house_allocations(to_cold_house) + + elif seller_type == 'ColdHouse': + cold_house_warehousing(to_cold_house) + + + else: + guild_steward_allocations_product_warehousing(product) + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + +class PosStewardAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [AllowAny] + serializer_class = PosStewardAllocationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = StewardAllocationFilterSet + filterset_fields = [ + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'guilds__guilds_name', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'steward__guilds_name', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'to_guilds__user__first_name', + 'to_guilds__user__last_name', + 'to_guilds__user__fullname', + 'to_guilds__user__mobile', + 'to_guilds__guilds_name', + 'to_steward__user__first_name', + 'to_steward__user__last_name', + 'to_steward__user__fullname', + 'to_steward__user__mobile', + 'to_steward__guilds_name', + 'to_kill_house__kill_house_operator__user__first_name', + 'to_kill_house__kill_house_operator__user__last_name', + 'to_kill_house__kill_house_operator__user__fullname', + 'to_kill_house__kill_house_operator__user__mobile', + 'to_kill_house__name', + ] + + def create(self, request, *args, **kwargs): + # validation_response = validate_headers(request) + # if validation_response: + # return validation_response + now = datetime.now() + pos = POSMachine.objects.get(pos_id=request.data['pos-id'], trash=False) + product = RolesProducts.objects.get(key=request.data['product_key']) + seller_type = request.data['seller_type'] + buyer_type = request.data['buyer_type'] + request.data.pop('buyer_type') + request.data.pop('product_key') + request.data.pop('pos-id') + + if seller_type == 'KillHouse': + kill_house = pos.kill_house + + elif seller_type == 'Steward': + steward = pos.guild + + else: + guild = pos.guild + + if buyer_type == 'Steward': + to_steward = Guilds.objects.get(key=request.data['steward_key'], trash=False) + request.data.pop('steward_key') + elif buyer_type == 'Guild': + to_guild = Guilds.objects.get(key=request.data['guild_key'], trash=False) + request.data.pop('guild_key') + else: + to_kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + request.data.pop('kill_house_key') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + allocation = serializer.create(validated_data=request.data) + allocation.date = now + allocation.allocation_type = allocation.allocation_type.lower() + allocation.real_number_of_carcasses = allocation.number_of_carcasses + allocation.real_weight_of_carcasses = int(allocation.weight_of_carcasses) + allocation.weight_of_carcasses = int(request.data['weight_of_carcasses']) + # allocation.real_weight_of_carcasses = allocation.weight_of_carcasses + allocation.product = product + if seller_type == 'KillHouse': + allocation.kill_house = kill_house + + elif seller_type == 'Steward': + allocation.steward = steward + + else: + allocation.guilds = guild + + if buyer_type == 'Steward': + allocation.to_steward = to_steward + elif buyer_type == 'Guild': + allocation.to_guilds = to_guild + else: + allocation.to_kill_house = to_kill_house + + allocation.save() + + if seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(product) + + else: + guild_steward_allocations_product_warehousing(product) + + allocations_list = [] + number = random.randint(10000, 99000) + allocation.registration_code = number + allocation.system_registration_code = True + allocations_list.append(str(allocation.key)) + allocation.save() + + sms_steward_allocations = threading.Thread(target=steward_allocations_sms, + args=(allocations_list,)) + + sms_steward_allocations.start() + + return Response({"result": "با موفقیت ثبت شد!"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + if 'steward' in request.data.keys() or 'guild' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + + steward_allocation.save() + + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + elif 'check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + seller_product = steward_allocation.product + + if request.data['state'] == 'accepted': + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = int( + request.data['receiver_real_weight_of_carcasses']) + steward_allocation.real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.real_weight_of_carcasses = int(request.data['receiver_real_weight_of_carcasses']) + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + + if steward_allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_steward, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + + elif steward_allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_guilds, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + buyer_product = RolesProducts.objects.get(kill_house=steward_allocation.to_kill_house, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'guild_check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + if request.data['state'] == 'accepted': + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'allocation_key' in request.data.keys() and 'logged_registration_code' not in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], trash=False) + steward_allocation.real_number_of_carcasses = request.data['number_of_carcasses'] + steward_allocation.real_weight_of_carcasses = request.data['weight_of_carcasses'] + seller_product = steward_allocation.product + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + steward_allocation.save() + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'allocation_list' in request.data.keys(): + allocations_list_temp = request.data['allocation_list'] + allocations_list = [] + steward_allocations = StewardAllocation.objects.filter(key__in=allocations_list_temp, + trash=False) + request.data.pop('allocation_list') + for steward_allocation in steward_allocations: + if steward_allocation.system_registration_code == True: + continue + number = random.randint(10000, 99000) + steward_allocation.registration_code = number + steward_allocation.system_registration_code = True + allocations_list.append(str(steward_allocation.key)) + steward_allocation.save() + + sms_steward_allocations = threading.Thread(target=steward_allocations_sms, + args=(allocations_list,)) + + sms_steward_allocations.start() + + return Response({"result": "عملیات با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + else: + + steward_allocation = StewardAllocation.objects.filter(key=request.data['steward_allocation_key'], + trash=False).select_related('ware_house__kill_house', + 'ware_house__kill_house__kill_house_operator__user').last() + request.data.pop('steward_allocation_key') + if int(request.data['logged_registration_code']) != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + + if 'logged_registration_code' in request.data.keys(): + steward_allocation.state = 'accepted' + steward_allocation.save() + request.data.pop('role') + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + allocations = [] + allocations_list = [] + state = request.GET.get('state') + type = request.GET.get('type') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False) + + if pos.kill_house: + if state and type: + if type == 'output': + if date1 and date2: + if state == 'all': + allocations = StewardAllocation.objects.filter( + kill_house=pos.kill_house, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter( + kill_house=pos.kill_house, + receiver_state=state, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + if state == 'all': + allocations = StewardAllocation.objects.filter( + kill_house=pos.kill_house, + trash=False).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + allocations = StewardAllocation.objects.filter( + kill_house=pos.kill_house, + receiver_state=state, + trash=False).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + if date1 and date2: + if state == 'all': + allocations = StewardAllocation.objects.filter(to_kill_house=pos.kill_house, + trash=False, date__date__gte=date1, + system_registration_code=True, + date__date__lte=date2).order_by('-date', + 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter(to_kill_house=pos.kill_house, + receiver_state=state, + trash=False, date__date__gte=date1, + system_registration_code=True, + date__date__lte=date2).order_by('-date', + 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + if state == 'all': + allocations = StewardAllocation.objects.filter(to_kill_house=pos.kill_house, + trash=False, + system_registration_code=True).order_by( + '-date', 'system_registration_code').exclude(to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter(to_kill_house=pos.kill_house, + receiver_state=state, + trash=False, + system_registration_code=True).order_by( + '-date', 'system_registration_code').exclude(to_cold_house__isnull=False) + + else: + allocations = StewardAllocation.objects.filter( + Q(to_kill_house=pos.kill_house) | Q(kill_house=pos.kill_house), + trash=False).order_by('-date', 'system_registration_code').exclude(to_cold_house__isnull=False) + + + + + else: + if state and type: + + if type == 'output': + if date1 and date2: + if state == 'all': + allocations = StewardAllocation.objects.filter( + Q(steward=pos.guild) | Q(guilds=pos.guild), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + allocations = StewardAllocation.objects.filter( + Q(steward=pos.guild) | Q(guilds=pos.guild), + receiver_state=state, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + if state == 'all': + allocations = StewardAllocation.objects.filter( + Q(steward=pos.guild) | Q(guilds=pos.guild), + trash=False).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + allocations = StewardAllocation.objects.filter( + Q(steward=pos.guild) | Q(guilds=pos.guild), + receiver_state=state, + trash=False).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + if date1 and date2: + if state == 'all': + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild), + trash=False, date__date__gte=date1, + system_registration_code=True, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild), + trash=False, date__date__gte=date1, + receiver_state=state, + system_registration_code=True, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + if state == 'all': + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild), + trash=False, + system_registration_code=True).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild), + trash=False, + receiver_state=state, + system_registration_code=True, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild) | Q(steward=pos.guild) | Q(guilds=pos.guild), + trash=False).order_by('-date', 'system_registration_code').exclude(to_cold_house__isnull=False) + + if 'search' in request.GET and 'value' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=allocations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=allocations) + allocations_list = ps.filter() + allocations = [] if len(allocations_list) == 0 else allocations_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(allocations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = PosStewardAllocationSerializer(allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + allocation = StewardAllocation.objects.get(key=request.GET["allocation_key"]) + product = allocation.product + seller_type = allocation.seller_type + allocation.delete() + if seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(product) + + else: + guild_steward_allocations_product_warehousing(product) + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + +class NewPosStewardAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [AllowAny] + serializer_class = PosStewardAllocationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = StewardAllocationFilterSet + filterset_fields = [ + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'guilds__guilds_name', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'steward__guilds_name', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'to_guilds__user__first_name', + 'to_guilds__user__last_name', + 'to_guilds__user__fullname', + 'to_guilds__user__mobile', + 'to_guilds__guilds_name', + 'to_steward__user__first_name', + 'to_steward__user__last_name', + 'to_steward__user__fullname', + 'to_steward__user__mobile', + 'to_steward__guilds_name', + 'to_kill_house__kill_house_operator__user__first_name', + 'to_kill_house__kill_house_operator__user__last_name', + 'to_kill_house__kill_house_operator__user__fullname', + 'to_kill_house__kill_house_operator__user__mobile', + 'to_kill_house__name', + ] + + def create(self, request, *args, **kwargs): + now = datetime.now() + now_time = now.time() + production_date = datetime.strptime(str(request.data['production_date']), '%Y-%m-%d').date() + production_date = datetime(year=production_date.year, month=production_date.month, day=production_date.day, + hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + + pos = POSMachine.objects.get(pos_id=request.data['pos-id'], trash=False) + product = RolesProducts.objects.get(key=request.data['product_key']) + seller_type = request.data['seller_type'] + buyer_type = request.data['buyer_type'] + request.data.pop('buyer_type') + request.data.pop('product_key') + request.data.pop('pos-id') + request.data.pop('production_date') + + if seller_type == 'KillHouse': + kill_house = pos.kill_house + quota = request.data['quota'] + if request.data['approved_price_status'] == False: + if quota == 'governmental': + if not kill_house.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + if quota == 'governmental': + if kill_house.total_input_warehouse_governmental_weight < ( + kill_house.total_selling_warehouse_governmental_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_commitment_selling_in_province_free_weight == 0 and not kill_house.free_sale_from_free_quota_in_province: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if kill_house.total_input_warehouse_free_weight < ( + kill_house.total_selling_warehouse_free_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + elif seller_type == 'Steward': + steward = pos.guild + quota = request.data['quota'] + if request.data['approved_price_status'] == False: + if quota == 'governmental': + if not steward.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + if quota == 'governmental': + if steward.total_input_warehouse_governmental_weight < ( + steward.total_selling_warehouse_governmental_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward.total_commitment_selling_in_province_free_weight == 0 and not steward.free_sale_from_free_quota_in_province: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if steward.total_input_warehouse_free_weight < ( + steward.total_selling_warehouse_free_weight + request.data['weight_of_carcasses']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + guild = pos.guild + + if buyer_type == 'Steward': + to_steward = Guilds.objects.get(key=request.data['steward_key'], trash=False) + request.data.pop('steward_key') + elif buyer_type == 'Guild': + to_guild = Guilds.objects.get(key=request.data['guild_key'], trash=False) + request.data.pop('guild_key') + else: + to_kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + request.data.pop('kill_house_key') + + if seller_type == 'KillHouse' and buyer_type == 'ColdHouse': + kill_house = pos.kill_house + quota = request.data['quota'] + if quota == 'governmental': + kill_house_sale_type = request.data['approved_price_status'] + if kill_house.governmental_selling_permission: + if kill_house_sale_type: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if not kill_house.free_sale_form_governmental_quota: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + if kill_house.total_commitment_cold_house_governmental_weight > 0: + if kill_house.total_cold_house_governmental_weight + request.data[ + 'weight_of_carcasses'] > kill_house.total_commitment_cold_house_governmental_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if kill_house.free_selling_permission: + if kill_house.total_commitment_selling_in_province_free_weight > kill_house.total_selling_in_province_free_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if kill_house.total_commitment_cold_house_free_weight > 0: + if kill_house.total_cold_house_free_weight + request.data[ + 'weight_of_carcasses'] > kill_house.total_commitment_cold_house_free_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + allocation = serializer.create(validated_data=request.data) + allow = AllowRegisterCodeForStewardAllocation.objects.filter(trash=False, active=True).first() + if allow: + allocation.active_expire_date_time = True + allocation.date = now + allocation.production_date = production_date + allocation.allocation_type = allocation.allocation_type.lower() + allocation.real_number_of_carcasses = allocation.number_of_carcasses + allocation.real_weight_of_carcasses = int(allocation.weight_of_carcasses) + allocation.weight_of_carcasses = int(request.data['weight_of_carcasses']) + # allocation.real_weight_of_carcasses = allocation.weight_of_carcasses + allocation.product = product + if seller_type == 'KillHouse': + allocation.kill_house = kill_house + + elif seller_type == 'Steward': + allocation.steward = steward + + else: + allocation.guilds = guild + + if buyer_type == 'Steward': + allocation.to_steward = to_steward + elif buyer_type == 'Guild': + allocation.to_guilds = to_guild + else: + allocation.to_kill_house = to_kill_house + + allocation.save() + + if seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(product) + + else: + guild_steward_allocations_product_warehousing(product) + + allocations_list = [] + number = random.randint(10000, 99000) + allocation.registration_code = number + allocation.system_registration_code = True + allocations_list.append(str(allocation.key)) + allocation.save() + + sms_steward_allocations = threading.Thread(target=steward_allocations_sms, + args=(allocations_list,)) + + sms_steward_allocations.start() + + return Response({"result": "با موفقیت ثبت شد!"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, pk=None, *args, **kwargs): + if 'steward' in request.data.keys() or 'guild' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + + steward_allocation.save() + + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + elif 'check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + seller_product = steward_allocation.product + + if request.data['state'] == 'accepted': + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = int( + request.data['receiver_real_weight_of_carcasses']) + steward_allocation.real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.real_weight_of_carcasses = int(request.data['receiver_real_weight_of_carcasses']) + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + + if steward_allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_steward, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + + elif steward_allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_guilds, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + guild_steward_allocations_product_warehousing(buyer_product) + else: + buyer_product = RolesProducts.objects.get(kill_house=steward_allocation.to_kill_house, + parent_product=seller_product.parent_product) + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + kill_house_allocations_product_warehousing(buyer_product) + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + else: + guild_steward_allocations_product_warehousing(seller_product) + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'guild_check_allocation' in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], + trash=False) + if request.data['state'] == 'accepted': + if 'registration_code' in request.data.keys(): + if request.data['registration_code'] != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + steward_allocation.logged_registration_code = request.data['registration_code'] + steward_allocation.receiver_real_number_of_carcasses = request.data['receiver_real_number_of_carcasses'] + steward_allocation.receiver_real_weight_of_carcasses = request.data['receiver_real_weight_of_carcasses'] + steward_allocation.save() + steward_allocation.receiver_state = 'accepted' + steward_allocation.save() + else: + steward_allocation.receiver_state = 'rejected' + steward_allocation.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + elif 'allocation_key' in request.data.keys() and 'logged_registration_code' not in request.data.keys(): + steward_allocation = StewardAllocation.objects.get(key=request.data['allocation_key'], trash=False) + if steward_allocation.receiver_state == 'accepted': + if steward_allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_guildso, trash=False, + parent_product=steward_allocation.product.parent_product) + elif steward_allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=steward_allocation.to_steward, trash=False, + parent_product=steward_allocation.product.parent_product) + + + elif steward_allocation.to_kill_house: + buyer_product = RolesProducts.objects.get(kill_house=steward_allocation.to_kill_house, trash=False, + parent_product=steward_allocation.product.parent_product) + else: + buyer_product = None + + if buyer_product: + if buyer_product.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if steward_allocation.to_cold_house: + if steward_allocation.other_cold_house: + if steward_allocation.other_cold_house.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward_allocation.to_cold_house.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + if steward_allocation.product: + if steward_allocation.product.kill_house: + if steward_allocation.quota == 'governmental': + if steward_allocation.product.kill_house.total_input_warehouse_governmental_weight < ( + ( + steward_allocation.product.kill_house.total_selling_warehouse_governmental_weight - steward_allocation.real_weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward_allocation.product.kill_house.total_input_warehouse_free_weight < ( + ( + steward_allocation.product.kill_house.total_selling_warehouse_free_weight - steward_allocation.real_weight_of_carcasses) + + request.data['weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if steward_allocation.quota == 'governmental': + if steward_allocation.product.guild.total_input_warehouse_governmental_weight < ( + ( + steward_allocation.product.guild.total_selling_warehouse_governmental_weight - steward_allocation.real_weight_of_carcasses) + + request.data[ + 'weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if steward_allocation.product.guild.total_input_warehouse_free_weight < ( + ( + steward_allocation.product.guild.total_selling_warehouse_free_weight - steward_allocation.real_weight_of_carcasses) + + request.data['weight_of_carcasses']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + + if steward_allocation.product.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار است!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if steward_allocation.to_cold_house.total_remain_weight + steward_allocation.real_weight_of_carcasses < \ + request.data[ + 'weight_of_carcasses']: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + + if steward_allocation.to_cold_house: + steward_allocation.real_weight_of_carcasses = int(request.data['weight_of_carcasses']) + else: + + steward_allocation.real_number_of_carcasses = request.data['number_of_carcasses'] + steward_allocation.real_weight_of_carcasses = int(request.data['weight_of_carcasses']) + steward_allocation.save() + seller_product = steward_allocation.product + if steward_allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(seller_product) + if steward_allocation.to_cold_house and steward_allocation.to_cold_house.kill_house == steward_allocation.kill_house: + kill_house_cold_house_allocations(steward_allocation.to_cold_house) + + elif steward_allocation.seller_type == 'ColdHouse': + cold_house_warehousing(steward_allocation.to_cold_house) + if steward_allocation.other_cold_house: + cold_house_warehousing(steward_allocation.other_cold_house) + + else: + guild_steward_allocations_product_warehousing(seller_product) + # steward_allocation.real_number_of_carcasses = request.data['number_of_carcasses'] + # steward_allocation.real_weight_of_carcasses = request.data['weight_of_carcasses'] + # seller_product = steward_allocation.product + # if steward_allocation.seller_type == 'KillHouse': + # kill_house_allocations_product_warehousing(seller_product) + # else: + # guild_steward_allocations_product_warehousing(seller_product) + # steward_allocation.save() + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'allocation_list' in request.data.keys(): + allocations_list_temp = request.data['allocation_list'] + allocations_list = [] + steward_allocations = StewardAllocation.objects.filter(key__in=allocations_list_temp, + trash=False) + request.data.pop('allocation_list') + for steward_allocation in steward_allocations: + if steward_allocation.system_registration_code == True: + continue + number = random.randint(10000, 99000) + steward_allocation.registration_code = number + steward_allocation.system_registration_code = True + allocations_list.append(str(steward_allocation.key)) + steward_allocation.save() + + sms_steward_allocations = threading.Thread(target=steward_allocations_sms, + args=(allocations_list,)) + + sms_steward_allocations.start() + + return Response({"result": "عملیات با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + else: + + steward_allocation = StewardAllocation.objects.filter(key=request.data['steward_allocation_key'], + trash=False).select_related('ware_house__kill_house', + 'ware_house__kill_house__kill_house_operator__user').last() + request.data.pop('steward_allocation_key') + if int(request.data['logged_registration_code']) != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + + if 'logged_registration_code' in request.data.keys(): + steward_allocation.state = 'accepted' + steward_allocation.save() + request.data.pop('role') + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + allocations = [] + allocations_list = [] + state = request.GET.get('state') + type = request.GET.get('type') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False) + + if pos.kill_house: + if state and type: + if type == 'output': + if date1 and date2: + if state == 'all': + allocations = StewardAllocation.objects.filter( + kill_house=pos.kill_house, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter( + kill_house=pos.kill_house, + receiver_state=state, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + if state == 'all': + allocations = StewardAllocation.objects.filter( + kill_house=pos.kill_house, + trash=False).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + allocations = StewardAllocation.objects.filter( + kill_house=pos.kill_house, + receiver_state=state, + trash=False).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + if date1 and date2: + if state == 'all': + allocations = StewardAllocation.objects.filter(to_kill_house=pos.kill_house, + trash=False, date__date__gte=date1, + system_registration_code=True, + date__date__lte=date2).order_by('-date', + 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter(to_kill_house=pos.kill_house, + receiver_state=state, + trash=False, date__date__gte=date1, + system_registration_code=True, + date__date__lte=date2).order_by('-date', + 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + if state == 'all': + allocations = StewardAllocation.objects.filter(to_kill_house=pos.kill_house, + trash=False, + system_registration_code=True).order_by( + '-date', 'system_registration_code').exclude(to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter(to_kill_house=pos.kill_house, + receiver_state=state, + trash=False, + system_registration_code=True).order_by( + '-date', 'system_registration_code').exclude(to_cold_house__isnull=False) + + else: + allocations = StewardAllocation.objects.filter( + Q(to_kill_house=pos.kill_house) | Q(kill_house=pos.kill_house), + trash=False).order_by('-date', 'system_registration_code').exclude(to_cold_house__isnull=False) + + + + + else: + if state and type: + + if type == 'output': + if date1 and date2: + if state == 'all': + allocations = StewardAllocation.objects.filter( + Q(steward=pos.guild) | Q(guilds=pos.guild), + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + allocations = StewardAllocation.objects.filter( + Q(steward=pos.guild) | Q(guilds=pos.guild), + receiver_state=state, + trash=False, date__date__gte=date1, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + if state == 'all': + allocations = StewardAllocation.objects.filter( + Q(steward=pos.guild) | Q(guilds=pos.guild), + trash=False).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + allocations = StewardAllocation.objects.filter( + Q(steward=pos.guild) | Q(guilds=pos.guild), + receiver_state=state, + trash=False).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + if date1 and date2: + if state == 'all': + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild), + trash=False, date__date__gte=date1, + system_registration_code=True, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild), + trash=False, date__date__gte=date1, + receiver_state=state, + system_registration_code=True, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + else: + if state == 'all': + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild), + trash=False, + system_registration_code=True).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild), + trash=False, + receiver_state=state, + system_registration_code=True, + date__date__lte=date2).order_by('-date', 'system_registration_code').exclude( + to_cold_house__isnull=False) + + + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward=pos.guild) | Q(to_guilds=pos.guild) | Q(steward=pos.guild) | Q(guilds=pos.guild), + trash=False).order_by('-date', 'system_registration_code').exclude(to_cold_house__isnull=False) + + if 'search' in request.GET and 'value' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=allocations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=allocations) + allocations_list = ps.filter() + allocations = [] if len(allocations_list) == 0 else allocations_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(allocations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = PosStewardAllocationSerializer(allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + # def destroy(self, request, pk=None, *args, **kwargs): + # allocation = StewardAllocation.objects.get(key=request.GET["allocation_key"]) + # product = allocation.product + # seller_type = allocation.seller_type + # allocation.delete() + # if seller_type == 'KillHouse': + # kill_house_allocations_product_warehousing(product) + # + # else: + # guild_steward_allocations_product_warehousing(product) + # return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + def destroy(self, request, pk=None, *args, **kwargs): + allocation = StewardAllocation.objects.get(key=request.GET["steward_allocation_key"]) + if allocation.receiver_state == 'accepted': + if allocation.to_steward: + buyer_product = RolesProducts.objects.get(guild=allocation.to_guildso, trash=False, + parent_product=allocation.product.parent_product) + elif allocation.to_guilds: + buyer_product = RolesProducts.objects.get(guild=allocation.to_steward, trash=False, + parent_product=allocation.product.parent_product) + + + elif allocation.to_kill_house: + buyer_product = RolesProducts.objects.get(kill_house=allocation.to_kill_house, trash=False, + parent_product=allocation.product.parent_product) + + else: + buyer_product = None + + if buyer_product: + if buyer_product.total_remain_weight < allocation.real_weight_of_carcasses: + return Response({"result": "وزن حذف شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if allocation.to_cold_house: + if allocation.other_cold_house: + if allocation.other_cold_house.total_remain_weight < allocation.real_weight_of_carcasses: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if allocation.to_cold_house.total_remain_weight < allocation.real_weight_of_carcasses: + return Response({"result": "وزن وارد شده بیشتر از موجودی انبار خریدار است!"}, + status=status.HTTP_403_FORBIDDEN) + + product = allocation.product + seller_type = allocation.seller_type + to_cold_house = allocation.to_cold_house + other_cold_house = allocation.other_cold_house if allocation.other_cold_house else None + allocation.trash = True + allocation.save() + if seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(product) + if to_cold_house and to_cold_house.kill_house == product.kill_house: + kill_house_cold_house_allocations(to_cold_house) + + elif seller_type == 'ColdHouse': + cold_house_warehousing(to_cold_house) + if other_cold_house: + cold_house_warehousing(other_cold_house) + + + else: + guild_steward_allocations_product_warehousing(product) + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + +class DispenserAllocationDashboardViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = DispenserAllocationSerializer + + def list(self, request, *args, **kwargs): + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + allocations = StewardAllocation.objects.filter(dispenser__key=request.GET['dispenser_key'], trash=False, + date__date__gte=date1, + date__date__lte=date2, + ).order_by('id') + total_quantity = allocations.aggregate(total=Sum('number_of_carcasses'))['total'] or 0 + total_weight = allocations.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0 + stewards_allocations = allocations.filter(steward__isnull=False) + steward_total_quantity = allocations.aggregate(total=Sum('number_of_carcasses'))['total'] or 0 + steward_total_weight = allocations.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0 + guilds_allocations = allocations.filter(guilds__isnull=False) + guild_total_quantity = allocations.aggregate(total=Sum('number_of_carcasses'))['total'] or 0 + guild_total_weight = allocations.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0 + + allocation_info = { + "number_of_allocations": len(allocations), + "total_quantity": total_quantity, + "total_weight": total_weight, + "number_of_stewards_allocations": len(stewards_allocations), + "steward_total_quantity": steward_total_quantity, + "steward_total_weight": steward_total_weight, + "number_of_guilds_allocations": len(guilds_allocations), + "guild_total_quantity": guild_total_quantity, + "guild_total_weight": guild_total_weight, + } + return Response(allocation_info, status=status.HTTP_200_OK) + + +class DispenserAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = DispenserAllocationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = DispenserAllocationFilterSet + filterset_fields = [ + 'dispenser__user__first_name', + 'dispenser__user__last_name', + 'dispenser__user__fullname', + 'dispenser__user__mobile', + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'steward__guilds__user__first_name', + 'steward__guilds__user__last_name', + 'steward__guilds__user__fullname', + 'steward__guilds__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name' + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + allocations_list = [] + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'Dispenser': + allocations = StewardAllocation.objects.filter(dispenser__user=user, trash=False, + date__date__gte=date1, + date__date__lte=date2, + ).order_by('-date') + else: + allocations = StewardAllocation.objects.filter(dispenser__key=request.GET['dispenser_key'], trash=False, + date__date__gte=date1, + date__date__lte=date2, + ).order_by('-date') + else: + if request.GET['role'] == 'Dispenser': + allocations = StewardAllocation.objects.filter(dispenser__user=user, trash=False + ).order_by('-date') + else: + allocations = StewardAllocation.objects.filter(dispenser__key=request.GET['dispenser_key'], + trash=False).order_by('-date') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=allocations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=allocations) + allocations_list = ps.filter() + allocations = [] if len(allocations_list) == 0 else allocations_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(allocations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class StewardGuildAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardAllocationSerializer + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'steward_allocation_key' in request.data.keys() and 'logged_registration_code' not in request.data.keys(): + steward_allocation = StewardAllocation.objects.filter(key=request.data['steward_allocation_key'], + trash=False).select_related('steward_ware_house', + 'steward_ware_house__steward').first() + request.data.pop('steward_allocation_key') + increase_number_of_carcasses = int( + request.data['number_of_carcasses']) - steward_allocation.number_of_carcasses + decrease_number_of_carcasses = steward_allocation.number_of_carcasses - int( + request.data['number_of_carcasses']) + increase_weight_of_carcasses = float( + request.data['weight_of_carcasses']) - steward_allocation.weight_of_carcasses + decrease_weight_of_carcasses = steward_allocation.weight_of_carcasses - float( + request.data['weight_of_carcasses']) + steward_ware_house = StewardWareHouse.objects.get(key=steward_allocation.steward_ware_house.key) + + if int(request.data['number_of_carcasses']) > steward_allocation.number_of_carcasses: + if increase_number_of_carcasses > steward_ware_house.remain_total_number_of_carcasses: + return Response({"result": "تعداد وارد شده از موجودی انبار بیشتر است"}, + status=status.HTTP_403_FORBIDDEN) + steward_ware_house.allocated_total_number_of_carcasses += increase_number_of_carcasses + + else: + steward_ware_house.allocated_total_number_of_carcasses -= decrease_number_of_carcasses + + if float(request.data['weight_of_carcasses']) > steward_allocation.weight_of_carcasses: + if increase_weight_of_carcasses > steward_ware_house.remain_total_weight_of_carcasses: + return Response({"result": "مقدار وارد شده از موجودی انبار بیشتر است"}, + status=status.HTTP_403_FORBIDDEN) + steward_ware_house.allocated_total_weight_of_carcasses += increase_weight_of_carcasses + + else: + steward_ware_house.allocated_total_weight_of_carcasses -= decrease_weight_of_carcasses + + steward_ware_house.save() + + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'steward_guild_allocation_list' in request.data.keys(): + allocations_list_temp = request.data['steward_guild_allocation_list'] + allocations_list = [] + steward_allocations = StewardAllocation.objects.filter(key__in=allocations_list_temp, + trash=False) + request.data.pop('steward_guild_allocation_list') + for steward_allocation in steward_allocations: + if steward_allocation.system_registration_code == True: + continue + number = random.randint(10000, 99000) + steward_allocation.registration_code = number + steward_allocation.system_registration_code = True + allocations_list.append(str(steward_allocation.key)) + + # steward_allocation.final_registration = True + steward_allocation.save() + # steward_ware_house = StewardWareHouse.objects.filter(steward=steward_allocation.steward, + # date__date=steward_allocation.date.date()).first() + # if not steward_ware_house: + # steward_ware_house = StewardWareHouse(steward=steward_allocation.steward, + # date=steward_allocation.date) + # steward_ware_house.save() + # steward_ware_house.bar_quantity += 1 + # steward_ware_house.number_of_carcasses += steward_allocation.real_number_of_carcasses + # steward_ware_house.weight_of_carcasses += steward_allocation.real_weight_of_carcasses + # steward_ware_house.save() + + sms_steward_allocations = threading.Thread(target=steward_allocations_sms, + args=(allocations_list,)) + + sms_steward_allocations.start() + + return Response({"result": "عملیات با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + else: + + steward_allocation = StewardAllocation.objects.filter(key=request.data['steward_allocation_key'], + trash=False).last() + request.data.pop('steward_allocation_key') + if int(request.data['logged_registration_code']) != steward_allocation.registration_code: + return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN) + + steward_allocation.role = { + "role": request.data['role'], + "fullname": user.fullname, + "mobile": user.mobile, + "date_register": str(datetime.now()) + } + if 'logged_registration_code' in request.data.keys(): + steward_allocation.state = 'accepted' + steward_allocation.save() + request.data.pop('role') + serializer = self.serializer_class(steward_allocation) + serializer.update(instance=steward_allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + allocation = StewardAllocation.objects.get(key=request.GET["steward_allocation_key"]) + steward_ware_house = StewardWareHouse.objects.get(key=allocation.steward_ware_house.key, trash=False) + steward_ware_house.allocated_total_number_of_carcasses -= allocation.number_of_carcasses + steward_ware_house.allocated_total_weight_of_carcasses -= allocation.weight_of_carcasses + steward_ware_house.save() + allocation.delete() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + +class StewardWareHouseViewSet(viewsets.ModelViewSet): + queryset = StewardWareHouse.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardWareHouseSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + date = datetime.strptime(request.GET['date'], + '%Y-%m-%d').date() if 'date' in request.GET else now + + steward = Steward.objects.get(guilds__user=user, trash=False) + steward_ware_house = StewardWareHouse.objects.filter(steward=steward, + date__date=date, + trash=False).last() + + if steward_ware_house is None: + ware_house_date = datetime(year=date.year, month=date.month, day=date.day, hour=1, minute=12, second=20) + steward_ware_house = StewardWareHouse( + steward=steward, + date=ware_house_date + ) + steward_ware_house.save() + + bar_quantity = 0 + number_of_carcasses = 0 + real_number_of_carcasses = 0 + weight_of_carcasses = 0 + real_weight_of_carcasses = 0 + ave_weight_of_carcasses = 0 + free_sale_number_of_carcasses = 0 + free_sale_weight_of_carcasses = 0 + + allocations = StewardAllocation.objects.filter(steward=steward, system_registration_code=True, date__date=date, + trash=False, state='accepted', + receiver_state__in=('pending', 'accepted')) + + if allocations.count() > 0: + for allocation in allocations: + bar_quantity += 1 + number_of_carcasses += allocation.number_of_carcasses + weight_of_carcasses += allocation.weight_of_carcasses + if allocation.receiver_state == 'accepted': + real_number_of_carcasses += allocation.receiver_real_number_of_carcasses + real_weight_of_carcasses += allocation.receiver_real_weight_of_carcasses + ave_weight_of_carcasses += weight_of_carcasses / number_of_carcasses + free_bars = StewardFreeBarInformation.objects.filter(steward=steward, date__date=date, trash=False) + total_quantity_free_bar = 0 + total_weight_free_bar = 0 + number_of_free_bar = 0 + if len(free_bars) > 0: + for free_bar in free_bars: + number_of_free_bar += 1 + total_quantity_free_bar += free_bar.number_of_carcasses + total_weight_free_bar += free_bar.weight_of_carcasses + steward_free_sale_bar_infos = StewardFreeSaleBarInformation.objects.filter(steward=steward, + date__date=date, + trash=False) + + free_sale_number_of_carcasses = steward_free_sale_bar_infos.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] or 0 + free_sale_weight_of_carcasses = steward_free_sale_bar_infos.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + steward_ware_house.bar_quantity = bar_quantity + steward_ware_house.number_of_carcasses = number_of_carcasses + steward_ware_house.real_number_of_carcasses = real_number_of_carcasses + total_quantity_free_bar + steward_ware_house.weight_of_carcasses = weight_of_carcasses + steward_ware_house.real_weight_of_carcasses = real_weight_of_carcasses + total_weight_free_bar + steward_ware_house.free_bar_quantity = number_of_free_bar + steward_ware_house.number_of_free_carcasses = total_quantity_free_bar + steward_ware_house.weight_of_free_carcasses = total_weight_free_bar + steward_ware_house.free_sale_quantity = free_sale_number_of_carcasses + steward_ware_house.free_sale_weight = free_sale_weight_of_carcasses + steward_ware_house.remain_total_number_of_carcasses = steward_ware_house.real_number_of_carcasses - steward_ware_house.allocated_total_number_of_carcasses + steward_ware_house.remain_total_weight_of_carcasses = steward_ware_house.real_weight_of_carcasses - steward_ware_house.allocated_total_weight_of_carcasses + steward_ware_house.save() + return Response({ + "steward_key": steward.key, + "bar_quantity": bar_quantity, + "number_of_carcasses": steward_ware_house.number_of_carcasses, + "real_number_of_carcasses": steward_ware_house.real_number_of_carcasses, + "weight_of_carcasses": steward_ware_house.weight_of_carcasses, + "real_weight_of_carcasses": steward_ware_house.real_weight_of_carcasses, + "free_bar_quantity": steward_ware_house.free_bar_quantity, + "number_of_free_carcasses": steward_ware_house.number_of_free_carcasses, + "weight_of_free_carcasses": steward_ware_house.weight_of_free_carcasses, + "allocated_total_number_of_carcasses": steward_ware_house.allocated_total_number_of_carcasses, + "allocated_total_weight_of_carcasses": steward_ware_house.allocated_total_weight_of_carcasses, + "remain_total_number_of_carcasses": steward_ware_house.remain_total_number_of_carcasses, + "remain_total_weight_of_carcasses": steward_ware_house.remain_total_weight_of_carcasses, + "free_sale_quantity": steward_ware_house.free_sale_quantity, + "free_sale_weight": steward_ware_house.free_sale_weight, + "total_average_weight_of_carcasses": round( + steward_ware_house.real_weight_of_carcasses / steward_ware_house.real_number_of_carcasses, + 2) if steward_ware_house.real_number_of_carcasses > 0 else 0, + }, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + ware_house = KillHouseWareHouse.objects.get(key=request.data['key']) + ware_house.updated_number_of_carcasses = request.data['updated_number_of_carcasses'] + ware_house.updated_weight_of_carcasses = request.data['updated_weight_of_carcasses'] + ware_house.total_weight_of_carcasses = request.data[ + 'updated_weight_of_carcasses'] + ware_house.weight_of_carcasses + ware_house.total_number_of_carcasses = request.data[ + 'updated_number_of_carcasses'] + ware_house.number_of_carcasses + ware_house.save() + serializer = self.serializer_class(ware_house) + serializer.update(instance=ware_house, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalReportOfStewardWareHouseForDailyBroadCastViewSet(viewsets.ModelViewSet): + queryset = StewardWareHouse.objects.all() + serializer_class = StewardWareHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + steward_ware_houses = StewardWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(weight_of_free_carcasses__gt=0), date__date__gte=date1, + date__date__lte=date2, trash=False) + + number_of_steward = Steward.objects.filter( + pk__in=steward_ware_houses.values('steward') + ) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + steward_ware_house__in=steward_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + total_number_of_free_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_free_carcasses'))[ + 'total'] + total_number_of_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + steward_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + steward_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + return Response({ + "buyers": len(number_of_steward), + "incoming_quantity_of_cold_house": 0, + "incoming_weight_of_cold_house": 0, + "total_pre_cold_quantity": 0, + "total_pre_cold_weight": 0, + "total_number_of_free_carcasses": total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + "total_free_weight_of_carcasses": total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + "total_number_of_carcasses": total_number_of_carcasses if total_number_of_carcasses != None else 0, + "total_weight_of_carcasses": total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + "final_total_number_of_carcasses": final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + "final_total_weight_of_carcasses": final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + "total_allocated_quantity": total_allocated_quantity if total_allocated_quantity != None else 0, + "total_allocated_weight": total_allocated_weight if total_allocated_weight != None else 0, + "total_accepted_allocated_quantity": total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + "total_accepted_allocated_weight": total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + "total_remain_quantity": total_remain_quantity if total_remain_quantity != None else 0, + "total_remain_weight": total_remain_weight if total_remain_weight != None else 0, + "number_of_guild": number_of_guild, + + }) + + +class TotalReportOfStewardWareHouseForDailyBroadCastInDetailsViewSet(viewsets.ModelViewSet): + queryset = Steward.objects.all() + serializer_class = StewardWareHouseForDailyBroadCastOInDetailsSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + steward_ware_houses = StewardWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(weight_of_free_carcasses__gt=0), date__date__gte=date1, + date__date__lte=date2, trash=False) + stewards = Steward.objects.filter( + pk__in=steward_ware_houses.values('steward') + ) + + serializer = self.serializer_class(stewards, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ChooseProductForGuildViewSet(viewsets.ModelViewSet): + queryset = Product.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProductSerializer + + # def update(self, request, pk=None, *args, **kwargs): + # product = Product.objects.get(key=request.data['product_key']) + # gulid = Guilds.objects.get(key=request.data['guild_key']) + # request.data.pop('product_key') + # request.data.pop('guild_key') + # if Product.objects.filter(guild=gulid,name=product.name).exists(): + # return Response({"result":"این محصول قبلا ثبت شده"}) + # serializer = self.serializer_class(product) + # serializer.update(instance=product, validated_data=request.data) + # return Response(serializer.data, status=status.HTTP_200_OK) + + +class GuildsWareHouseTotalProductViewSet(viewsets.ModelViewSet): + queryset = Product.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProductSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + guild = Guilds.objects.get(user=user, trash=False) + products = Product.objects.filter(Q(general=False, guild=guild) | Q(general=True, guild__isnull=True), + trash=False).order_by('priority') + product_serializer = ProductSerializer(products, many=True) + return Response(product_serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + product = Product.objects.get(key=request.data['product_key']) + request.data.pop('product_key') + serializer = self.serializer_class(product) + serializer.update(instance=product, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class GuildsWareHouseProductViewSet(viewsets.ModelViewSet): + queryset = Product.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProductSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + guild = Guilds.objects.get(user=user, trash=False) + products = Product.objects.filter( + Q(general=False, guild=guild, show=True) | Q(general=True, guild__isnull=True), + trash=False).order_by('priority') + product_serializer = ProductSerializer(products, many=True) + return Response(product_serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + product = Product.objects.get(key=request.data['product_key']) + request.data.pop('product_key') + serializer = self.serializer_class(product) + serializer.update(instance=product, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +def change_product_state(product_key): + additional_product = AdditionalProducts.objects.get(key=product_key) + products = Product.objects.filter(name=additional_product.name, trash=False) + if products: + for product in products: + product.selling_approved_price = additional_product.selling_approved_price + product.selling_free_price = additional_product.selling_free_price + product.selling_more_than_inventory = additional_product.selling_more_than_inventory + product.selling_other_products = additional_product.selling_other_products + product.price = additional_product.price + product.save() + + +def change_roles_products_state(state, price, steward_price, guild_price): + roles_products = RolesProducts.objects.filter(trash=False) + for roles_product in roles_products: + if roles_product.kill_house: + roles_product.approved_price_status = state + roles_product.approved_price = price + else: + if roles_product.guild.steward: + roles_product.approved_price = steward_price + roles_product.approved_price_status = state if steward_price > 0 else False + else: + roles_product.approved_price = guild_price + roles_product.approved_price_status = state if guild_price > 0 else False + if state: + roles_product.free_price = 0 + + roles_product.save() + + +class ServerMainProductsViewSet(viewsets.ModelViewSet): + queryset = AdditionalProducts.objects.all() + permission_classes = [AllowAny] + serializer_class = AdditionalProductsSerializer + + def list(self, request, *args, **kwargs): + products = AdditionalProducts.objects.filter(trash=False).order_by('id') + + product_serializer = AdditionalProductsSerializer(products, many=True) + return Response(product_serializer.data, status=status.HTTP_200_OK) + + +class AdditionalProductsViewSet(viewsets.ModelViewSet): + queryset = AdditionalProducts.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = AdditionalProductsSerializer + + def list(self, request, *args, **kwargs): + products = AdditionalProducts.objects.filter(trash=False).order_by('id') + + product_serializer = AdditionalProductsSerializer(products, many=True) + return Response(product_serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + product = AdditionalProducts.objects.get(key=request.data['product_key']) + request.data.pop('product_key') + serializer = self.serializer_class(product) + serializer.update(instance=product, validated_data=request.data) + change_guild_products_info = threading.Thread(target=change_product_state, + args=(product.key,)) + + change_guild_products_info.start() + return Response(serializer.data, status=status.HTTP_200_OK) + + +class GuildsWareHouseViewSet(viewsets.ModelViewSet): + queryset = GuildsWareHouse.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = GuildsWareHouseSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + date = datetime.strptime(request.GET['date'], + '%Y-%m-%d').date() if 'date' in request.GET else now + + guild = Guilds.objects.get(user=user, trash=False) + guild_ware_house = GuildsWareHouse.objects.filter(guilds=guild, + # date__date=date, + trash=False).first() + + if guild_ware_house is None: + ware_house_date = datetime(year=date.year, month=date.month, day=date.day, hour=1, minute=12, second=20) + guild_ware_house = GuildsWareHouse( + guilds=guild, + date=ware_house_date + ) + guild_ware_house.save() + + bar_quantity = 0 + number_of_carcasses = 0 + real_number_of_carcasses = 0 + weight_of_carcasses = 0 + real_weight_of_carcasses = 0 + ave_weight_of_carcasses = 0 + + allocations = StewardAllocation.objects.filter( + (Q(allocation_type='steward_broadcast') | Q(allocation_type='kill_house_broadcast')), guilds=guild, + system_registration_code=True, + # date__date=date, + trash=False, state='accepted', receiver_state__in=('pending', 'accepted')) + accepted_allocations = allocations.filter(receiver_state='accepted') + if len(allocations) > 0: + bar_quantity = len(allocations) + number_of_carcasses = allocations.aggregate(total=Sum('number_of_carcasses'))['total'] or 0 + real_number_of_carcasses = accepted_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] or 0 + weight_of_carcasses = allocations.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0 + real_weight_of_carcasses = accepted_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] or 0 + ave_weight_of_carcasses = weight_of_carcasses / number_of_carcasses if number_of_carcasses > 0 else 0 + + # if allocations.count() > 0: + # for allocation in allocations: + # bar_quantity += 1 + # number_of_carcasses += allocation.number_of_carcasses + # real_number_of_carcasses += allocation.receiver_real_number_of_carcasses + # weight_of_carcasses += allocation.weight_of_carcasses + # real_weight_of_carcasses += allocation.receiver_real_weight_of_carcasses + # ave_weight_of_carcasses += weight_of_carcasses / number_of_carcasses + guild_ware_house.bar_quantity = bar_quantity + guild_ware_house.number_of_carcasses = number_of_carcasses + guild_ware_house.real_number_of_carcasses = real_number_of_carcasses + guild_ware_house.weight_of_carcasses = weight_of_carcasses + guild_ware_house.real_weight_of_carcasses = real_weight_of_carcasses + guild_ware_house.remain_total_number_of_carcasses = guild_ware_house.real_number_of_carcasses - guild_ware_house.allocated_total_number_of_carcasses if guild_ware_house.real_number_of_carcasses > 0 else 0 + guild_ware_house.remain_total_weight_of_carcasses = guild_ware_house.real_weight_of_carcasses - guild_ware_house.allocated_total_weight_of_carcasses if guild_ware_house.real_weight_of_carcasses > 0 else 0 + guild_ware_house.save() + return Response({ + "bar_quantity": bar_quantity, + "number_of_carcasses": guild_ware_house.number_of_carcasses, + "real_number_of_carcasses": guild_ware_house.real_number_of_carcasses, + "weight_of_carcasses": guild_ware_house.weight_of_carcasses, + "real_weight_of_carcasses": guild_ware_house.real_weight_of_carcasses, + "allocated_total_number_of_carcasses": guild_ware_house.allocated_total_number_of_carcasses, + "allocated_total_weight_of_carcasses": guild_ware_house.allocated_total_weight_of_carcasses, + "remain_total_number_of_carcasses": guild_ware_house.remain_total_number_of_carcasses, + "remain_total_weight_of_carcasses": guild_ware_house.remain_total_weight_of_carcasses, + "total_average_weight_of_carcasses": round( + guild_ware_house.real_weight_of_carcasses / guild_ware_house.real_number_of_carcasses, + 2) if guild_ware_house.real_number_of_carcasses > 0 else 0, + }, status=status.HTTP_200_OK) + + +class VetSupervisorViewSet(viewsets.ModelViewSet): + queryset = VetSupervisor.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = VetSupervisorSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + operator = user.supervisor_user.all() + + # send to serializer + serializer = self.serializer_class(operator[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityVetViewSet(viewsets.ModelViewSet): + queryset = CityVet.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityVetSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + operator = user.city_vet_user.all().last() + + serializer = self.serializer_class(operator) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProvinceCheckKillRequestViewSet(viewsets.ModelViewSet): + queryset = ProvinceCheckOperatorRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceCheckOperatorRequestSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + now = datetime.now() + state = request.data['state'] + request.data.pop('state') + if 'quantity' in request.data.keys() and request.data['quantity'] != None: + quantity = request.data['quantity'] + request.data.pop('quantity') + else: + quantity = None + # request.data.pop('quantity') + if 'breed' in request.data.keys() and request.data['breed'] != None: + breed = request.data['breed'] + request.data.pop('breed') + else: + breed = None + # request.data.pop('breed') + + kill_request = KillRequest.objects.get(key=request.data['kill_request_key']) + request.data.pop('kill_request_key') + if state == 'accepted': + kill_request.province_state = 'accepted' + if quantity != None: + kill_request.province_quantity = kill_request.kill_capacity + kill_request.kill_capacity = int(quantity) + kill_request.remain_quantity = int(quantity) + if breed != None: + kill_request.old_chicken_breed = kill_request.chicken_breed + kill_request.chicken_breed = breed + kill_request.save() + price = Pricing.objects.all() + if price.count() > 0: + price = price.last() + factor = KillRequestFactor( + kill_request=kill_request, + amount=round((kill_request.kill_capacity * kill_request.Index_weight) * price.live_chicken_price, + 0), + # amount=round((kill_request.kill_capacity * kill_request.Index_weight) * price.live_chicken_price, + # 0) * 1000, + minimum_amount=round( + ((kill_request.kill_capacity * kill_request.Index_weight) * price.live_chicken_price) * ( + 70 / 100), + 0) + + ) + factor.save() + kill_request.factor_amount = factor.amount + kill_request.save() + mobile = kill_request.kill_house.kill_house_operator.user.mobile + kill_house_name = kill_request.kill_house.name + # sms_province_kill_request_accept_sms = threading.Thread( + # target=province_kill_request_accept_sms, + # args=( + # mobile, kill_house_name)) + # sms_province_kill_request_accept_sms.start() + confirmation_of_the_need_for_slaughterhouse = threading.Thread( + target=confirmation_of_the_need_for_slaughterhouse_sms_threading, + args=( + kill_request.kill_house.name)) + confirmation_of_the_need_for_slaughterhouse.start() + else: + mobile = kill_request.kill_house.kill_house_operator.user.mobile + kill_house_name = kill_request.kill_house.name + sms_province_kill_request_reject_sms = threading.Thread( + target=province_kill_request_reject_sms, + args=( + mobile, kill_house_name)) + sms_province_kill_request_reject_sms.start() + + kill_request.province_state = 'rejected' + kill_request.message = request.data['msg'] + kill_request.state = 'archive' + kill_request.save() + return Response(status=status.HTTP_201_CREATED) + + +class VetCheckAllocationsViewSet(viewsets.ModelViewSet): + queryset = VetCheckAllocations.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = VetCheckAllocationsSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + vet_superviser = VetSupervisor.objects.filter(address__province=user.province) + kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key']) + clearance_code = request.data['code'] + role = request.data['role'] + if 'code' in request.data.keys(): + date_time_of_now = datetime.now().date() + if OperationLimitation.objects.all().first().vet_farm_limitation == True and role not in ['Supporter', + 'AdminX', + 'Supporter']: + + if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1): + return Response( + {"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + if KillHouseRequest.objects.filter(clearance_code=clearance_code, trash=False).exists(): + return Response({"result": "کد وارد شده تکراری میباشد!"}, status=status.HTTP_403_FORBIDDEN) + + request.data.pop('kill_house_request_key') + request.data.pop('role') + request.data.pop('code') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + check_request = serializer.create(validated_data=request.data) + now = datetime.now() + formatted_now = now.strftime('%Y-%m-%dT%H:%M:%S') + + if role == 'ProvinceOperator': + if vet_superviser.count() > 0: + vet_superviser = vet_superviser.last() + check_request.vet = vet_superviser.vet + check_request.save() + kill_house_request.clearance_code = clearance_code + + kill_house_request.registrar_clearance_code = { + 'role': role, + 'name': user.fullname, + 'mobile': user.mobile, + 'date': str(formatted_now), + } + kill_house_request.save() + try: + get_gid(kill_house_request.clearance_code) + except: + pass + check_request.kill_house_request = kill_house_request + try: + vet = Vet.objects.get(user=user) + check_request.vet = vet + check_request.reviewer = { + 'role': role, + 'name': vet.user.fullname, + 'mobile': vet.user.mobile, + } + except: + check_request.reviewer = { + 'role': role, + 'name': user.fullname, + 'mobile': user.mobile, + } + + check_request.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def update(self, request, pk=None, selected_kill_house_request=None, *args, **kwargs): + + code = request.data['code'] + kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False) + if KillHouseRequest.objects.filter(clearance_code=code, trash=False).exists(): + return Response( + {"result": "کد وارد شده تکراری میباشد!"}, + status=status.HTTP_403_FORBIDDEN + ) + if kill_house_request.aggregate_status == True: + kill_house_requests = KillHouseRequest.objects.filter( + aggregate_code=kill_house_request.aggregate_code).order_by('id') + + for kill_house_request in kill_house_requests: + if 'code' in request.data.keys(): + kill_house_request.clearance_code = request.data['code'] + if 'traffic_code' in request.data.keys(): + kill_house_request.traffic_code = request.data['traffic_code'] + + kill_house_request.save() + else: + kill_house_request.clearance_code = code + kill_house_request.save() + try: + get_gid(kill_house_request.clearance_code) + except: + pass + return Response({"result": "کد ترخیص با موفقیت ویرایش شد"}, status=status.HTTP_200_OK) + + def destroy(self, request, *args, **kwargs): + kill = KillHouseRequest.objects.get(key=request.GET['kill_house_request_key'], trash=False) + + vat_check_request = VetCheckAllocations.objects.get(kill_house_request=kill, trash=False) + vat_check_request.delete() + kill.clearance_code = None + kill.traffic_code = None + kill.aggregate_status = False + kill.aggregate_code = None + kill.save() + return Response({'msg': f'بار به شماره {kill.bar_code} از تجمیع خارج شد.'}, status=status.HTTP_200_OK) + + +class AggregateVetCheckAllocationsViewSet(viewsets.ModelViewSet): + queryset = VetCheckAllocations.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = VetCheckAllocationsSerializer + + def create(self, request, *args, **kwargs): + # Extract necessary data from request + user = get_object_or_404(SystemUserProfile, user=request.user) + province = user.province + clearance_code = request.data.get('code') + traffic_code = request.data.get('traffic_code') + role = request.data.get('role') + kill_house_request_keys = request.data['kill_house_requests_list'] + + # Fetch related objects in a single query + kill_house_requests = KillHouseRequest.objects.filter(key__in=kill_house_request_keys).order_by('id') + aggregate_code = kill_house_requests.first().bar_code + vet_supervisor = VetSupervisor.objects.filter(address__province=province).last() + operation_limitation = OperationLimitation.objects.first() + if clearance_code is not None and KillHouseRequest.objects.filter(clearance_code=clearance_code, + trash=False).exists(): + return Response( + {"result": "کد وارد شده تکراری میباشد!"}, + status=status.HTTP_403_FORBIDDEN + ) + # Validation + if clearance_code and operation_limitation.vet_farm_limitation and role not in ['Supporter', 'AdminX']: + first_kill_house_request = kill_house_requests.first() + if first_kill_house_request and now().date() > ( + first_kill_house_request.kill_request.recive_date.date() + timedelta(days=1)): + return Response( + {"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN + ) + + # Prepare data for saving + request_data = request.data.copy() # Use copy to avoid modifying original request data + request_data.pop('kill_house_requests_list', None) + request_data.pop('role', None) + request_data.pop('code', None) + now_formatted = now().strftime('%Y-%m-%dT%H:%M:%S') + + for kill_house_request in kill_house_requests: + if kill_house_request.aggregate_status: + check_request = get_object_or_404(VetCheckAllocations, kill_house_request=kill_house_request, + trash=False) + else: + serializer = self.serializer_class(data=request_data) + if serializer.is_valid(): + check_request = serializer.save() + kill_house_request.aggregate_status = True + kill_house_request.aggregate_code = aggregate_code + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + # Update vet and reviewer information + if role == 'ProvinceOperator' and vet_supervisor: + check_request.vet = vet_supervisor.vet + + if clearance_code: + kill_house_request.clearance_code = clearance_code + kill_house_request.traffic_code = traffic_code + kill_house_request.registrar_clearance_code = { + 'role': role, + 'name': user.fullname, + 'mobile': user.mobile, + 'date': now_formatted, + } + + # Set reviewer information + try: + vet = Vet.objects.get(user=user) + check_request.vet = vet + check_request.reviewer = { + 'role': role, + 'name': vet.user.fullname, + 'mobile': vet.user.mobile, + } + except Vet.DoesNotExist: + check_request.reviewer = { + 'role': role, + 'name': user.fullname, + 'mobile': user.mobile, + } + + # Save changes + kill_house_request.save() + check_request.kill_house_request = kill_house_request + check_request.save() + try: + if kill_house_requests.first().clearance_code is not None: + get_gid(kill_house_requests.first().clearance_code) + except: + pass + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + + def update(self, request, pk=None, *args, **kwargs): + + type = request.data.get('type') + if type == 'cancel_aggregate': + selected_kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key']) + kill_house_requests = KillHouseRequest.objects.filter( + aggregate_code=selected_kill_house_request.aggregate_code).order_by('id') + for kill_house_request in kill_house_requests: + check_request = get_object_or_404(VetCheckAllocations, kill_house_request=kill_house_request, + trash=False) + check_request.delete() + kill_house_request.aggregate_status = False + kill_house_request.aggregate_code = None + kill_house_request.save() + else: + selected_kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key']) + kill_house_requests = KillHouseRequest.objects.filter( + aggregate_code=selected_kill_house_request.aggregate_code).order_by('id') + + for kill_house_request in kill_house_requests: + if 'code' in request.data.keys(): + kill_house_request.clearance_code = request.data['code'] + if 'traffic_code' in request.data.keys(): + kill_house_request.traffic_code = request.data['traffic_code'] + + kill_house_request.save() + try: + if kill_house_requests.first().clearance_code is not None: + get_gid(kill_house_requests.first().clearance_code) + except: + pass + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + +class ProvincePercentLeftOverViewSet(viewsets.ModelViewSet): + queryset = ProvincePercentLeftOver.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvincePercentLeftOverSerializer + + +# ویوست مربوط یه قیمت گذاری +class PricingViewSet(viewsets.ModelViewSet): + queryset = Pricing.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PricingSerializer + + # تابع مربوط یه قیمت گذاری + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + # role = request.data['role'] + # request.data.pop('role') + user = SystemUserProfile.objects.get(user=request.user) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + prices = Pricing.objects.filter(trash=False) + date1 = (datetime.strptime(request.data['date'], '%Y-%m-%d %H:%M:%S')).date() + for price in prices: + if price.date.year == date1.year and price.date.month == date1.month and price.date.day == date1.day: + price.live_chicken_price = float(request.data['live_chicken_price']) + price.ceiling_price = float(request.data['ceiling_price']) + price.floor_price = float(request.data['floor_price']) + # price.dead_chicken_price = float(request.data['dead_chicken_price']) + # price.major_seller_price = float(request.data['major_seller_price']) + # price.retail_seller_price = float(request.data['retail_seller_price']) + price.save() + return Response({"result": "object update"}, status=status.HTTP_200_OK) + pricing = serializer.create(validated_data=request.data) + # pricing.role = role + pricing.operator = user + pricing.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع مربوط یه نمایش قیمت های ثبت شده + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + if 'role' in request.GET: + # if request.GET['role'] == 'Poultry': + now = datetime.now().date() + # pricing = Pricing.objects.filter(date__year=now.year, date__month=now.month, date__day=now.day, + # trash=False) + pricing = Pricing.objects.all() + if pricing.count() > 0: + queryset = pricing.last() + serializer = PricingSerializer(queryset) + return Response(serializer.data, status=status.HTTP_200_OK) + + else: + queryset = [] + return Response(queryset, status=status.HTTP_200_OK) + + else: + queryset = Pricing.objects.filter(trash=False).order_by('-date') + serializer = PricingSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# class ProvinceCheckOperatorOutRequestViewSet(viewsets.ModelViewSet): +# queryset = ProvinceCheckOperatorOutRequest.objects.all() +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = ProvinceCheckOperatorOutRequestSerializer +# +# def create(self, request, *args, **kwargs): +# # refresh(request.user.id) +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key'], trash=False) +# hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) +# wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() +# request.data.pop('poultry_request_key') +# state = request.data['state'] +# message = request.data['message'] +# request.data.pop('message') +# # if state == 'accepted': +# # if wage_type and wage_type.status == True: +# # if 'payer_type' in request.data.keys() and request.data['payer_type'] is not None: +# # poultry_request.payer_type = request.data['payer_type'] +# # if request.data['payer_type'] == 'buyer': +# # poultry_request.payer_fullname = poultry_request.buyer['firstName'] + " " + \ +# # poultry_request.buyer[ +# # 'lastName'] +# # else: +# # poultry_request.payer_fullname = poultry_request.poultry.user.fullname +# # poultry_request.save() +# # +# # request.data.pop('payer_type') +# # mobile_sms = '' +# # if 'buyer_mobile' in request.data.keys() and request.data['buyer_mobile'] is not None: +# # poultry_request.buyer['mobile'] = request.data['buyer_mobile'] +# # mobile_sms = request.data['buyer_mobile'] +# # poultry_request.save() +# # # request.data.pop('buyer_mobile') +# # if 'poultry_mobile' in request.data.keys() and request.data['poultry_mobile'] is not None: +# # if poultry_request.poultry.user.mobile != request.data['poultry_mobile']: +# # first_mobile_number = poultry_request.poultry.user.mobile +# # second_mobile_number = request.data['poultry_mobile'] +# # # request.data.pop('poultry_mobile') +# # system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) +# # user = User.objects.get(id=system_user_profile.user.id) +# # +# # if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): +# # return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, +# # status=status.HTTP_403_FORBIDDEN) +# # data = { +# # "first_mobile_number": first_mobile_number, +# # "second_mobile_number": second_mobile_number, +# # } +# # req = requests.post( +# # url=ARTA_URL_CHANGE_MOBILE_NUMBER, +# # data=data, +# # verify=False +# # ) +# # if req.status_code == 200: +# # user.username = second_mobile_number +# # user.save() +# # system_user_profile.mobile = second_mobile_number +# # system_user_profile.save() +# # mobile_sms = poultry_request.poultry.user.mobile +# # request.data.pop('buyer_mobile') +# # request.data.pop('poultry_mobile') +# serializer = self.serializer_class(data=request.data) +# if serializer.is_valid(): +# check_out = serializer.create(validated_data=request.data) +# check_out.poultry_request = poultry_request +# check_out.save() +# if state == 'accepted': +# poultry_request.state_process = 'accepted' +# poultry_request.province_state = 'accepted' +# poultry_request.agent = { +# "role": None, +# "fullname": user.fullname, +# "mobile": user.mobile, +# "date": str(datetime.now()), +# } +# # if wage_type and wage_type.status == False: +# hatching.out_province_killed_weight += int(poultry_request.quantity * poultry_request.Index_weight) +# +# hatching.out_province_killed_quantity += poultry_request.quantity +# hatching.save() +# poultry_request.hatching_left_over = hatching.left_over +# # poultry_request.archive_wage = True +# # else: +# # province_out_request_transaction_sms(province=hatching.poultry.address.province.name, +# # buyer=poultry_request.buyer['firstName'] + " " + +# # poultry_request.buyer[ +# # 'lastName'], +# # poultry_name=poultry_request.poultry.user.fullname, +# # quantity=poultry_request.quantity, +# # index_weight=poultry_request.Index_weight, +# # wage=poultry_request.total_wage_amount, +# # mobile=mobile_sms, order_code=poultry_request.order_code, +# # date=poultry_request.send_date.date()) +# +# else: +# poultry_request.state_process = 'rejected' +# poultry_request.province_state = 'rejected' +# poultry_request.agent = { +# "role": None, +# "fullname": user.fullname, +# "mobile": user.mobile, +# "date": str(datetime.now()), +# } +# poultry_request.message = message if message != "" else None +# +# poultry_request.final_state = 'archive' +# poultry_request.save() +# check_serializer = self.serializer_class(check_out) +# +# return Response(check_serializer.data, status=status.HTTP_201_CREATED) +# return Response(serializer.errors) +# +# def destroy(self, request, *args, **kwargs): +# # refresh(request.user.id) +# poultry_request = PoultryRequest.objects.get(key=request.GET['poultry_request_key'], trash=False) +# hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) +# check = ProvinceCheckOperatorOutRequest.objects.get(poultry_request=poultry_request, trash=False) +# check.trash = True +# check.save() +# hatching.out_province_killed_weight -= int(poultry_request.quantity * poultry_request.Index_weight) +# +# hatching.out_province_killed_quantity -= poultry_request.quantity +# hatching.save() +# poultry_request.state_process = 'deleted' +# poultry_request.province_state = 'deleted' +# poultry_request.save() +# return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) +# +# def update(self, request, *args, **kwargs): +# poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key'], trash=False) +# if 'quantity' in request.data.keys() and request.data['quantity'] is not None: +# poultry_request.quantity = request.data['quantity'] +# poultry_request.Index_weight = request.data['Index_weight'] +# poultry_request.save() +# poultry_request.total_wage_amount = int( +# (poultry_request.Index_weight * poultry_request.quantity) * poultry_request.wage) +# poultry_request.save() +# union_percent = poultry_request.union_share_percent / 100 if poultry_request.union_share_percent > 0 else 0 +# company_percent = poultry_request.company_share_percent / 100 if poultry_request.company_share_percent > 0 else 0 +# guilds_percent = poultry_request.guilds_share_percent / 100 if poultry_request.guilds_share_percent > 0 else 0 +# city_share_percent = poultry_request.city_share_percent / 100 if poultry_request.city_share_percent > 0 else 0 +# wallet_share_percent = poultry_request.wallet_share_percent / 100 if poultry_request.wallet_share_percent > 0 else 0 +# other_share_percent = poultry_request.other_share_percent / 100 if poultry_request.other_share_percent > 0 else 0 +# poultry_request.union_share = int(union_percent * poultry_request.total_wage_amount) +# poultry_request.company_share = int(company_percent * poultry_request.total_wage_amount) +# poultry_request.guilds_share = int(guilds_percent * poultry_request.total_wage_amount) +# poultry_request.city_share = int(city_share_percent * poultry_request.total_wage_amount) +# poultry_request.wallet_share = int(wallet_share_percent * poultry_request.total_wage_amount) +# poultry_request.other_share = int(other_share_percent * poultry_request.total_wage_amount) +# poultry_request.save() +# if 'payer_type' in request.data.keys() and request.data['payer_type'] is not None: +# poultry_request.payer_type = request.data['payer_type'] +# if request.data['payer_type'] == 'buyer': +# poultry_request.payer_fullname = poultry_request.buyer['firstName'] + " " + poultry_request.buyer[ +# 'lastName'] +# else: +# poultry_request.payer_fullname = poultry_request.poultry.user.fullname +# poultry_request.save() +# +# mobile_sms = '' +# if 'buyer_mobile' in request.data.keys() and request.data['buyer_mobile'] is not None: +# poultry_request.buyer['mobile'] = request.data['buyer_mobile'] +# mobile_sms = request.data['buyer_mobile'] +# poultry_request.save() +# if 'poultry_mobile' in request.data.keys() and request.data['poultry_mobile'] is not None: +# if poultry_request.poultry.user.mobile != request.data['poultry_mobile']: +# first_mobile_number = poultry_request.poultry.user.mobile +# second_mobile_number = request.data['poultry_mobile'] +# system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) +# user = User.objects.get(id=system_user_profile.user.id) +# +# if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): +# return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, +# status=status.HTTP_403_FORBIDDEN) +# data = { +# "first_mobile_number": first_mobile_number, +# "second_mobile_number": second_mobile_number, +# } +# req = requests.post( +# url=ARTA_URL_CHANGE_MOBILE_NUMBER, +# data=data, +# verify=False +# ) +# if req.status_code == 200: +# user.username = second_mobile_number +# user.save() +# system_user_profile.mobile = second_mobile_number +# system_user_profile.save() +# mobile_sms = poultry_request.poultry.user.mobile +# wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() +# if wage_type and wage_type.status == True: +# province_out_request_transaction_sms(province=poultry_request.poultry.address.province.name, +# buyer=poultry_request.buyer['firstName'] + " " + poultry_request.buyer[ +# 'lastName'], +# poultry_name=poultry_request.poultry.user.fullname, +# quantity=poultry_request.quantity, +# index_weight=poultry_request.Index_weight, +# wage=poultry_request.total_wage_amount, +# mobile=mobile_sms, order_code=poultry_request.order_code, +# date=poultry_request.send_date.date(), +# amount=poultry_request.amount, +# sale_type=poultry_request.free_sale_in_province) +# +# return Response({'result': 'با موفقیت انجام شد.'}, status=status.HTTP_201_CREATED) +class ProvinceCheckOperatorOutRequestViewSet(viewsets.ModelViewSet): + queryset = ProvinceCheckOperatorOutRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceCheckOperatorOutRequestSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + poultry_requests = PoultryRequest.objects.filter(key=request.data['poultry_request_key'], trash=False) + request.data.pop('poultry_request_key') + now = datetime.now().date() + poultry = SystemUserProfile.objects.filter( + key__in=poultry_requests.filter(payer_type='poultry', sms=False).values_list('poultry__user__key', + flat=True)).values_list('id', + flat=True) + buyer = SystemUserProfile.objects.filter( + key__in=poultry_requests.filter(payer_type='buyer', sms=False).values_list( + 'out_province_poultry_request_buyer__user__key', + flat=True)).values_list('id', flat=True) + poultry_requests_for_sms = poultry_requests.filter(payer_type='poultry').values_list('id', flat=True).distinct() + wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() + if wage_type and wage_type.status == True: + sms = threading.Thread(target=send_sms_for_final_approval_out_province_threading, + args=(list(buyer), list(poultry_requests_for_sms))) + sms.start() + for poultry_request in poultry_requests: + # if poultry_request.has_wage == False: + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + if hatching.left_over >= poultry_request.quantity: + hatching.out_province_killed_weight += int(poultry_request.quantity * poultry_request.Index_weight) + hatching.out_province_killed_quantity += poultry_request.quantity + hatching.save() + else: + different_quantity = poultry_request.quantity - hatching.left_over + hatching.out_province_killed_weight += int(hatching.left_over * poultry_request.Index_weight) + hatching.out_province_killed_quantity += hatching.left_over + hatching.extra_killed_quantity += different_quantity + hatching.save() + url = f'https://rasadyar.net/pay/{base_url_for_sms_report}' + if poultry_request.payer_type == 'poultry': + poultry_request.payment_link = f'{url}/p{poultry_request.poultry.user.user_gate_way_id}{poultry_request.order_code}' + else: + poultry_request.payment_link = f'{url}/b{poultry_request.out_province_poultry_request_buyer.user.user_gate_way_id}' + poultry_request.final_state = 'archive' + poultry_request.province_state = 'accepted' + poultry_request.state_process = 'accepted' + poultry_request.agent = { + "role": None, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()) + } + poultry_request.hatching_left_over = poultry_request.hatching.left_over + + poultry_request.save() + + return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_201_CREATED) + + def destroy(self, request, *args, **kwargs): + # refresh(request.user.id) + poultry_request = PoultryRequest.objects.get(key=request.GET['poultry_request_key'], trash=False) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + check = ProvinceCheckOperatorOutRequest.objects.get(poultry_request=poultry_request, trash=False) + check.trash = True + check.save() + hatching.out_province_killed_weight -= int(poultry_request.quantity * poultry_request.Index_weight) + + hatching.out_province_killed_quantity -= poultry_request.quantity + hatching.save() + poultry_request.state_process = 'deleted' + poultry_request.province_state = 'deleted' + poultry_request.save() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key'], trash=False) + if 'quantity' in request.data.keys() and request.data['quantity'] is not None: + poultry_request.quantity = request.data['quantity'] + poultry_request.Index_weight = request.data['Index_weight'] + poultry_request.save() + poultry_request.total_wage_amount = int( + (poultry_request.Index_weight * poultry_request.quantity) * poultry_request.wage) + poultry_request.save() + union_percent = poultry_request.union_share_percent / 100 if poultry_request.union_share_percent > 0 else 0 + company_percent = poultry_request.company_share_percent / 100 if poultry_request.company_share_percent > 0 else 0 + guilds_percent = poultry_request.guilds_share_percent / 100 if poultry_request.guilds_share_percent > 0 else 0 + city_share_percent = poultry_request.city_share_percent / 100 if poultry_request.city_share_percent > 0 else 0 + wallet_share_percent = poultry_request.wallet_share_percent / 100 if poultry_request.wallet_share_percent > 0 else 0 + other_share_percent = poultry_request.other_share_percent / 100 if poultry_request.other_share_percent > 0 else 0 + poultry_request.union_share = int(union_percent * poultry_request.total_wage_amount) + poultry_request.company_share = int(company_percent * poultry_request.total_wage_amount) + poultry_request.guilds_share = int(guilds_percent * poultry_request.total_wage_amount) + poultry_request.city_share = int(city_share_percent * poultry_request.total_wage_amount) + poultry_request.wallet_share = int(wallet_share_percent * poultry_request.total_wage_amount) + poultry_request.other_share = int(other_share_percent * poultry_request.total_wage_amount) + poultry_request.save() + if 'payer_type' in request.data.keys() and request.data['payer_type'] is not None: + poultry_request.payer_type = request.data['payer_type'] + if request.data['payer_type'] == 'buyer': + poultry_request.payer_fullname = poultry_request.buyer['firstName'] + " " + poultry_request.buyer[ + 'lastName'] + else: + poultry_request.payer_fullname = poultry_request.poultry.user.fullname + poultry_request.save() + + mobile_sms = '' + if 'buyer_mobile' in request.data.keys() and request.data['buyer_mobile'] is not None: + poultry_request.buyer['mobile'] = request.data['buyer_mobile'] + mobile_sms = request.data['buyer_mobile'] + poultry_request.save() + if 'poultry_mobile' in request.data.keys() and request.data['poultry_mobile'] is not None: + if poultry_request.poultry.user.mobile != request.data['poultry_mobile']: + first_mobile_number = poultry_request.poultry.user.mobile + second_mobile_number = request.data['poultry_mobile'] + system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) + user = User.objects.get(id=system_user_profile.user.id) + + if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + mobile_sms = poultry_request.poultry.user.mobile + wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() + if wage_type and wage_type.status == True: + province_out_request_transaction_sms(province=poultry_request.poultry.address.province.name, + buyer=poultry_request.buyer['firstName'] + " " + poultry_request.buyer[ + 'lastName'], + poultry_name=poultry_request.poultry.user.fullname, + quantity=poultry_request.quantity, + index_weight=poultry_request.Index_weight, + wage=poultry_request.total_wage_amount, + mobile=mobile_sms, order_code=poultry_request.order_code, + date=poultry_request.send_date.date(), + amount=poultry_request.amount, + sale_type=poultry_request.free_sale_in_province) + + return Response({'result': 'با موفقیت انجام شد.'}, status=status.HTTP_201_CREATED) + + +# ویوست مربوط به تایید یا رد درخواست تایید شده شهرستان +class ProvinceCheckOperatorRequestViewSet(viewsets.ModelViewSet): + queryset = ProvinceCheckOperatorRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceCheckOperatorRequestSerializer + + # تابع مربوط به تایید یا رد درخواست تایید شده شهرستان + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + state = request.data['state'] + + try: + key = request.data['key'] + request.data.pop('key') + except: + key = None + + try: + poultry_key = request.data['poultry_key'] + request.data.pop('poultry_key') + factor_fee = request.data['factor_fee'] + real_quantity = request.data['real_quantity'] + real_weight = request.data['real_weight'] + request.data.pop('factor_fee') + request.data.pop('real_quantity') + request.data.pop('real_weight') + except: + poultry_key = None + factor_fee = None + real_quantity = None + real_weight = None + + if key != None: + + city_request = CityOperatorCheckRequest.objects.get(key=key, trash=False) + poultry_request = PoultryRequest.objects.get(id=city_request.poultry_request.id, trash=False) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + else: + poultry_request = PoultryRequest.objects.get(key=poultry_key, trash=False) + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + province_operator = ProvinceOperator.objects.get(user=user, trash=False) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + if key != None: + if ProvinceCheckOperatorRequest.objects.filter(city_request_Poultry=city_request, trash=False).exists(): + return Response({"result": "already exist"}, status=status.HTTP_403_FORBIDDEN) + check = serializer.create(validated_data=request.data) + province_fee = Pricing.objects.all() + if province_fee.count() > 0: + province_fee = province_fee.last().live_chicken_price + check.fee = province_fee + + if key != None: + check.city_request_Poultry = city_request + check.province_operator_system = province_operator + check.quantity = poultry_request.quantity + send_date = poultry_request.send_date.date() + price = Pricing.objects.filter(date__year=send_date.year, date__month=send_date.month, + date__day=send_date.day, trash=False) + if price: + check.fee = price[0].live_chicken_price + else: + check.fee = 0 + + check.poultry_request = poultry_request + check.save() + if state == 'reject': + # poultry_request.state = { + # "city_operator": city_request.city_operator_system.user.first_name + " " + city_request.city_operator_system.user.last_name, + # "city_state": "accepted", + # "city_operator_mobile": city_request.city_operator_system.user.mobile, + # "city_operator_date_time_accepted": str(city_request.create_date), + # "province_operator": user.first_name + " " + user.last_name, + # "province_operator_mobile": user.mobile, + # "province_state": "rejected", + # "province_operator_date_time_accepted": str(check.create_date), + # + # } + poultry_request.province_state = 'rejected' + poultry_request.save() + if poultry_request.kill_house_list != None and len(poultry_request.kill_house_list) > 0: + for item in poultry_request.kill_house_list: + parts = item.split("(") + name = parts[0].strip() + kill_request = KillRequest.objects.filter(kill_house__name=name, + recive_date__date=poultry_request.send_date.date(), + trash=False, poultry__isnull=True, + province_state='accepted').first() + if kill_request: + kill_request.remain_quantity_for_poultry -= poultry_request.quantity + kill_request.save() + if key != None: + city_request.province_state = 'reject' + message = UserMessage( + message="درخواست شما با کد سفارش {0} از طرف کارشناس استان {1} رد شده است ".format( + poultry_request.order_code, user.fullname), + heading="پیام سیستم ثبت شده در تاریخ {0}".format(datetime.now()), + sender=user + ) + message.save() + message.users.add(poultry_request.poultry.user) + # hatching.left_over += (poultry_request.quantity + poultry_request.losses) + hatching.losses -= poultry_request.losses + hatching.state = 'pending' + hatching.allow_hatching = 'pending' + hatching.save() + elif state == 'accept': + if poultry_key != None: + poultry_factor = ProvinceFactorToKillHouseForPoultry( + province_check_req=check, + total_weight=float(real_weight), + factor_fee=float(factor_fee), + real_weight=float(real_quantity), + out=True + + ) + poultry_factor.save() + if poultry_key != None: + if poultry_request.poultry.user_bank_info != None: + poultry_bank = BankCard.objects.get( + key=poultry_request.poultry.user_bank_info.key) + poultry_factor.bank = poultry_bank + poultry_factor.total_price = poultry_factor.total_weight * poultry_factor.factor_fee + poultry_factor.shares = { + "poultryShareWithProfit": poultry_factor.total_weight * poultry_factor.factor_fee, + } + poultry_factor.save() + poultry_factor.save() + province_factor = ProvinceFactorToKillHouse( + province_check_req=check, + total_weight=float(real_weight), + factor_fee=float(factor_fee), + real_weight=float(real_quantity), + out=True + + ) + province_factor.save() + financial_operator = ProvinceOperator.objects.filter(user__role__name='ProvinceFinancial', + address__province=poultry_request.poultry.address.province) + if financial_operator.count() > 0: + financial_operator = financial_operator.last() + if financial_operator.user_bank_info != None: + province_bank = BankCard.objects.get(id=financial_operator.user_bank_info.id, trash=False) + province_factor.bank = province_bank + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + percent = MonthlyProfitPercentage.objects.all().last() + percent = (percent.percent / 100) / percent.days + union = province_factor.total_weight * share_allocation.total + city_share = province_factor.total_weight * share_allocation.city_union + province_share = province_factor.total_weight * share_allocation.province_union + company_share = province_factor.total_weight * share_allocation.company + fanava_share = province_factor.total_weight * share_allocation.fanava + central_union_share = province_factor.total_weight * share_allocation.central_union + province_factor.total_price = (union * percent) + union + province_factor.shares = { + "unionShareWithProfit": (union * percent) + union, + "city_share": (city_share * percent) + city_share, + "province_share": (province_share * percent) + province_share, + "company_share": (company_share * percent) + company_share, + "fanava_share": (fanava_share * percent) + fanava_share, + "central_union_share": (central_union_share * percent) + central_union_share, + } + province_factor.poultry_factor = poultry_factor + province_factor.save() + + poultry_request.province_state = 'accepted' + poultry_request.save() + if key != None: + city_request.province_state = 'accept' + message = UserMessage( + message="درخواست شما با کد سفارش {0} از طرف کارشناس استان {1} تایید شده است ".format( + poultry_request.order_code, user.fullname), + heading="پیام سیستم ثبت شده در تاریخ {0}".format(datetime.now()), + sender=user + ) + message.save() + message.users.add(poultry_request.poultry.user) + if SmsLicense.objects.filter(province_approval=True).exists(): + poultry_mobile = check.poultry_request.poultry.user.mobile + order_code = check.poultry_request.order_code + # poultry_request_receive_province_accept_sms(poultry_mobile, order_code + # ) + # sms_poultry_request_receive_province_accept_sms = threading.Thread( + # target=poultry_request_receive_province_accept_sms, + # args=( + # poultry_mobile, order_code)) + # sms_poultry_request_receive_province_accept_sms.start() + + if key != None: + city_request.save() + if poultry_request.out == True: + poultry_request.final_state = 'archive' + poultry_request.save() + check_serializer = self.serializer_class(check) + + return Response(check_serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع مربوط به نمایش درخواست های تایید شده استان + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + info_dict = [] + info_list = [] + info_province_assignments_list = [] + if 'key' in request.GET: + poultry_request = PoultryRequest.objects.get(key=request.GET['key'], trash=False) + province_request = ProvinceCheckOperatorRequest.objects.filter( + city_request_Poultry__poultry_request=poultry_request, trash=False + ) + if province_request.count() > 0: + province_request = province_request.last() + send__date = province_request.city_request_Poultry.poultry_request.send_date + kill_req = KillRequest.objects.filter(recive_date__year=send__date.year, + recive_date__month=send__date.month, + recive_date__day=send__date.day, trash=False) + if kill_req: + is_car = True + else: + is_car = False + internal_dict_poultry = { + "id": province_request.city_request_Poultry.poultry_request.id, + "full_name": province_request.city_request_Poultry.poultry_request.poultry.user.fullname, + "city": province_request.city_request_Poultry.poultry_request.poultry.user.city.name, + "province": province_request.city_request_Poultry.poultry_request.poultry.user.province.name, + "mobile": province_request.city_request_Poultry.poultry_request.poultry.user.mobile, + "gis_code": province_request.city_request_Poultry.poultry_request.poultry.gis_code, + "poultry_request_quantity": province_request.city_request_Poultry.poultry_request.quantity, + "poultry_request_id": province_request.city_request_Poultry.poultry_request.id, + "poultry_request_inspector": province_request.city_request_Poultry.poultry_request.inspector, + "price": province_request.fee, + "date": province_request.city_request_Poultry.poultry_request.send_date, + "freezing": province_request.city_request_Poultry.poultry_request.freezing, + "register_date": province_request.city_request_Poultry.poultry_request.create_date, + "breed": province_request.city_request_Poultry.poultry_request.chicken_breed, + "order_code": province_request.city_request_Poultry.poultry_request.order_code, + "index_weight": province_request.city_request_Poultry.poultry_request.Index_weight, + "quantity": province_request.quantity, + "chicken_date": province_request.city_request_Poultry.poultry_request.poultry.incubation_date, + "age": ( + datetime.now() - province_request.city_request_Poultry.poultry_request.hatching.date).days, + "key": province_request.key, + "is_car": is_car, + "province_assignments": "", + "kill_house_assignments": "" + } + if 'role' in request.GET: + if request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.filter(user=user, trash=False) + if kill_house_operator.count() > 0: + kill_house_operator = kill_house_operator.last() + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request=province_request, killhouse_user__in=kill_house, trash=False) + elif request.GET['role'] == 'KillHouseVet': + vet = Vet.objects.filter(user=user, trash=False) + if vet.count() > 0: + vet = vet.last() + kill_house_vet = KillHouseVet.objects.filter(vet=vet) + kill_house_vet = kill_house_vet.last() + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request=province_request, killhouse_user=kill_house_vet.kill_house, + trash=False) + else: + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request=province_request, trash=False) + if province_kill_requests.count() > 0: + kill_house_check = None + for province_kill_request in province_kill_requests: + check = KillHouseCheckRequest.objects.filter(province_kill_request=province_kill_request) + if check.count() > 0: + kill_house_check = check.last().key + kill_house_reqs = True if KillHouseRequest.objects.filter( + province_kill_request=province_kill_request, trash=False) else False + bar = True if KillHouseAssignmentInformation.objects.filter( + kill_house_request__province_kill_request=province_kill_request, trash=False) else False + internal_dict_province_kill_request_infos = { + "province_kill_request_key": province_kill_request.key, + "automatic_state": province_kill_request.automatic, + "return_to_province": province_kill_request.return_to_province, + "kill_house_check_key": kill_house_check, + "payment_type": province_kill_request.payment_type, + "payment_dead_line": province_kill_request.payment_dead_line, + "kill_req_key": province_kill_request.kill_request.key, + "market": province_kill_request.kill_request.market, + "province_kill_request_state": province_kill_request.state, + "kill_house_key": province_kill_request.kill_request.kill_house.key, + "kill_house_name": province_kill_request.kill_request.kill_house.name, + "kill_house_user_name": province_kill_request.kill_request.kill_house.kill_house_operator.user.fullname, + "kill_house_user_city": province_kill_request.kill_request.kill_house.kill_house_operator.user.city.name, + "kill_house_mobile": province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": province_kill_request.quantity, + "main_quantity": province_kill_request.main_quantity, + "time": province_kill_request.kill_request.recive_time, + "date": province_kill_request.kill_request.recive_date, + "province_kill_request_message": province_kill_request.message, + "kill_house_requests": kill_house_reqs, + "bar_information": bar, + } + + info_province_assignments_list.append(internal_dict_province_kill_request_infos) + + internal_dict_poultry["province_assignments"] = info_province_assignments_list + elif province_kill_requests.count() == 0: + internal_dict_poultry["province_assignments"] = None + if 'role' in request.GET: + if request.GET['role'] == 'KillHouse': + + kill_house_operator = KillHouseOperator.objects.filter(user=user, trash=False) + if kill_house_operator.count() > 0: + kill_house_operator = kill_house_operator.last() + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + kill_house_requests = KillHouseRequest.objects.filter( + province_request=province_request, killhouse_user__in=kill_house, trash=False) + else: + kill_house_requests = KillHouseRequest.objects.filter( + province_request=province_request, trash=False) + if kill_house_requests.count() > 0: + for kill_house_req_obj in kill_house_requests: + internal_dict_infos = { + "kill_house_req_key": kill_house_req_obj.key, + "kill_req_key": kill_house_req_obj.kill_request.key, + "barcod": kill_house_req_obj.bar_code, + "kill_house_state": kill_house_req_obj.state, + "kill_house_name": kill_house_req_obj.kill_request.kill_house.name, + "kill_house_user_name": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.fullname, + "kill_house_user_city": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.city.name, + "kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "cars": kill_house_req_obj.car, + "show_kill_house": kill_house_req_obj.show_kill_house, + "kill_house_message": kill_house_req_obj.kill_house_message, + } + + info_list.append(internal_dict_infos) + + internal_dict_poultry["kill_house_assignments"] = info_list + elif kill_house_requests.count() == 0: + internal_dict_poultry["kill_house_assignments"] = None + return Response(internal_dict_poultry, status=status.HTTP_200_OK) + else: + return Response([], status=status.HTTP_200_OK) + + province_requests = ProvinceCheckOperatorRequest.objects.filter(state='accept', end_state='active', trash=False + ).order_by( + 'city_request_Poultry__poultry_request__send_date') + + for province_request in province_requests: + send__date = province_request.city_request_Poultry.poultry_request.send_date + kill_req = KillRequest.objects.filter(recive_date__year=send__date.year, + recive_date__month=send__date.month, recive_date__day=send__date.day, + trash=False) + if kill_req: + is_car = True + else: + is_car = False + + internal_dict_poultry = { + "id": province_request.city_request_Poultry.poultry_request.id, + "full_name": province_request.city_request_Poultry.poultry_request.user.fullname, + "city": province_request.city_request_Poultry.poultry_request.user.address.city, + "province": province_request.city_request_Poultry.poultry_request.user.address.province, + "mobile": province_request.city_request_Poultry.poultry_request.user.mobile, + "gis_code": province_request.city_request_Poultry.poultry_request.user.gis_code, + "poultry_request_quantity": province_request.city_request_Poultry.poultry_request.quantity, + "poultry_request_id": province_request.city_request_Poultry.poultry_request.id, + "poultry_request_inspector": province_request.city_request_Poultry.poultry_request.inspector, + "price": province_request.fee, + "date": province_request.city_request_Poultry.poultry_request.send_date, + "freezing": province_request.city_request_Poultry.poultry_request.freezing, + "register_date": province_request.city_request_Poultry.poultry_request.create_date, + "breed": province_request.city_request_Poultry.poultry_request.chicken_breed, + "order_code": province_request.city_request_Poultry.poultry_request.order_code, + "index_weight": province_request.city_request_Poultry.poultry_request.Index_weight, + "quantity": province_request.quantity, + "chicken_date": province_request.city_request_Poultry.poultry_request.user.incubation_date, + "age": ( + province_request.city_request_Poultry.poultry_request.send_date - province_request.city_request_Poultry.poultry_request.user.incubation_date).days + 2, + "key": province_request.key, + "is_car": is_car, + "province_assignments": "", + "Assignments": "" + } + + for province_kill_request in ProvinceKillRequest.objects.filter( + province_request=province_request, trash=False): + internal_dict_province_kill_request_infos = { + "province_kill_request_key": province_kill_request.key, + "automatic_state": province_kill_request.automatic, + "kill_req_key": province_kill_request.kill_request.key, + "market": province_kill_request.kill_request.market, + "province_kill_request_state": province_kill_request.state, + "kill_house_name": province_kill_request.kill_request.kill_house.name, + "kill_house_user_name": province_kill_request.kill_request.kill_house.user.fullname, + "kill_house_user_city": province_kill_request.kill_request.kill_house.user.address.city, + "kill_house_mobile": province_kill_request.kill_request.kill_house.user.mobile, + "quantity": province_kill_request.quantity, + "time": province_kill_request.kill_request.recive_time, + "date": province_kill_request.kill_request.recive_date, + "province_kill_request_message": province_kill_request.kill_house_message, + } + + info_province_assignments_list.append(internal_dict_province_kill_request_infos) + + internal_dict_poultry["province_assignments"] = info_province_assignments_list + + for kill_house_req_obj in KillHouseRequest.objects.filter( + province_request=province_request, trash=False): + internal_dict_infos = { + "kill_house_req_key": kill_house_req_obj.key, + "kill_req_key": kill_house_req_obj.kill_request.key, + "barcod": kill_house_req_obj.bar_code, + "kill_house_state": kill_house_req_obj.state, + "kill_house_name": kill_house_req_obj.kill_request.kill_house.name, + "kill_house_user_name": kill_house_req_obj.kill_request.kill_house.user.fullname, + "kill_house_user_city": kill_house_req_obj.kill_request.kill_house.user.address.city, + "kill_house_mobile": kill_house_req_obj.kill_request.kill_house.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "cars": kill_house_req_obj.car, + "show_kill_house": kill_house_req_obj.show_kill_house, + "kill_house_message": kill_house_req_obj.kill_house_message, + } + + info_list.append(internal_dict_infos) + + internal_dict_poultry["Assignments"] = info_list + # info_dict.update(internal_dict_poultry) + info_dict.append(internal_dict_poultry) + info_list = [] + + return Response(info_dict, status=status.HTTP_200_OK) + + +# ویوست مربوط به تایید یا رد درخواست تایید شده شهرستان +class ProvinceRequestActionViewSet(viewsets.ModelViewSet): + queryset = ProvinceRequestAction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceRequestActionSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + operator = ProvinceOperator.objects.get(user=user, trash=False) + poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key'], trash=False) + auction_list = request.data['auction_list'] + request.data.pop('poultry_request_key') + request.data.pop('auction_list') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + province_auction = serializer.create(validated_data=request.data) + province_auction.poultry_request = poultry_request + if len(auction_list) > 0: + i = 0 + for auction in auction_list: + poultry_request_auction = PoultryRequestAuction( + poultry_request=poultry_request, + pricing=Pricing.objects.all(), + fee=auction['fee'], + hour=auction['hour'] + ) + poultry_request_auction.save() + poultry_auction = PoultryRequestAuction.objects.filter(poultry_request=poultry_request, + state__in=('active', 'inactive'), + trash=False).order_by( + 'auction_date') + if poultry_auction.count() > 0: + if i == 0: + poultry_request_auction.auction_date = datetime.now() + timedelta( + hours=int(poultry_request_auction.hour)) + poultry_request_auction.state = 'active' + else: + poultry_request_auction.auction_date = poultry_auction[i - 1].auction_date + timedelta( + hours=int(poultry_request_auction.hour)) + i += 1 + poultry_request_auction.save() + + poultry_request.auction = True + poultry_request.save() + province_auction.province_operator_system = operator + province_auction.state = 'active' + province_auction.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +# ویوست مربوط به تایید یا رد اطلاعات بار وارد شده از سمت کشتارگاه +class ProvinceCheckInformationViewSet(viewsets.ModelViewSet): + queryset = ProvinceCheckInformation.objects.all() + serializer_class = ProvinceCheckInformationSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به تایید یا رد اطلاعات بار وارد شده از سمت کشتارگاه + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + + poultry_cost_wallet = 0 + city_cost_wallet = 0 + province_cost_wallet = 0 + kill_house_cost_wallet = 0 + if 'pay' in request.data.keys(): + pay = request.data['pay'] + request.data.pop('pay') + else: + if 'pay' in request.data.keys(): + request.data.pop('pay') + pay = None + + if 'reason' in request.data.keys() and request.data['reason'] != None: + reason = request.data['reason'] + request.data.pop('reason') + else: + if 'reason' in request.data.keys(): + request.data.pop('reason') + reason = None + + if 'province_input_wage' in request.data.keys() and request.data['province_input_wage'] != None: + province_input_wage = float(request.data['province_input_wage']) + request.data.pop('province_input_wage') + else: + if 'province_input_wage' in request.data.keys(): + request.data.pop('province_input_wage') + + province_input_wage = None + + if 'province_input_amount' in request.data.keys() and 'province_input_amount_state' in request.data.keys() and \ + request.data['province_input_amount'] != None and request.data['province_input_amount_state'] != None: + province_input_amount = float(request.data['province_input_amount']) + request.data.pop('province_input_amount') + province_input_amount_state = request.data['province_input_amount_state'] + request.data.pop('province_input_amount_state') + else: + if 'province_input_amount' in request.data.keys() and 'province_input_amount_state' in request.data.keys(): + request.data.pop('province_input_amount') + request.data.pop('province_input_amount_state') + + province_input_amount = None + province_input_amount_state = None + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + operator = ProvinceOperator.objects.get(user=user, trash=False) + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + # total = share_allocation.total + # else: + # total = 0 + + kill_house_info = KillHouseAssignmentInformation.objects.get(key=request.data['kill_house_info_key'], + trash=False) + request.data.pop('kill_house_info_key') + if 'bank' in request.data.keys(): + factor_person_type = request.data['bank'] + if request.data['bank'] == 'poultry': + poultry = Poultry.objects.get( + key=kill_house_info.kill_house_request.province_request.poultry_request.poultry.key, trash=False) + if poultry.user_bank_info != None: + bank = BankCard.objects.get(id=poultry.user_bank_info.id, trash=False) + else: + return Response({"result": "اطلاعات مالی مرغدار وارد نشده است"}, status=status.HTTP_403_FORBIDDEN) + elif request.data['bank'] == 'union': + if operator.user_bank_info != None: + bank = BankCard.objects.get(id=operator.user_bank_info.id, trash=False) + else: + return Response({"result": "اطلاعات مالی استان وارد نشده است"}, status=status.HTTP_403_FORBIDDEN) + request.data.pop('bank') + + if 'real_weight' in request.data.keys(): + real_weight = float(request.data['real_weight']) + request.data.pop('real_weight') + else: + real_weight = 0 + if 'fee' in request.data.keys(): + fee = request.data['fee'] + request.data.pop('fee') + else: + fee = 0 + + if kill_house_info.kill_house_request.province_kill_request != None: + province_check = kill_house_info.kill_house_check.province_kill_request.province_request + pou_req = kill_house_info.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request + else: + province_check = None + + try: + kill_house_image_without_load = request.data['kill_house_image_without_load'] + request.data.pop('kill_house_image_without_load') + except: + kill_house_image_without_load = None + + try: + kill_house_image_with_load = request.data['kill_house_image_with_load'] + request.data.pop('kill_house_image_with_load') + except: + kill_house_image_with_load = None + + try: + kill_house_car_weight_without_load = request.data['kill_house_car_weight_without_load'] + request.data.pop('kill_house_car_weight_without_load') + + except: + kill_house_car_weight_without_load = None + try: + kill_house_car_weight_with_load = request.data['kill_house_car_weight_with_load'] + request.data.pop('kill_house_car_weight_with_load') + + except: + kill_house_car_weight_with_load = None + + if KillHouseComplaint.objects.filter(bar=kill_house_info, state='pending').exists(): + return Response({"result": "can not create"}, status=status.HTTP_406_NOT_ACCEPTABLE) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + province_info = serializer.create(validated_data=request.data) + province_info.kill_house_assignment = kill_house_info + province_info.save() + if province_info.state == 'accepted': + kill_house_info.state = 'accepted' + if kill_house_image_without_load != None: + kill_house_info.car_weight_without_load_image = send_image_to_server(kill_house_image_without_load) + elif kill_house_image_with_load != None: + kill_house_info.car_weight_with_load_image = send_image_to_server(kill_house_image_with_load) + elif kill_house_car_weight_without_load != None: + kill_house_info.car_weight_without_load = kill_house_car_weight_without_load + elif kill_house_car_weight_with_load != None: + kill_house_info.car_weight_with_load = kill_house_car_weight_with_load + kill_house_info.save() + if pay == 'together': + province_info.kill_house_assignment = kill_house_info + province_info.save() + if province_check != None: + if KillHouseComplaint.objects.filter(state='accepted', bar=kill_house_info).exists(): + t_weight = kill_house_info.weight_withs_losses + else: + t_weight = kill_house_info.net_weight + + list1 = KillHouseRequest.objects.filter( + province_kill_request=kill_house_info.kill_house_request.province_kill_request) + + factor = ProvinceFactorToKillHouse( + province_check_info=province_info, + total_weight=t_weight, + factor_fee=float(fee), + factor_person_type=factor_person_type, + # factor_fee=kill_house_info.kill_house_check.province_kill_request.fee, + factor_date=kill_house_info.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request.send_date, + factor_bar_code=kill_house_info.kill_house_request.bar_code, + real_weight=real_weight, + province_check_req=kill_house_info.kill_house_check.province_kill_request.province_request, + ) + factor.save() + province_factors_count = 0 + poultry_factors_count = 0 + total_count = 0 + province_factors_counter = 0 + province_factors = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__province_kill_request=kill_house_info.kill_house_request.province_kill_request, + poultry_factor__isnull=True) + poultry_factors = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__province_kill_request=kill_house_info.kill_house_request.province_kill_request) + if province_factors.count() > 0: + province_factors_count = province_factors.count() + if poultry_factors.count() > 0: + poultry_factors_count = poultry_factors.count() + for poultry in poultry_factors: + if ProvinceFactorToKillHouse.objects.filter(poultry_factor=poultry).exists(): + province_factors_counter += 1 + if poultry_factors_count == province_factors_counter or province_factors_counter == 0: + total_count = province_factors_count + poultry_factors_count + if province_factors_counter > 0: + if poultry_factors_count > 0: + poultry_factors_count -= province_factors_counter + total_count = province_factors_count + poultry_factors_count + else: + total_count = province_factors_count + if bank != None: + factor.bank = bank + factor.save() + province_check.total_weight_at_end += factor.total_weight + province_check.save() + province_info.save() + province_kill_req = ProvinceKillRequest.objects.get( + key=kill_house_info.kill_house_check.province_kill_request.key) + + province_kill_req.fee = fee + if province_kill_req.payment_type == 'credit': + percent = MonthlyProfitPercentage.objects.all().last() + percent = (percent.percent / 100) / percent.days + total = factor.total_weight * factor.factor_fee + union = factor.total_weight * share_allocation.total + city_share = factor.total_weight * share_allocation.city_union + province_share = factor.total_weight * share_allocation.province_union + company_share = factor.total_weight * share_allocation.company + fanava_share = factor.total_weight * share_allocation.fanava + central_union_share = factor.total_weight * share_allocation.central_union + factor.total_price = ((total + union) * percent) + (total + union) + factor.shares = { + "poultryShareWithProfit": (total * percent) + total, + "unionShareWithProfit": (union * percent) + union, + "city_share": (city_share * percent) + city_share, + "province_share": (province_share * percent) + province_share, + "company_share": (company_share * percent) + company_share, + "fanava_share": (fanava_share * percent) + fanava_share, + "central_union_share": (central_union_share * percent) + central_union_share, + } + factor.save() + # factor.today_price = total + + if list1.count() > 0 and total_count > 0: + if list1.count() == total_count: + dead_line = PaymentDeadLine.objects.all().last() + province_kill_req.payment_dead_line = datetime.now().date() + timedelta( + days=dead_line.days) + else: + if province_input_wage != None: + province_share_allocation = province_input_wage + factor.province_wage = province_input_wage + else: + province_share_allocation = share_allocation.total + factor.province_wage = share_allocation.total + if province_input_amount != None: + if province_input_amount_state != None and province_input_amount_state == 'decrease': + factor.total_price = (factor.total_weight * factor.factor_fee) + ( + factor.total_weight * province_share_allocation) - province_input_amount + factor.province_input_amount_type = 'decrease' + factor.province_input_amount = province_input_amount + else: + factor.total_price = (factor.total_weight * factor.factor_fee) + ( + factor.total_weight * province_share_allocation) + province_input_amount + factor.province_input_amount_type = 'plus' + factor.province_input_amount = province_input_amount + if reason != None: + factor.reason = reason + + else: + factor.total_price = (factor.total_weight * factor.factor_fee) + ( + factor.total_weight * province_share_allocation) + kill_request_sms_payment = KillRequest.objects.filter( + key=kill_house_info.kill_house_check.province_kill_request.kill_request.key) + if kill_request_sms_payment.count() > 0: + kill_request_sms_payment = kill_request_sms_payment.last() + if kill_request_sms_payment.sms_payment == True: + factor.total_price += 50000 + factor.shares = { + "poultryShareWithProfit": factor.total_weight * factor.factor_fee, + "unionShareWithProfit": factor.total_weight * province_share_allocation, + "poultry_share": factor.total_weight * factor.factor_fee, + "city_share": 0, + "province_share": factor.total_weight * province_share_allocation, + "company_share": 0, + "fanava_share": 0, + "central_union_share": 0, + # "city_share": factor.total_weight * share_allocation.city_union, + # "province_share": factor.total_weight * share_allocation.province_union, + # "company_share": factor.total_weight * share_allocation.company, + # "fanava_share": factor.total_weight * share_allocation.fanava, + # "central_union_share": factor.total_weight * share_allocation.central_union, + } + factor.save() + + province_kill_req.save() + poultry_cost_wallet = factor.shares['poultryShareWithProfit'] + city_cost_wallet = factor.shares['city_share'] + province_cost_wallet = factor.shares['province_share'] + kill_house_cost_wallet = factor.shares['poultryShareWithProfit'] + factor.shares[ + 'unionShareWithProfit'] + + else: + factor = ProvinceFactorToKillHouse( + province_check_info=province_info, + total_weight=kill_house_info.net_weight, + factor_fee=float(fee), + # factor_fee=kill_house_info.kill_house_request.kill_house_request_auction_winner.fee, + factor_date=kill_house_info.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date, + factor_bar_code=kill_house_info.kill_house_request.bar_code, + real_weight=real_weight, + province_check_req=kill_house_info.kill_house_check.province_kill_request.province_request, + + ) + factor.save() + if bank != None: + factor.bank = bank + factor.total_price = (factor.total_weight * factor.factor_fee) + ( + factor.total_weight * share_allocation.total) + factor.save() + province_info.province_operator = operator + province_info.save() + auction_winner = KillHouseRequestActionWinner.objects.get( + key=kill_house_info.kill_house_request.kill_house_request_auction_winner.key) + auction_winner.fee = fee + auction_winner.save() + + province_factors_count = 0 + poultry_factors_count = 0 + total_count = 0 + province_factors_counter = 0 + kill_house_requests = KillHouseRequest.objects.filter( + province_kill_request__province_request__city_request_Poultry__poultry_request=kill_house_info.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request) + province_factors = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__province_kill_request__province_request__city_request_Poultry__poultry_request=kill_house_info.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request, + poultry_factor__isnull=True) + poultry_factors = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__province_kill_request__province_request__city_request_Poultry__poultry_request=kill_house_info.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request) + if province_factors.count() > 0: + province_factors_count = province_factors.count() + if poultry_factors.count() > 0: + poultry_factors_count = poultry_factors.count() + for poultry in poultry_factors: + if ProvinceFactorToKillHouse.objects.filter(poultry_factor=poultry).exists(): + province_factors_counter += 1 + if poultry_factors_count == province_factors_counter or province_factors_counter == 0: + total_count = province_factors_count + poultry_factors_count + if province_factors_counter > 0: + if poultry_factors_count > 0: + poultry_factors_count -= province_factors_counter + total_count = province_factors_count + poultry_factors_count + else: + total_count = province_factors_count + + if kill_house_requests.count() == total_count: + poultry_request = PoultryRequest.objects.get( + key=kill_house_info.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.key) + poultry_request.awaiting_payment = True + poultry_request.save() + poultry_wallet = pou_req.poultry.wallet + city_wallet = CityOperator.objects.get(key=pou_req.city_operator.key).wallet + province_wallet = operator.wallet + + poultry_transaction = Itransaction( + wallet=pou_req.poultry.wallet, + transfer_amount=poultry_cost_wallet, + transaction_type='creditor', + payment_code=kill_house_info.kill_house_request.bar_code, + file_id=pou_req.id, + ) + poultry_transaction.save() + # poultry_wallet.inventory += poultry_transaction.transfer_amount + # poultry_wallet.save() + + kill_housse_wallet = kill_house_info.kill_house_request.province_kill_request.kill_request.kill_house.kill_house_operator.wallet + kill_house_transaction = Itransaction( + wallet=kill_housse_wallet, + transfer_amount=kill_house_cost_wallet, + transaction_type='debtor', + payment_code=kill_house_info.kill_house_request.bar_code, + file_id=pou_req.id, + + ) + kill_house_transaction.save() + # kill_housse_wallet.inventory -= kill_house_transaction.transfer_amount + # kill_housse_wallet.save() + + if city_cost_wallet > 0 and province_cost_wallet > 0: + city_transaction = Itransaction( + wallet=city_wallet, + transfer_amount=city_cost_wallet, + transaction_type='creditor', + payment_code=kill_house_info.kill_house_request.bar_code, + file_id=pou_req.id, + + ) + city_transaction.save() + # city_wallet.inventory += city_transaction.transfer_amount + # city_wallet.save() + + province_transaction = Itransaction( + wallet=province_wallet, + transfer_amount=province_cost_wallet, + transaction_type='creditor', + payment_code=kill_house_info.kill_house_request.bar_code, + file_id=pou_req.id, + + ) + province_transaction.save() + # province_wallet.inventory += city_transaction.transfer_amount + # province_wallet.save() + if factor.total_price == 0: + kill_house_factor = KillHouseFactorToProvince( + province_factor=factor, + importer='ProvinceOperator', + first_payment=True, + ) + kill_house_factor.save() + factor.kill_house_factor_info = 'accepted' + factor.paid_state = 'paid' + factor.decreasing_amount = factor.total_price + + factor.save() + else: + kill_house_factor_payment = KillRequestFactorPayment.objects.filter( + kill_request_factor__kill_request=kill_house_info.kill_house_check.province_kill_request.kill_request) + + if kill_house_factor_payment.count() > 0: + kill_house_factor_payment = kill_house_factor_payment.last() + factor.kill_house_factor_payment = kill_house_factor_payment.remain_amount + factor.save() + if factor.total_price > kill_house_factor_payment.remain_amount and kill_house_factor_payment.remain_amount > 0: + factor.previous_amount = factor.total_price + factor.decreasing_amount = kill_house_factor_payment.remain_amount + factor.total_price -= kill_house_factor_payment.remain_amount + kill_house = KillHouse.objects.get( + key=kill_house_info.kill_house_check.province_kill_request.kill_request.kill_house.key) + kill_house.wallet_amount -= kill_house_factor_payment.remain_amount + kill_house.save() + kill_house_factor_payment.remain_amount = 0 + kill_house_factor_payment.save() + + else: + + kill_house_factor = KillHouseFactorToProvince( + province_factor=factor, + payment_code=kill_house_factor_payment.payment_code, + factor_image=kill_house_factor_payment.image, + importer='ProvinceOperator', + first_payment=True, + ) + kill_house_factor.save() + factor.kill_house_factor_info = 'accepted' + factor.paid_state = 'paid' + factor.decreasing_amount = factor.total_price + + factor.save() + kill_house = KillHouse.objects.get( + key=kill_house_info.kill_house_check.province_kill_request.kill_request.kill_house.key) + kill_house.wallet_amount -= factor.total_price + kill_house.save() + kill_house_factor_payment.remain_amount -= factor.total_price + kill_house_factor_payment.save() + + province_info_serializer = self.serializer_class(province_info) + return Response(province_info_serializer.data, status=status.HTTP_201_CREATED) + + else: + if province_check != None: + if KillHouseComplaint.objects.filter(state='accepted', bar=kill_house_info).exists(): + t_weight = kill_house_info.weight_withs_losses + else: + t_weight = kill_house_info.net_weight + # list1 = KillHouseRequest.objects.filter( + # province_kill_request=kill_house_info.kill_house_request.province_kill_request) + + poultry_factor = ProvinceFactorToKillHouseForPoultry( + province_check_info=province_info, + total_weight=t_weight, + factor_fee=float(fee), + # factor_fee=kill_house_info.kill_house_check.province_kill_request.fee, + factor_date=kill_house_info.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request.send_date, + factor_bar_code=kill_house_info.kill_house_request.bar_code, + real_weight=real_weight, + province_check_req=kill_house_info.kill_house_check.province_kill_request.province_request, + + ) + poultry_factor.save() + if province_check.city_request_Poultry.poultry_request.poultry.user_bank_info != None: + poultry_bank = BankCard.objects.get( + key=province_check.city_request_Poultry.poultry_request.poultry.user_bank_info.key) + poultry_factor.bank = poultry_bank + poultry_factor.save() + # province_factors_count = 0 + # poultry_factors_count = 0 + # total_count = 0 + # province_factors_counter = 0 + # province_factors = ProvinceFactorToKillHouse.objects.filter( + # province_check_info__kill_house_assignment__kill_house_request__province_kill_request=kill_house_info.kill_house_request.province_kill_request) + # # poultry_factor__isnull=True) + # poultry_factors = ProvinceFactorToKillHouseForPoultry.objects.filter( + # province_check_info__kill_house_assignment__kill_house_request__province_kill_request=kill_house_info.kill_house_request.province_kill_request) + # if province_factors.count() > 0: + # province_factors_count = province_factors.count() + # if poultry_factors.count() > 0: + # poultry_factors_count = poultry_factors.count() + # for poultry in poultry_factors: + # if ProvinceFactorToKillHouse.objects.filter(poultry_factor=poultry).exists(): + # province_factors_counter += 1 + # + # if poultry_factors_count == province_factors_counter or province_factors_counter == 0: + # if poultry_factors_count == province_factors_counter and poultry_factors_count != 0: + # if province_factors_count == province_factors_counter: + # total_count = poultry_factors_count + # elif province_factors_count > province_factors_counter: + # total_count = poultry_factors_count + ( + # province_factors_count - province_factors_counter) + # total_count = province_factors_count + poultry_factors_count + # if province_factors_counter > 0: + # if poultry_factors_count > 0: + # poultry_factors_count -= province_factors_counter + # total_count = province_factors_count + poultry_factors_count + # else: + # total_count = province_factors_count + + province_kill_req = ProvinceKillRequest.objects.get( + key=kill_house_info.kill_house_check.province_kill_request.key) + + if province_kill_req.payment_type == 'credit': + percent = MonthlyProfitPercentage.objects.all().last() + percent = (percent.percent / 100) / percent.days + total = poultry_factor.total_weight * poultry_factor.factor_fee + poultry_factor.total_price = (total * percent) + total + poultry_factor.shares = { + "poultryShareWithProfit": (total * percent) + total, + } + poultry_factor.save() + + # if list1.count() > 0 and total_count > 0: + # if list1.count() == total_count: + if province_kill_req.payment_dead_line == None: + dead_line = PaymentDeadLine.objects.all().last() + province_kill_req.payment_dead_line = datetime.now().date() + timedelta( + days=dead_line.days) + else: + poultry_factor.total_price = (poultry_factor.total_weight * poultry_factor.factor_fee) + poultry_factor.shares = { + "poultryShareWithProfit": poultry_factor.total_weight * poultry_factor.factor_fee, + } + poultry_factor.save() + province_check.save() + province_info.save() + poultry_cost_wallet = poultry_factor.shares['poultryShareWithProfit'] + kill_house_cost_wallet = poultry_factor.shares['poultryShareWithProfit'] + if share_allocation.total != 0: + if KillHouseComplaint.objects.filter(state='accepted', bar=kill_house_info).exists(): + t_weight = kill_house_info.weight_withs_losses + else: + t_weight = kill_house_info.net_weight + factor = ProvinceFactorToKillHouse( + province_check_info=province_info, + total_weight=t_weight, + factor_fee=float(fee), + # factor_fee=kill_house_info.kill_house_check.province_kill_request.fee, + factor_date=kill_house_info.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request.send_date, + factor_bar_code=kill_house_info.kill_house_request.bar_code, + real_weight=real_weight, + province_check_req=kill_house_info.kill_house_check.province_kill_request.province_request, + ) + factor.save() + # province_factors_count = 0 + # poultry_factors_count = 0 + # total_count = 0 + # province_factors_counter = 0 + # province_factors = ProvinceFactorToKillHouse.objects.filter( + # province_check_info__kill_house_assignment__kill_house_request__province_kill_request=kill_house_info.kill_house_request.province_kill_request) + # # poultry_factor__isnull=True) + # poultry_factors = ProvinceFactorToKillHouseForPoultry.objects.filter( + # province_check_info__kill_house_assignment__kill_house_request__province_kill_request=kill_house_info.kill_house_request.province_kill_request) + # if province_factors.count() > 0: + # province_factors_count = province_factors.count() + # if poultry_factors.count() > 0: + # poultry_factors_count = poultry_factors.count() + # for poultry in poultry_factors: + # if ProvinceFactorToKillHouse.objects.filter(poultry_factor=poultry).exists(): + # province_factors_counter += 1 + # if poultry_factors_count == province_factors_counter or province_factors_counter == 0: + # if poultry_factors_count == province_factors_counter and poultry_factors_count != 0: + # if province_factors_count == province_factors_counter: + # total_count = poultry_factors_count + # elif province_factors_count > province_factors_counter: + # total_count = poultry_factors_count + ( + # province_factors_count - province_factors_counter) + + # total_count = province_factors_count + poultry_factors_count + # if province_factors_counter > 0: + # if poultry_factors_count > 0: + # poultry_factors_count -= province_factors_counter + # total_count = province_factors_count + poultry_factors_count + # else: + # total_count = province_factors_count + + if bank != None: + factor.bank = bank + factor.save() + province_check.total_weight_at_end += factor.total_weight + province_check.save() + province_info.save() + province_kill_req = ProvinceKillRequest.objects.get( + key=kill_house_info.kill_house_check.province_kill_request.key) + province_kill_req.fee = fee + if province_kill_req.payment_type == 'credit': + percent = MonthlyProfitPercentage.objects.all().last() + percent = (percent.percent / 100) / percent.days + union = factor.total_weight * share_allocation.total + city_share = factor.total_weight * share_allocation.city_union + province_share = factor.total_weight * share_allocation.province_union + company_share = factor.total_weight * share_allocation.company + fanava_share = factor.total_weight * share_allocation.fanava + central_union_share = factor.total_weight * share_allocation.central_union + factor.total_price = (union * percent) + union + factor.shares = { + "unionShareWithProfit": (union * percent) + union, + "city_share": (city_share * percent) + city_share, + "province_share": (province_share * percent) + province_share, + "company_share": (company_share * percent) + company_share, + "fanava_share": (fanava_share * percent) + fanava_share, + "central_union_share": (central_union_share * percent) + central_union_share, + } + factor.poultry_factor = poultry_factor + factor.save() + # factor.today_price = total + + + # if list1.count() > 0 and total_count > 0: + # if list1.count() == total_count: + if province_kill_req.payment_dead_line == None: + dead_line = PaymentDeadLine.objects.all().last() + province_kill_req.payment_dead_line = datetime.now().date() + timedelta( + days=dead_line.days) + else: + factor.total_price = factor.total_weight * share_allocation.total + factor.shares = { + "unionShareWithProfit": factor.total_weight * share_allocation.total, + "city_share": factor.total_weight * share_allocation.city_union, + "province_share": factor.total_weight * share_allocation.province_union, + "company_share": factor.total_weight * share_allocation.company, + "fanava_share": factor.total_weight * share_allocation.fanava, + "central_union_share": factor.total_weight * share_allocation.central_union, + } + factor.poultry_factor = poultry_factor + factor.save() + kill_house_cost_wallet += factor.shares['unionShareWithProfit'] + city_cost_wallet = factor.shares['city_share'] + province_cost_wallet = factor.shares['province_share'] + province_info.save() + province_kill_req.save() + + else: + factor = ProvinceFactorToKillHouse( + province_check_info=province_info, + total_weight=kill_house_info.net_weight, + factor_fee=float(fee), + # factor_fee=kill_house_info.kill_house_request.kill_house_request_auction_winner.fee, + factor_date=kill_house_info.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date, + factor_bar_code=kill_house_info.kill_house_request.bar_code, + real_weight=real_weight, + + ) + factor.save() + if bank != None: + factor.bank = bank + factor.total_price = (factor.total_weight * factor.factor_fee) + ( + factor.total_weight * share_allocation.total) + factor.save() + province_info.province_operator = operator + province_info.save() + auction_winner = KillHouseRequestActionWinner.objects.get( + key=kill_house_info.kill_house_request.kill_house_request_auction_winner.key) + auction_winner.fee = fee + auction_winner.save() + + province_factors_count = 0 + poultry_factors_count = 0 + total_count = 0 + province_factors_counter = 0 + kill_house_requests = KillHouseRequest.objects.filter( + province_kill_request__province_request__city_request_Poultry__poultry_request=kill_house_info.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request) + province_factors = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__province_kill_request__province_request__city_request_Poultry__poultry_request=kill_house_info.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request, + poultry_factor__isnull=True) + poultry_factors = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__province_kill_request__province_request__city_request_Poultry__poultry_request=kill_house_info.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request) + if province_factors.count() > 0: + province_factors_count = province_factors.count() + if poultry_factors.count() > 0: + poultry_factors_count = poultry_factors.count() + for poultry in poultry_factors: + if ProvinceFactorToKillHouse.objects.filter(poultry_factor=poultry).exists(): + province_factors_counter += 1 + if poultry_factors_count == province_factors_counter or province_factors_counter == 0: + total_count = province_factors_count + poultry_factors_count + if province_factors_counter > 0: + if poultry_factors_count > 0: + poultry_factors_count -= province_factors_counter + total_count = province_factors_count + poultry_factors_count + else: + total_count = province_factors_count + + if kill_house_requests.count() == total_count: + poultry_request = PoultryRequest.objects.get( + key=kill_house_info.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.key) + poultry_request.awaiting_payment = True + poultry_request.save() + poultry_wallet = pou_req.poultry.wallet + city_wallet = CityOperator.objects.get(key=pou_req.city_operator.key).wallet + province_wallet = operator.wallet + + poultry_transaction = Itransaction( + wallet=pou_req.poultry.wallet, + transfer_amount=poultry_cost_wallet, + transaction_type='creditor', + payment_code=kill_house_info.kill_house_request.bar_code, + file_id=pou_req.id, + + ) + poultry_transaction.save() + # poultry_wallet.inventory += poultry_transaction.transfer_amount + # poultry_wallet.save() + + kill_housse_wallet = kill_house_info.kill_house_request.province_kill_request.kill_request.kill_house.kill_house_operator.wallet + kill_house_transaction = Itransaction( + wallet=kill_housse_wallet, + transfer_amount=kill_house_cost_wallet, + transaction_type='debtor', + payment_code=kill_house_info.kill_house_request.bar_code, + file_id=pou_req.id, + + ) + kill_house_transaction.save() + # kill_housse_wallet.inventory -= kill_house_transaction.transfer_amount + # kill_housse_wallet.save() + + if city_cost_wallet > 0 and province_cost_wallet > 0: + city_transaction = Itransaction( + wallet=city_wallet, + transfer_amount=city_cost_wallet, + transaction_type='creditor', + payment_code=kill_house_info.kill_house_request.bar_code, + file_id=pou_req.id, + + ) + city_transaction.save() + # city_wallet.inventory += city_transaction.transfer_amount + # city_wallet.save() + + province_transaction = Itransaction( + wallet=province_wallet, + transfer_amount=province_cost_wallet, + transaction_type='creditor', + payment_code=kill_house_info.kill_house_request.bar_code, + file_id=pou_req.id, + + ) + province_transaction.save() + # province_wallet.inventory += city_transaction.transfer_amount + # province_wallet.save() + + province_info_serializer = self.serializer_class(province_info) + return Response(province_info_serializer.data, status=status.HTTP_201_CREATED) + + + + elif province_info.state == 'rejected': + kill_house_info.state = 'rejected' + kill_house_info.message = province_info.message + kill_house_info.save() + # province_check.save() + province_info.province_operator = operator + province_info.save() + province_info_serializer = self.serializer_class(province_info) + return Response(province_info_serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع مربوط به نمایش اطلاعات بار وارد شده از سمت کشتارگاه + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + province_operator = UserProfile.objects.get(user=request.user, trash=False) + # info_dict = {} + info_dict = [] + info_list = [] + province_requests = ProvinceCheckOperatorRequest.objects.filter(state='accept', end_state='active', trash=False) + + for province_request in province_requests: + internal_dict_poultry = { + "id": province_request.city_request_Poultry.poultry_request.id, + "full_name": province_request.city_request_Poultry.poultry_request.user.fullname, + "mobile": province_request.city_request_Poultry.poultry_request.user.mobile, + "poultry_request_quantity": province_request.city_request_Poultry.poultry_request.quantity, + "price": province_request.fee, + "date": province_request.city_request_Poultry.poultry_request.send_date, + "breed": province_request.city_request_Poultry.poultry_request.chicken_breed, + "order_code": province_request.city_request_Poultry.poultry_request.order_code, + "informations": "" + } + for kill_house_req_obj in KillHouseRequest.objects.filter(state='accepted', active_state='active', + province_request=province_request, trash=False): + province_req = kill_house_req_obj.province_request + + kill_house_assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_check__province_kill_request__province_request=province_req, trash=False) + # poultry_assignment = PoultryAssignmentInformation.objects.filter( + # kill_house_check_poultry__kill_house_request__bar_code=kill_house_req_obj.bar_code) + if kill_house_assignment: + # return Response (kill_house_assignment[0].car_weight_without_load) + internal_dict_infos = { + "barcod": kill_house_req_obj.bar_code, + "kill_house_state": kill_house_req_obj.state, + "kill_house_name": kill_house_req_obj.kill_request.kill_house.name, + "kill_house_user_name": kill_house_req_obj.kill_request.kill_house.user.fullname, + "kill_house_mobile": kill_house_req_obj.kill_request.kill_house.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "cars": kill_house_req_obj.car, + "kill_house_assigment_key": kill_house_assignment[0].key, + "kill_house_assigment_state": kill_house_assignment[0].state, + "kill_house_weight_without_load": kill_house_assignment[0].car_weight_without_load, + "kill_house_weight_with_load": kill_house_assignment[0].car_weight_with_load, + "kill_house_image_without_load": kill_house_assignment[0].car_weight_without_load_image, + "kill_house_image_with_load": kill_house_assignment[0].car_weight_with_load_image, + "kill_house_net_weight": kill_house_assignment[0].net_weight, + } + if kill_house_assignment[0].state == 'accepted': + province_check_info = ProvinceCheckInformation.objects.get( + kill_house_assignment=kill_house_assignment[0], + state='accepted', trash=False) + internal_dict_infos.update({"province_operator": province_operator.fullname, + "date_of_registration": province_check_info.create_date}) + + info_list.append(internal_dict_infos) + + if not kill_house_assignment: + internal_dict_infos = { + "barcod": kill_house_req_obj.bar_code, + "kill_house_state": kill_house_req_obj.state, + "kill_house_name": kill_house_req_obj.kill_request.kill_house.name, + "kill_house_user_name": kill_house_req_obj.kill_request.kill_house.user.fullname, + "kill_house_mobile": kill_house_req_obj.kill_request.kill_house.user.mobile, + "quantity": kill_house_req_obj.quantity, + "time": kill_house_req_obj.kill_request.recive_time, + "date": kill_house_req_obj.kill_request.recive_date, + "cars": kill_house_req_obj.car, + "kill_house_assigment_key": "", + "poultry_assigment_key": "", + "kill_house_weight_without_load": "", + "kill_house_weight_with_load": "", + "poultry_weight_without_load": "", + "poultry_weight_with_load": "", + "kill_house_image_without_load": "", + "kill_house_image_with_load": "", + "poultry_image_without_load": "", + "poultry_image_with_load": "", + "kill_house_net_weight": "", + "poultry_net_weight": "" + } + info_list.append(internal_dict_infos) + + internal_dict_poultry["informations"] = info_list + info_dict.append(internal_dict_poultry) + info_list = [] + + return Response(info_dict, status=status.HTTP_200_OK) + + +class ProvinceFactorToKillHouseForPoultryViewSet(viewsets.ModelViewSet): + queryset = ProvinceFactorToKillHouseForPoultry.objects.all() + serializer_class = ProvinceFactorToKillHouseForPoultrySerializer + permission_classes = [TokenHasReadWriteScope] + + +# ویوست مربوط به فاکتور استان برای کشتارگاه +class ProvinceFactorToKillHouseViewSet(viewsets.ModelViewSet): + queryset = ProvinceFactorToKillHouse.objects.all() + serializer_class = ProvinceFactorToKillHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به نمایش فاکتور استان برای کشتارگاه + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + + if 'role' in request.GET: + if request.GET['role'] == 'KillHouse': + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + factors = [] + operator = KillHouseOperator.objects.get(user=user) + kill_house = KillHouse.objects.filter(kill_house_operator=operator) + factor_list = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__killhouse_user__in=kill_house) + factors = [ + factor for factor in factor_list + if date1 <= factor.province_check_req.poultry_request.send_date.date() <= date2 + ] + factor_serializer = self.serializer_class(factors, many=True) + return Response(factor_serializer.data, status=status.HTTP_200_OK) + elif request.GET['role'] == 'ProvinceFinancial': + factors = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__killhouse_user__system_address__province=user.province, + paid_state='pending') + factor_serializer = self.serializer_class(factors, many=True) + return Response(factor_serializer.data, status=status.HTTP_200_OK) + + elif request.GET['role'] == 'ProvinceOperator': + + factors = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__killhouse_user__system_address__province=user.province, + paid_state='pending') + factor_serializer = self.serializer_class(factors, many=True) + return Response(factor_serializer.data, status=status.HTTP_200_OK) + + + elif request.GET['role'] == 'CityOperator': + factors = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__killhouse_user__system_address__city=user.city, + paid_state='pending') + factor_serializer = self.serializer_class(factors, many=True) + return Response(factor_serializer.data, status=status.HTTP_200_OK) + + elif request.GET['role'] == 'Poultry': + + factors = ProvinceFactorToKillHouse.objects.filter( + province_check_req__poultry_request__poultry__user=user, + paid_state='pending', trash=False) + factor_serializer = self.serializer_class(factors, many=True) + return Response(factor_serializer.data, status=status.HTTP_200_OK) + + if request.GET['type'] == 'kill_house': + key = request.GET['key'] + # user = UserProfile.objects.get(user=request.user) + # # kill_house = KillHouse.objects.get(user=user) + # # factor_dict_list = [] + factor_list = [] + provinc_factor_to_kill_house = ProvinceFactorToKillHouse.objects.get( + province_check_info__kill_house_assignment__key=key, trash=False) + kill_house_factor = KillHouseFactorToProvince.objects.filter( + province_factor=provinc_factor_to_kill_house, trash=False) + internal_dict_factors = { + "full_name": provinc_factor_to_kill_house.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request.user.fullname, + "mobile": provinc_factor_to_kill_house.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request.user.mobile, + "weight": provinc_factor_to_kill_house.total_weight, + "bar_code": provinc_factor_to_kill_house.factor_bar_code, + "date": provinc_factor_to_kill_house.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request.send_date, + "gis_code": provinc_factor_to_kill_house.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request.user.gis_code, + "fee": provinc_factor_to_kill_house.factor_fee, + "total_amount": provinc_factor_to_kill_house.total_price, + "total_amount_char": words(provinc_factor_to_kill_house.total_price) + " " + "ریال", + "bank": provinc_factor_to_kill_house.bank, + "key": provinc_factor_to_kill_house.key, + + } + if kill_house_factor: + internal_dict_factors.update({ + "payment_code": kill_house_factor[0].payment_code, + "factor_image": kill_house_factor[0].factor_image, + "kill_house_factor_state": kill_house_factor[0].state, + + }) + if not kill_house_factor: + internal_dict_factors.update({ + "payment_code": None, + "factor_image": None, + "kill_house_factor_state": None, + + }) + + factor_list.append(internal_dict_factors) + + return Response(factor_list, status=status.HTTP_200_OK) + + if request.GET['type'] == 'province': + + factor_dict_list = [] + factor_list = [] + for province_check in ProvinceCheckOperatorRequest.objects.filter(state='accept', + financial_archive='pending', trash=False): + poultry_req = province_check.city_request_Poultry.poultry_request + internal_dict_poultry = {"full_name": poultry_req.user.fullname, "mobile": poultry_req.user.mobile, + "gis_code": poultry_req.user.gis_code, + "poultry_request_id": poultry_req.id, + "date": poultry_req.send_date, + "weight": province_check.total_weight_at_end, + "price": province_check.fee, + "breed": poultry_req.chicken_breed, + "inspector": poultry_req.inspector, + "order_code": poultry_req.order_code, "factors": ""} + + for provinc_factor_to_kill_house in ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_check__province_kill_request__province_request=province_check, + trash=False): + + internal_dict_factors = { + "province_operator": provinc_factor_to_kill_house.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator.fullname, + "province_mobile": provinc_factor_to_kill_house.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator.mobile, + "weight": provinc_factor_to_kill_house.total_weight, + "bar_code": provinc_factor_to_kill_house.factor_bar_code, + "kill_house_name": provinc_factor_to_kill_house.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, + "kill_house_mobile": provinc_factor_to_kill_house.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.user.mobile, + "cost": provinc_factor_to_kill_house.total_price, + "bank": provinc_factor_to_kill_house.bank, + "factor": provinc_factor_to_kill_house.bank, + } + kill_house_factor = KillHouseFactorToProvince.objects.filter( + province_factor=provinc_factor_to_kill_house) + if kill_house_factor: + internal_dict_factors.update({ + "kill_house_Send_factor_information": "accepted", + "payment_code": kill_house_factor[0].payment_code, + "factor_image": kill_house_factor[0].factor_image, + "factor_key": kill_house_factor[0].key, + "factor_state": kill_house_factor[0].state + }) + else: + internal_dict_factors.update({ + "kill_house_Send_factor_information": "pending", + "payment_code": "", + "factor_image": "", + "factor_key": "", + "factor_state": "" + }) + + factor_list.append(internal_dict_factors) + internal_dict_poultry["factors"] = factor_list + factor_dict_list.append(internal_dict_poultry) + factor_list = [] + + return Response(factor_dict_list, status=status.HTTP_200_OK) + + +class KillHouseFactorToPoultryViewSet(viewsets.ModelViewSet): + queryset = KillHouseFactorToPoultry.objects.all() + serializer_class = KillHouseFactorToPoultrySerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ایجاد فاکتور کشتارگاه برای استان + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + + role = request.data['role'] + province_factor = ProvinceFactorToKillHouseForPoultry.objects.get(key=request.data['key'], trash=False) + request.data.pop('key') + request.data.pop('role') + try: + factor_image = request.data['factor_image'] + request.data.pop('factor_image') + except: + factor_image = None + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + factor = serializer.create(validated_data=request.data) + if factor_image != None: + factor.factor_image = send_image_to_server(factor_image) + + factor.province_factor = province_factor + factor.importer = role + factor.save() + province_factor.kill_house_factor_info = 'accepted' + province_factor.paid_state = 'paid' + province_factor.save() + factor_serializer = self.serializer_class(factor) + return Response(factor_serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + role = request.data['role'] + kill_house_factor = KillHouseFactorToPoultry.objects.get(key=request.data['key'], trash=False) + request.data.pop('key') + request.data.pop('role') + try: + image = request.data['factor_image'] + request.data.pop('factor_image') + except: + image = None + if image != None: + kill_house_factor.factor_image = send_image_to_server(image) + kill_house_factor.state = 'pending' + kill_house_factor.importer = role + kill_house_factor.save() + + serializer = self.serializer_class(kill_house_factor) + serializer.update(instance=kill_house_factor, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به فاکتور کشتارگاه برای استان +class KillHouseFactorToProvinceViewSet(viewsets.ModelViewSet): + queryset = KillHouseFactorToProvince.objects.all() + serializer_class = KillHouseFactorToProvinceSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ایجاد فاکتور کشتارگاه برای استان + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + role = request.data['role'] + province_factor = ProvinceFactorToKillHouse.objects.get(key=request.data['key'], trash=False) + request.data.pop('key') + request.data.pop('role') + try: + factor_image = request.data['factor_image'] + request.data.pop('factor_image') + except: + factor_image = None + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + factor = serializer.create(validated_data=request.data) + if factor_image != None: + factor.factor_image = send_image_to_server(factor_image) + + factor.province_factor = province_factor + factor.importer = role + factor.save() + province_factor.kill_house_factor_info = 'accepted' + province_factor.paid_state = 'paid' + province_factor.save() + factor_serializer = self.serializer_class(factor) + return Response(factor_serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + role = request.data['role'] + kill_house_factor = KillHouseFactorToProvince.objects.get(key=request.data['key'], trash=False) + request.data.pop('key') + request.data.pop('role') + try: + image = request.data['factor_image'] + request.data.pop('factor_image') + except: + image = None + if image != None: + kill_house_factor.factor_image = send_image_to_server(image) + kill_house_factor.state = 'pending' + kill_house_factor.message = None + kill_house_factor.importer = role + kill_house_factor.save() + + serializer = self.serializer_class(kill_house_factor) + serializer.update(instance=kill_house_factor, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + if 'role' in request.GET: + if request.GET['role'] == 'KillHouse': + now = datetime.now().date() + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator) + factor_list = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__killhouse_user__in=kill_house) + + factors = [ + factor for factor in factor_list + if date1 <= factor.modify_date.date() <= date2 + ] + + + elif request.GET['role'] == 'ProvinceFinancial': + factors = KillHouseFactorToProvince.objects.filter(state__in=('pending', 'accepted'), + province_factor__province_check_info__kill_house_assignment__kill_house_request__killhouse_user__system_address__province=user.province) + serializer = self.serializer_class(factors, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProvinceImportKillHouseOutFactorsViewSet(viewsets.ModelViewSet): + queryset = ProvinceImportKillHouseOutFactors.objects.all() + serializer_class = ProvinceImportKillHouseOutFactorsSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ایجاد فاکتور کشتارگاه برای استان + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + if 'poultry_factor_key' in request.data.keys(): + poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.get(key=request.data['poultry_factor_key']) + request.data.pop('poultry_factor_key') + province_check_request = ProvinceCheckOperatorRequest.objects.get(key=poultry_factor.province_check_req.key) + else: + poultry_factor = None + + if 'province_factor_key' in request.data.keys(): + province_factor = ProvinceFactorToKillHouse.objects.get(key=request.data['province_factor_key']) + request.data.pop('province_factor_key') + province_check_request = ProvinceCheckOperatorRequest.objects.get( + key=province_factor.province_check_req.key) + + else: + province_factor = None + image = request.data['image'] + request.data.pop('image') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + payment_factor = serializer.create(validated_data=request.data) + payment_factor.province_check = province_check_request + payment_factor.image = send_image_to_server(image) + if poultry_factor != None: + payment_factor.kill_house_factor_poultry = poultry_factor + poultry_factor.paid_state = 'paid' + poultry_factor.save() + else: + payment_factor.kill_house_factor = province_factor + province_factor.paid_state = 'paid' + province_factor.save() + + payment_factor.save() + deposit_allocation = DepositAllocation.objects.filter(poultry=province_check_request.poultry_request) + if deposit_allocation.count() > 0: + deposit_allocation = deposit_allocation.last() + if poultry_factor != None: + deposit_allocation.poultry_share += poultry_factor.shares['poultryShareWithProfit'] + else: + deposit_allocation.city_share += province_factor.shares['city_share'] + deposit_allocation.province_share += province_factor.shares['province_share'] + deposit_allocation.company_share += province_factor.shares['company_share'] + deposit_allocation.central_union_share += province_factor.shares['central_union_share'] + deposit_allocation.fanava_share += province_factor.shares['fanava_share'] + deposit_allocation.save() + else: + + if poultry_factor != None: + + deposit_allocation = DepositAllocation(poultry=province_check_request.poultry_request, + poultry_share=poultry_factor.shares[ + 'poultryShareWithProfit'], + ) + deposit_allocation.save() + + else: + deposit_allocation = DepositAllocation(poultry=province_check_request.poultry_request, + city_share=province_factor.shares['city_share'], + province_share=province_factor.shares['province_share'], + company_share=province_factor.shares['company_share'], + central_union_share=province_factor.shares[ + 'central_union_share'], + fanava_share=province_factor.shares['fanava_share'], + ) + + deposit_allocation.save() + province_factors = ProvinceFactorToKillHouse.objects.filter( + province_check_req=province_check_request).count() + poultry_factors = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_req=province_check_request).count() + out_factors = ProvinceImportKillHouseOutFactors.objects.filter( + province_check=province_check_request).count() + if out_factors == province_factors + poultry_factors: + poultry_request = PoultryRequest.objects.get(key=province_check_request.poultry_request.key) + poultry_request.final_state = 'archive' + poultry_request.save() + + factor_serializer = self.serializer_class(payment_factor) + return Response(factor_serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +# ویوست مربوط به تایید یا رذ فاکتورهای ارسالی از سمت کشتارگاه +class ProvinceCheckKillHouseFactorViewSet(viewsets.ModelViewSet): + queryset = ProvinceCheckKillHouseFactor.objects.all() + serializer_class = ProvinceCheckKillHouseFactorSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به تایید یا رذ فاکتورهای ارسالی از سمت کشتارگاه + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + kill_house_factor = None + kill_house_poultry_factor = None + if request.data['type'] == 'province': + kill_house_factor = KillHouseFactorToProvince.objects.get(key=request.data['key'], trash=False) + request.data.pop('key') + request.data.pop('type') + + else: + kill_house_poultry_factor = KillHouseFactorToPoultry.objects.get(key=request.data['key']) + request.data.pop('key') + request.data.pop('type') + + if kill_house_factor != None: + if kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner != None: + auction = kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner + poultry_request = kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.poultry_request + else: + auction = None + if auction == None: + if kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request != None: + province_check = kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request + poultry_request = kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request + else: + if kill_house_poultry_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner != None: + auction = kill_house_poultry_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner + poultry_request = kill_house_poultry_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.poultry_request + else: + auction = None + if auction == None: + if kill_house_poultry_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request != None: + province_check = kill_house_poultry_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request + poultry_request = kill_house_poultry_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.city_request_Poultry.poultry_request + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + check = serializer.create(validated_data=request.data) + if check.state == 'accepted': + + if kill_house_factor != None: + check.kill_house_factor = kill_house_factor + kill_house_factor.state = 'accepted' + kill_house_factor.save() + else: + check.kill_house_factor_poultry = kill_house_poultry_factor + kill_house_poultry_factor.state = 'accepted' + kill_house_poultry_factor.save() + + if auction != None: + kill_house_factors = KillHouseFactorToProvince.objects.filter(state='accepted', + province_factor__province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + trash=False) + kill_house_poultry_factors = KillHouseFactorToPoultry.objects.filter(state='accepted', + province_factor__province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + trash=False) + # kill_house_requests = KillHouseRequest.objects.filter( + # kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + # state='accepted', + # active_state='inactive', trash=False) + else: + kill_house_factors = KillHouseFactorToProvince.objects.filter(state='accepted', + province_factor__province_check_info__kill_house_assignment__kill_house_check__province_kill_request__province_request=province_check, + trash=False, + province_factor__sum_state='pending') + kill_house_poultry_factors = KillHouseFactorToPoultry.objects.filter(state='accepted', + province_factor__province_check_info__kill_house_assignment__kill_house_check__province_kill_request__province_request=province_check, + trash=False, + province_factor__sum_state='pending') + # kill_house_requests = KillHouseRequest.objects.filter(province_request=province_check, + # state='accepted', + # active_state='inactive', trash=False) + + # kill_house_requests_counter = len(kill_house_requests) + # kill_house_factors_counter = len(kill_house_factors) + # if kill_house_factors_counter == kill_house_requests_counter: + total_amount = 0 + total_weight = 0 + poultry_share = 0 + city_share = 0 + province_share = 0 + company_share = 0 + central_union_share = 0 + fanava_share = 0 + if kill_house_factor != None: + for factor in kill_house_factors: + total_amount += factor.province_factor.total_price + total_weight += factor.province_factor.total_weight + if 'poultryShareWithProfit' in factor.province_factor.shares: + poultry_share += factor.province_factor.shares['poultryShareWithProfit'] + else: + poultry_share = 0 + city_share += factor.province_factor.shares['city_share'] + province_share += factor.province_factor.shares['province_share'] + company_share += factor.province_factor.shares['company_share'] + central_union_share += factor.province_factor.shares['central_union_share'] + fanava_share += factor.province_factor.shares['fanava_share'] + f = ProvinceFactorToKillHouse.objects.get(key=factor.province_factor.key) + f.sum_state = 'complete' + f.save() + + deposit_allocation = DepositAllocation.objects.filter(poultry=poultry_request) + if deposit_allocation.count() > 0: + deposit_allocation = deposit_allocation.last() + deposit_allocation.poultry_share += poultry_share + deposit_allocation.city_share += city_share + deposit_allocation.province_share += province_share + deposit_allocation.company_share += company_share + deposit_allocation.central_union_share += central_union_share + deposit_allocation.fanava_share += fanava_share + deposit_allocation.save() + else: + + deposit_allocation = DepositAllocation(poultry=poultry_request, + poultry_share=poultry_share, + city_share=city_share, + province_share=province_share, + company_share=company_share, + central_union_share=central_union_share, + fanava_share=fanava_share, + ) + + deposit_allocation.save() + else: + + for factor in kill_house_poultry_factors: + total_amount += factor.province_factor.total_price + total_weight += factor.province_factor.total_weight + poultry_share += factor.province_factor.total_price + # poultry_share += factor.province_factor.shares['poultryShareWithProfit'] + fa = ProvinceFactorToKillHouseForPoultry.objects.get(key=factor.province_factor.key) + fa.sum_state = 'complete' + fa.save() + deposit_allocation = DepositAllocation.objects.filter(poultry=poultry_request) + if deposit_allocation.count() > 0: + deposit_allocation = deposit_allocation.last() + deposit_allocation.poultry_share += poultry_share + deposit_allocation.poultry_share_payment += poultry_share + deposit_allocation.save() + else: + + deposit_allocation = DepositAllocation(poultry=poultry_request, + poultry_share=poultry_share, + poultry_share_payment=poultry_share + ) + + deposit_allocation.save() + + if auction == None: + if province_check != None: + province_check.total_cost_at_end = total_amount + province_check.factor_state = 'accepted' + # province_check.financial_archive = 'accepted' + province_check.save() + # poultry_request.inspector = 'pending' + # poultry_request.save() + + province_factor_to_kill_house = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_check__province_kill_request__province_request__city_request_Poultry__poultry_request=deposit_allocation.poultry, + trash=False) + province_factor_to_kill_house_poultry = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_check__province_kill_request__province_request__city_request_Poultry__poultry_request=deposit_allocation.poultry, + trash=False) + + kill_house_requests = KillHouseRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=deposit_allocation.poultry, + state='accepted', + active_state='inactive', trash=False) + + # total = 0 + # if province_factor_to_kill_house.count() > 0: + # for factor in province_factor_to_kill_house: + # total += factor.total_price + # if province_factor_to_kill_house_poultry.count() > 0: + # for poultry_factor in province_factor_to_kill_house_poultry: + # total += poultry_factor.total_price + # deposit_total = deposit_allocation.poultry_share_payment + deposit_allocation.city_share_payment + deposit_allocation.province_share_payment + deposit_allocation.company_share_payment + deposit_allocation.central_union_share_payment + deposit_allocation.fanava_share_payment + # + # if total == deposit_total: + counter = 0 + if province_factor_to_kill_house.count() > 0: + counter = province_factor_to_kill_house.count() + for po_factor in province_factor_to_kill_house_poultry: + if ProvinceFactorToKillHouse.objects.filter(poultry_factor=po_factor).exists(): + continue + else: + counter += 1 + if counter == kill_house_requests.count(): + poultry_request = PoultryRequest.objects.get(key=deposit_allocation.poultry.key) + poultry_request.inspector = 'pending' + poultry_request.awaiting_payment = False + poultry_request.save() + + if check.state == 'rejected': + if kill_house_factor != None: + kill_house_factor.state = 'rejected' + check.kill_house_factor = kill_house_factor + kill_house_factor.message = check.message + kill_house_factor.save() + else: + kill_house_poultry_factor.state = 'rejected' + kill_house_poultry_factor.message = check.message + kill_house_poultry_factor.save() + + check.save() + check_serializer = self.serializer_class(check) + return Response(check_serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors) + + +# ویوست مربوط به تخصیصات مالی برای استان و شهرستان و مرغدار +class DepositAllocationViewSet(viewsets.ModelViewSet): + queryset = DepositAllocation.objects.all() + serializer_class = DepositAllocationSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ویرایش تخصیصات مالی برای استان و شهرستان و مرغدار + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + deposit = DepositAllocation.objects.get(key__exact=request.data["key"], trash=False) + province_factor_to_kill_house = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_check__province_kill_request__province_request__city_request_Poultry__poultry_request=deposit.poultry, + trash=False) + province_factor_to_kill_house_poultry = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_check__province_kill_request__province_request__city_request_Poultry__poultry_request=deposit.poultry, + trash=False) + + kill_house_requests = KillHouseRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=deposit.poultry, + state='accepted', + active_state='inactive', trash=False) + + request.data.pop('key') + pay_for = request.data['type'] + request.data.pop('type') + image = request.data['image'] + pay = request.data['payment'] + request.data.pop('image') + request.data.pop('payment') + if pay_for == 'Poultry': + deposit.city_image = send_image_to_server(image) + deposit.poultry_share_payment += float(pay) + list1 = [] + if deposit.poultry_share_payment_info == list1: + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.poultry_share_payment_info = list1 + else: + list1 = list(deposit.poultry_share_payment_info) + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.poultry_share_payment_info = list1 + deposit.save() + elif pay_for == 'CityOperator': + # deposit.city_image = send_image_to_server(image) + deposit.city_share_payment += float(pay) + list1 = [] + if deposit.city_share_payment_info == list1: + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.city_share_payment_info = list1 + else: + list1 = list(deposit.city_share_payment_info) + list1.append({"pay": pay, "image": send_image_to_server(image)}) + # list1.append(list1.append({city_pay: ARVAN_deposit_URL + "{0}.jpg".format(str(ran))})) + deposit.city_share_payment_info = list1 + deposit.save() + elif pay_for == 'ProvinceOperator': + # deposit.city_image = send_image_to_server(image) + deposit.province_share_payment += float(pay) + list1 = [] + if deposit.province_share_payment_info == list1: + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.province_share_payment_info = list1 + else: + list1 = list(deposit.province_share_payment_info) + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.province_share_payment_info = list1 + deposit.save() + elif pay_for == 'fanava': + # deposit.city_image = send_image_to_server(image) + deposit.fanava_share_payment += float(pay) + list1 = [] + if deposit.fanava_share_payment_info == list1: + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.fanava_share_payment_info = list1 + else: + list1 = list(deposit.fanava_share_payment_info) + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.fanava_share_payment_info = list1 + deposit.save() + elif pay_for == 'company': + # deposit.city_image = send_image_to_server(image) + deposit.company_share_payment += float(pay) + list1 = [] + if deposit.company_share_payment_info == list1: + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.company_share_payment_info = list1 + else: + list1 = list(deposit.company_share_payment_info) + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.company_share_payment_info = list1 + deposit.save() + elif pay_for == 'central': + # deposit.city_image = send_image_to_server(image) + deposit.central_union_share_payment += float(pay) + list1 = [] + if deposit.central_union_share_payment_info == list1: + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.central_union_share_payment_info = list1 + else: + list1 = list(deposit.central_union_share_payment_info) + list1.append({"pay": pay, "image": send_image_to_server(image)}) + deposit.central_union_share_payment_info = list1 + deposit.save() + # total = 0 + # if province_factor_to_kill_house.count() > 0: + # for factor in province_factor_to_kill_house: + # total += factor.total_price + # if province_factor_to_kill_house_poultry.count() > 0: + # for poultry_factor in province_factor_to_kill_house_poultry: + # total += poultry_factor.total_price + # deposit_total = deposit.poultry_share_payment + deposit.city_share_payment + deposit.province_share_payment + deposit.company_share_payment + deposit.central_union_share_payment + deposit.fanava_share_payment + # + # if total == deposit_total: + # counter = province_factor_to_kill_house.count() + # for po_factor in province_factor_to_kill_house_poultry: + # if ProvinceFactorToKillHouse.objects.filter(poultry_factor=po_factor).exists(): + # continue + # else: + # counter += 1 + # if counter == kill_house_requests.count(): + # poultry_request = PoultryRequest.objects.get(key=deposit.poultry.key) + # poultry_request.final_state = 'archive' + # poultry_request.save() + + serializer = self.serializer_class(deposit) + serializer.update(instance=deposit, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع مربوط به نمایش تخصیصات مالی برای استان و شهرستان و مرغدار + # def list(self, request, *args, **kwargs): + # # refresh(request.user.id) + # user = SystemUserProfile.objects.get(user=request.user, trash=False) + # final_list = [] + # factor_dict_list = [] + # factor_list = [] + # for province_check_request in ProvinceCheckOperatorRequest.objects.filter(state='accept', + # factor_state='accepted', + # deposit_allocation_archive='pending', + # trash=False): + # poultry = province_check_request.city_request_Poultry.poultry_request.user + # city_operator = province_check_request.city_request_Poultry.city_operator + # deposit_allocation = DepositAllocation.objects.filter( + # poultry=province_check_request.city_request_Poultry.poultry_request) + # + # internal_dict_poultry = { + # "full_name": province_check_request.city_request_Poultry.poultry_request.user.fullname, + # "mobile": province_check_request.city_request_Poultry.poultry_request.user.mobile, + # "gis_code": province_check_request.city_request_Poultry.poultry_request.user.gis_code, + # "quantity": province_check_request.city_request_Poultry.poultry_request.quantity, + # "breed": province_check_request.city_request_Poultry.poultry_request.chicken_breed, + # "order_code": province_check_request.city_request_Poultry.poultry_request.order_code, + # "fee": province_check_request.fee, + # "date": province_check_request.city_request_Poultry.poultry_request.send_date, + # "total_weight": province_check_request.total_weight_at_end, + # "total_amount": province_check_request.total_cost_at_end, + # "factors": ""} + # + # if user.role.name == 'Poultry': + # if deposit_allocation: + # internal_dict_poultry.update({"poultry_share": deposit_allocation[0].poultry_share, + # "poultry_bank_name": user.user_bank_info.bank_name, + # "poultry_card_number": user.user_bank_info.card, + # "poultry_shaba": user.user_bank_info.shaba, + # "poultry_bank_account_number": user.user_bank_info.account, + # "poultry_image": deposit_allocation[0].poultry_image, + # "Union_share": deposit_allocation[0].province_share + + # deposit_allocation[0].city_share, + # "province": province_check_request.province_operator.address.province, + # }) + # factor_dict_list.append(internal_dict_poultry) + # factor_list = [] + # if user.role.name == 'CityOperator': + # if deposit_allocation: + # internal_dict_poultry.update({ + # "city": city_operator.address.city, + # "city_bank_name": city_operator.user_bank_info.bank_name, + # "name_of_bank_user": city_operator.user_bank_info.name_of_bank_user, + # "city_share": deposit_allocation[0].city_share, + # "city_image": deposit_allocation[0].city_image, + # }) + # factor_dict_list.append(internal_dict_poultry) + # factor_list = [] + # if user.role.name == 'ProvinceOperator': + # for kill_house_req_obj in KillHouseRequest.objects.filter(province_request=province_check_request, + # state='accepted', trash=False): + # province_req = kill_house_req_obj.province_request + # + # for kill_house_factor in KillHouseFactorToProvince.objects.filter( + # province_factor__province_check_info__kill_house_assignment__kill_house_check__province_kill_request__province_request=province_req, + # state='accepted', trash=False): + # internal_dict_factors = { + # "barcod": kill_house_factor.province_factor.factor_bar_code, + # "kill_house_name": kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, + # "kill_house_mobile": kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.user.mobile, + # "payment_code": kill_house_factor.payment_code, + # "cost": kill_house_factor.province_factor.total_price, + # "factor_key": kill_house_factor.key, + # "factor_state": kill_house_factor.state, + # "factor_payment_state": kill_house_factor.payment_state, + # "factor_payment_method": kill_house_factor.payment_method + # } + # factor_list.append(internal_dict_factors) + # internal_dict_poultry["factors"] = factor_list + # internal_dict_poultry.update({ + # "total_money": province_check_request.total_cost_at_end, + # }) + # deposit_allocation = DepositAllocation.objects.filter( + # poultry=province_check_request.city_request_Poultry.poultry_request) + # if deposit_allocation: + # if user.role.name == 'ProvinceOperator': + # internal_dict_poultry.update({"allocation_key": deposit_allocation[0].key, + # "poultry_share": deposit_allocation[0].poultry_share, + # "poultry_bank_info": poultry.user_bank_info.name_of_bank_user, + # "poultry_bank_name": user.user_bank_info.bank_name, + # "poultry_card_number": user.user_bank_info.card, + # "poultry_shaba": user.user_bank_info.shaba, + # "poultry_image": deposit_allocation[0].poultry_image, + # "city_share": deposit_allocation[0].city_share, + # "city_bank_info": city_operator.user_bank_info.name_of_bank_user, + # "city_bank_name": city_operator.user_bank_info.bank_name, + # "city_card_number": city_operator.user_bank_info.card, + # "city_shaba": city_operator.user_bank_info.shaba, + # "city_image": deposit_allocation[0].city_image, + # "province_share": deposit_allocation[0].province_share, + # "province_bank_info": province_check_request.province_operator.user_bank_info.name_of_bank_user, + # }) + # factor_dict_list.append(internal_dict_poultry) + # factor_list = [] + # + + # return Response(factor_dict_list, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + factor_list = [] + user = SystemUserProfile.objects.get(user=request.user) + allocations = DepositAllocation.objects.filter(poultry__poultry__address__province=user.province).order_by('id') + serializer_request = self.serializer_class(allocations, many=True) + return Response(serializer_request.data, status=status.HTTP_200_OK) + + +class InspectorOperatorViewSet(viewsets.ModelViewSet): + queryset = InspectorOperator.objects.all() + serializer_class = InspectorOperatorSerializer + permission_classes = [TokenHasReadWriteScope] + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + operator = InspectorOperator.objects.get(user=user, trash=False) + inspector_operator_serializer = InspectorOperatorSerializer(operator) + profile_info = { + 'inspector': inspector_operator_serializer.data, + } + return Response(profile_info, status=status.HTTP_200_OK) + + +# ویوست مربوط به تایید یا رد پرونده مرغدار توسط بازرس استان +class PovinceInspectorViewSet(viewsets.ModelViewSet): + queryset = PovinceInspector.objects.all() + serializer_class = PovinceInspectorSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به تایید یا رد پرونده مرغدار توسط بازرس استان + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + inspector = InspectorOperator.objects.get(user=user, trash=False) + key = request.data['key'] + request.data.pop('key') + poultry_request = PoultryRequest.objects.get(key=key, trash=False) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + inspector_req = serializer.create(validated_data=request.data) + inspector_req.poultry_request = poultry_request + if inspector_req.state == 'accepted': + poultry_request.inspector = 'accepted' + poultry_request.final_state = 'archive' + elif inspector_req.state == 'rejected': + poultry_request.inspector = 'rejected' + poultry_request.final_state = 'archive' + poultry_request.save() + inspector_req.inspector = user + inspector_req.inspector_operator = inspector + inspector_req.save() + serializer_request = self.serializer_class(inspector_req) + return Response(serializer_request.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع مربوط به نمایش پرونده های تایید شده یا رد شده توسط بازرس استان + # def list(self, request, *args, **kwargs): + # user = UserProfile.objects.get(user=request.user) + # final_list = [] + # factor_dict_list = [] + # factor_list = [] + # for province_check_request in ProvinceCheckOperatorRequest.objects.filter(state='accept', + # factor_state='accepted', + # deposit_allocation_archive='accepted'): + # poultry = province_check_request.city_request_Poultry.poultry_request.user + # city_operator = province_check_request.city_request_Poultry.city_operator + # deposit_allocation = DepositAllocation.objects.filter( + # poultry=province_check_request.city_request_Poultry.poultry_request) + # + # internal_dict_poultry = { + # "full_name": province_check_request.city_request_Poultry.poultry_request.user.fullname, + # "mobile": province_check_request.city_request_Poultry.poultry_request.user.mobile, + # "gis_code": province_check_request.city_request_Poultry.poultry_request.user.gis_code, + # "quantity": province_check_request.city_request_Poultry.poultry_request.quantity, + # "breed": province_check_request.city_request_Poultry.poultry_request.chicken_breed, + # "order_code": province_check_request.city_request_Poultry.poultry_request.order_code, + # "fee": province_check_request.fee, + # "date": province_check_request.city_request_Poultry.poultry_request.send_date, + # "total_weight": province_check_request.total_weight_at_end, + # "total_amount": province_check_request.total_cost_at_end, + # "factors": ""} + # if user.role.name == 'ProvinceOperator': + # for kill_house_req_obj in KillHouseRequest.objects.filter(province_request=province_check_request, + # state='accepted'): + # province_req = kill_house_req_obj.province_request + # + # for kill_house_factor in KillHouseFactorToProvince.objects.filter( + # province_factor__province_check_info__kill_house_assignment__kill_house_check__province_kill_request__province_request=province_req, + # state='accepted'): + # internal_dict_factors = { + # "barcod": kill_house_factor.province_factor.factor_bar_code, + # "kill_house_name": kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, + # "kill_house_mobile": kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.user.mobile, + # "payment_code": kill_house_factor.payment_code, + # "cost": kill_house_factor.province_factor.total_price, + # "factor_key": kill_house_factor.key, + # "factor_state": kill_house_factor.state, + # "factor_payment_state": kill_house_factor.payment_state, + # "factor_payment_method": kill_house_factor.payment_method + # } + # factor_list.append(internal_dict_factors) + # internal_dict_poultry["factors"] = factor_list + # internal_dict_poultry.update({ + # "total_money": province_check_request.total_cost_at_end, + # }) + # deposit_allocation = DepositAllocation.objects.filter( + # poultry=province_check_request.city_request_Poultry.poultry_request) + # if deposit_allocation: + # if user.role.name == 'ProvinceOperator': + # internal_dict_poultry.update({"allocation_key": deposit_allocation[0].key, + # "poultry_share": deposit_allocation[0].poultry_share, + # "poultry_bank_info": poultry.user_bank_info.name_of_bank_user, + # "poultry_bank_name": user.user_bank_info.bank_name, + # "poultry_card_number": user.user_bank_info.card, + # "poultry_shaba": user.user_bank_info.shaba, + # "poultry_image": deposit_allocation[0].poultry_image, + # "city_share": deposit_allocation[0].city_share, + # "city_bank_info": city_operator.user_bank_info.name_of_bank_user, + # "city_bank_name": city_operator.user_bank_info.bank_name, + # "city_card_number": city_operator.user_bank_info.card, + # "city_shaba": city_operator.user_bank_info.shaba, + # "city_image": deposit_allocation[0].city_image, + # "province_share": deposit_allocation[0].province_share, + # "province_bank_info": province_check_request.province_operator.user_bank_info.name_of_bank_user, + # }) + # factor_dict_list.append(internal_dict_poultry) + # factor_list = [] + # + # return Response(factor_dict_list, status=status.HTTP_200_OK) + + +# ویوست مربوط به دریافت درخواست مرغدار که در هر مرحله ای رد شده باشه برای پنل استان +class RejectedRequestsViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به نمایش درخواست مرغدار که در هر مرحله ای رد شده باشه برای پنل استان + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + objects = [] + objects_list = [] + poultry_request = PoultryRequest.objects.filter(poultry__address__province=user.province) + # for value in self.queryset: + for value in poultry_request: + for i in value.poultry_check.filter(): + if i.state == "rejected" or i.state == "reject": + objects.append({ + 'rejected_position': 'city-operator', + 'rejected_position_farsi': 'اپراتور شهرستان', + 'city_operator': i.city_operator_system.user.fullname, + 'modify_date': i.modify_date, + 'reason_message': i.message, + 'value': self.serializer_class(value).data + }) + break + for item in i.Poultry_city_request_to_province.filter(): + if item.state == "rejected" or item.state == "reject": + objects.append({ + 'rejected_position': 'province-operator', + 'rejected_position_farsi': 'اپراتور استان', + 'province_operator': item.province_operator_system.user.fullname, + 'modify_date': item.modify_date, + 'city_operator': item.city_request_Poultry.city_operator_system.user.fullname, + 'reason_message': item.message, + 'value': self.serializer_class(value).data + }) + break + for x in item.kill_house_province.filter(): + if x.state == "rejected" or x.state == "reject": + objects.append({ + 'rejected_position': 'kill-house-request', + 'rejected_position_farsi': 'درخواست کشتارگاه', + 'kill_house': x.kill_request.kill_house.name, + 'modify_date': x.modify_date, + 'province_operator': x.province_request.province_operator_system.user.fullname, + 'city_operator': x.province_request.city_request_Poultry.city_operator_system.user.fullname, + 'reason_message': x.message, + 'value': self.serializer_class(value).data + }) + break + for y in x.province_kill_house_check.filter(): + for m in y.kill_house_check_req.filter(): + for n in m.kill_house_assign.filter(): + if n.state == "rejected" or n.state == "reject": + objects.append({ + 'rejected_position': 'financial', + 'rejected_position_farsi': 'مالی', + 'province_operator': n.kill_house_assignment.kill_house_check. + province_kill_request.province_request.province_operator_system.user.fullname, + 'kill_house': n.kill_house_assignment.kill_house_check.province_kill_request + .kill_request.kill_house.name, + 'city_operator': n.kill_house_assignment.kill_house_check.province_kill_request + .province_request.city_request_Poultry.city_operator_system.user.fullname, + 'modify_date': n.modify_date, + 'reason_message': n.message, + 'value': self.serializer_class(value).data + }) + for v in n.province_info.filter(): + pass + for i in value.poultry_request_inspector.filter(): + if i.state == "rejected" or i.state == "reject": + objects.append({ + 'rejected_position': 'inspector-operator', + 'rejected_position_farsi': 'اپراتور بازرس استان', + 'inspector_operator': i.inspector_operator.user.fullname, + 'modify_date': i.modify_date, + 'reason_message': i.message, + 'value': self.serializer_class(value).data + }) + break + for item in objects: + objects_dict = {} + kill_house_objects = [] + objects_dict['rejected_position'] = item['rejected_position'] + objects_dict['rejected_position_farsi'] = item['rejected_position_farsi'] + objects_dict['fullname'] = item['value']['poultry']['userprofile']['full_name'] + objects_dict['mobile'] = item['value']['poultry']['userprofile']['mobile'] + objects_dict['city'] = item['value']['poultry']['address']['city']['name'] + objects_dict['province'] = item['value']['poultry']['address']['province']['name'] + + if 'city_operator' in item.keys(): + objects_dict['city_operator'] = item['city_operator'] + if 'province_operator' in item.keys(): + objects_dict['province_operator'] = item['province_operator'] + if 'kill_house' in item.keys(): + objects_dict['kill_house'] = item['kill_house'] + objects_dict['modify_date'] = item['modify_date'] + objects_dict['reason_message'] = item['reason_message'] + if item['value']['process']['province_kill_requests'] is not None: + for kill_item in item['value']['process']['province_kill_requests']: + if kill_item['kill_house_requests']: + for i in kill_item['kill_house_requests']: + kill_dict = {} + kill_dict['kill_house_name'] = i['kill_house_name'] + kill_dict['kill_house_owner_name'] = i['kill_house_user_name'] + kill_dict['mobile'] = i['kill_house_mobile'] + kill_dict['quantity'] = i['quantity'] + kill_dict['date'] = i['date'] + kill_dict['time'] = i['time'] + kill_dict['barcode'] = i['barcod'] + kill_dict['car_model'] = i['type_car'] + kill_dict['pelak'] = i['pelak'] + kill_dict['car_quantity'] = i['capocity'] + kill_dict['driver_name'] = i['driver_name'] + kill_house_objects.append(kill_dict) + objects_dict['kill_house'] = kill_house_objects + objects_dict['poultry_quantity'] = item['value']['quantity'] + objects_dict['send_date'] = item['value']['send_date'] + objects_dict['chicken_breed'] = item['value']['chicken_breed'] + objects_dict['Index_weight'] = item['value']['Index_weight'] + objects_dict['order_code'] = item['value']['order_code'] + objects_dict['create_date'] = item['value']['create_date'] + objects_dict['id'] = item['value']['id'] + kill_date = datetime.strptime(str(item['value']['send_date']), '%Y-%m-%dT%H:%M:%S') + # objects_dict['age'] = (kill_date - chicken_date).days + 2 + objects_list.append(objects_dict) + return Response(objects_list) + + +# ویوست مربوط به بررسی قیمت گذاری برای پنل استان +class ProvinceCheckRequestsPriceViewSet(viewsets.ModelViewSet): + queryset = ProvinceCheckOperatorRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceCheckOperatorRequestSerializer + + # تابع مربوط به بررسی قیمت گذاری برای پنل استان + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + next_day = datetime.now() + timedelta(days=1) + now = datetime.now() + price = Pricing.objects.filter(date__gte=next_day.date(), trash=False) + if price: + pass + + elif not price and now.hour == 12: + user = UserProfile.objects.get(role__name='ProvinceFinancial', trash=False) + message = UserMessage( + message="کاربر گرامی {} 12 ساعت تا شزوع روز بعد باقی است لطفا قیمت های روز بعد را وارد نمایید ".format( + user.fullname)) + message.save() + message.users.add(user) + return Response('message_sent') + elif not price and now.hour == 17: + users = UserProfile.objects.filter(role__name__in=('ProvinceFinancial', 'ProvinceInspector'), trash=False) + for user in users: + message = UserMessage( + message="کاربر گرامی {} 7 ساعت تا شزوع روز بعد باقی است لطفا قیمت های روز بعد را وارد نمایید".format( + user.fullname)) + message.save() + message.users.add(user) + return Response('message_sent') + + elif not price and now.hour == 22: + users = UserProfile.objects.filter( + role__name__in=('ProvinceFinancial', 'ProvinceOperator', 'ProvinceInspector'), trash=False) + for user in users: + message = UserMessage( + message="کاربر گرامی {} 2 ساعت تا شزوع روز بعد باقی است لطفا قیمت های روز بعد را وارد نمایید".format( + user.fullname)) + message.save() + message.users.add(user) + price_reminder(user.mobile, user.fullname) + return Response('sms sent') + + +# ویوست مربوط به آنالیز قیمت گذاری برای پنل استان +class PriceAnalysisViewSet(viewsets.ModelViewSet): + queryset = PriceAnalysis.objects.all() + serializer_class = PriceAnalysisorSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به آنالیز قیمت گذاری برای پنل استان + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + price_analys = serializer.create(validated_data=request.data) + price_analys.corn_Ration_free_price = price_analys.anacorn_percent * price_analys.corn_free_price + price_analys.Soy_Ration_free_price = price_analys.Soy_percent * price_analys.Soy_free_price + price_analys.Oil_Ration_free_price = price_analys.Oil_percent * price_analys.Oil_free_price + price_analys.Dicalcium_Ration_free_price = price_analys.Dicalcium_percent * price_analys.Dicalcium_free_price + price_analys.Carbonate_Ration_free_price = price_analys.Carbonate_percent * price_analys.Carbonate_free_price + price_analys.mineral_Ration_supplement_free_price = price_analys.mineral_supplement_percent * price_analys.mineral_supplement_free_price + price_analys.vitamin_Ration_free_supplement_percent = price_analys.vitamin_supplement_percent * price_analys.vitamin_supplement_total_free_price + price_analys.baking_Ration_soda_free_price = price_analys.baking_soda_percent * price_analys.baking_soda_free_price + price_analys.Salt_Ration_free_price = price_analys.Salt_percent * price_analys.Salt_free_price + price_analys.metiunin_Ration_free_price = price_analys.metiunin_percent * price_analys.metiunin_free_price + price_analys.Lysine_Ration_free_price = price_analys.Lysine_percent * price_analys.Lysine_free_price + price_analys.threonine_Ration_free_price = price_analys.threonine_percent * price_analys.threonine_free_price + price_analys.Antifungal_Ration_free_price = price_analys.Antifungal_percent * price_analys.Antifungal_free_price + price_analys.Colleen_Ration_free_price = price_analys.Colleen_percent * price_analys.Colleen_free_price + price_analys.total_percent = price_analys.anacorn_percent + price_analys.Soy_percent + price_analys.Oil_percent + price_analys.Dicalcium_percent + price_analys.Carbonate_percent + price_analys.mineral_supplement_percent + price_analys.vitamin_supplement_percent + price_analys.baking_soda_percent + price_analys.Salt_percent + price_analys.metiunin_percent + price_analys.Lysine_percent + price_analys.threonine_percent + price_analys.Antifungal_percent + price_analys.Colleen_percent + price_analys.total_ration = price_analys.corn_Ration_free_price + price_analys.Soy_Ration_free_price + price_analys.Oil_Ration_free_price + price_analys.Dicalcium_Ration_free_price + price_analys.Carbonate_Ration_free_price + price_analys.mineral_Ration_supplement_free_price + price_analys.vitamin_Ration_free_supplement_percent + price_analys.baking_Ration_soda_free_price + price_analys.Salt_Ration_free_price + price_analys.metiunin_Ration_free_price + price_analys.Lysine_Ration_free_price + price_analys.threonine_Ration_free_price + price_analys.Antifungal_Ration_free_price + price_analys.Colleen_Ration_free_price + price_analys.corn_total_free_price = 5 * (price_analys.total_ration / 2.5) + price_analys.Soy_total_free_price = price_analys.period_chicken / 2.5 + price_analys.Oil_total_free_price = price_analys.Vaccination_period / 50000 + price_analys.Dicalcium_total_free_price = price_analys.Multivitamin_course / 50000 + price_analys.Carbonate_total_free_price = price_analys.directors_office / 50000 + price_analys.mineral_supplement_total_free_price = price_analys.Water_gas_electricity_period / 50000 + price_analys.vitamin_supplement_total_free_price = price_analys.Water_gas_the_current_cost_of_the_period_unit / 50000 + price_analys.baking_soda_total_free_price = price_analys.Course_repairs / 50000 + price_analys.Salt_free_total_price = price_analys.motfar_ga_durah / 50000 + price_analys.metiunin_total_free_price = price_analys.Paper_reel / 50000 + price_analys.Lysine_total_free_price = price_analys.Course_disinfection / 50000 + price_analys.threonine_total_free_price = price_analys.Lamp / 50000 + price_analys.Antifungal_total_free_price = 60 + price_analys.inulin_total_free_price = 50 + price_analys.Fire_total_emulsion_free_price = 25 + price_analys.Colleen_total_free_price = price_analys.Course_loss / 50000 + price_analys.chicken_price = price_analys.corn_total_free_price + price_analys.Soy_total_free_price + price_analys.Oil_total_free_price + price_analys.Dicalcium_total_free_price + price_analys.Carbonate_total_free_price + price_analys.mineral_supplement_total_free_price + price_analys.vitamin_supplement_total_free_price + price_analys.baking_soda_total_free_price + price_analys.Salt_free_total_price + price_analys.metiunin_total_free_price + price_analys.Lysine_total_free_price + price_analys.threonine_total_free_price + price_analys.Antifungal_total_free_price + price_analys.inulin_total_free_price + price_analys.Fire_total_emulsion_free_price + price_analys.Colleen_total_free_price + price_analys.save() + serializer_request = self.serializer_class(price_analys) + return Response(serializer_request.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +# ویوست مربوط به ثبت درخواست مرغ منجمد و ایجاد فاکتور پنل استان +class WareHouseFactorViewSet(viewsets.ModelViewSet): + queryset = WareHouseFactor.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = WareHouseFactorSerializer + + # نابع مربوط به ثبت درخواست مرغ منجمد و ایجاد فاکتور پنل استان + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = UserProfile.objects.get(user=request.user, trash=False) + role = Group.objects.get(name=user.role.name) + ware_factor = WareHouseFactor.objects.all() + letter_number = ware_factor.last().letter_number + 1 if len(ware_factor) > 0 else 100000 + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + ware_house_factor = serializer.create(validated_data=request.data) + if role.name == 'Jahad': + ware_house_factor.first_operator = user + today = jdatetime.datetime.now() + today = today.date() + + ware_house_factor.letter_number_jahad = int( + str(today.year) + str(today.month) + str(today.day) + str(ware_house_factor.letter_number)) + serializer_request = self.serializer_class(ware_house_factor) + return Response(serializer_request.data, status=status.HTTP_201_CREATED) + ware_house_factor.total_wage = float(ware_house_factor.weight) * float(ware_house_factor.wage) + ware_house_factor.total_fee = float(ware_house_factor.weight) * float(ware_house_factor.fee) + ware_house_factor.total_cost = ware_house_factor.total_fee + ware_house_factor.total_wage + ware_house_factor.second_operator = user + ware_house_factor.letter_number = letter_number + ware_house_factor.save() + serializer_request = self.serializer_class(ware_house_factor) + return Response(serializer_request.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # نابع مربوط به ویرایش درخواست مرغ منجمد ثبت شده پنل استان + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + user = UserProfile.objects.get(user=request.user, trash=False) + role = Group.objects.get(name=user.role.name) + ware_house_factor = WareHouseFactor.objects.get(key__exact=request.data["key"], trash=False) + request.data.pop('key') + if role.name == 'Jahad': + if ware_house_factor.state == 'completed': + return Response({'result': 'can not update'}, status=status.HTTP_403_FORBIDDEN) + else: + ware_house_factor.first_operator = user + ware_house_factor.save() + serializer = self.serializer_class(ware_house_factor) + serializer.update(instance=ware_house_factor, validated_data=request.data) + + else: + try: + wage = float(request.data['wage']) + fee = float(request.data['fee']) + request.data.pop('wage') + request.data.pop('fee') + except: + wage = ware_house_factor.wage + fee = ware_house_factor.fee + + try: + weight = float(request.data['weight']) + request.data.pop('weight') + ware_house_factor.weight = weight + except: + weight = ware_house_factor.weight + ware_house_factor.state = 'completed' + ware_house_factor.fee = fee + ware_house_factor.wage = wage + ware_house_factor.total_wage = weight * wage + ware_house_factor.total_fee = weight * fee + ware_house_factor.total_cost = ware_house_factor.total_fee + ware_house_factor.total_wage + ware_house_factor.second_operator = user + ware_house_factor.save() + serializer = self.serializer_class(ware_house_factor) + serializer.update(instance=ware_house_factor, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + # نابع مربوط به نمایش درخواست مرغ منجمد ثبت شده پنل استان + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + queryset = WareHouseFactor.objects.filter(trash=False).order_by('-create_date') + # queryset = WareHouseFactor.objects.all().order_by('-create_date') + serializer = WareHouseFactorSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + # نابع مربوط به حذف درخواست مرغ منجمد ثبت شده پنل استان + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + queryset = WareHouseFactor.objects.get(id=pk, trash=False) + queryset.trash = True + queryset.save() + return Response(queryset.trash, status=status.HTTP_200_OK) + + +class ManageCarsByProvince(viewsets.ModelViewSet): + queryset = KillHouseADDCAR.objects.all() + serializer_class = KillHouseADDCARSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + """ + Show List Of KillHouse Cars To Province + """ + kill_house_object = KillHouse.objects.get(key=request.GET['key'], trash=False) + kill_house_cars = self.queryset.filter(kill_house=kill_house_object, trash=False) + + # Send Data To Serializer + serializer = self.serializer_class(kill_house_cars) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + """ + Update KillHouse Cars (activate cars) By Province Operator + """ + car_key = request.data['key'] + request.data.pop('key') + car_object = self.queryset.get(key=car_key, trash=False) + + # Sending Data To Serializer & Update Information + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + obj = serializer.update( + validated_data=request.data, + instance=car_object + ) + serializer = self.serializer_class(obj) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class KillHouseListForProvince(viewsets.ModelViewSet): + queryset = KillHouse.objects.all() + serializer_class = KillHouseSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + """ + show List of KillHouses for Province Operator To Manage + """ + userprofile = SystemUserProfile.objects.get( + user=request.user, trash=False + ) + if 'show_poultry' in request.GET: + kill_house_objects_list = [] + now = datetime.now().date() + date = datetime.strptime(str(request.GET['date']), + '%Y-%m-%d').date() if 'date' in request.GET else now + # poultry = Poultry.objects.filter(user=userprofile).last() + kill_house_objects = KillHouse.objects.filter( + system_address__province=userprofile.province, trash=False + ) + for kill_house_object in kill_house_objects: + quantity_sum = 0 + poultry_quantity_sum = 0 + first_quantity = 0 + kill_req_key = None + total_kill_request = KillRequest.objects.filter(kill_house=kill_house_object, recive_date__date=date, + trash=False, province_state__in=('pending', 'accepted')) + + kill_request = total_kill_request.filter(poultry__isnull=True, province_state='accepted').first() + direct_buying_export_kill_request = total_kill_request.filter(poultry__isnull=False, + province_state__in=( + 'pending', 'accepted')) + direct_buying_export_kill_request_quantity = \ + direct_buying_export_kill_request.aggregate(total=Sum('kill_capacity'))[ + 'total'] or 0 + + if kill_request: + # quantity_sum = kill_request.kill_capacity - ( + # kill_request.remain_quantity_for_poultry + direct_buying_export_kill_request_quantity) + quantity_sum = kill_request.kill_capacity - kill_request.remain_quantity_for_poultry + first_quantity = kill_request.kill_capacity + poultry_quantity_sum = kill_request.remain_quantity_for_poultry + kill_req_key = kill_request.key + + kill_house_dict = { + "name": kill_house_object.name, + "killer": kill_house_object.killer, + "fullname": kill_house_object.kill_house_operator.user.fullname, + "quantity_sum": quantity_sum, + "first_quantity": first_quantity, + "poultry_quantity_sum": poultry_quantity_sum, + "kill_req_key": kill_req_key, + } + kill_house_objects_list.append(kill_house_dict) + return Response(kill_house_objects_list, status=status.HTTP_200_OK) + + else: + + kill_house_objects = KillHouse.objects.filter( + system_address__province=userprofile.province, trash=False + ) + + # Send Data To Serializer + serializer = self.serializer_class(kill_house_objects, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ShareOfAllocationViewSet(viewsets.ModelViewSet): + queryset = ShareOfAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ShareOfAllocationSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + share = self.queryset + if share: + share = share.last() + else: + share = ShareOfAllocation(province=user.province) + share.save() + serializer = ShareOfAllocationSerializer(share) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + share = ShareOfAllocation.objects.all().last() + serializer = self.serializer_class(share) + serializer.update(instance=share, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PaymentDeadLineViewSet(viewsets.ModelViewSet): + queryset = PaymentDeadLine.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PaymentDeadLineSerializer + + +class MonthlyProfitPercentageViewSet(viewsets.ModelViewSet): + queryset = MonthlyProfitPercentage.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = MonthlyProfitPercentageSerializer + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + queryset = MonthlyProfitPercentage.objects.all().last() + serializer = MonthlyProfitPercentageSerializer(queryset) + return Response(serializer.data, status=status.HTTP_200_OK) + + # + # def create(self, request, *args, **kwargs): + # serializer = self.serializer_class(data=request.data) + # if serializer.is_valid(): + # share = serializer.create(validated_data=request.data) + # serializer_request = self.serializer_class(ware_house_factor) + # return Response(serializer_request.data, status=status.HTTP_201_CREATED) + # return Response(serializer.errors) + + +def update_factor_total_price(): + factors = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__province_kill_request__payment_type='credit', + paid_state='pending') + for factor in factors: + total = factor.total_weight * factor.factor_fee + factor.total_price += (total * 0.001) + factor.save() + return Response({"result": "factors updated"}, status=status.HTTP_200_OK) + + +class WalletViewset(viewsets.ModelViewSet): + queryset = Wallet.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = walletSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + new_wallet = serializer.create(validated_data=request.data) + new_wallet.save() + w = self.serializer_class(new_wallet) + return Response(w.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + queryset = self.queryset.get(key=request.GET['wallet_key']) + transactions = Itransaction.objects.filter(wallet=queryset, state__in=("pending", "waiting")).order_by( + 'create_date') + serializer = ItransactionSerializer(transactions, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ItransactionViewset(viewsets.ModelViewSet): + queryset = Itransaction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ItransactionSerializer + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + itransaction_list = [] + itransactions = Itransaction.objects.all() + + for transaction in itransactions: + itransaction_list.append(transaction) + + t = ItransactionSerializer(itransaction_list, many=True) + + return Response(t.data, status.HTTP_200_OK) + + +class DebttViewset(viewsets.ModelViewSet): + queryset = Debt.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = DebtSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + wallet_receive = Wallet.objects.get(key=request.data['wallet_receive']) + user_receive = SystemUserProfile.objects.get(key=request.data['user_key']) + request.data.pop('wallet_receive') + request.data.pop('user_key') + image = request.data['image'] + request.data.pop('image') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + new_debt = serializer.create(validated_data=request.data) + new_debt.image = send_image_to_server(image) + # os.remove("{0}.jpg".format(str(ran))) + + itransactions = Itransaction.objects.filter(make_location_state='outside', wallet=wallet_receive).order_by( + 'create_date') + if itransactions.count() > 0: + itransactions = itransactions.last() + payment_code = itransactions.payment_code + 1 + else: + payment_code = int(str(user_receive.base_order) + '01') + new_transaction = Itransaction( + wallet=wallet_receive, + transfer_amount=new_debt.cost, + transaction_type='debtor', + payment_code=payment_code + ) + new_transaction.save() + new_debt.itransaction = new_transaction + new_debt.save() + wallet_receive.inventory -= new_debt.cost + wallet_receive.save() + d = self.serializer_class(new_debt) + return Response(d.data, status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + debt_list = [] + debts = Debt.objects.all() + for debt in debts: + debt_list.append(debt) + d = DebtSerializer(debt_list, many=True) + return Response(d.data, status=status.HTTP_200_OK) + + +class PenaltyViewset(viewsets.ModelViewSet): + queryset = Penalty.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PenaltySerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + wallet_receive = Wallet.objects.get(key=request.data['wallet_id']) + request.data.pop('wallet_id') + user_receive = SystemUserProfile.objects.get(key=request.data['user_key']) + request.data.pop('user_key') + image = request.data['image'] + request.data.pop('image') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + new_penalty = serializer.create(validated_data=request.data) + + new_penalty.image = send_image_to_server(image) + # os.remove("{0}.jpg".format(str(ran))) + itransactions = Itransaction.objects.filter(make_location_state='outside', + wallet=wallet_receive).order_by('create_date') + + if itransactions.count() > 0: + itransactions = itransactions.last() + payment_code = itransactions.payment_code + 1 + else: + payment_code = int(str(user_receive.base_order) + '01') + + new_transaction = Itransaction( + wallet=wallet_receive, + transfer_amount=new_penalty.cost, + transaction_type='penalty', + payment_code=payment_code + ) + new_transaction.save() + new_penalty.itransaction = new_transaction + new_penalty.save() + wallet_receive.inventory -= new_penalty.cost + wallet_receive.save() + p = self.serializer_class(new_penalty) + return Response(p.data, status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + penalty_list = [] + penaltys = Penalty.objects.all() + for penalty in penaltys: + penalty_list.append(penalty) + p = PenaltySerializer(penalty_list, many=True) + return Response(p.data, status=status.HTTP_200_OK) + + +class DepositViewset(viewsets.ModelViewSet): + queryset = Deposit.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = DepositSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + wallet_receive = Wallet.objects.get(key=request.data['wallet_key']) + request.data.pop('wallet_key') + user_receive = SystemUserProfile.objects.get(key=request.data['user_key']) + request.data.pop('user_key') + image = request.data['image'] + request.data.pop('image') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + new_deposit = serializer.create(validated_data=request.data) + new_deposit.image = send_image_to_server(image) + itransactions = Itransaction.objects.filter(make_location_state='outside', + wallet=wallet_receive).order_by('create_date') + + if itransactions.count() > 0: + itransactions = itransactions.last() + payment_code = itransactions.payment_code + 1 + else: + payment_code = int(str(user_receive.base_order) + '01') + new_transaction = Itransaction( + wallet=wallet_receive, + transfer_amount=new_deposit.cost, + transaction_type='deposit', + payment_code=payment_code + ) + new_transaction.save() + new_deposit.itransaction = new_transaction + new_deposit.save() + wallet_receive.inventory += new_deposit.cost + wallet_receive.save() + d = self.serializer_class(new_deposit) + return Response(d.data, status.HTTP_201_CREATED) + + +class FinancialDocumentViewset(viewsets.ModelViewSet): + queryset = FinancialDocument.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = FinancialDocumentSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + transaction_list = request.data['transaction_list'] + request.data.pop('transaction_list') + user = SystemUserProfile.objects.get(id=request.data['user_id']) + request.data.pop('user_id') + if 'image' in request.data.keys(): + images = request.data['image'] + request.data.pop('image') + else: + images = None + image_list = [] + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + new_financial_document = serializer.create(validated_data=request.data) + if images != None: + for image in images: + image_list.append(send_image_to_server(image)) + + new_financial_document.image = image_list + + for transaction in transaction_list: + tr = Itransaction.objects.get(key=transaction) + tr.state = "paid" + tr.save() + wallet = tr.wallet + + new_financial_document.wallet = wallet + new_financial_document.transaction_details = transaction_list + new_financial_document.save() + if new_financial_document.type != 'zero': + + itransactions = Itransaction.objects.filter(file_id=0, wallet=wallet).order_by( + 'create_date') + if itransactions.count() > 0: + itransactions = itransactions.last() + payment_code = itransactions.payment_code + 1 + else: + payment_code = int(str(user.base_order) + '01') + new_transaction = Itransaction( + wallet=wallet, + transfer_amount=new_financial_document.cost, + transaction_type=new_financial_document.type, + payment_code=payment_code, + + ) + new_transaction.save() + new_financial_document.payment_code = payment_code + new_financial_document.save() + + f = self.serializer_class(new_financial_document) + return Response(f.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(id=request.GET['user_id']) + if 'all' in request.GET: + documents = FinancialDocument.objects.all() + total_list = [] + if documents.count() > 0: + for document in documents: + total_debtor = 0 + total_creditor = 0 + transactions = Itransaction.objects.filter(key__in=document.transaction_details) + payment_code = document.payment_code + if transactions.count() > 0: + + for transaction in transactions: + if transaction.transaction_type == 'debtor' or transaction.transaction_type == 'penalty' or transaction.transaction_type == 'negative': + total_debtor += transaction.transfer_amount + elif transaction.transaction_type == "creditor" or transaction.transaction_type == 'deposit' or transaction.transaction_type == 'positive': + total_creditor += transaction.transfer_amount + inter_dict = { + "national_id": user.national_id, + "cost": document.cost, + "image": document.image, + "description": document.description, + "payment_code": payment_code, + "total_debtors": total_debtor, + "total_creditor": total_creditor + } + total_list.append(inter_dict) + + return Response(total_list, status=status.HTTP_200_OK) + + +class ReportingAllwalletRequestsViewset(viewsets.ModelViewSet): + poultery_query = Poultry.objects.all() + province_query = ProvinceOperator.objects.all() + killhouse_query = KillHouseOperator.objects.all() + vet_query = Vet.objects.all() + city_query = CityOperator.objects.all() + driver_query = KillHouseDriver.objects.all() + inspector_query = InspectorOperator.objects.all() + vet_query = Vet.objects.all() + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + poultry_filterset = PoultryFilterSet + serializer_class = PoultrySerializer + city_filterset = CityOperatorFilterSet + province_filterset = ProvinceOperatorFilterSet + killhouseoperator_filterset = KillHouseOperatorFilterSet + killhousedriver_filterset = KillHouseDriverFilterSet + inspector_filterset = InspectorOperatorFilterSet + vet_filterset = VetFilterSet + + filterset_fields = [ + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__city__name', + 'user__province_name', + 'user__base_order', + 'user__national_id', + + ] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + total_list = [] + poultry_query_val = [] + province_query_val = [] + killhouse_query_val = [] + driver_query_val = [] + city_query_val = [] + inspector_query_val = [] + vet_query_val = [] + poultry_limited_dict = {} + province_limited_dict = {} + killhouse_limited_dict = {} + city_limited_dict = {} + driver_limited_dict = {} + inspector_limited_dict = {} + vet_limited_dict = {} + province_limited_query = [] + killhouse_limited_query = [] + city_limited_query = [] + driver_limited_query = [] + inspector_limited_query = [] + values_item = [] + province_query_var = [] + killhouse_query_var = [] + city_query_var = [] + driver_query_var = [] + inspector_query_var = [] + vet_query_var = [] + poultry_limited_query = [] + vet_limited_query = [] + + if 'type' in request.GET: + if request.GET['type'] == 'filter': + if 'value' in request.GET and request.GET['value'] != "": + values = request.GET['value'].split(',') + for item in values: + if item != "": + values_item.append(item) + for val in values_item: + if not poultry_query_val: + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.poultry_filterset(data=query, queryset=self.poultery_query)).filter(): + ps = self.poultry_filterset(data=query, queryset=self.poultery_query) + filtered_poultry = ps.filter() + if filtered_poultry: + poultry_limited_query.append(query) + + if not province_query_var: + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.province_filterset(data=query, + queryset=self.province_query)).filter(): + ps = self.province_filterset(data=query, + queryset=self.province_query) + filtered_province_operator = ps.filter() + if filtered_province_operator: + province_limited_query.append(query) + + if not killhouse_query_var: + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.killhouseoperator_filterset(data=query, + queryset=self.killhouse_query)).filter(): + ps = self.killhouseoperator_filterset(data=query, + queryset=self.killhouse_query) + filtered_killhouse_operator = ps.filter() + if filtered_killhouse_operator: + killhouse_limited_query.append(query) + + if not city_query_var: + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.city_filterset(data=query, + queryset=self.city_query)).filter(): + ps = self.city_filterset(data=query, + queryset=self.city_query) + filtered_city_operator = ps.filter() + if filtered_city_operator: + city_limited_query.append(query) + + if not driver_query_var: + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.killhousedriver_filterset(data=query, + queryset=self.driver_query)).filter(): + ps = self.killhousedriver_filterset(data=query, + queryset=self.city_query) + filtered_driver = ps.filter() + if filtered_driver: + driver_limited_query.append(query) + + if not inspector_query_var: + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.inspector_filterset(data=query, + queryset=self.inspector_query)).filter(): + ps = self.inspector_filterset(data=query, + queryset=self.inspector_query) + filtered_inspector_operator = ps.filter() + if filtered_inspector_operator: + inspector_limited_query.append(query) + + if not vet_query_var: + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.vet_filterset(data=query, + queryset=self.vet_query)).filter(): + ps = self.vet_filterset(data=query, + queryset=self.vet_query) + filtered_vet = ps.filter() + if filtered_vet: + vet_limited_query.append(query) + + for i in poultry_limited_query: + for key, value in i.items(): + poultry_limited_dict[key] = value + + if len(poultry_limited_dict) > 0: + for i in Poultry.objects.filter(**poultry_limited_dict): + poultry_query_val.append(i) + + if len(poultry_query_val) > 0: + for poultry in poultry_query_val: + poulty_wallet = poultry.wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=poulty_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + + internal_dict = { + "base_orde": poultry.user.base_order, + "fullname": poultry.user.fullname, + "id": poultry.user.id, + # "role": poultry.user.name, + "mobile": poultry.user.mobile, + "national_id": poultry.user.national_id, + "wallet_key": poultry.wallet.key, + "inventory": poultry.wallet.inventory, + "city": poultry.user.city.name, + "province": poultry.user.province.name, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + total_list.append(internal_dict) + + for i in province_limited_query: + for key, value in i.items(): + province_limited_dict[key] = value + if len(province_limited_dict) > 0: + if len(values_item) == len(province_limited_dict): + + for i in ProvinceOperator.objects.filter(**province_limited_dict): + province_query_val.append(i) + + if len(province_query_val) > 0: + for province in province_query_val: + province_wallet = province.wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=province_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + internal_dict = { + "base_orde": province.user.base_order, + "fullname": province.user.fullname, + "id": province.user.id, + # "role": poultry.user.name, + "mobile": province.user.mobile, + "national_id": province.user.national_id, + "wallet_key": province.wallet.key, + "inventory": province.wallet.inventory, + "city": province.user.city.name, + "province": province.user.province.name, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + total_list.append(internal_dict) + + for i in killhouse_limited_query: + for key, value in i.items(): + killhouse_limited_dict[key] = value + if len(killhouse_limited_dict) > 0: + if len(values_item) == len(killhouse_limited_dict): + + for i in KillHouseOperator.objects.filter(**killhouse_limited_dict): + killhouse_query_val.append(i) + + if len(killhouse_query_val) > 0: + for killhouse in killhouse_query_val: + killhouse_wallet = killhouse.wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=killhouse_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + + internal_dict = { + "base_orde": killhouse.user.base_order, + "fullname": killhouse.user.fullname, + "id": killhouse.user.id, + # "role": poultry.user.name, + "mobile": killhouse.user.mobile, + "national_id": killhouse.user.national_id, + "wallet_key": killhouse.wallet.key, + "inventory": killhouse.wallet.inventory, + "city": killhouse.user.city.name, + "province": killhouse.user.province.name, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + total_list.append(internal_dict) + + for i in city_limited_query: + for key, value in i.items(): + city_limited_dict[key] = value + + if len(city_limited_dict) > 0: + if len(values_item) == len(city_limited_dict): + + for i in CityOperator.objects.filter(**city_limited_dict): + city_query_val.append(i) + + if len(city_query_val) > 0: + for city in city_query_val: + city_wallet = city.wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=city_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + + internal_dict = { + "base_orde": city.user.base_order, + "fullname": city.user.fullname, + "id": city.user.id, + # "role": city.user.name, + "mobile": city.user.mobile, + "national_id": city.user.national_id, + "wallet_key": city.wallet.key, + "inventory": city.wallet.inventory, + "city": city.user.city.name, + "province": city.user.province.name, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + total_list.append(internal_dict) + + for i in driver_limited_query: + for key, value in i.items(): + driver_limited_dict[key] = value + if len(driver_limited_dict) > 0: + if len(values_item) == len(driver_limited_dict): + + for i in KillHouseDriver.objects.filter(**driver_limited_dict): + driver_query_val.append(i) + + if len(driver_query_val) > 0: + for driver in driver_query_val: + driver_wallet = driver.wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=driver_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + + internal_dict = { + "base_orde": driver.user.base_order, + "fullname": driver.user.fullname, + "id": driver.user.id, + # "role": driver.user.name, + "mobile": driver.user.mobile, + "national_id": driver.user.national_id, + "wallet_key": driver.wallet.key, + "inventory": driver.wallet.inventory, + "city": driver.user.city.name, + "province": driver.user.province.name, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + total_list.append(internal_dict) + + for i in inspector_limited_query: + for key, value in i.items(): + inspector_limited_dict[key] = value + if len(inspector_limited_dict) > 0: + if len(values_item) == len(inspector_limited_dict): + for i in InspectorOperator.objects.filter(**inspector_limited_dict): + inspector_query_val.append(i) + + if len(inspector_query_val) > 0: + for inspector in inspector_query_val: + inspector_wallet = inspector.wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=inspector_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + + internal_dict = { + "base_orde": inspector.user.base_order, + "fullname": inspector.user.fullname, + "id": inspector.user.id, + # "role": inspector.user.name, + "mobile": inspector.user.mobile, + "national_id": inspector.user.national_id, + "wallet_key": inspector.wallet.key, + "inventory": inspector.wallet.inventory, + "city": inspector.user.city.name, + "province": inspector.user.province.name, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + total_list.append(internal_dict) + + for i in vet_limited_query: + for key, value in i.items(): + vet_limited_dict[key] = value + if len(vet_limited_dict) > 0: + if len(values_item) == len(vet_limited_dict): + + for i in Vet.objects.filter(**vet_limited_dict): + vet_query_val.append(i) + + if len(vet_query_val) > 0: + for vet in vet_query_val: + vet_wallet = vet.wallet + creditor = 0 + debtor = 0 + penalty = 0 + deposit = 0 + for i in Itransaction.objects.filter(wallet=vet_wallet): + if i.transaction_type == 'creditor': + creditor += i.transfer_amount + elif i.transaction_type == 'debtor': + debtor += i.transfer_amount + elif i.transaction_type == 'penalty': + penalty += i.transfer_amount + elif i.transaction_type == 'deposit': + deposit += i.transfer_amount + + internal_dict = { + "base_orde": vet.user.base_order, + "fullname": vet.user.fullname, + "id": vet.user.id, + # "role": vet.user.name, + "mobile": vet.user.mobile, + "national_id": vet.user.national_id, + "wallet_key": vet.wallet.key, + "inventory": vet.wallet.inventory, + "city": vet.user.city.name, + "province": vet.user.province.name, + "creditor": creditor, + "debtor": debtor, + "penalty": penalty, + "deposit": deposit, + "depositable": (creditor + deposit) - (debtor + penalty) + + } + total_list.append(internal_dict) + + return Response(total_list, status=status.HTTP_200_OK) + + +class FinancialTransactionViewset(viewsets.ModelViewSet): + queryset = FinancialTransaction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = FinancialTransactionSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + + wallet_receive = Wallet.objects.get(key=request.data['wallet_receive']) + user = SystemUserProfile.objects.get(id=request.data['user_id']) + user_system = SystemUserProfile.objects.get(user=request.user) + request.data.pop('wallet_receive') + request.data.pop('user_id') + + if 'image' in request.data.keys(): + images = request.data['image'] + request.data.pop('image') + else: + images = None + image_list = [] + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + finansial_transaction = serializer.create(validated_data=request.data) + if images != None: + for image in images: + image_list.append(send_image_to_server(image)) + + finansial_transaction.image = image_list + + itransactions = Itransaction.objects.filter(file_id=0, wallet=wallet_receive).order_by( + 'create_date') + if itransactions.count() > 0: + itransactions = itransactions.last() + payment_code = itransactions.payment_code + 1 + else: + payment_code = int(user.base_order) + 1 + + if finansial_transaction.type == 'deposit': + + # if user.id == user_system.id: + new_transaction = Itransaction( + wallet=wallet_receive, + transfer_amount=finansial_transaction.cost, + transaction_type=finansial_transaction.type, + payment_code=payment_code, + state='waiting' + ) + else: + + new_transaction = Itransaction( + wallet=wallet_receive, + transfer_amount=finansial_transaction.cost, + transaction_type=finansial_transaction.type, + payment_code=payment_code + ) + new_transaction.save() + finansial_transaction.itransaction = new_transaction + finansial_transaction.save() + new_object = self.serializer_class(finansial_transaction) + return Response(new_object.data, status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + if 'payment_code' in request.GET: + transaction = Itransaction.objects.get(payment_code=int(request.GET['payment_code'])) + financial = FinancialTransaction.objects.get(itransaction=transaction) + serializer = self.serializer_class(financial) + + else: + + query_list = [] + querys = FinancialTransaction.objects.filter(cost=0, trash=False) + + # for query in querys: + # query_list.append(query) + + serializer = self.serializer_class(querys) + return Response(serializer.data, status.HTTP_200_OK) + + +class AdminViewset(viewsets.ModelViewSet): + queryset = Admin.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = AdminSerializer + + +class TypeCheckViewset(viewsets.ModelViewSet): + queryset = Itransaction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ItransactionSerializer + + def update(self, request, *args, **kwargs): + # refresh(request.user.id) + + transaction = Itransaction.objects.get(key=request.data['transaction_key']) + request.data.pop('transaction_key') + state = request.data['state'] + request.data.pop('state') + + if state == 'accepted': + transaction.state = 'pending' + transaction.save() + + elif state == 'rejected': + transaction.state = 'rejected' + transaction.save() + + return Response(status=status.HTTP_200_OK) + + +class HourLimitViewset(viewsets.ModelViewSet): + queryset = HourLimit.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = HourLimitSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + limit_hour = HourLimit.objects.all() + if limit_hour.count() > 0: + limit_hour = limit_hour.last() + limit_hour.hour = request.data['hour'] + limit_hour.active = request.data['active'] + limit_hour.save() + else: + limit_hour = serializer.create(validated_data=request.data) + + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + limit_hour = self.queryset.filter(trash=False).last() + if limit_hour == None: + limit_hour = HourLimit(hour=0) + limit_hour.save() + serializer = self.serializer_class(limit_hour) + return Response(serializer.data, status.HTTP_200_OK) + + +class KillHouseHourLimitViewset(viewsets.ModelViewSet): + queryset = KillHouseHourLimit.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseHourLimitSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + limit_hour = KillHouseHourLimit.objects.all() + if limit_hour.count() > 0: + limit_hour = limit_hour.last() + limit_hour.hour = request.data['hour'] + limit_hour.active = request.data['active'] + limit_hour.save() + else: + limit_hour = serializer.create(validated_data=request.data) + + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + limit_hour = self.queryset.filter(trash=False).last() + if limit_hour == None: + limit_hour = KillHouseHourLimit(hour=0) + limit_hour.save() + serializer = self.serializer_class(limit_hour) + return Response(serializer.data, status.HTTP_200_OK) + + +class SmsLicenseViewset(viewsets.ModelViewSet): + queryset = SmsLicense.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = SmsLicenseSerializer + + def create(self, request, *args, **kwargs): + try: + sms_license = SmsLicense.objects.latest('id') + except SmsLicense.DoesNotExist: + sms_license = None + + serializer = self.serializer_class(sms_license, data=request.data) + if serializer.is_valid(): + serializer.save() + status_code = status.HTTP_200_OK if sms_license else status.HTTP_201_CREATED + return Response(serializer.data, status=status_code) + else: + return Response(serializer.errors) + + +class PoultryAllowCityProvinceViewset(viewsets.ModelViewSet): + queryset = PoultryAllowCityProvince.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryAllowCityProvinceSerializer + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + poultries = Poultry.objects.filter(user=user) + if poultries.count() > 0: + for poultry in poultries: + allow = PoultryAllowCityProvince.objects.filter(poultry=poultry) + if allow.count() > 0: + allow = allow.last() + if request.data['city'] != None: + allow.city = request.data['city'] + if request.data['province'] != None: + allow.province = request.data['province'] + allow.save() + else: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + allow = serializer.create(validated_data=request.data) + allow.poultry = poultry + allow.save() + if allow.city == True: + # sms_allow_poultry_city_province_sms_sms = threading.Thread( + # target=allow_poultry_city_province_sms, + # args=( + # poultry.user.mobile)) + # sms_allow_poultry_city_province_sms_sms.start() + + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', + province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + sms_allow_poultry_city_province_sms_sms = threading.Thread( + target=allow_poultry_city_province_sms, + args=( + province_operator.user.mobile, poultry.unit_name)) + sms_allow_poultry_city_province_sms_sms.start() + + sms_allow_poultry_city_for_poultry_sms_sms = threading.Thread( + target=allow_poultry_city_for_poultry_sms, + args=( + poultry.user.mobile, poultry.unit_name)) + sms_allow_poultry_city_for_poultry_sms_sms.start() + if allow.province == True: + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', + province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + sms_allow_poultry_city_province_sms_sms = threading.Thread( + target=allow_poultry_city_province_sms, + args=( + province_operator.user.mobile, poultry.unit_name)) + sms_allow_poultry_city_province_sms_sms.start() + + sms_allow_poultry_province_for_poultry_sms_sms = threading.Thread( + target=allow_poultry_province_for_poultry_sms, + args=( + poultry.user.mobile, poultry.unit_name)) + sms_allow_poultry_province_for_poultry_sms_sms.start() + return Response({"result": "عملیات با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + poultries = Poultry.objects.filter(user=user) + if poultries.count() > 0: + poultries = poultries.last() + allow = PoultryAllowCityProvince.objects.filter(poultry=poultries) + serializer = self.serializer_class(allow, many=True) + return Response(serializer.data, status.HTTP_200_OK) + + +class ProvinceAllowKillHouseRegisterCarViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowKillHouseRegisterCar.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowKillHouseRegisterCarSerializer + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) + request.data.pop('kill_house_key') + # for kill_house in kill_house_list: + allow = ProvinceAllowKillHouseRegisterCar.objects.filter(kill_house=kill_house) + if allow.count() > 0: + allow = allow.last() + allow.allow = request.data['allow'] + allow.save() + + else: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + allow = serializer.create(validated_data=request.data) + allow.kill_house = kill_house + allow.save() + + return Response({"result": "عملیات با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + + +def AllowKillHouseDirectBuying(allow_state, province): + kill_houses = KillHouse.objects.filter(system_address__province__name=province, trash=False) + for kill_house in kill_houses: + allow = ProvinceAllowKillHouseDirectBuying.objects.filter(kill_house=kill_house).last() + if allow: + allow.allow = allow_state + allow.save() + else: + allow = ProvinceAllowKillHouseDirectBuying( + kill_house=kill_house, + allow=allow_state, + + ) + allow.save() + + +class ProvinceAllowKillHouseDirectBuyingViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowKillHouseDirectBuying.objects.all().order_by('id') + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowKillHouseDirectBuyingSerializer + + def list(self, request, *args, **kwargs): + if 'role' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + kill_house_direct = ProvinceAllowKillHouseDirectBuying.objects.get(trash=False, kill_house=kill_house) + serializer = self.serializer_class(kill_house_direct) + + + else: + serializer = self.serializer_class(self.queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + direct_buying = ProvinceAllowKillHouseDirectBuying.objects.get(key=request.data['direct_buying_key'], + trash=False) + request.data.pop('direct_buying_key') + serializer = self.serializer_class(direct_buying) + serializer.update(instance=direct_buying, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + # allow = request.data['allow'] + # request.data.pop('allow') + # direct_buying.allow = allow + # direct_buying.save() + # return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +class ProvinceAllowKillHouseDirectBuyingTotalViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowKillHouseDirectBuyingTotal.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowKillHouseDirectBuyingTotalSerializer + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + direct_buying_threading = threading.Thread( + target=AllowKillHouseDirectBuying, + args=( + request.data['allow'], + user.province.name)) + direct_buying_threading.start() + direct_buying = ProvinceAllowKillHouseDirectBuyingTotal.objects.all() + if direct_buying.count() > 0: + direct_buying = direct_buying.last() + direct_buying.allow = request.data['allow'] + else: + direct_buying = ProvinceAllowKillHouseDirectBuyingTotal( + allow=request.data['allow'], + + ) + direct_buying.save() + + return Response({"result": "عملیات با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + allow_state = False + direct_buying = ProvinceAllowKillHouseDirectBuyingTotal.objects.all() + if direct_buying.count() > 0: + allow_state = direct_buying.last().allow + + return Response({"allow_state": allow_state}, status.HTTP_200_OK) + + +def AllowKillHouseRegisterguild(allow_state, province): + kill_houses = KillHouse.objects.filter(system_address__province__name=province, trash=False) + for kill_house in kill_houses: + allow = ProvinceAllowKillHouseRegisterGuilds.objects.filter(kill_house=kill_house).last() + if allow: + allow.allow = allow_state + allow.save() + else: + allow = ProvinceAllowKillHouseRegisterGuilds( + kill_house=kill_house, + allow=allow_state, + + ) + allow.save() + + +class ProvinceAllowKillHouseRegisterGuildsViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowKillHouseRegisterGuilds.objects.all().order_by('id') + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowKillHouseRegisterGuildsSerializer + + def update(self, request, *args, **kwargs): + register_guilds = ProvinceAllowKillHouseRegisterGuilds.objects.get(key=request.data['register_guilds_key'], + trash=False) + request.data.pop('register_guilds_key') + allow = request.data['allow'] + request.data.pop('allow') + register_guilds.allow = allow + register_guilds.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +class ProvinceAllowKillHouseRegisterGuildsTotalViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowKillHouseRegisterGuildsTotal.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowKillHouseRegisterGuildsTotalSerializer + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + register_guilds_threading = threading.Thread( + target=AllowKillHouseRegisterguild, + args=( + request.data['allow'], + user.province.name)) + register_guilds_threading.start() + register_guilds = ProvinceAllowKillHouseRegisterGuildsTotal.objects.all() + if register_guilds.count() > 0: + register_guilds = register_guilds.last() + register_guilds.allow = request.data['allow'] + else: + register_guilds = ProvinceAllowKillHouseRegisterGuildsTotal( + allow=request.data['allow'], + + ) + register_guilds.save() + + return Response({"result": "عملیات با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + allow_state = False + register_guilds = ProvinceAllowKillHouseRegisterGuildsTotal.objects.all() + if register_guilds.count() > 0: + allow_state = register_guilds.last().allow + + return Response({"allow_state": allow_state}, status.HTTP_200_OK) + + +def PoultryChooseKillHouse(allow_state, mandatory, province): + poultries = Poultry.objects.filter(address__province__name=province, trash=False) + for poultry in poultries: + allow = ProvinceAllowPoultryChooseKillHouse.objects.filter(poultry=poultry) + if allow.count() > 0: + allow = allow.last() + allow.allow = allow_state + allow.mandatory = mandatory + allow.save() + + else: + allow = ProvinceAllowPoultryChooseKillHouse( + poultry=poultry, + allow=allow_state, + + ) + allow.save() + + +class ProvinceAllowPoultryChooseKillHouseViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowPoultryChooseKillHouse.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowPoultryChooseKillHouseSerializer + + def update(self, request, *args, **kwargs): + # refresh(request.user.id) + + poultry = Poultry.objects.get(key=request.data['poultry_key'], trash=False) + request.data.pop('poultry_key') + allow = request.data['allow'] + mandatory = request.data['mandatory'] + request.data.pop('allow') + request.data.pop('mandatory') + province_allow = ProvinceAllowPoultryChooseKillHouse.objects.filter(poultry=poultry, trash=False) + if province_allow.count() > 0: + province_allow = province_allow.last() + province_allow.allow = allow + province_allow.mandatory = mandatory + province_allow.save() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + else: + return Response({"result": "اجازه ای صادر نشده است !"}, status=status.HTTP_403_FORBIDDEN) + + +class ProvinceAllowPoultryChooseKillHouseTotalViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowPoultryChooseKillHouseTotal.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowPoultryChooseKillHouseTotalSerializer + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + PoultryChooseKillHouse_threading = threading.Thread( + target=PoultryChooseKillHouse, + args=( + request.data['allow'], + request.data['mandatory'], + user.province.name)) + PoultryChooseKillHouse_threading.start() + total_allow = ProvinceAllowPoultryChooseKillHouseTotal.objects.all() + if total_allow.count() > 0: + total_allow = total_allow.last() + total_allow.allow = request.data['allow'] + total_allow.mandatory = request.data['mandatory'] + else: + total_allow = ProvinceAllowPoultryChooseKillHouseTotal( + allow=request.data['allow'], + mandatory=request.data['mandatory'] + + ) + total_allow.save() + + return Response({"result": "عملیات با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + allow_state = False + mandatory = False + total_allow = ProvinceAllowPoultryChooseKillHouseTotal.objects.all() + if total_allow.count() > 0: + allow_state = total_allow.last().allow + mandatory = total_allow.last().mandatory + + return Response({"allow_state": allow_state, "mandatory": mandatory}, status.HTTP_200_OK) + + +def PoultrySellFree(allow_state, province): + poultries = Poultry.objects.filter(address__province__name=province, trash=False) + for poultry in poultries: + allow = ProvinceAllowPoultrySellFree.objects.filter(poultry=poultry) + if allow.count() > 0: + allow = allow.last() + allow.allow = allow_state + allow.save() + + else: + allow = ProvinceAllowPoultrySellFree( + poultry=poultry, + allow=allow_state, + + ) + allow.save() + + +def KillHouseChooseSteward(steward, guilds, province): + kill_houses = KillHouse.objects.filter(system_address__province__name=province, trash=False) + for kill_house in kill_houses: + choose = ProvinceAllowKillHouseChooseStewardGuilds.objects.filter(kill_house=kill_house).last() + if choose: + choose.steward = steward + choose.guilds = guilds + choose.save() + + else: + choose = ProvinceAllowKillHouseChooseStewardGuilds( + kill_house=kill_house, + steward=steward, + guilds=guilds, + + ) + choose.save() + + +class ProvinceAllowPoultrySellFreeViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowPoultrySellFree.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowPoultrySellFreeSerializer + + def update(self, request, *args, **kwargs): + # refresh(request.user.id) + + poultry = Poultry.objects.get(key=request.data['poultry_key'], trash=False) + request.data.pop('poultry_key') + allow = request.data['allow'] + request.data.pop('allow') + province_allow = ProvinceAllowPoultrySellFree.objects.filter(poultry=poultry, trash=False) + if province_allow.count() > 0: + province_allow = province_allow.last() + province_allow.allow = allow + province_allow.save() + else: + province_allow = ProvinceAllowPoultrySellFree( + poultry=poultry, + allow=allow + ) + province_allow.save() + + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +def FreeSaleWithinprovinceThreadByWeight(weight, province): + hatchings = PoultryHatching.objects.filter(poultry__address__province__name=province, archive=False, + allow_hatching='pending', state='pending', trash=False) + for hatching in hatchings: + hatching.total_commitment = hatching.quantity * weight + hatching.total_commitment_quantity = 0 + hatching.save() + + +def FreeSaleWithinprovinceThreadByPercent(percent, province): + hatchings = PoultryHatching.objects.filter(poultry__address__province__name=province, archive=False, + allow_hatching='pending', state='pending', trash=False) + for hatching in hatchings: + # hatching.total_commitment_quantity = hatching.quantity * (percent / 100) + hatching.total_commitment_quantity = int((hatching.quantity - hatching.total_losses) * (percent / 100)) + hatching.total_free_commitment_quantity = ( + hatching.quantity - hatching.total_losses) - hatching.total_commitment_quantity + hatching.total_commitment = 0 + hatching.save() + + +def FreeCommitmentThread(province): + hatchings = PoultryHatching.objects.filter(poultry__address__province__name=province, archive=False, + allow_hatching='pending', state='pending', trash=False) + for hatching in hatchings: + hatching.total_free_commitment_quantity = hatching.quantity - hatching.total_losses + hatching.total_commitment = 0 + hatching.total_commitment_quantity = 0 + hatching.commitment_type = "free" + hatching.save() + + +class FreeSaleWithinprovinceViewset(viewsets.ModelViewSet): + queryset = FreeSaleWithinprovince.objects.all() + permission_classes = [AllowAny] + serializer_class = FreeSaleWithinprovinceSerializer + + def list(self, request, *args, **kwargs): + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if not free_sale_province: + free_sale_province = FreeSaleWithinprovince() + free_sale_province.save() + serializer = self.serializer_class(free_sale_province) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + free_sale = FreeSaleWithinprovince.objects.get(key=request.data['free_sale_key'], trash=False) + request.data.pop('free_sale_key') + if request.data['allow'] == True: + approved_price = ApprovedPrice.objects.filter(trash=False).first() + if approved_price.approved == False: + return Response({"result": "برای فعال کردن تعهد دولتی ابتدا قیمت مصوب مرغ زنده را فعال کنید!"}, + status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(free_sale) + serializer.update(instance=free_sale, validated_data=request.data) + if request.data['allow'] == True and 'type' in request.data.keys(): + if request.data['type'] == 'weight': + FreeSaleWithinprovince_threading_weight = threading.Thread( + target=FreeSaleWithinprovinceThreadByWeight, + args=( + request.data['weight'], + user.province.name)) + FreeSaleWithinprovince_threading_weight.start() + else: + FreeSaleWithinprovince_threading_percent = threading.Thread( + target=FreeSaleWithinprovinceThreadByPercent, + args=( + request.data['percent'], + user.province.name)) + FreeSaleWithinprovince_threading_percent.start() + + else: + FreeCommitmentThread_Threading = threading.Thread( + target=FreeCommitmentThread, + args=(user.province.name,)) + + FreeCommitmentThread_Threading.start() + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProvinceAllowPoultrySellFreeTotalViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowPoultrySellFreeTotal.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowPoultrySellFreeTotalSerializer + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + PoultrySellFree_threading = threading.Thread( + target=PoultrySellFree, + args=( + request.data['allow'], + user.province.name)) + PoultrySellFree_threading.start() + total_allow = ProvinceAllowPoultrySellFreeTotal.objects.all() + if total_allow.count() > 0: + total_allow = total_allow.last() + total_allow.allow = request.data['allow'] + else: + total_allow = ProvinceAllowPoultrySellFreeTotal( + allow=request.data['allow'] + + ) + total_allow.save() + + return Response({"result": "عملیات با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + allow_state = False + total_allow = ProvinceAllowPoultrySellFreeTotal.objects.all() + if total_allow.count() > 0: + allow_state = total_allow.last().allow + + return Response(allow_state, status.HTTP_200_OK) + + +def AutoAcceptMakeRequest(province_kill_request_list): + allow = False + if AutoMakeKillHouseRequest.objects.filter(allow=True).exists(): + allow = True + province_kill_requests = ProvinceKillRequest.objects.filter(key__in=province_kill_request_list, + trash=False).select_related('killhouse_user', + 'kill_request', + 'province_request') + + for province_kill_request in province_kill_requests: + kill_house_check = KillHouseCheckRequest( + province_kill_request=province_kill_request, + role="ProvinceOperator", + state="accepted" + + ) + kill_house_check.save() + province_kill_request.state = 'accepted' + province_kill_request.save() + if allow == True: + user = province_kill_request.province_request.city_request_Poultry.poultry_request.poultry.user + if province_kill_request.kill_request.slaughter_house != None: + kill_house = province_kill_request.kill_request.slaughter_house + else: + kill_house = province_kill_request.kill_request.kill_house + + car = KillHouseADDCAR.objects.filter(kill_house=kill_house, trash=False).first() + bar_code = KillHouseRequest.objects.filter( + province_request__city_request_Poultry__poultry_request__poultry__user=user, trash=False).order_by( + 'create_date') + if bar_code.count() > 0: + if bar_code.last().bar_code != None: + bar_code_number = bar_code.last().bar_code + 1 + else: + bar_code_number = int( + str(province_kill_request.province_request.city_request_Poultry.poultry_request.order_code) + '0001') + if car: + kill_house_request = KillHouseRequest( + killhouse_user=province_kill_request.killhouse_user, + kill_request=province_kill_request.kill_request, + province_request=province_kill_request.province_request, + province_kill_request=province_kill_request, + bar_code=bar_code_number, + quantity=province_kill_request.quantity, + capacity=province_kill_request.quantity, + add_car=car, + state='accepted', + + ) + kill_house_request.save() + province_kill_request.quantity = 0 + province_kill_request.save() + + +class ProvinceAutoAllocationViewset(viewsets.ModelViewSet): + queryset = ProvinceAutoAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAutoAllocationSerializer + + def create(self, request, *args, **kwargs): + debt = False + filter_list = request.data['filter_list'] + for first_item in filter_list: + if 'minimum_allocation' in first_item: + minimum_allocation = int(first_item['minimum_allocation']) + del first_item['minimum_allocation'] + else: + minimum_allocation = 0 + + if 'no_debt' in first_item: + debt = True + del first_item['no_debt'] + + filter_list_keys = [] + request.data.pop('filter_list') + now = datetime.strptime(str(request.data['date']), '%Y-%m-%d') + request.data.pop('date') + + for item in filter_list: + filter_list_keys.extend(item.keys()) + if 'city' in filter_list_keys or 'kill_place' in filter_list_keys: + pass + else: + return Response({"result": "باید یکی از پارامتر های شهر یا محل کشتار را انتخاب کنید"}, + status=status.HTTP_403_FORBIDDEN) + + now = now + timedelta(hours=14, minutes=30, seconds=45) + quantity_sum = 0 + allocation_order_code = ProvinceAutoAllocation.objects.filter(trash=False).order_by('id') + allocation_order_code_number = allocation_order_code.last().allocation_order_code + 1 if allocation_order_code.count() > 0 else 1000 + user = SystemUserProfile.objects.get(user=request.user, trash=False) + poultry_requests = PoultryRequest.objects.filter( + trash=False, + province_state='accepted', + final_state='pending', + send_date__year=now.year, + send_date__month=now.month, + send_date__day=now.day, + remain_quantity__gt=0, + poultry__address__province=user.province + ).order_by('-quantity') + + quantity_sum = poultry_requests.aggregate(total_quantity=Sum('remain_quantity')).get('total_quantity', 0) + if quantity_sum == None: + return Response({"result": "تعداد درخواست کشتار ها صفر است"}, status=status.HTTP_403_FORBIDDEN) + else: + percentages = KillHousePercentage.objects.filter(trash=False, + kill_house__system_address__province=user.province, + percent__gt=0).order_by( + '-percent') + add_quantity = 0 + for kill_house_percentage in percentages: + + kill_request_quantity = (kill_house_percentage.percent / 100) * quantity_sum + if kill_request_quantity.is_integer(): + kill_request_quantity = (kill_house_percentage.percent / 100) * quantity_sum + else: + kill_request_quantity = math.ceil((kill_house_percentage.percent / 100) * quantity_sum) + + kill_request = KillRequest( + kill_house=kill_house_percentage.kill_house, + kill_capacity=kill_request_quantity, + remain_quantity=kill_request_quantity, + recive_time='14 - 16', + province_state='accepted', + automatic=True, + recive_date=now + ) + kill_request.save() + + if debt == True: + if KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__killhouse_user=kill_request.kill_house, + state='pending').exists(): + kill_request.automatic_debt = True + kill_request.save() + + price = Pricing.objects.all() + if price.count() > 0: + price = price.last() + factor = KillRequestFactor( + kill_request=kill_request, + amount=round( + (kill_request.kill_capacity * 2.7) * price.live_chicken_price, + 0), + minimum_amount=round( + ((kill_request.kill_capacity * 2.7) * price.live_chicken_price) * ( + 70 / 100), + 0) + + ) + factor.save() + kill_request.factor_amount = factor.amount + kill_request.save() + + kill_house_daily_quota = KillHouseDailyQuota( + kill_house=kill_house_percentage.kill_house, + kill_request=kill_request, + percent=kill_house_percentage.percent, + quantity=kill_request_quantity, + remain_quantity=kill_request_quantity, + ) + kill_house_daily_quota.save() + if kill_house_percentage.kill_house_for_killer != None: + kill_request.slaughter_house = kill_house_percentage.kill_house_for_killer + kill_request.save() + kill_house_daily_quota.killer_kill_house = kill_house_percentage.kill_house_for_killer + kill_house_daily_quota.save() + # if add_quantity > 0 : + # daily_quotas_lists = KillHouseDailyQuota.objects.filter(trash=False, create_date__day=now.day, + # create_date__month=now.month, + # create_date__year=now.year).order_by( + # '-quantity') + # for daily in daily_quotas_lists: + # daily_quta=math.ceil((daily.percent/100) * add_quantity) + # # if daily_quta.is_integer(): + # # daily_quta = daily_quta + # # else: + # # daily_quta = math.ceil(daily_quta) + # daily.quantity += daily_quta + # daily.save() + # daily.kill_request.kill_capacity +=daily_quta + # daily.kill_request.remain_quantity +=daily_quta + # daily.kill_request.save() + + total_kill_house_daily_list = [] + for filter_key in filter_list_keys: + daily_quotas_lists = KillHouseDailyQuota.objects.filter(trash=False, create_date__day=now.day, + create_date__month=now.month, + create_date__year=now.year).order_by( + '-quantity') + if filter_key == 'kill_place' or filter_key == 'city': + + if len(total_kill_house_daily_list) == 0: + for poultry_request in poultry_requests: + if poultry_request.remain_quantity == 0: + continue + for daily_quotas_list in daily_quotas_lists: + if daily_quotas_list.killer_kill_house != None: + city = daily_quotas_list.killer_kill_house.system_address.city + if city == poultry_request.poultry.address.city: + if daily_quotas_list not in total_kill_house_daily_list: + for daily_quotas_list_kill_house_internal in daily_quotas_lists: + if daily_quotas_list_kill_house_internal.kill_house == daily_quotas_list.killer_kill_house: + if daily_quotas_list_kill_house_internal not in total_kill_house_daily_list: + total_kill_house_daily_list.append( + daily_quotas_list_kill_house_internal) + # break + total_kill_house_daily_list.append(daily_quotas_list) + for daily_quotas_list_first_internal in daily_quotas_lists: + if daily_quotas_list_first_internal.killer_kill_house == daily_quotas_list.killer_kill_house: + if not daily_quotas_list_first_internal in total_kill_house_daily_list: + total_kill_house_daily_list.append( + daily_quotas_list_first_internal) + else: + continue + else: + if daily_quotas_list.kill_house.system_address.city == poultry_request.poultry.address.city: + if daily_quotas_list not in total_kill_house_daily_list: + total_kill_house_daily_list.append(daily_quotas_list) + for daily_quotas_list_internal in daily_quotas_lists: + if daily_quotas_list_internal.killer_kill_house == daily_quotas_list.killer_kill_house: + if not daily_quotas_list_internal in total_kill_house_daily_list: + total_kill_house_daily_list.append(daily_quotas_list_internal) + else: + continue + for daily_quotas_remain_list in daily_quotas_lists: + if daily_quotas_remain_list not in total_kill_house_daily_list: + total_kill_house_daily_list.append(daily_quotas_remain_list) + + + + else: + internal_kill_place_list = total_kill_house_daily_list + total_kill_house_daily_list = [] + for poultry_request in poultry_requests: + if poultry_request.remain_quantity == 0: + continue + + for internal_daily_quotas_list in internal_kill_place_list: + if internal_daily_quotas_list.killer_kill_house != None: + city = internal_daily_quotas_list.killer_kill_house.system_address.city + if city == poultry_request.poultry.address.city: + if internal_daily_quotas_list not in total_kill_house_daily_list: + for daily_quotas_list_kill_house_internal_second in internal_kill_place_list: + if daily_quotas_list_kill_house_internal_second.kill_house == internal_daily_quotas_list.killer_kill_house: + if daily_quotas_list_kill_house_internal_second not in total_kill_house_daily_list: + total_kill_house_daily_list.append( + daily_quotas_list_kill_house_internal_second) + # break + total_kill_house_daily_list.append(internal_daily_quotas_list) + for internal_daily_quotas_list_first in daily_quotas_lists: + if internal_daily_quotas_list_first.killer_kill_house == internal_daily_quotas_list.killer_kill_house or internal_daily_quotas_list_first.kill_house == internal_daily_quotas_list.killer_kill_house: + if not internal_daily_quotas_list_first in total_kill_house_daily_list: + total_kill_house_daily_list.append( + internal_daily_quotas_list_first) + else: + continue + else: + if internal_daily_quotas_list.kill_house.system_address.city == poultry_request.poultry.address.city: + if internal_daily_quotas_list not in total_kill_house_daily_list: + total_kill_house_daily_list.append(internal_daily_quotas_list) + for daily_quotas_list_internal_second in internal_kill_place_list: + if daily_quotas_list_internal_second.killer_kill_house == internal_daily_quotas_list.killer_kill_house: + if not daily_quotas_list_internal_second in total_kill_house_daily_list: + total_kill_house_daily_list.append( + daily_quotas_list_internal_second) + else: + continue + + for internal_daily_quotas_remain_list in internal_kill_place_list: + if internal_daily_quotas_remain_list not in total_kill_house_daily_list: + total_kill_house_daily_list.append(internal_daily_quotas_remain_list) + + for poultry_request in poultry_requests: + + if poultry_request.remain_quantity == 0: + continue + province_ckeck = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + + for kill_house_daily in total_kill_house_daily_list: + kill_request = KillRequest.objects.get(key=kill_house_daily.kill_request.key, trash=False) + + if kill_request.remain_quantity == 0: + continue + + if poultry_request.remain_quantity == 0: + continue + if kill_house_daily.killer_kill_house != None: + city = kill_house_daily.killer_kill_house.system_address.city + else: + city = kill_house_daily.kill_house.system_address.city + + if city != poultry_request.poultry.address.city: + continue + if kill_request.remain_quantity > poultry_request.remain_quantity: + province_kill_request = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + dont_show_kill_house=True, + kill_request=kill_request, + province_request=province_ckeck, + quantity=poultry_request.remain_quantity, + main_quantity=poultry_request.remain_quantity, + automatic=True, + + ) + province_kill_request.save() + allocation = ProvinceAutoAllocation( + daily_quota=kill_house_daily, + poultry_request=poultry_request, + quantity=poultry_request.remain_quantity, + allocation_order_code=allocation_order_code_number, + province_kill_request=province_kill_request, + + ) + allocation.save() + if minimum_allocation > 0 and allocation.quantity < minimum_allocation: + allocation.unauthorized_number = True + allocation.save() + kill_request.remain_quantity -= poultry_request.remain_quantity + kill_request.save() + poultry_request.remain_quantity = 0 + poultry_request.save() + province_ckeck.quantity = 0 + province_ckeck.save() + elif kill_request.remain_quantity == poultry_request.remain_quantity: + + province_kill_request = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + dont_show_kill_house=True, + kill_request=kill_request, + province_request=province_ckeck, + quantity=poultry_request.remain_quantity, + main_quantity=poultry_request.remain_quantity, + automatic=True, + + ) + province_kill_request.save() + allocation = ProvinceAutoAllocation( + daily_quota=kill_house_daily, + poultry_request=poultry_request, + quantity=poultry_request.remain_quantity, + allocation_order_code=allocation_order_code_number, + province_kill_request=province_kill_request, + + ) + allocation.save() + if minimum_allocation > 0 and allocation.quantity < minimum_allocation: + allocation.unauthorized_number = True + allocation.save() + kill_request.remain_quantity = 0 + kill_request.save() + poultry_request.remain_quantity = 0 + poultry_request.save() + province_ckeck.quantity = 0 + province_ckeck.save() + else: + province_kill_request = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + dont_show_kill_house=True, + kill_request=kill_request, + province_request=province_ckeck, + quantity=kill_request.remain_quantity, + main_quantity=kill_request.remain_quantity, + automatic=True, + + ) + province_kill_request.save() + + allocation = ProvinceAutoAllocation( + daily_quota=kill_house_daily, + poultry_request=poultry_request, + quantity=kill_request.remain_quantity, + allocation_order_code=allocation_order_code_number, + province_kill_request=province_kill_request, + + ) + allocation.save() + if minimum_allocation > 0 and allocation.quantity < minimum_allocation: + allocation.unauthorized_number = True + allocation.save() + poultry_request.remain_quantity -= kill_request.remain_quantity + poultry_request.save() + province_ckeck.quantity -= kill_request.remain_quantity + province_ckeck.save() + kill_request.remain_quantity = 0 + kill_request.save() + + for poultry_request in poultry_requests: + + if poultry_request.remain_quantity == 0: + continue + province_ckeck = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + + for kill_house_daily in total_kill_house_daily_list: + kill_request = KillRequest.objects.get(key=kill_house_daily.kill_request.key, trash=False) + + if kill_request.remain_quantity == 0: + continue + + if poultry_request.remain_quantity == 0: + continue + if kill_request.remain_quantity > poultry_request.remain_quantity: + province_kill_request = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + dont_show_kill_house=True, + kill_request=kill_request, + province_request=province_ckeck, + quantity=poultry_request.remain_quantity, + main_quantity=poultry_request.remain_quantity, + automatic=True, + + ) + province_kill_request.save() + allocation = ProvinceAutoAllocation( + daily_quota=kill_house_daily, + poultry_request=poultry_request, + quantity=poultry_request.remain_quantity, + allocation_order_code=allocation_order_code_number, + province_kill_request=province_kill_request, + + ) + allocation.save() + if minimum_allocation > 0 and allocation.quantity < minimum_allocation: + allocation.unauthorized_number = True + allocation.save() + kill_request.remain_quantity -= poultry_request.remain_quantity + kill_request.save() + poultry_request.remain_quantity = 0 + poultry_request.save() + province_ckeck.quantity = 0 + province_ckeck.save() + elif kill_request.remain_quantity == poultry_request.remain_quantity: + + province_kill_request = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + dont_show_kill_house=True, + kill_request=kill_request, + province_request=province_ckeck, + quantity=poultry_request.remain_quantity, + main_quantity=poultry_request.remain_quantity, + automatic=True, + + ) + province_kill_request.save() + allocation = ProvinceAutoAllocation( + daily_quota=kill_house_daily, + poultry_request=poultry_request, + quantity=poultry_request.remain_quantity, + allocation_order_code=allocation_order_code_number, + province_kill_request=province_kill_request, + + ) + allocation.save() + if minimum_allocation > 0 and allocation.quantity < minimum_allocation: + allocation.unauthorized_number = True + allocation.save() + kill_request.remain_quantity = 0 + kill_request.save() + poultry_request.remain_quantity = 0 + poultry_request.save() + province_ckeck.quantity = 0 + province_ckeck.save() + else: + province_kill_request = ProvinceKillRequest( + killhouse_user=kill_request.kill_house, + dont_show_kill_house=True, + kill_request=kill_request, + province_request=province_ckeck, + quantity=kill_request.remain_quantity, + main_quantity=kill_request.remain_quantity, + automatic=True, + + ) + province_kill_request.save() + + allocation = ProvinceAutoAllocation( + daily_quota=kill_house_daily, + poultry_request=poultry_request, + quantity=kill_request.remain_quantity, + allocation_order_code=allocation_order_code_number, + province_kill_request=province_kill_request, + + ) + allocation.save() + if minimum_allocation > 0 and allocation.quantity < minimum_allocation: + allocation.unauthorized_number = True + allocation.save() + poultry_request.remain_quantity -= kill_request.remain_quantity + poultry_request.save() + province_ckeck.quantity -= kill_request.remain_quantity + province_ckeck.save() + kill_request.remain_quantity = 0 + kill_request.save() + + return Response({"result": "تخصیص اتوماتیک با موفقیت انجام شد."}, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + poultry_requests_list = [] + date1 = datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + poultry_requests_lists = PoultryRequest.objects.filter( + trash=False, + province_state='accepted', + final_state='pending', + poultry__address__province=user.province + ).order_by('-quantity') + poultry_requests = [ + poultry_request_list for poultry_request_list in poultry_requests_lists + if date1 <= poultry_request_list.send_date.date() <= date2 + ] + if len(poultry_requests) > 0: + if request.GET['state'] == 'temporary': + + for poultry_request in poultry_requests: + allocations_sum = 0 + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request__poultry_request=poultry_request, trash=False, + state__in=('pending', 'accepted'), automatic=False) + if province_kill_requests.count() > 0: + for province_kill_request in province_kill_requests: + allocations_sum += province_kill_request.main_quantity + poultry_request_dict = { + "poultry_user_fullname": poultry_request.poultry.user.fullname, + "poultry_key": poultry_request.key, + "poultry_mobile": poultry_request.poultry.user.mobile, + "poultry_name": poultry_request.poultry.unit_name, + "poultry_address": poultry_request.poultry.address.city.name, + "poultry_quantity": poultry_request.quantity, + "poultry_request_index_weight": poultry_request.Index_weight, + "poultry_request_weight": poultry_request.quantity * poultry_request.Index_weight, + "poultry_request_key": poultry_request.key, + "poultry_remain_quantity": poultry_request.remain_quantity, + } + allocations_list = [] + allocations = ProvinceAutoAllocation.objects.filter(poultry_request=poultry_request, + state='temporary', trash=False) + if allocations.count() > 0: + + for allocation in allocations: + allocations_sum += allocation.quantity + if allocation.daily_quota.killer_kill_house != None: + Killing_place = allocation.daily_quota.killer_kill_house.name + buyer_address = allocation.daily_quota.killer_kill_house.system_address.city.name + else: + Killing_place = allocation.daily_quota.kill_house.name + buyer_address = allocation.daily_quota.kill_house.system_address.city.name + allocation_dict = { + "allocation_key": allocation.key, + "type": allocation.daily_quota.kill_house.killer, + "buyer_name": allocation.daily_quota.kill_house.kill_house_operator.user.fullname, + "buyer_mobile": allocation.daily_quota.kill_house.kill_house_operator.user.mobile, + "buyer_address": buyer_address, + "allocation_quantity": allocation.quantity, + "allocation_weight": allocation.quantity * poultry_request.Index_weight, + "allocation_percent": allocation.daily_quota.percent, + "unauthorized_number": allocation.unauthorized_number, + "Killing_place": Killing_place, + "debt": allocation.daily_quota.kill_request.automatic_debt, + } + + allocations_list.append(allocation_dict) + + poultry_request_dict.update({ + "allocations": allocations_list, + "allocations_sum": allocations_sum, + }) + poultry_requests_list.append(poultry_request_dict) + return Response(poultry_requests_list, status=status.HTTP_200_OK) + # return Response({"result": "تعدادی برای تخصیص وجود ندارد!"}, status=status.HTTP_200_OK) + + else: + allocation_order_code_list = [] + final_allocation_list = [] + for poultry_request in poultry_requests: + allocations = ProvinceAutoAllocation.objects.filter(poultry_request=poultry_request, + state='final_registration', trash=False) + if allocations.count() > 0: + for allocation in allocations: + if allocation.allocation_order_code in allocation_order_code_list: + pass + else: + allocation_order_code_list.append(allocation.allocation_order_code) + + if len(allocation_order_code_list) > 0: + for allocation_order_code in sorted(allocation_order_code_list): + poultry_requests_list = [] + kill_house_list = [] + poultry_list = [] + allocated_quantity = 0 + total_quantity = 0 + internal_allocation_dict = { + "allocation_order_code": allocation_order_code, + "allocation_date": allocation_order_code, + } + + for poultry_request in poultry_requests: + if poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(poultry_request.poultry) + allocations_sum = 0 + total_quantity += poultry_request.quantity + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request__poultry_request=poultry_request, trash=False, + state__in=('pending', 'accepted'), automatic=False) + if province_kill_requests.count() > 0: + for province_kill_request in province_kill_requests: + allocations_sum += province_kill_request.main_quantity + poultry_request_dict = { + "poultry_user_fullname": poultry_request.poultry.user.fullname, + "poultry_mobile": poultry_request.poultry.user.mobile, + "poultry_name": poultry_request.poultry.unit_name, + "poultry_address": poultry_request.poultry.address.city.name, + "poultry_quantity": poultry_request.quantity, + "poultry_request_key": poultry_request.key, + "poultry_request_index_weight": poultry_request.Index_weight, + "poultry_request__weight": poultry_request.quantity * poultry_request.Index_weight, + "poultry_remain_quantity": poultry_request.remain_quantity, + } + allocations_list = [] + allocations = ProvinceAutoAllocation.objects.filter(poultry_request=poultry_request, + state='final_registration', + allocation_order_code=allocation_order_code, + trash=False) + if allocations.count() > 0: + + for allocation in allocations: + debt = False + if allocation.daily_quota.kill_house in kill_house_list: + pass + else: + kill_house_list.append(allocation.daily_quota.kill_house) + allocation_date = str(allocation.create_date.date()) + allocations_sum += allocation.quantity + if allocation.daily_quota.killer_kill_house != None: + Killing_place = allocation.daily_quota.killer_kill_house.name + buyer_address = allocation.daily_quota.killer_kill_house.system_address.city.name + + else: + Killing_place = allocation.daily_quota.kill_house.name + buyer_address = allocation.daily_quota.kill_house.system_address.city.name + + # if KillHouseFactorToProvince.objects.filter( + # province_factor__province_check_info__kill_house_assignment__kill_house_request__killhouse_user=allocation.daily_quota.kill_house, + # state='pending').exists(): + + allocation_dict = { + "allocation_key": allocation.key, + "type": allocation.daily_quota.kill_house.killer, + "buyer_name": allocation.daily_quota.kill_house.kill_house_operator.user.fullname, + "buyer_mobile": allocation.daily_quota.kill_house.kill_house_operator.user.mobile, + "buyer_address": buyer_address, + "allocation_quantity": allocation.quantity, + "allocation_weight": allocation.quantity * poultry_request.Index_weight, + "allocation_percent": allocation.daily_quota.percent, + "Killing_place": Killing_place, + "debt": allocation.daily_quota.kill_request.automatic_debt, + "unauthorized_number": allocation.unauthorized_number, + } + + allocations_list.append(allocation_dict) + + poultry_request_dict.update({ + "allocations": allocations_list, + "allocations_sum": allocations_sum, + }) + poultry_requests_list.append(poultry_request_dict) + allocated_quantity += allocations_sum + internal_allocation_dict.update({"allocations_list": poultry_requests_list, + "allocation_date": allocation.create_date, + "allocated_quantity": allocated_quantity, + "total_quantity": total_quantity, + "number_of_poultry": len(poultry_list), + "number_of_kill_house": len(kill_house_list)}) + final_allocation_list.append(internal_allocation_dict) + + return Response(final_allocation_list, status=status.HTTP_200_OK) + else: + if request.GET['state'] == 'temporary': + return Response({"result": "تعدادی برای تخصیص وجود ندارد!"}, status=status.HTTP_200_OK) + else: + return Response([], status=status.HTTP_200_OK) + # return Response({"result": "تعدادی برای بایگانی وجود ندارد!"}, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + if 'allocation_list' in request.data.keys(): + + allocation_lists = request.data['allocation_list'] + request.data.pop('allocation_list') + daily_quota_objects = [] + allocation_objects = [] + for allocation_list in allocation_lists: + allocation = ProvinceAutoAllocation.objects.get(key=allocation_list["allocationKey"], trash=False) + poultry_request = PoultryRequest.objects.get(key=allocation.poultry_request.key, trash=False) + province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request) + if allocation.quantity > allocation_list["allocationQuantity"]: + province_check.quantity += allocation.quantity - allocation_list["allocationQuantity"] + poultry_request.remain_quantity += allocation.quantity - allocation_list["allocationQuantity"] + province_check.save() + poultry_request.save() + else: + province_check.quantity -= allocation_list["allocationQuantity"] - allocation.quantity + poultry_request.remain_quantity -= allocation_list["allocationQuantity"] - allocation.quantity + province_check.save() + poultry_request.save() + + allocation.quantity = allocation_list["allocationQuantity"] + allocation.save() + province_kill_request = ProvinceKillRequest.objects.get( + key=allocation.province_kill_request.key) + province_kill_request.quantity = allocation_list["allocationQuantity"] + province_kill_request.main_quantity = allocation_list["allocationQuantity"] + province_kill_request.save() + + allocation_objects.append(allocation) + daily_quota_objects.append(allocation.daily_quota) + for daily_quota_object in daily_quota_objects: + quantity = 0 + for allocation_object in allocation_objects: + if allocation_object.daily_quota == daily_quota_object: + quantity += allocation_object.quantity + daily_quota_object.quantity = quantity + daily_quota_object.save() + kill_request = KillRequest.objects.get(key=daily_quota_object.kill_request.key, trash=False) + kill_request.kill_capacity = quantity + kill_request.remain_quantity = 0 + kill_request.save() + + return Response({"result": "با موفقیت ویرایش شد."}, status=status.HTTP_200_OK) + elif 'allocation_delete_list' in request.data.keys(): + allocation_lists = request.data['allocation_delete_list'] + request.data.pop('allocation_delete_list') + for allocation_list in allocation_lists: + allocation = ProvinceAutoAllocation.objects.get(key=allocation_list["allocationKey"], trash=False) + province_kill_request = ProvinceKillRequest.objects.get( + key=allocation.province_kill_request.key) + province_check = ProvinceCheckOperatorRequest.objects.get( + key=province_kill_request.province_request.key) + province_check.quantity += province_kill_request.main_quantity + province_check.save() + province_kill_request.trash = True + province_kill_request.save() + + daily_object = KillHouseDailyQuota.objects.get(key=allocation.daily_quota.key, trash=False) + poultry_request = PoultryRequest.objects.get(key=allocation.poultry_request.key) + poultry_request.remain_quantity += allocation.quantity + poultry_request.save() + kill_request = KillRequest.objects.get(key=allocation.daily_quota.kill_request.key, trash=False) + kill_request.trash = True + kill_request.save() + daily_object.trash = True + daily_object.save() + allocation.trash = True + allocation.save() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + elif 'final_registration_list' in request.data.keys(): + province_kill_requeest_list = [] + final_registration_list = request.data['final_registration_list'] + for allocation_list in final_registration_list: + final_registration = ProvinceAutoAllocation.objects.get(key=allocation_list["allocationKey"], + trash=False) + province_kill_request = ProvinceKillRequest.objects.get( + key=final_registration.province_kill_request.key, trash=False) + province_kill_request.dont_show_kill_house = False + province_kill_request.save() + final_registration.state = 'final_registration' + final_registration.save() + province_kill_requeest_list.append(province_kill_request.key) + if AutoAcceptProvinceKillRequest.objects.filter(allow=True).exists(): + AutoAcceptMakeRequest_threading = threading.Thread( + target=AutoAcceptMakeRequest, + args=( + province_kill_requeest_list, + )) + AutoAcceptMakeRequest_threading.start() + return Response({"result": "ثبت نهایی با موفقیت انجام شد."}) + elif 'cancellation' in request.data.keys(): + cancellation_allocations_list = request.data['cancellation'] + daily_quota_list = [] + for delete_allocation in cancellation_allocations_list: + + allocation = ProvinceAutoAllocation.objects.get(key=delete_allocation["allocationKey"], trash=False) + if allocation.daily_quota not in daily_quota_list: + daily_quota_list.append(allocation.daily_quota) + province_kill_request = ProvinceKillRequest.objects.get(key=allocation.province_kill_request.key, + trash=False) + province_check = ProvinceCheckOperatorRequest.objects.get( + key=province_kill_request.province_request.key) + province_check.quantity += province_kill_request.main_quantity + province_check.save() + poultry_request = PoultryRequest.objects.get(key=province_check.poultry_request.key, trash=False) + poultry_request.remain_quantity += province_kill_request.main_quantity + poultry_request.save() + + province_kill_request.delete() + allocation.delete() + + for daily_quota_internal_list in daily_quota_list: + daily_quota = KillHouseDailyQuota.objects.get(key=daily_quota_internal_list.key) + kill_request = KillRequest.objects.get(key=daily_quota.kill_request.key, trash=False) + factor = KillRequestFactor.objects.get(kill_request=kill_request, trash=False) + factor.delete() + kill_request.delete() + daily_quota.delete() + + return Response({"result": "ثبت نهایی با موفقیت انجام شد."}) + + else: + allocation_lists = request.data['allocation_add_list'] + request.data.pop('allocation_add_list') + + for allocation_list in allocation_lists: + + poultry_request = PoultryRequest.objects.get(key=allocation_list["poultry_request_key"]) + province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request, trash=False) + kill_house_percentage = KillHousePercentage.objects.get( + kill_house__key=allocation_list["kill_house_key"]) + kill_request = KillRequest( + kill_house=kill_house_percentage.kill_house, + kill_capacity=int(allocation_list["quantity"]), + remain_quantity=0, + recive_time='14 - 16', + province_state='accepted', + automatic=True, + recive_date=datetime.now() + ) + kill_request.save() + price = Pricing.objects.all() + if price.count() > 0: + price = price.last() + factor = KillRequestFactor( + kill_request=kill_request, + amount=round( + (kill_request.kill_capacity * 2.7) * price.live_chicken_price, + 0), + minimum_amount=round( + ((kill_request.kill_capacity * 2.7) * price.live_chicken_price) * ( + 70 / 100), + 0) + + ) + factor.save() + kill_request.factor_amount = factor.amount + kill_request.save() + kill_house_daily_quota = KillHouseDailyQuota( + kill_house=kill_house_percentage.kill_house, + kill_request=kill_request, + percent=kill_house_percentage.percent, + quantity=kill_request.kill_capacity, + remain_quantity=kill_request.kill_capacity, + ) + kill_house_daily_quota.save() + if kill_house_percentage.kill_house_for_killer != None: + kill_request.slaughter_house = kill_house_percentage.kill_house_for_killer + kill_request.save() + kill_house_daily_quota.killer_kill_house = kill_house_percentage.kill_house_for_killer + kill_house_daily_quota.save() + poultry_request.remain_quantity -= int(allocation_list["quantity"]) + poultry_request.save() + allocation_list = ProvinceAutoAllocation.objects.all() + if allocation_list.count() > 0: + code = allocation_list.last().allocation_order_code + else: + code = 1000 + + province_kill_request = ProvinceKillRequest( + killhouse_user=kill_house_percentage.kill_house, + dont_show_kill_house=True, + kill_request=kill_request, + province_request=province_check, + quantity=kill_request.kill_capacity, + main_quantity=kill_request.kill_capacity, + automatic=True, + + ) + province_kill_request.save() + province_check = ProvinceCheckOperatorRequest.objects.get( + key=province_kill_request.province_request.key) + province_check.quantity -= province_kill_request.main_quantity + province_check.save() + + allocation = ProvinceAutoAllocation( + daily_quota=kill_house_daily_quota, + poultry_request=poultry_request, + quantity=kill_request.kill_capacity, + allocation_order_code=code, + province_kill_request=province_kill_request + + ) + allocation.save() + + return Response({"result": "تخصیص با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + +# +# class ProvinceAutoAcceptAllocationProvinceKillRequestViewset(viewsets.ModelViewSet): +# queryset = ProvinceKillRequest.objects.all() +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = ProvinceKillRequestSerializer +# +# +# +# +# def create(self, request, *args, **kwargs): +# date=datetime.now().date() +# # allocations = ProvinceAutoAllocation.objects.filter(trash=False, create_date__date=date).select_related( +# # 'poultry_request', +# # 'province_kill_request', +# # 'daily_quota__kill_house__kill_house_operator__user', +# # 'daily_quota__killer_kill_house__kill_house_operator__user' +# # ) +# +# poultry_requests = PoultryRequest.objects.filter( +# poultry_request_auto_quantity_province__in=ProvinceAutoAllocation.objects.filter( +# trash=False, +# create_date__date=date +# ).values('poultry_request_id') +# ).distinct() +# +# +# +# return Response(poultry_requests.query, status=status.HTTP_201_CREATED) + + +class AutoAcceptProvinceKillRequestViewset(viewsets.ModelViewSet): + queryset = AutoAcceptProvinceKillRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = AutoAcceptProvinceKillRequestSerializer + + def update(self, request, *args, **kwargs): + serializer = self.serializer_class(data=request.data) + auto_accept = AutoAcceptProvinceKillRequest.objects.all().first() + if serializer.is_valid(): + + if auto_accept: + serializer.update(instance=auto_accept, validated_data=request.data) + else: + serializer.create(validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + auto_accept = AutoAcceptProvinceKillRequest.objects.all().first() + allow = False + if auto_accept: + allow = auto_accept.allow + return Response(allow, status=status.HTTP_200_OK) + + +class AutoMakeKillHouseRequestViewset(viewsets.ModelViewSet): + queryset = AutoMakeKillHouseRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = AutoMakeKillHouseRequestSerializer + + def update(self, request, *args, **kwargs): + serializer = self.serializer_class(data=request.data) + auto_accept = AutoMakeKillHouseRequest.objects.all().first() + if serializer.is_valid(): + + if auto_accept: + serializer.update(instance=auto_accept, validated_data=request.data) + else: + serializer.create(validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + auto_accept = AutoMakeKillHouseRequest.objects.all().first() + allow = False + if auto_accept: + allow = auto_accept.allow + return Response(allow, status=status.HTTP_200_OK) + + +class KillHousePercentageOfLossesViewset(viewsets.ModelViewSet): + queryset = KillHousePercentageOfLosses.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHousePercentageOfLossesSerializer + + +class ProvinceAllowKillHouseChooseStewardGuildsViewset(viewsets.ModelViewSet): + queryset = ProvinceAllowKillHouseChooseStewardGuilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceAllowKillHouseChooseStewardGuildsSerializer + + # def create(self, request, *args, **kwargs): + # user = SystemUserProfile.objects.get(user=request.user, trash=False) + # steward = False + # guilds = False + # kill_house_choose_threading = threading.Thread( + # target=KillHouseChooseSteward, + # args=( + # steward, + # # request.data['steward'], + # guilds, + # # request.data['guilds'], + # user.province.name)) + # kill_house_choose_threading.start() + # return Response({"result": "عملیات با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house_choose_threading = threading.Thread( + target=KillHouseChooseSteward, + args=( + request.data['steward'], + request.data['guilds'], + user.province.name)) + kill_house_choose_threading.start() + return Response({"result": "عملیات با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + if 'kill_house_key' in request.GET and request.GET['kill_house_key'] != None: + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key']) + queryset = ProvinceAllowKillHouseChooseStewardGuilds.objects.get(kill_house=kill_house) + serializer = self.serializer_class(queryset) + else: + + queryset = ProvinceAllowKillHouseChooseStewardGuilds.objects.all().order_by('id') + serializer = self.serializer_class(queryset, many=True) + return Response(serializer.data, status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + choose_steward_guilds = ProvinceAllowKillHouseChooseStewardGuilds.objects.get( + key=request.data['choose_steward_guilds_key']) + request.data.pop('choose_steward_guilds_key') + serializer = self.serializer_class(choose_steward_guilds) + serializer.update(instance=choose_steward_guilds, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# class WagePaymentGateWayUrlViewset(viewsets.ModelViewSet): +# queryset = WagePayment.objects.all() +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = WagePaymentSerializer +# +# def create(self, request, *args, **kwargs): + + +class WagePaymentBasedOnWeightViewset(viewsets.ModelViewSet): + queryset = WagePayment.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = WagePaymentSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = WagePaymentFilterSet + filterset_fields = [ + 'tracking_code', + 'refId', + 'orderId', + 'cardHolderPan', + 'payer_info', + + ] + + def create(self, request, *args, **kwargs): + now = datetime.now() + total_amount = 0 + final_total_amount = 0 + exclusive = False + slaughter_transaction_type = 'public' + killer = False + killer_kill_house = None + user = SystemUserProfile.objects.get(user=request.user, trash=False) + wage = ShareOfAllocation.objects.all().last() + wage = wage.province_union if wage else 0 + role = request.data['role'] + request.data.pop('role') + wallet = False + kill_house_key = None + if 'amount' in request.data.keys(): + wallet = True + input_amout = request.data['amount'] + input_amount_with_tax = request.data['amount_with_tax'] + kill_house_key = request.data['kill_house_key'] + request.data.pop('amount') + request.data.pop('amount_with_tax') + request.data.pop('kill_house_key') + kill_house_key = request.data['kill_house_key'] + request.data.pop('kill_house_key') + + kill_house = KillHouse.objects.filter(key=kill_house_key, trash=False).select_related( + 'kill_house_operator__user').first() + kill_house_percentage = KillHousePercentage.objects.get(kill_house=kill_house, trash=False) + if kill_house_percentage.kill_house_for_killer != None: + killer = True + if kill_house.type == 'exclusive': + exclusive = True + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + wage_payment = serializer.create(validated_data=request.data) + wage_payment.payer_info = user.fullname + wage_payment.payer = { + "role": role, + "payer": user.fullname, + "payment_type": wage_payment.payment_type, + "tracking_code": wage_payment.tracking_code, + "date": str(now) + + } + + if wallet == True: + kill_house_user = kill_house.kill_house_operator.user + creator = kill_house_user + receiver = kill_house_user + total_amount = input_amout + wage_payment.total_amount_with_tax = input_amount_with_tax + wage_payment.type = "wallet" + else: + + total_amount = wage_payment.total_amount + kill_house_user = kill_house.kill_house_operator.user + creator = kill_house_user + receiver = kill_house_user + wage_payment.total_amount_with_tax = total_amount + (total_amount * (10 / 100)) + + wage_payment.total_amount = total_amount + wage_payment.save() + + payment_gate_way_percentage = PaymentGatewayPercentage.objects.get(trash=False) + company = payment_gate_way_percentage.company / 100 if payment_gate_way_percentage.company > 0 else 0 + union = payment_gate_way_percentage.union / 100 if payment_gate_way_percentage.union > 0 else 0 + guilds = payment_gate_way_percentage.guilds / 100 if payment_gate_way_percentage.guilds > 0 else 0 + + if user.province.name == 'لرستان': + province_deposit_id = sha_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = test_order_id + + + elif user.province.name == 'آذربایجان شرقی': + province_deposit_id = sha_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = sha_order_id + + elif user.province.name == 'اردبیل': + province_deposit_id = ar_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = ar_order_id + + + + elif user.province.name == 'همدان': + province_deposit_id = ha_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = ha_order_id + + + elif user.province.name == 'مركزی': + province_deposit_id = ma_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = ma_order_id + + order_id = "{0}{1}{2}{3}{4}{5}{6}".format(gate_way_order_id, now.year, now.month, now.day, now.hour, + now.minute, now.second) + # if user.province.name == 'مركزی': + # result = PaymentGateway( + # "{0},{1},0;{2},{3},0;".format(province_deposit_id, 100, + # arta_api_deposit_id, + # int(total_amount - 100)), int(total_amount), + # order_id) + # else: + + if wallet == True: + final_total_amount = input_amount_with_tax + else: + final_total_amount = total_amount + (total_amount * (10 / 100)) + if company > 0 and union > 0 and guilds > 0: + result = PaymentGateway( + "{0},{1},0;{2},{3},0;{4},{5},0;".format(province_deposit_id, + int(final_total_amount * union), + arta_api_deposit_id, + int(final_total_amount * company), + guilds_api_deposit_id, + int(final_total_amount * guilds)), + int(final_total_amount), + order_id) + elif company > 0 and union > 0 and guilds == 0: + result = PaymentGateway( + "{0},{1},0;{2},{3},0;".format(province_deposit_id, + int(final_total_amount * union), + arta_api_deposit_id, + int(final_total_amount * company)), + int(final_total_amount), + order_id) + + elif company > 0 and union == 0 and guilds > 0: + result = PaymentGateway( + "{0},{1},0;{2},{3},0;".format( + + arta_api_deposit_id, + int(final_total_amount * company), + guilds_api_deposit_id, + int(final_total_amount * guilds)), + int(final_total_amount), + order_id) + else: + result = PaymentGateway( + "{0},{1},0;{2},{3},0;".format(province_deposit_id, + int(final_total_amount * union), + guilds_api_deposit_id, + int(final_total_amount * guilds)), + int(final_total_amount), + order_id) + + # result = PaymentGateway( + # "{0},{1},0;{2},{3},0;".format(sha_deposit_id, 10000, arta_deposit_id, 10000),20000, order_id) + if '400' in result.keys(): + wage_payment.state = 'failed' + wage_payment.message = result[400] + wage_payment.save() + if wallet == True: + transaction = ExternalTransaction( + amount=total_amount, + amount_with_tax=final_total_amount, + status="failed", + type="deposit", + transaction_type="wallet", + is_complete=False, + kill_house_user=kill_house_user, + creator=creator, + receiver=receiver, + creator_role='KillHouse', + receiver_role='KillHouse', + payer=kill_house_user.fullname, + message=result[400] + + ) + transaction.save() + else: + transaction = ExternalTransaction( + amount=total_amount, + amount_with_tax=final_total_amount, + status="failed", + transaction_type="wage-gateway", + is_complete=False, + kill_house_user=kill_house_user, + creator=creator, + receiver=receiver, + creator_role='KillHouse', + receiver_role='ProvinceOperator', + payer=user.fullname, + message=result[400] + + ) + transaction.save() + return Response(result[400], status=status.HTTP_400_BAD_REQUEST) + else: + wage_payment.refId = result[200] + wage_payment.orderId = order_id + wage_payment.save() + if wallet == True: + transaction = ExternalTransaction( + amount=total_amount, + amount_with_tax=final_total_amount, + status="pending", + type="deposit", + transaction_type="wallet", + is_complete=False, + kill_house_user=kill_house_user, + creator=creator, + receiver=receiver, + receiver_role='KillHouse', + creator_role='KillHouse', + payer=kill_house_user.fullname, + refId=result[200], + orderId=order_id + + ) + transaction.save() + else: + + transaction = ExternalTransaction( + amount=total_amount, + amount_with_tax=final_total_amount, + status="pending", + transaction_type="wage-gateway", + is_complete=False, + kill_house_user=kill_house_user, + creator=creator, + receiver=receiver, + receiver_role='KillHouse', + creator_role='ProvinceOperator', + payer=user.fullname, + refId=result[200], + orderId=order_id + + ) + transaction.save() + if killer == True: + parent_kill_house = kill_house_percentage.kill_house_for_killer + main_kill_house = kill_house_percentage.kill_house + if exclusive == True: + slaughter_transaction_type = 'exclusive' + else: + parent_kill_house = kill_house + main_kill_house = kill_house + + slaughter_transaction = SlaughterHouseTransaction( + kill_house=main_kill_house, + parent_kill_house=parent_kill_house, + type=slaughter_transaction_type, + amount=wage_payment.total_amount, + amount_with_tax=wage_payment.total_amount_with_tax, + transaction=transaction.id, + + ) + slaughter_transaction.save() + return Response({"refId": result[200]}, status=status.HTTP_201_CREATED) + + # return Response(serializer.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + wage_payment_list = [] + + if request.GET['state'] == 'failed': + wage_payment = WagePayment.objects.filter( + create_date__date__gte=date1, + create_date__date__lte=date2, + state='failed', + trash=False).order_by('id') + else: + wage_payment = WagePayment.objects.filter( + create_date__date__gte=date1, + create_date__date__lte=date2, + state='completed', + trash=False).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=wage_payment + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=wage_payment) + wage_payment_list = ps.filter() + wage_payment = [] if len(wage_payment_list) == 0 else wage_payment_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(wage_payment) + if page is not None: + serializer = WagePaymentSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = WagePaymentSerializer(wage_payment, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# class WagePaymentWithLinkViewset(viewsets.ModelViewSet): +# queryset = WagePayment.objects.all() +# permission_classes = [AllowAny] +# serializer_class = WagePaymentSerializer +# +# def create(self, request, *args, **kwargs): +# link = True +# zarinpal_accounts = ZarinPalAccounts.objects.filter(trash=False) +# province_shaba_id = zarinpal_accounts.filter(en_name='union').first().account +# arta_shaba_id = zarinpal_accounts.filter(en_name='company').first().account +# guilds_shaba_id = zarinpal_accounts.filter(en_name='guilds').first().account +# other_shaba_id = zarinpal_accounts.filter(en_name='other').first().account +# now = datetime.now() +# wages = [] +# amount = 0 +# poultry_requests = None +# role = request.data['role'] +# request.data.pop('role') +# payer = None +# if 'order_codes' in request.data.keys(): +# if request.data['order_codes'] is not None: +# poultry_requests = PoultryRequest.objects.filter(order_code__in=request.data['order_codes']) +# request.data.pop('order_codes') +# user = SystemUserProfile.objects.get(key=request.data['user_key'], trash=False) +# request.data.pop('user_key') +# if role == 'Poultry': +# payer = 'poultry' +# payer_fullname = user.fullname +# phone = user.mobile +# +# # request.data.pop('user_key') +# elif role == 'Buyer': +# buyer = OutProvincePoultryRequestBuyer.objects.get(user=user, trash=False) +# payer = 'buyer' +# payer_fullname = user.fullname +# phone = user.mobile +# +# +# else: +# parent_kill_house = None +# if role == 'KillHouse': +# kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() +# parent_kill_house = kill_house +# if kill_house.killer == True and kill_house.type == 'exclusive': +# percentage = KillHousePercentage.objects.filter(kill_house=kill_house, trash=False).first() +# parent_kill_house = percentage.kill_house_for_killer if percentage else kill_house +# +# payer = 'kill_house' +# phone = kill_house.kill_house_operator.user.mobile +# +# else: +# chain_company = ChainCompany.objects.get(user=user, trash=False) +# payer = 'chain_company' +# phone = chain_company.user.mobile +# +# serializer = self.serializer_class(data=request.data) +# if serializer.is_valid(): +# wage_payment = serializer.create(validated_data=request.data) +# beneficiary_accounts = CompanyBeneficiaryAccount.objects.filter(trash=False, percent__gt=0) +# amount = int(wage_payment.total_amount) +# wage_payment.payer_info = user.fullname +# wage_payment.link_pay = True +# +# wage_payment.payer = { +# "role": role, +# "payer": user.fullname, +# "payment_type": wage_payment.payment_type, +# "tracking_code": wage_payment.tracking_code, +# "date": str(now) +# +# } +# if payer == 'kill_house': +# +# if kill_house.share_debt_counting_wage == False: +# company = kill_house.company_gateway_percent / 100 if kill_house.company_gateway_percent > 0 else 0 +# union = kill_house.union_gateway_percent / 100 if kill_house.union_gateway_percent > 0 else 0 +# guilds = kill_house.guilds_gateway_percent / 100 if kill_house.guilds_gateway_percent > 0 else 0 +# other = kill_house.other_gateway_percent / 100 if kill_house.other_gateway_percent > 0 else 0 +# else: +# percent_data = get_kill_house_percent(kill_house) +# if percent_data: +# company = percent_data['company'] / 100 if percent_data['company'] > 0 else 0 +# union = percent_data['union'] / 100 if percent_data['union'] > 0 else 0 +# guilds = percent_data['guilds'] / 100 if percent_data['guilds'] > 0 else 0 +# other = percent_data['vet'] / 100 if percent_data['vet'] > 0 else 0 +# else: +# company = kill_house.company_gateway_percent / 100 if kill_house.company_gateway_percent > 0 else 0 +# union = kill_house.union_gateway_percent / 100 if kill_house.union_gateway_percent > 0 else 0 +# guilds = kill_house.guilds_gateway_percent / 100 if kill_house.guilds_gateway_percent > 0 else 0 +# other = kill_house.other_gateway_percent / 100 if kill_house.other_gateway_percent > 0 else 0 +# else: +# wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() +# percentage_of_wage_type = PercentageOfWageType.objects.filter(trash=False, wage_type=wage_type) +# company_share = percentage_of_wage_type.filter(share_type__en_name='company').first().percent +# union_share = percentage_of_wage_type.filter(share_type__en_name='union').first().percent +# guilds_share = percentage_of_wage_type.filter(share_type__en_name='guilds').first().percent +# other_share = percentage_of_wage_type.filter(share_type__en_name='other').first().percent +# +# company = (company_share) / 100 if company_share > 0 else 0 +# union = union_share / 100 if union_share > 0 else 0 +# guilds = guilds_share / 100 if guilds_share > 0 else 0 +# other = other_share / 100 if other_share > 0 else 0 +# +# if user.province.name == 'همدان': +# gate_way_order_id = ha_order_id +# +# +# elif user.province.name == 'مركزی': +# gate_way_order_id = ma_order_id +# +# +# else: +# gate_way_order_id = test_order_id +# +# order_id = "{0}{1}{2}{3}{4}{5}{6}".format(gate_way_order_id, now.year, now.month, now.day, now.hour, +# now.minute, now.second) +# +# guild_id = 0 +# other_id = 0 +# province_other_wage = 0 +# if province_shaba_id == guilds_shaba_id: +# guild_id = 1 +# province_other_wage += (amount * guilds) +# if province_shaba_id == other_shaba_id: +# other_id = 1 +# province_other_wage += (amount * other) +# +# if company > 0: +# company_total_amount = amount * company +# total_remain_amount = company_total_amount +# account_amount = 0 +# if payer == 'kill_house': +# beneficiary_accounts = beneficiary_accounts.filter(in_province=True) +# else: +# beneficiary_accounts = beneficiary_accounts.filter(out_province=True) +# +# if beneficiary_accounts: +# for account in beneficiary_accounts: +# account_amount = int(company_total_amount * (account.percent / 100)) +# total_remain_amount -= account_amount +# wages.append( +# { +# "IBAN": account.shaba, +# "Amount": account_amount, +# } +# +# ) +# if total_remain_amount > 0: +# wages.append( +# { +# "IBAN": arta_shaba_id, +# "Amount": total_remain_amount, +# } +# +# ) +# +# +# +# else: +# +# wages.append( +# { +# "IBAN": arta_shaba_id, +# "Amount": amount * company, +# } +# +# ) +# +# if union > 0: +# wages.append( +# { +# "IBAN": province_shaba_id, +# "Amount": (amount * union) + province_other_wage +# } +# +# ) +# if guild_id == 0 or (union == 0 and guild_id == 1): +# if guilds > 0: +# wages.append( +# { +# "IBAN": guilds_shaba_id, +# "Amount": (amount * guilds), +# } +# +# ) +# if other_id == 0 or (union == 0 and other_id == 1): +# if other > 0: +# wages.append( +# { +# "IBAN": other_shaba_id, +# "Amount": (amount * other), +# } +# +# ) +# result = PaymentGatewayZarinPal(amount, phone, order_id, link, wages) +# if 500 in result.keys(): +# wage_payment.state = 'failed' +# wage_payment.message = result[500] +# wage_payment.save() +# if payer == 'kill_house': +# transaction = InternalTransaction( +# amount=amount, +# status="failed", +# transaction_type="wage-gateway-auto", +# kill_house=kill_house, +# parent_kill_house=parent_kill_house, +# payer_fullname=kill_house.kill_house_operator.user.fullname, +# payer_mobile=kill_house.kill_house_operator.user.mobile, +# payer_type='kill_house', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# link_pay=True, +# orderId=order_id, +# message=result[500] +# ) +# transaction.save() +# +# elif payer == 'poultry': +# +# transaction = InternalTransaction( +# amount=amount, +# status="failed", +# transaction_type="wage-gateway-auto", +# payer_type='poultry', +# poultry=poultry_requests.first().poultry, +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# user=user, +# payer_fullname=user.fullname, +# payer_mobile=user.mobile, +# link_pay=True, +# orderId=order_id, +# message=result[500] +# ) +# transaction.save() +# if poultry_requests is not None: +# transaction.poultry_request.add(*poultry_requests) +# +# elif payer == 'buyer': +# transaction = InternalTransaction( +# amount=amount, +# status="failed", +# transaction_type="wage-gateway-auto", +# payer_type='buyer', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# user=user, +# out_province_poultry_request_buyer=buyer, +# payer_fullname=buyer.user.fullname, +# payer_mobile=buyer.user.mobile, +# link_pay=True, +# orderId=order_id, +# message=result[500] +# ) +# transaction.save() +# if poultry_requests is not None: +# transaction.poultry_request.add(*poultry_requests) +# else: +# transaction = InternalTransaction( +# amount=amount, +# status="failed", +# transaction_type="wage-gateway-auto", +# chain_company=chain_company, +# payer_fullname=chain_company.user.fullname, +# payer_mobile=chain_company.user.mobile, +# payer_type='chain_company', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# link_pay=True, +# orderId=order_id, +# message=result[400] +# ) +# transaction.save() +# +# return Response(result[500], status=status.HTTP_400_BAD_REQUEST) +# else: +# wage_payment.authority = result[201] +# wage_payment.orderId = order_id +# wage_payment.save() +# if payer == 'kill_house': +# transaction = InternalTransaction( +# amount=amount, +# status="pending", +# transaction_type="wage-gateway-auto", +# kill_house=kill_house, +# parent_kill_house=parent_kill_house, +# payer_fullname=kill_house.kill_house_operator.user.fullname, +# payer_mobile=kill_house.kill_house_operator.user.mobile, +# payer_type='kill_house', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# authority=result[201], +# link_pay=True, +# orderId=order_id +# +# ) +# transaction.save() +# +# elif payer == 'poultry': +# transaction = InternalTransaction( +# amount=amount, +# status="pending", +# transaction_type="wage-gateway-auto", +# payer_type='poultry', +# poultry=poultry_requests.first().poultry, +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# authority=result[201], +# user=user, +# payer_fullname=user.fullname, +# payer_mobile=user.mobile, +# link_pay=True, +# orderId=order_id +# +# ) +# transaction.save() +# if poultry_requests is not None: +# transaction.poultry_request.add(*poultry_requests) +# +# +# elif payer == 'buyer': +# +# transaction = InternalTransaction( +# amount=amount, +# status="pending", +# transaction_type="wage-gateway-auto", +# payer_type='buyer', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# authority=result[201], +# user=user, +# out_province_poultry_request_buyer=buyer, +# payer_fullname=buyer.user.fullname, +# payer_mobile=buyer.user.mobile, +# link_pay=True, +# orderId=order_id +# +# ) +# transaction.save() +# if poultry_requests is not None: +# transaction.poultry_request.add(*poultry_requests) +# +# +# else: +# transaction = InternalTransaction( +# amount=amount, +# status="pending", +# # is_complete=False, +# transaction_type="wage-gateway-auto", +# chain_company=chain_company, +# payer_fullname=chain_company.user.fullname, +# payer_mobile=chain_company.user.mobile, +# payer_type='chain_company', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# authority=result[201], +# link_pay=True, +# orderId=order_id +# +# ) +# transaction.save() +# +# return Response({"token": result[201]}, status=status.HTTP_201_CREATED) +# +# # return Response(serializer.data, status=status.HTTP_201_CREATED) + +class WagePaymentWithLinkViewset(viewsets.ModelViewSet): + queryset = WagePayment.objects.all() + permission_classes = [AllowAny] + serializer_class = WagePaymentSerializer + + def create(self, request, *args, **kwargs): + link = True + zarinpal_accounts = ZarinPalAccounts.objects.filter(trash=False) + province_shaba_id = zarinpal_accounts.filter(en_name='union').first().account + arta_shaba_id = zarinpal_accounts.filter(en_name='company').first().account + guilds_shaba_id = zarinpal_accounts.filter(en_name='guilds').first().account + other_shaba_id = zarinpal_accounts.filter(en_name='other').first().account + now = datetime.now() + wages = [] + amount = 0 + poultry_requests = None + role = request.data['role'] + request.data.pop('role') + payer = None + if 'order_codes' in request.data.keys(): + if request.data['order_codes'] is not None: + poultry_requests = PoultryRequest.objects.filter(order_code__in=request.data['order_codes']) + request.data.pop('order_codes') + user = SystemUserProfile.objects.get(key=request.data['user_key'], trash=False) + request.data.pop('user_key') + if role == 'Poultry': + payer = 'poultry' + payer_fullname = user.fullname + phone = user.mobile + + # request.data.pop('user_key') + elif role == 'Buyer': + buyer = OutProvincePoultryRequestBuyer.objects.get(user=user, trash=False) + payer = 'buyer' + payer_fullname = user.fullname + phone = user.mobile + + + else: + parent_kill_house = None + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + parent_kill_house = kill_house + if kill_house.killer == True and kill_house.type == 'exclusive': + percentage = KillHousePercentage.objects.filter(kill_house=kill_house, trash=False).first() + parent_kill_house = percentage.kill_house_for_killer if percentage else kill_house + + payer = 'kill_house' + phone = kill_house.kill_house_operator.user.mobile + + else: + chain_company = ChainCompany.objects.get(user=user, trash=False) + payer = 'chain_company' + phone = chain_company.user.mobile + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + wage_payment = serializer.create(validated_data=request.data) + beneficiary_accounts = CompanyBeneficiaryAccount.objects.filter(trash=False, percent__gt=0) + amount = int(wage_payment.total_amount) + wage_payment.payer_info = user.fullname + wage_payment.link_pay = True + + wage_payment.payer = { + "role": role, + "payer": user.fullname, + "payment_type": wage_payment.payment_type, + "tracking_code": wage_payment.tracking_code, + "date": str(now) + + } + if payer == 'kill_house': + + if kill_house.share_debt_counting_wage == False: + company = kill_house.company_gateway_percent / 100 if kill_house.company_gateway_percent > 0 else 0 + union = kill_house.union_gateway_percent / 100 if kill_house.union_gateway_percent > 0 else 0 + guilds = kill_house.guilds_gateway_percent / 100 if kill_house.guilds_gateway_percent > 0 else 0 + other = kill_house.other_gateway_percent / 100 if kill_house.other_gateway_percent > 0 else 0 + else: + percent_data = get_kill_house_percent(kill_house) + if percent_data and ( + percent_data['union'] or percent_data['company'] or percent_data['guilds'] or percent_data[ + 'vet']): + company = percent_data['company'] / 100 if percent_data['company'] > 0 else 0 + union = percent_data['union'] / 100 if percent_data['union'] > 0 else 0 + guilds = percent_data['guilds'] / 100 if percent_data['guilds'] > 0 else 0 + other = percent_data['vet'] / 100 if percent_data['vet'] > 0 else 0 + else: + company = kill_house.company_gateway_percent / 100 if kill_house.company_gateway_percent > 0 else 0 + union = kill_house.union_gateway_percent / 100 if kill_house.union_gateway_percent > 0 else 0 + guilds = kill_house.guilds_gateway_percent / 100 if kill_house.guilds_gateway_percent > 0 else 0 + other = kill_house.other_gateway_percent / 100 if kill_house.other_gateway_percent > 0 else 0 + else: + wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() + percentage_of_wage_type = PercentageOfWageType.objects.filter(trash=False, wage_type=wage_type) + company_share = percentage_of_wage_type.filter(share_type__en_name='company').first().percent + union_share = percentage_of_wage_type.filter(share_type__en_name='union').first().percent + guilds_share = percentage_of_wage_type.filter(share_type__en_name='guilds').first().percent + other_share = percentage_of_wage_type.filter(share_type__en_name='other').first().percent + + company = (company_share) / 100 if company_share > 0 else 0 + union = union_share / 100 if union_share > 0 else 0 + guilds = guilds_share / 100 if guilds_share > 0 else 0 + other = other_share / 100 if other_share > 0 else 0 + + if user.province.name == 'همدان': + gate_way_order_id = ha_order_id + + + elif user.province.name == 'مركزی': + gate_way_order_id = ma_order_id + + + else: + gate_way_order_id = test_order_id + + order_id = "{0}{1}{2}{3}{4}{5}{6}".format(gate_way_order_id, now.year, now.month, now.day, now.hour, + now.minute, now.second) + zero_counter = 0 + zero_wages = 0 + + if arta_shaba_id == '-' and company > 0: + zero_wages += amount * company + + if province_shaba_id == '-' and union > 0: + zero_wages += amount * union + + if guilds_shaba_id == '-' and guilds > 0: + zero_wages += amount * guilds + + if other_shaba_id == '-' and other > 0: + zero_wages += amount * other + + if arta_shaba_id != '-' and company > 0: + zero_counter += 1 + + if province_shaba_id != '-' and union > 0: + zero_counter += 1 + + if guilds_shaba_id != '-' and guilds > 0: + zero_counter += 1 + + if other_shaba_id != '-' and other > 0: + zero_counter += 1 + + if zero_counter > 0 and zero_counter != zarinpal_accounts.count(): + zero_wages = zero_wages / (zarinpal_accounts.count() - zero_counter) + + guild_id = 0 + other_id = 0 + province_other_wage = 0 + if province_shaba_id == guilds_shaba_id: + if guilds > 0: + guild_id = 1 + province_other_wage += (amount * guilds) + zero_wages + if province_shaba_id == other_shaba_id: + if other > 0: + other_id = 1 + province_other_wage += (amount * other) + zero_wages + + if arta_shaba_id != '-': + if company > 0: + company_total_amount = (amount * company) + zero_wages + total_remain_amount = company_total_amount + account_amount = 0 + if payer == 'kill_house': + beneficiary_accounts = beneficiary_accounts.filter(in_province=True) + else: + beneficiary_accounts = beneficiary_accounts.filter(out_province=True) + + if beneficiary_accounts: + for account in beneficiary_accounts: + account_amount = int(company_total_amount * (account.percent / 100)) + total_remain_amount -= account_amount + + wages.append( + { + "IBAN": account.shaba, + "Amount": account_amount, + } + + ) + if total_remain_amount > 0: + wages.append( + { + "IBAN": arta_shaba_id, + "Amount": total_remain_amount, + } + + ) + + + + else: + wages.append( + { + "IBAN": arta_shaba_id, + "Amount": (amount * company) + zero_wages, + } + + ) + if province_shaba_id != '-': + if union > 0: + wages.append( + { + "IBAN": province_shaba_id, + "Amount": (amount * union) + province_other_wage + zero_wages + } + + ) + + if guilds_shaba_id != '-': + if guild_id == 0 or (union == 0 and guild_id == 1): + if guilds > 0: + wages.append( + { + "IBAN": guilds_shaba_id, + "Amount": (amount * guilds) + zero_wages, + } + + ) + if other_shaba_id != '-': + if other_id == 0 or (union == 0 and other_id == 1): + if other > 0: + wages.append( + { + "IBAN": other_shaba_id, + "Amount": (amount * other) + zero_wages, + } + + ) + result = PaymentGatewayZarinPal(amount, phone, order_id, link, wages) + if 500 in result.keys(): + wage_payment.state = 'failed' + wage_payment.message = result[500] + wage_payment.save() + if payer == 'kill_house': + transaction = InternalTransaction( + amount=amount, + status="failed", + transaction_type="wage-gateway-auto", + kill_house=kill_house, + parent_kill_house=parent_kill_house, + payer_fullname=kill_house.kill_house_operator.user.fullname, + payer_mobile=kill_house.kill_house_operator.user.mobile, + payer_type='kill_house', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + link_pay=True, + orderId=order_id, + message=result[500] + ) + transaction.save() + + elif payer == 'poultry': + + transaction = InternalTransaction( + amount=amount, + status="failed", + transaction_type="wage-gateway-auto", + payer_type='poultry', + poultry=poultry_requests.first().poultry, + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + user=user, + payer_fullname=user.fullname, + payer_mobile=user.mobile, + link_pay=True, + orderId=order_id, + message=result[500] + ) + transaction.save() + if poultry_requests is not None: + transaction.poultry_request.add(*poultry_requests) + + elif payer == 'buyer': + transaction = InternalTransaction( + amount=amount, + status="failed", + transaction_type="wage-gateway-auto", + payer_type='buyer', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + user=user, + out_province_poultry_request_buyer=buyer, + payer_fullname=buyer.user.fullname, + payer_mobile=buyer.user.mobile, + link_pay=True, + orderId=order_id, + message=result[500] + ) + transaction.save() + if poultry_requests is not None: + transaction.poultry_request.add(*poultry_requests) + else: + transaction = InternalTransaction( + amount=amount, + status="failed", + transaction_type="wage-gateway-auto", + chain_company=chain_company, + payer_fullname=chain_company.user.fullname, + payer_mobile=chain_company.user.mobile, + payer_type='chain_company', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + link_pay=True, + orderId=order_id, + message=result[400] + ) + transaction.save() + + return Response(result[500], status=status.HTTP_400_BAD_REQUEST) + else: + wage_payment.authority = result[201] + wage_payment.orderId = order_id + wage_payment.save() + if payer == 'kill_house': + transaction = InternalTransaction( + amount=amount, + status="pending", + transaction_type="wage-gateway-auto", + kill_house=kill_house, + parent_kill_house=parent_kill_house, + payer_fullname=kill_house.kill_house_operator.user.fullname, + payer_mobile=kill_house.kill_house_operator.user.mobile, + payer_type='kill_house', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + authority=result[201], + link_pay=True, + orderId=order_id + + ) + transaction.save() + + elif payer == 'poultry': + transaction = InternalTransaction( + amount=amount, + status="pending", + transaction_type="wage-gateway-auto", + payer_type='poultry', + poultry=poultry_requests.first().poultry, + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + authority=result[201], + user=user, + payer_fullname=user.fullname, + payer_mobile=user.mobile, + link_pay=True, + orderId=order_id + + ) + transaction.save() + if poultry_requests is not None: + transaction.poultry_request.add(*poultry_requests) + + + elif payer == 'buyer': + + transaction = InternalTransaction( + amount=amount, + status="pending", + transaction_type="wage-gateway-auto", + payer_type='buyer', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + authority=result[201], + user=user, + out_province_poultry_request_buyer=buyer, + payer_fullname=buyer.user.fullname, + payer_mobile=buyer.user.mobile, + link_pay=True, + orderId=order_id + + ) + transaction.save() + if poultry_requests is not None: + transaction.poultry_request.add(*poultry_requests) + + + else: + transaction = InternalTransaction( + amount=amount, + status="pending", + # is_complete=False, + transaction_type="wage-gateway-auto", + chain_company=chain_company, + payer_fullname=chain_company.user.fullname, + payer_mobile=chain_company.user.mobile, + payer_type='chain_company', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + authority=result[201], + link_pay=True, + orderId=order_id + + ) + transaction.save() + + return Response({"token": result[201]}, status=status.HTTP_201_CREATED) + + # return Response(serializer.data, status=status.HTTP_201_CREATED) + + +# class WagePaymentTotalViewset(viewsets.ModelViewSet): +# queryset = WagePayment.objects.all() +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = WagePaymentSerializer +# filter_backends = [DjangoFilterBackend] +# pagination_class = CustomPagination +# filterset_class = WagePaymentFilterSet +# filterset_fields = [ +# 'tracking_code', +# 'refId', +# 'orderId', +# 'cardHolderPan', +# 'payer_info', +# +# ] +# +# def create(self, request, *args, **kwargs): +# link = False +# zarinpal_accounts = ZarinPalAccounts.objects.filter(trash=False) +# beneficiary_accounts = CompanyBeneficiaryAccount.objects.filter(trash=False, percent__gt=0) +# province_shaba_id = zarinpal_accounts.filter(en_name='union').first().account +# arta_shaba_id = zarinpal_accounts.filter(en_name='company').first().account +# guilds_shaba_id = zarinpal_accounts.filter(en_name='guilds').first().account +# other_shaba_id = zarinpal_accounts.filter(en_name='other').first().account +# now = datetime.now() +# wages = [] +# amount = 0 +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# payer = None +# parent_kill_house = None +# role = request.data['role'] +# request.data.pop('role') +# if role == 'KillHouse': +# kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() +# parent_kill_house = kill_house +# if kill_house.killer == True and kill_house.type == 'exclusive': +# percentage = KillHousePercentage.objects.filter(kill_house=kill_house, trash=False).first() +# parent_kill_house = percentage.kill_house_for_killer if percentage else kill_house +# +# payer = 'kill_house' +# phone = kill_house.kill_house_operator.user.mobile +# else: +# chain_company = ChainCompany.objects.get(user=user, trash=False).first() +# payer = 'chain_company' +# phone = chain_company.user.mobile +# +# serializer = self.serializer_class(data=request.data) +# if serializer.is_valid(): +# wage_payment = serializer.create(validated_data=request.data) +# amount = wage_payment.total_amount +# wage_payment.payer_info = user.fullname +# wage_payment.payer = { +# "role": role, +# "payer": user.fullname, +# "payment_type": wage_payment.payment_type, +# "tracking_code": wage_payment.tracking_code, +# "date": str(now) +# +# } +# +# if payer == 'kill_house': +# if kill_house.share_debt_counting_wage == False: +# +# company = kill_house.company_gateway_percent / 100 if kill_house.company_gateway_percent > 0 else 0 +# union = kill_house.union_gateway_percent / 100 if kill_house.union_gateway_percent > 0 else 0 +# guilds = kill_house.guilds_gateway_percent / 100 if kill_house.guilds_gateway_percent > 0 else 0 +# other = kill_house.other_gateway_percent / 100 if kill_house.other_gateway_percent > 0 else 0 +# +# else: +# percent_data = get_kill_house_percent(kill_house) +# if percent_data: +# company = percent_data['company'] / 100 if percent_data['company'] > 0 else 0 +# union = percent_data['union'] / 100 if percent_data['union'] > 0 else 0 +# guilds = percent_data['guilds'] / 100 if percent_data['guilds'] > 0 else 0 +# other = percent_data['vet'] / 100 if percent_data['vet'] > 0 else 0 +# else: +# company = kill_house.company_gateway_percent / 100 if kill_house.company_gateway_percent > 0 else 0 +# union = kill_house.union_gateway_percent / 100 if kill_house.union_gateway_percent > 0 else 0 +# guilds = kill_house.guilds_gateway_percent / 100 if kill_house.guilds_gateway_percent > 0 else 0 +# other = kill_house.other_gateway_percent / 100 if kill_house.other_gateway_percent > 0 else 0 +# +# else: +# +# payment_gate_way_percentage = PaymentGatewayPercentage.objects.get(trash=False) +# company = payment_gate_way_percentage.company / 100 if payment_gate_way_percentage.company > 0 else 0 +# union = payment_gate_way_percentage.union / 100 if payment_gate_way_percentage.union > 0 else 0 +# guilds = payment_gate_way_percentage.guilds / 100 if payment_gate_way_percentage.guilds > 0 else 0 +# other = payment_gate_way_percentage.other / 100 if payment_gate_way_percentage.other > 0 else 0 +# +# if user.province.name == 'همدان': +# gate_way_order_id = ha_order_id +# +# +# elif user.province.name == 'مركزی': +# gate_way_order_id = ma_order_id +# +# +# else: +# gate_way_order_id = test_order_id +# +# order_id = "{0}{1}{2}{3}{4}{5}{6}".format(gate_way_order_id, now.year, now.month, now.day, now.hour, +# now.minute, now.second) +# guild_id = 0 +# other_id = 0 +# province_other_wage = 0 +# if province_shaba_id == guilds_shaba_id: +# guild_id = 1 +# province_other_wage += (amount * guilds) +# if province_shaba_id == other_shaba_id: +# other_id = 1 +# province_other_wage += (amount * other) +# +# if company > 0: +# company_total_amount = amount * company +# total_remain_amount = company_total_amount +# account_amount = 0 +# beneficiary_accounts = beneficiary_accounts.filter(in_province=True) +# if beneficiary_accounts: +# for account in beneficiary_accounts: +# account_amount = int(company_total_amount * (account.percent / 100)) +# total_remain_amount -= account_amount +# wages.append( +# { +# "IBAN": account.shaba, +# "Amount": account_amount, +# } +# +# ) +# if total_remain_amount > 0: +# wages.append( +# { +# "IBAN": arta_shaba_id, +# "Amount": total_remain_amount, +# } +# +# ) +# +# +# +# else: +# +# wages.append( +# { +# "IBAN": arta_shaba_id, +# "Amount": amount * company, +# } +# +# ) +# +# if union > 0: +# wages.append( +# { +# "IBAN": province_shaba_id, +# "Amount": (amount * union) + province_other_wage +# } +# +# ) +# if guild_id == 0 or (union == 0 and guild_id == 1): +# if guilds > 0: +# wages.append( +# { +# "IBAN": guilds_shaba_id, +# "Amount": (amount * guilds), +# } +# +# ) +# if other_id == 0 or (union == 0 and other_id == 1): +# if other > 0: +# wages.append( +# { +# "IBAN": other_shaba_id, +# "Amount": (amount * other), +# } +# +# ) +# result = PaymentGatewayZarinPal(amount, phone, order_id, link, wages) +# if 500 in result.keys(): +# wage_payment.state = 'failed' +# wage_payment.message = result[500] +# wage_payment.save() +# if payer == 'kill_house': +# transaction = InternalTransaction( +# amount=amount, +# status="failed", +# transaction_type="wage-gateway-auto", +# kill_house=kill_house, +# parent_kill_house=parent_kill_house, +# payer_fullname=kill_house.kill_house_operator.user.fullname, +# payer_mobile=kill_house.kill_house_operator.user.mobile, +# payer_type='kill_house', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# orderId=order_id, +# message=result[500] +# ) +# transaction.save() +# else: +# transaction = InternalTransaction( +# amount=amount, +# status="failed", +# transaction_type="wage-gateway-auto", +# chain_company=chain_company, +# payer_fullname=chain_company.user.fullname, +# payer_mobile=chain_company.user.mobile, +# payer_type='chain_company', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# orderId=order_id, +# message=result[400] +# ) +# transaction.save() +# +# return Response(result[500], status=status.HTTP_400_BAD_REQUEST) +# else: +# wage_payment.authority = result[201] +# wage_payment.orderId = order_id +# wage_payment.save() +# if payer == 'kill_house': +# +# transaction = InternalTransaction( +# amount=amount, +# status="pending", +# transaction_type="wage-gateway-auto", +# kill_house=kill_house, +# parent_kill_house=parent_kill_house, +# payer_fullname=kill_house.kill_house_operator.user.fullname, +# payer_mobile=kill_house.kill_house_operator.user.mobile, +# payer_type='kill_house', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# authority=result[201], +# orderId=order_id +# +# ) +# transaction.save() +# else: +# transaction = InternalTransaction( +# amount=amount, +# status="pending", +# # is_complete=False, +# transaction_type="wage-gateway-auto", +# chain_company=chain_company, +# payer_fullname=chain_company.user.fullname, +# payer_mobile=chain_company.user.mobile, +# payer_type='chain_company', +# union_share=amount * union, +# union_account=province_shaba_id, +# company_share=amount * company, +# company_account=arta_shaba_id, +# guilds_share=amount * guilds, +# guilds_account=guilds_shaba_id, +# other_share=amount * other, +# other_account=other_shaba_id, +# date=now, +# authority=result[201], +# orderId=order_id +# +# ) +# transaction.save() +# +# return Response({"token": result[201]}, status=status.HTTP_201_CREATED) +# +# # return Response(serializer.data, status=status.HTTP_201_CREATED) + +class WagePaymentTotalViewset(viewsets.ModelViewSet): + queryset = WagePayment.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = WagePaymentSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = WagePaymentFilterSet + filterset_fields = [ + 'tracking_code', + 'refId', + 'orderId', + 'cardHolderPan', + 'payer_info', + + ] + + def create(self, request, *args, **kwargs): + link = False + zarinpal_accounts = ZarinPalAccounts.objects.filter(trash=False) + beneficiary_accounts = CompanyBeneficiaryAccount.objects.filter(trash=False, percent__gt=0) + province_shaba_id = zarinpal_accounts.filter(en_name='union').first().account + arta_shaba_id = zarinpal_accounts.filter(en_name='company').first().account + guilds_shaba_id = zarinpal_accounts.filter(en_name='guilds').first().account + other_shaba_id = zarinpal_accounts.filter(en_name='other').first().account + now = datetime.now() + wages = [] + amount = 0 + user = SystemUserProfile.objects.get(user=request.user, trash=False) + payer = None + parent_kill_house = None + role = request.data['role'] + request.data.pop('role') + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + parent_kill_house = kill_house + if kill_house.killer == True and kill_house.type == 'exclusive': + percentage = KillHousePercentage.objects.filter(kill_house=kill_house, trash=False).first() + parent_kill_house = percentage.kill_house_for_killer if percentage else kill_house + + payer = 'kill_house' + phone = kill_house.kill_house_operator.user.mobile + else: + chain_company = ChainCompany.objects.get(user=user, trash=False).first() + payer = 'chain_company' + phone = chain_company.user.mobile + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + wage_payment = serializer.create(validated_data=request.data) + amount = wage_payment.total_amount + wage_payment.payer_info = user.fullname + wage_payment.payer = { + "role": role, + "payer": user.fullname, + "payment_type": wage_payment.payment_type, + "tracking_code": wage_payment.tracking_code, + "date": str(now) + + } + + if payer == 'kill_house': + if kill_house.share_debt_counting_wage == False: + + company = kill_house.company_gateway_percent / 100 if kill_house.company_gateway_percent > 0 else 0 + union = kill_house.union_gateway_percent / 100 if kill_house.union_gateway_percent > 0 else 0 + guilds = kill_house.guilds_gateway_percent / 100 if kill_house.guilds_gateway_percent > 0 else 0 + other = kill_house.other_gateway_percent / 100 if kill_house.other_gateway_percent > 0 else 0 + + else: + percent_data = get_kill_house_percent(kill_house) + if percent_data and ( + percent_data['union'] or percent_data['company'] or percent_data['guilds'] or percent_data[ + 'vet']): + company = percent_data['company'] / 100 if percent_data['company'] > 0 else 0 + union = percent_data['union'] / 100 if percent_data['union'] > 0 else 0 + guilds = percent_data['guilds'] / 100 if percent_data['guilds'] > 0 else 0 + other = percent_data['vet'] / 100 if percent_data['vet'] > 0 else 0 + else: + company = kill_house.company_gateway_percent / 100 if kill_house.company_gateway_percent > 0 else 0 + union = kill_house.union_gateway_percent / 100 if kill_house.union_gateway_percent > 0 else 0 + guilds = kill_house.guilds_gateway_percent / 100 if kill_house.guilds_gateway_percent > 0 else 0 + other = kill_house.other_gateway_percent / 100 if kill_house.other_gateway_percent > 0 else 0 + + else: + + payment_gate_way_percentage = PaymentGatewayPercentage.objects.get(trash=False) + company = payment_gate_way_percentage.company / 100 if payment_gate_way_percentage.company > 0 else 0 + union = payment_gate_way_percentage.union / 100 if payment_gate_way_percentage.union > 0 else 0 + guilds = payment_gate_way_percentage.guilds / 100 if payment_gate_way_percentage.guilds > 0 else 0 + other = payment_gate_way_percentage.other / 100 if payment_gate_way_percentage.other > 0 else 0 + + if user.province.name == 'همدان': + gate_way_order_id = ha_order_id + + + elif user.province.name == 'مركزی': + gate_way_order_id = ma_order_id + + + else: + gate_way_order_id = test_order_id + + order_id = "{0}{1}{2}{3}{4}{5}{6}".format(gate_way_order_id, now.year, now.month, now.day, now.hour, + now.minute, now.second) + + zero_counter = 0 + zero_wages = 0 + + if arta_shaba_id == '-' and company > 0: + zero_wages += amount * company + + if province_shaba_id == '-' and union > 0: + zero_wages += amount * union + + if guilds_shaba_id == '-' and guilds > 0: + zero_wages += amount * guilds + + if other_shaba_id == '-' and other > 0: + zero_wages += amount * other + + if arta_shaba_id != '-' and company > 0: + zero_counter += 1 + + if province_shaba_id != '-' and union > 0: + zero_counter += 1 + + if guilds_shaba_id != '-' and guilds > 0: + zero_counter += 1 + + if other_shaba_id != '-' and other > 0: + zero_counter += 1 + + if zero_counter > 0 and zero_counter != zarinpal_accounts.count(): + zero_wages = zero_wages / (zarinpal_accounts.count() - zero_counter) + + guild_id = 0 + other_id = 0 + province_other_wage = 0 + if province_shaba_id == guilds_shaba_id: + if guilds > 0: + guild_id = 1 + province_other_wage += (amount * guilds) + zero_wages + if province_shaba_id == other_shaba_id: + if other > 0: + other_id = 1 + province_other_wage += (amount * other) + zero_wages + + if arta_shaba_id != '-': + + if company > 0: + company_total_amount = (amount * company) + zero_wages + total_remain_amount = company_total_amount + account_amount = 0 + beneficiary_accounts = beneficiary_accounts.filter(in_province=True) + if beneficiary_accounts: + for account in beneficiary_accounts: + account_amount = int(company_total_amount * (account.percent / 100)) + total_remain_amount -= account_amount + wages.append( + { + "IBAN": account.shaba, + "Amount": account_amount, + } + + ) + if total_remain_amount > 0: + wages.append( + { + "IBAN": arta_shaba_id, + "Amount": total_remain_amount, + } + + ) + + + + else: + + wages.append( + { + "IBAN": arta_shaba_id, + "Amount": (amount * company) + zero_wages, + } + + ) + + if province_shaba_id != '-': + + if union > 0: + wages.append( + { + "IBAN": province_shaba_id, + "Amount": (amount * union) + province_other_wage + zero_wages + } + + ) + + if guilds_shaba_id != '-': + + if guild_id == 0 or (union == 0 and guild_id == 1): + if guilds > 0: + wages.append( + { + "IBAN": guilds_shaba_id, + "Amount": (amount * guilds) + zero_wages, + } + + ) + if other_shaba_id != '-': + if other_id == 0 or (union == 0 and other_id == 1): + if other > 0: + wages.append( + { + "IBAN": other_shaba_id, + "Amount": (amount * other) + zero_wages, + } + + ) + result = PaymentGatewayZarinPal(amount, phone, order_id, link, wages) + if 500 in result.keys(): + wage_payment.state = 'failed' + wage_payment.message = result[500] + wage_payment.save() + if payer == 'kill_house': + transaction = InternalTransaction( + amount=amount, + status="failed", + transaction_type="wage-gateway-auto", + kill_house=kill_house, + parent_kill_house=parent_kill_house, + payer_fullname=kill_house.kill_house_operator.user.fullname, + payer_mobile=kill_house.kill_house_operator.user.mobile, + payer_type='kill_house', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + orderId=order_id, + message=result[500] + ) + transaction.save() + else: + transaction = InternalTransaction( + amount=amount, + status="failed", + transaction_type="wage-gateway-auto", + chain_company=chain_company, + payer_fullname=chain_company.user.fullname, + payer_mobile=chain_company.user.mobile, + payer_type='chain_company', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + orderId=order_id, + message=result[400] + ) + transaction.save() + + return Response(result[500], status=status.HTTP_400_BAD_REQUEST) + else: + wage_payment.authority = result[201] + wage_payment.orderId = order_id + wage_payment.save() + if payer == 'kill_house': + + transaction = InternalTransaction( + amount=amount, + status="pending", + transaction_type="wage-gateway-auto", + kill_house=kill_house, + parent_kill_house=parent_kill_house, + payer_fullname=kill_house.kill_house_operator.user.fullname, + payer_mobile=kill_house.kill_house_operator.user.mobile, + payer_type='kill_house', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + authority=result[201], + orderId=order_id + + ) + transaction.save() + else: + transaction = InternalTransaction( + amount=amount, + status="pending", + # is_complete=False, + transaction_type="wage-gateway-auto", + chain_company=chain_company, + payer_fullname=chain_company.user.fullname, + payer_mobile=chain_company.user.mobile, + payer_type='chain_company', + union_share=(amount * union) + zero_wages if province_shaba_id != '-' and union > 0 else 0, + union_account=province_shaba_id, + company_share=(amount * company) + zero_wages if arta_shaba_id != '-' and company > 0 else 0, + company_account=arta_shaba_id, + guilds_share=(amount * guilds) + zero_wages if guilds_shaba_id != '-' and guilds > 0 else 0, + guilds_account=guilds_shaba_id, + other_share=(amount * other) + zero_wages if other_shaba_id != '-' and other > 0 else 0, + other_account=other_shaba_id, + date=now, + authority=result[201], + orderId=order_id + + ) + transaction.save() + + return Response({"token": result[201]}, status=status.HTTP_201_CREATED) + + # return Response(serializer.data, status=status.HTTP_201_CREATED) + + +class WagePaymentViewset(viewsets.ModelViewSet): + queryset = WagePayment.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = WagePaymentSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = WagePaymentFilterSet + filterset_fields = [ + 'tracking_code', + 'refId', + 'orderId', + 'cardHolderPan', + 'payer_info', + + ] + + def create(self, request, *args, **kwargs): + now = datetime.now() + total_amount = 0 + final_total_amount = 0 + user = SystemUserProfile.objects.get(user=request.user, trash=False) + wage = ShareOfAllocation.objects.all().last() + wage = wage.province_union if wage else 0 + role = request.data['role'] + request.data.pop('role') + wallet = False + kill_house_key = None + if 'amount' in request.data.keys(): + wallet = True + input_amout = request.data['amount'] + input_amount_with_tax = request.data['amount_with_tax'] + kill_house_key = request.data['kill_house_key'] + request.data.pop('amount') + request.data.pop('amount_with_tax') + request.data.pop('kill_house_key') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + wage_payment = serializer.create(validated_data=request.data) + wage_payment.payer_info = user.fullname + wage_payment.payer = { + "role": role, + "payer": user.fullname, + "payment_type": wage_payment.payment_type, + "tracking_code": wage_payment.tracking_code, + "date": str(now) + + } + if request.data['payment_type'] == 'manual': + for province_kill_request in wage_payment.province_kill_request: + kill_request = ProvinceKillRequest.objects.filter(key=province_kill_request).select_related( + 'province_request__poultry_request').last() + kill_request.wage_pay = True + kill_request.depositor = { + "role": role, + "payer": user.fullname, + "date": str(now), + "payment_type": wage_payment.payment_type, + "tracking_code": wage_payment.tracking_code, + "refId": 0, + "orderId": 0, + "total_amount": kill_request.total_killed_weight * kill_request.wage + } + kill_request.save() + + total_amount += kill_request.depositor['total_amount'] + kill_house = KillHouse.objects.filter( + key=kill_request.kill_request.kill_house.key).select_related( + 'kill_house_operator__user').first() + kill_house_user = kill_house.kill_house_operator.user + creator = kill_house.kill_house_operator.user if role == 'KillHouse' else user + receiver = user if role == 'KillHouse' else SystemUserProfile.objects.filter( + role__name='ProvinceOperator', + province=user.province).first() + wage_payment.total_amount = total_amount + wage_payment.state = "completed" + wage_payment.save() + transaction = ExternalTransaction( + amount=total_amount, + status="completed", + transaction_type="wage-manual", + is_complete=True, + saleReferenceId=wage_payment.tracking_code, + kill_house_user=kill_house_user, + creator=creator, + receiver=receiver, + creator_role='KillHouse', + receiver_role='ProvinceOperator', + payer=user.fullname + + ) + transaction.save() + + return Response(serializer.data, status=status.HTTP_201_CREATED) + # return Response(serializer.errors) + + else: + if wallet == True: + + kill_house = KillHouse.objects.filter(key=kill_house_key, trash=False).select_related( + 'kill_house_operator__user').first() + kill_house_user = kill_house.kill_house_operator.user + creator = kill_house_user + receiver = kill_house_user + total_amount = input_amout + wage_payment.total_amount_with_tax = input_amount_with_tax + wage_payment.type = "wallet" + else: + + for province_kill_request in wage_payment.province_kill_request: + kill_request = ProvinceKillRequest.objects.filter(key=province_kill_request).select_related( + 'province_request__poultry_request').last() + # kill_request.wage_pay = True + kill_request.depositor = { + "role": role, + "payer": user.fullname, + "date": str(now), + "payment_type": wage_payment.payment_type, + "total_amount": kill_request.total_killed_weight * kill_request.wage + } + kill_request.save() + + total_amount += kill_request.depositor['total_amount'] + kill_house = KillHouse.objects.filter( + key=kill_request.kill_request.kill_house.key).select_related( + 'kill_house_operator__user').first() + kill_house_user = kill_house.kill_house_operator.user + creator = kill_house.kill_house_operator.user if role == 'KillHouse' else user + receiver = user if role == 'KillHouse' else SystemUserProfile.objects.filter( + role__name='ProvinceOperator', + province=user.province).first() + wage_payment.total_amount_with_tax = total_amount + (total_amount * (10 / 100)) + + wage_payment.total_amount = total_amount + wage_payment.save() + + payment_gate_way_percentage = PaymentGatewayPercentage.objects.get(trash=False) + company = payment_gate_way_percentage.company / 100 if payment_gate_way_percentage.company > 0 else 0 + union = payment_gate_way_percentage.union / 100 if payment_gate_way_percentage.union > 0 else 0 + guilds = payment_gate_way_percentage.guilds / 100 if payment_gate_way_percentage.guilds > 0 else 0 + + if user.province.name == 'لرستان': + province_deposit_id = sha_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = test_order_id + + + elif user.province.name == 'آذربایجان شرقی': + province_deposit_id = sha_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = sha_order_id + + elif user.province.name == 'اردبیل': + province_deposit_id = ar_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = ar_order_id + + + + elif user.province.name == 'همدان': + province_deposit_id = ha_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = ha_order_id + + + elif user.province.name == 'مركزی': + province_deposit_id = ma_deposit_id + province_deposit_percent = union + arta_api_deposit_id = arta_deposit_id + arta_api_deposit_percent = company + guilds_api_deposit_id = guilds_deposit_id + guilds_api_deposit_percent = guilds + gate_way_order_id = ma_order_id + + order_id = "{0}{1}{2}{3}{4}{5}{6}".format(gate_way_order_id, now.year, now.month, now.day, now.hour, + now.minute, now.second) + # if user.province.name == 'مركزی': + # result = PaymentGateway( + # "{0},{1},0;{2},{3},0;".format(province_deposit_id, 100, + # arta_api_deposit_id, + # int(total_amount - 100)), int(total_amount), + # order_id) + # else: + + if wallet == True: + final_total_amount = input_amount_with_tax + else: + final_total_amount = total_amount + (total_amount * (10 / 100)) + if company > 0 and union > 0 and guilds > 0: + result = PaymentGateway( + "{0},{1},0;{2},{3},0;{4},{5},0;".format(province_deposit_id, + int(final_total_amount * union), + arta_api_deposit_id, + int(final_total_amount * company), + guilds_api_deposit_id, + int(final_total_amount * guilds)), + int(final_total_amount), + order_id) + elif company > 0 and union > 0 and guilds == 0: + result = PaymentGateway( + "{0},{1},0;{2},{3},0;".format(province_deposit_id, + int(final_total_amount * union), + arta_api_deposit_id, + int(final_total_amount * company)), + int(final_total_amount), + order_id) + + elif company > 0 and union == 0 and guilds > 0: + result = PaymentGateway( + "{0},{1},0;{2},{3},0;".format( + + arta_api_deposit_id, + int(final_total_amount * company), + guilds_api_deposit_id, + int(final_total_amount * guilds)), + int(final_total_amount), + order_id) + else: + result = PaymentGateway( + "{0},{1},0;{2},{3},0;".format(province_deposit_id, + int(final_total_amount * union), + guilds_api_deposit_id, + int(final_total_amount * guilds)), + int(final_total_amount), + order_id) + + # result = PaymentGateway( + # "{0},{1},0;{2},{3},0;".format(sha_deposit_id, 10000, arta_deposit_id, 10000),20000, order_id) + if '400' in result.keys(): + wage_payment.state = 'failed' + wage_payment.message = result[400] + wage_payment.save() + if wallet == True: + transaction = ExternalTransaction( + amount=total_amount, + amount_with_tax=final_total_amount, + status="failed", + type="deposit", + transaction_type="wallet", + is_complete=False, + kill_house_user=kill_house_user, + creator=creator, + receiver=receiver, + creator_role='KillHouse', + receiver_role='KillHouse', + payer=kill_house_user.fullname, + message=result[400] + + ) + transaction.save() + else: + transaction = ExternalTransaction( + amount=total_amount, + amount_with_tax=final_total_amount, + status="failed", + transaction_type="wage-gateway", + is_complete=False, + kill_house_user=kill_house_user, + creator=creator, + receiver=receiver, + creator_role='KillHouse', + receiver_role='ProvinceOperator', + payer=user.fullname, + message=result[400] + + ) + transaction.save() + return Response(result[400], status=status.HTTP_400_BAD_REQUEST) + else: + wage_payment.refId = result[200] + wage_payment.orderId = order_id + wage_payment.save() + if wallet == True: + transaction = ExternalTransaction( + amount=total_amount, + amount_with_tax=final_total_amount, + status="pending", + type="deposit", + transaction_type="wallet", + is_complete=False, + kill_house_user=kill_house_user, + creator=creator, + receiver=receiver, + receiver_role='KillHouse', + creator_role='KillHouse', + payer=kill_house_user.fullname, + refId=result[200], + orderId=order_id + + ) + transaction.save() + else: + + transaction = ExternalTransaction( + amount=total_amount, + amount_with_tax=final_total_amount, + status="pending", + transaction_type="wage-gateway", + is_complete=False, + kill_house_user=kill_house_user, + creator=creator, + receiver=receiver, + receiver_role='KillHouse', + creator_role='ProvinceOperator', + payer=user.fullname, + refId=result[200], + orderId=order_id + + ) + transaction.save() + return Response({"refId": result[200]}, status=status.HTTP_201_CREATED) + + # return Response(serializer.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + wage_payment_list = [] + + if request.GET['state'] == 'failed': + wage_payment = WagePayment.objects.filter( + create_date__date__gte=date1, + create_date__date__lte=date2, + state='failed', + trash=False).order_by('id') + else: + wage_payment = WagePayment.objects.filter( + create_date__date__gte=date1, + create_date__date__lte=date2, + state='completed', + trash=False).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=wage_payment + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=wage_payment) + wage_payment_list = ps.filter() + wage_payment = [] if len(wage_payment_list) == 0 else wage_payment_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(wage_payment) + if page is not None: + serializer = WagePaymentSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = WagePaymentSerializer(wage_payment, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class WagePaymentFinalStepViewset(viewsets.ModelViewSet): + queryset = WagePayment.objects.all() + permission_classes = [AllowAny] + serializer_class = WagePaymentSerializer + + def create(self, request, *args, **kwargs): + ref_id = request.data['refId'] + wage_payment = WagePayment.objects.get(refId=ref_id, trash=False, state='pending') + transaction = InternalTransaction.objects.get(refId=ref_id, trash=False, status='pending') + + if 'error' in request.data.keys(): + wage_payment.state = "failed" + wage_payment.message = request.data['error'] + wage_payment.save() + transaction.status = "failed" + transaction.message = request.data['error'] + transaction.save() + + return Response({"result": "با خطا مواجه شد"}, status=status.HTTP_200_OK) + else: + now = datetime.now() + wage_payment.payer['date'] = str(now) + wage_payment.payer['tracking_code'] = request.data['saleReferenceId'] + wage_payment.payer['cardHolderPan'] = request.data['cardHolderPan'] + wage_payment.refId = request.data['refId'] + wage_payment.orderId = request.data['saleOrderId'] + wage_payment.cardHolderPan = request.data['cardHolderPan'] + wage_payment.tracking_code = request.data['saleReferenceId'] + wage_payment.state = "completed" + wage_payment.save() + transaction.refId = request.data['refId'] + transaction.orderId = request.data['saleOrderId'] + transaction.cardHolderPan = request.data['cardHolderPan'] + transaction.saleReferenceId = request.data['saleReferenceId'] + transaction.status = "completed" + transaction.save() + text = [] + killer = '' + + if transaction.kill_house is not None: + user = transaction.kill_house.name + mobile = transaction.kill_house.kill_house_operator.user.mobile + killer = 'کشتارگاه' if transaction.kill_house.killer == False else 'کشتارکن' + + else: + user = transaction.chain_company.name + mobile = transaction.chain_company.user.mobile + from_date = jdatetime.date.fromgregorian( + year=transaction.date.year, + month=transaction.date.month, + day=transaction.date.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + date = separate.join(reversed_date) + province = transaction.kill_house.kill_house_operator.user.province.name + if transaction.union_share > 0: + text.append({ + 'payer': user, + 'date': date, + 'share': transaction.union_share, + 'mobile': UNION_NUMBER, + 'province': province, + 'killer': killer + + }) + if transaction.company_share > 0: + text.append({ + 'payer': user, + 'date': date, + 'share': transaction.company_share, + 'mobile': COMPANY_NUMBER, + 'province': province, + 'killer': killer + + }) + if transaction.guilds_share > 0: + text.append({ + 'payer': user, + 'date': date, + 'share': transaction.guilds_share, + 'mobile': GUILD_NUMBER, + 'province': province, + 'killer': killer + + }) + text_for_company = [{ + 'payer': user, + 'date': date, + 'share': transaction.amount, + 'mobile': COMPANY_NUMBER, + 'province': province, + 'killer': killer + + }] + transaction_for_eata(request, transaction) + send_sms_for_company = threading.Thread(target=transaction_sms_threading_for_company, + args=(text_for_company)) + send_sms_for_kill_house = threading.Thread(target=transaction_sms_threading_appreciation, + args=(user, mobile)) + send_sms = threading.Thread(target=transaction_sms_threading, args=(text)) + send_sms.start() + send_sms_for_company.start() + send_sms_for_kill_house.start() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + # def create(self, request, *args, **kwargs): + # ref_id = request.data['refId'] + # wage_payment = WagePayment.objects.get(refId=ref_id, trash=False, state='pending') + # transaction = ExternalTransaction.objects.get(refId=ref_id, trash=False, status='pending') + # + # if 'error' in request.data.keys(): + # wage_payment.state = "failed" + # wage_payment.message = request.data['error'] + # wage_payment.save() + # transaction.status = "failed" + # transaction.message = request.data['error'] + # transaction.save() + # + # return Response({"result": "با خطا مواجه شد"}, status=status.HTTP_200_OK) + # else: + # now = datetime.now() + # wage_payment.payer['date'] = str(now) + # wage_payment.payer['tracking_code'] = request.data['saleReferenceId'] + # wage_payment.payer['cardHolderPan'] = request.data['cardHolderPan'] + # if wage_payment.type == None: + # + # for province_kill_request in wage_payment.province_kill_request: + # province_kill_request = ProvinceKillRequest.objects.filter( + # key=province_kill_request).select_related( + # 'province_request__poultry_request').last() + # province_kill_request.wage_pay = True + # province_kill_request.depositor['tracking_code'] = request.data['saleReferenceId'] + # province_kill_request.depositor['orderId'] = request.data['saleOrderId'] + # province_kill_request.depositor['refId'] = request.data['refId'] + # province_kill_request.depositor[ + # 'total_amount'] = province_kill_request.total_killed_weight * province_kill_request.wage + # # province_kill_request.depositor['total_amount'] = request.data['finalAmount'] + # province_kill_request.depositor['date'] = str(now) + # province_kill_request.depositor['cardHolderPan'] = request.data['cardHolderPan'] + # province_kill_request.save() + # + # wage_payment.total_amount_with_tax = request.data['finalAmount'] + # wage_payment.refId = request.data['refId'] + # wage_payment.orderId = request.data['saleOrderId'] + # wage_payment.cardHolderPan = request.data['cardHolderPan'] + # wage_payment.tracking_code = request.data['saleReferenceId'] + # wage_payment.state = "completed" + # wage_payment.save() + # transaction.amount_with_tax = request.data['finalAmount'] + # transaction.refId = request.data['refId'] + # transaction.orderId = request.data['saleOrderId'] + # transaction.cardHolderPan = request.data['cardHolderPan'] + # transaction.saleReferenceId = request.data['saleReferenceId'] + # transaction.status = "completed" + # transaction.save() + # + # return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +class WagePaymentWithLinkFinalStepViewset(viewsets.ModelViewSet): + queryset = WagePayment.objects.all() + permission_classes = [AllowAny] + serializer_class = WagePaymentSerializer + + def create(self, request, *args, **kwargs): + authority = request.data['authority'] + wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() + # wage_payment = WagePayment.objects.get(authority=authority, trash=False, state='pending') + transaction = InternalTransaction.objects.get(authority=authority, trash=False, status='pending') + + if 'error' in request.data.keys(): + # wage_payment.state = "failed" + # wage_payment.message = request.data['error'] + # wage_payment.save() + transaction.status = "failed" + transaction.message = request.data['error'] + transaction.save() + + return Response({"result": "با خطا مواجه شد"}, status=status.HTTP_200_OK) + else: + now = datetime.now() + # wage_payment.payer['date'] = str(now) + # wage_payment.payer['cardHolderPan'] = request.data['cardHolderPan'] + # wage_payment.refId = request.data['refId'] + # wage_payment.cardHolderPan = request.data['cardHolderPan'] + # wage_payment.state = "completed" + # wage_payment.save() + transaction.refId = request.data['refId'] + transaction.cardHolderPan = request.data['cardHolderPan'] + transaction.status = "completed" + transaction.save() + text = [] + + if transaction.payer_type == 'poultry': + # if transaction.poultry_request is not None: + # poultry_requests = PoultryRequest.objects.filter(id=transaction.poultry_request.id,trash=False) + # + # + # else: + # poultry_requests = PoultryRequest.objects.filter(payer_type='poultry', + # poultry__user=transaction.user, + # out_province_request_cancel=False, out=True, + # has_wage=True, + # province_state='accepted', wage_pay=False, trash=False) + poultry_requests = transaction.poultry_request.all() + for poultry_request in poultry_requests: + if poultry_request.has_wage == True and poultry_request.wage_pay == False: + # hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + # if hatching.left_over >= poultry_request.quantity: + # hatching.out_province_killed_weight += int( + # poultry_request.quantity * poultry_request.Index_weight) + # hatching.out_province_killed_quantity += poultry_request.quantity + # hatching.save() + # else: + # different_quantity = poultry_request.quantity - hatching.left_over + # hatching.out_province_killed_weight += int( + # hatching.left_over * poultry_request.Index_weight) + # hatching.out_province_killed_quantity += hatching.left_over + # hatching.extra_killed_quantity += different_quantity + # hatching.save() + poultry_request.wage_pay = True + poultry_request.save() + if wage_type and wage_type.status == True: + province_operator = ProvinceOperator.objects.filter(trash=False).last() + + vet = VetFarm.objects.filter(trash=False, poultry=poultry_request.poultry).first() + vet_number = vet.vet.user.mobile if vet else None + province_operator_mobile = province_operator.user.mobile + date_str = poultry_request.send_date + send_date = datetime.strptime(str(date_str), '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + poultry_fullname = poultry_request.poultry.unit_name + quantity = poultry_request.quantity + chicken_breed = poultry_request.chicken_breed + order_code = poultry_request.order_code + sms_operator_out_poultry_request_sms = threading.Thread( + target=operator_out_poultry_request_sms, + args=( + province_operator_mobile, + poultry_fullname, + quantity, chicken_breed, + order_code, send_date, + poultry_request.free_sale_in_province, + poultry_request.amount, + vet_number + )) + sms_operator_out_poultry_request_sms.start() + vet_farm = VetFarm.objects.filter(trash=False, poultry__in=poultry_requests.values_list('poultry', + flat=True).distinct()).first() + bot_eitaa_out_province_live_bar(request, poultry_requests, vet_farm) + if transaction.payer_type == 'buyer': + buyer = OutProvincePoultryRequestBuyer.objects.get(user=transaction.user, trash=False) + poultry_requests = transaction.poultry_request.all() + # poultry_requests = PoultryRequest.objects.filter(out_province_poultry_request_buyer=buyer, + # payer_type='buyer', out_province_request_cancel=False, + # out=True, has_wage=True, + # province_state='accepted', wage_pay=False, trash=False) + for poultry_request in poultry_requests: + if poultry_request.has_wage == True and poultry_request.wage_pay == False: + # hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + # if hatching.left_over >= poultry_request.quantity: + # hatching.out_province_killed_weight += int( + # poultry_request.quantity * poultry_request.Index_weight) + # hatching.out_province_killed_quantity += poultry_request.quantity + # hatching.save() + # else: + # different_quantity = poultry_request.quantity - hatching.left_over + # hatching.out_province_killed_weight += int( + # hatching.left_over * poultry_request.Index_weight) + # hatching.out_province_killed_quantity += hatching.left_over + # hatching.extra_killed_quantity += different_quantity + # hatching.save() + poultry_request.wage_pay = True + poultry_request.save() + + if wage_type and wage_type.status == True: + province_operator = ProvinceOperator.objects.filter(trash=False).last() + + vet = VetFarm.objects.filter(trash=False, poultry=poultry_request.poultry).first() + vet_number = vet.vet.user.mobile if vet else None + province_operator_mobile = province_operator.user.mobile + date_str = poultry_request.send_date + send_date = datetime.strptime(str(date_str), '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + poultry_fullname = poultry_request.poultry.unit_name + quantity = poultry_request.quantity + chicken_breed = poultry_request.chicken_breed + order_code = poultry_request.order_code + sms_operator_out_poultry_request_sms = threading.Thread( + target=operator_out_poultry_request_sms, + args=( + province_operator_mobile, + poultry_fullname, + quantity, chicken_breed, + order_code, send_date, + poultry_request.free_sale_in_province, + poultry_request.amount, + vet_number + )) + sms_operator_out_poultry_request_sms.start() + vet_farm = VetFarm.objects.filter(trash=False, poultry__in=poultry_requests.values_list('poultry', + flat=True).distinct()).first() + + bot_eitaa_out_province_live_bar(request, poultry_requests, vet_farm) + killer = '' + if transaction.kill_house is not None: + user = transaction.kill_house.name + mobile = transaction.kill_house.kill_house_operator.user.mobile + killer = 'کشتارگاه' if transaction.kill_house.killer == False else 'کشتارکن' + province = transaction.kill_house.kill_house_operator.user.province.name + elif transaction.out_province_poultry_request_buyer is not None: + buyer = OutProvincePoultryRequestBuyer.objects.get(user=transaction.user, trash=False) + user = buyer.user.fullname + mobile = buyer.user.mobile + province = buyer.province + + + + + # elif transaction.poultry_request is not None: + # poultry_request = PoultryRequest.objects.get(key=transaction.poultry_request.key, trash=False) + # poultry_request.wage_pay = True + # poultry_request.save() + # update_out_province_hatching(poultry_request.hatching) + # + # user = transaction.poultry_request.poultry.unit_name if transaction.poultry_request.payer_type == 'poultry' else transaction.poultry_request.payer_fullname + # mobile = transaction.poultry_request.poultry.user.mobile if transaction.poultry_request.payer_type == 'poultry' else \ + # transaction.poultry_request.buyer['mobile'] + + elif transaction.chain_company is not None: + user = transaction.chain_company.name + mobile = transaction.chain_company.user.mobile + province = transaction.chain_company.user.province.name + + else: + user = transaction.user.fullname + mobile = transaction.user.mobile + province = transaction.user.province.name + + from_date = jdatetime.date.fromgregorian( + year=transaction.date.year, + month=transaction.date.month, + day=transaction.date.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + date = separate.join(reversed_date) + if transaction.union_share > 0: + text.append({ + 'payer': user, + 'date': date, + 'share': transaction.union_share, + 'mobile': UNION_NUMBER, + 'province': province, + 'killer': killer + + }) + if transaction.company_share > 0: + text.append({ + 'payer': user, + 'date': date, + 'share': transaction.company_share, + 'mobile': COMPANY_NUMBER, + 'province': province, + 'killer': killer + + }) + if transaction.guilds_share > 0: + text.append({ + 'payer': user, + 'date': date, + 'share': transaction.guilds_share, + 'mobile': GUILD_NUMBER, + 'province': province, + 'killer': killer + + }) + text_for_company = [{ + 'payer': user, + 'date': date, + 'share': transaction.amount, + 'mobile': COMPANY_NUMBER, + 'province': province, + 'killer': killer + + }] + transaction_for_eata(request, transaction) + if transaction.kill_house is not None: + send_sms_for_zir_bakhs = threading.Thread(target=transaction_sms_threading_in_province, + args=(text)) + send_sms_for_zir_bakhs.start() + + send_sms_for_company = threading.Thread(target=transaction_sms_threading_for_company, + args=(text_for_company)) + send_sms_for_kill_house = threading.Thread(target=transaction_sms_threading_appreciation, + args=(user, mobile)) + send_sms = threading.Thread(target=transaction_sms_threading, args=(text)) + send_sms.start() + send_sms_for_company.start() + send_sms_for_kill_house.start() + + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + # def create(self, request, *args, **kwargs): + # ref_id = request.data['refId'] + # wage_payment = WagePayment.objects.get(refId=ref_id, trash=False, state='pending') + # transaction = ExternalTransaction.objects.get(refId=ref_id, trash=False, status='pending') + # + # if 'error' in request.data.keys(): + # wage_payment.state = "failed" + # wage_payment.message = request.data['error'] + # wage_payment.save() + # transaction.status = "failed" + # transaction.message = request.data['error'] + # transaction.save() + # + # return Response({"result": "با خطا مواجه شد"}, status=status.HTTP_200_OK) + # else: + # now = datetime.now() + # wage_payment.payer['date'] = str(now) + # wage_payment.payer['tracking_code'] = request.data['saleReferenceId'] + # wage_payment.payer['cardHolderPan'] = request.data['cardHolderPan'] + # if wage_payment.type == None: + # + # for province_kill_request in wage_payment.province_kill_request: + # province_kill_request = ProvinceKillRequest.objects.filter( + # key=province_kill_request).select_related( + # 'province_request__poultry_request').last() + # province_kill_request.wage_pay = True + # province_kill_request.depositor['tracking_code'] = request.data['saleReferenceId'] + # province_kill_request.depositor['orderId'] = request.data['saleOrderId'] + # province_kill_request.depositor['refId'] = request.data['refId'] + # province_kill_request.depositor[ + # 'total_amount'] = province_kill_request.total_killed_weight * province_kill_request.wage + # # province_kill_request.depositor['total_amount'] = request.data['finalAmount'] + # province_kill_request.depositor['date'] = str(now) + # province_kill_request.depositor['cardHolderPan'] = request.data['cardHolderPan'] + # province_kill_request.save() + # + # wage_payment.total_amount_with_tax = request.data['finalAmount'] + # wage_payment.refId = request.data['refId'] + # wage_payment.orderId = request.data['saleOrderId'] + # wage_payment.cardHolderPan = request.data['cardHolderPan'] + # wage_payment.tracking_code = request.data['saleReferenceId'] + # wage_payment.state = "completed" + # wage_payment.save() + # transaction.amount_with_tax = request.data['finalAmount'] + # transaction.refId = request.data['refId'] + # transaction.orderId = request.data['saleOrderId'] + # transaction.cardHolderPan = request.data['cardHolderPan'] + # transaction.saleReferenceId = request.data['saleReferenceId'] + # transaction.status = "completed" + # transaction.save() + # + # return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +class WagePaymentFinalStepZarinPalViewset(viewsets.ModelViewSet): + queryset = WagePayment.objects.all() + permission_classes = [AllowAny] + serializer_class = WagePaymentSerializer + + def create(self, request, *args, **kwargs): + authority = request.data['authority'] + # wage_payment = WagePayment.objects.get(authority=authority, trash=False, state='pending') + transaction = InternalTransaction.objects.get(authority=authority, trash=False, status='pending') + # ref_id = request.data['refId'] + # wage_payment = WagePayment.objects.get(refId=ref_id, trash=False, state='pending') + # transaction = InternalTransaction.objects.get(refId=ref_id, trash=False, status='pending') + + if 'error' in request.data.keys(): + # wage_payment.state = "failed" + # wage_payment.message = request.data['error'] + # wage_payment.save() + # transaction.status = "failed" + transaction.message = request.data['error'] + transaction.save() + + return Response({"result": "با خطا مواجه شد"}, status=status.HTTP_200_OK) + else: + now = datetime.now() + # wage_payment.payer['date'] = str(now) + # wage_payment.payer['cardHolderPan'] = request.data['cardHolderPan'] + # wage_payment.refId = request.data['refId'] + # wage_payment.cardHolderPan = request.data['cardHolderPan'] + # wage_payment.state = "completed" + # wage_payment.save() + transaction.refId = request.data['refId'] + transaction.cardHolderPan = request.data['cardHolderPan'] + transaction.status = "completed" + transaction.save() + text = [] + killer = '' + + if transaction.kill_house is not None: + user = transaction.kill_house.name + mobile = transaction.kill_house.kill_house_operator.user.mobile + killer = 'کشتارگاه' if transaction.kill_house.killer == False else 'کشتارکن' + else: + user = transaction.chain_company.name + mobile = transaction.chain_company.user.mobile + from_date = jdatetime.date.fromgregorian( + year=transaction.date.year, + month=transaction.date.month, + day=transaction.date.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + date = separate.join(reversed_date) + province = transaction.kill_house.kill_house_operator.user.province.name + + if transaction.union_share > 0: + text.append({ + 'payer': user, + 'date': date, + 'share': transaction.union_share, + 'mobile': UNION_NUMBER, + 'province': province, + 'killer': killer + }) + if transaction.company_share > 0: + text.append({ + 'payer': user, + 'date': date, + 'share': transaction.company_share, + 'mobile': COMPANY_NUMBER, + 'province': province, + 'killer': killer + + }) + if transaction.guilds_share > 0: + text.append({ + 'payer': user, + 'date': date, + 'share': transaction.guilds_share, + 'mobile': GUILD_NUMBER, + 'province': province, + 'killer': killer + + }) + text_for_company = [{ + 'payer': user, + 'date': date, + 'share': transaction.amount, + 'mobile': COMPANY_NUMBER, + 'province': province, + 'killer': killer + + }] + transaction_for_eata(request, transaction) + send_sms_for_company = threading.Thread(target=transaction_sms_threading_for_company, + args=(text_for_company)) + send_sms_for_kill_house = threading.Thread(target=transaction_sms_threading_appreciation, + args=(user, mobile)) + send_sms = threading.Thread(target=transaction_sms_threading, args=(text)) + send_sms.start() + send_sms_for_company.start() + send_sms_for_kill_house.start() + return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + # def create(self, request, *args, **kwargs): + # ref_id = request.data['refId'] + # wage_payment = WagePayment.objects.get(refId=ref_id, trash=False, state='pending') + # transaction = ExternalTransaction.objects.get(refId=ref_id, trash=False, status='pending') + # + # if 'error' in request.data.keys(): + # wage_payment.state = "failed" + # wage_payment.message = request.data['error'] + # wage_payment.save() + # transaction.status = "failed" + # transaction.message = request.data['error'] + # transaction.save() + # + # return Response({"result": "با خطا مواجه شد"}, status=status.HTTP_200_OK) + # else: + # now = datetime.now() + # wage_payment.payer['date'] = str(now) + # wage_payment.payer['tracking_code'] = request.data['saleReferenceId'] + # wage_payment.payer['cardHolderPan'] = request.data['cardHolderPan'] + # if wage_payment.type == None: + # + # for province_kill_request in wage_payment.province_kill_request: + # province_kill_request = ProvinceKillRequest.objects.filter( + # key=province_kill_request).select_related( + # 'province_request__poultry_request').last() + # province_kill_request.wage_pay = True + # province_kill_request.depositor['tracking_code'] = request.data['saleReferenceId'] + # province_kill_request.depositor['orderId'] = request.data['saleOrderId'] + # province_kill_request.depositor['refId'] = request.data['refId'] + # province_kill_request.depositor[ + # 'total_amount'] = province_kill_request.total_killed_weight * province_kill_request.wage + # # province_kill_request.depositor['total_amount'] = request.data['finalAmount'] + # province_kill_request.depositor['date'] = str(now) + # province_kill_request.depositor['cardHolderPan'] = request.data['cardHolderPan'] + # province_kill_request.save() + # + # wage_payment.total_amount_with_tax = request.data['finalAmount'] + # wage_payment.refId = request.data['refId'] + # wage_payment.orderId = request.data['saleOrderId'] + # wage_payment.cardHolderPan = request.data['cardHolderPan'] + # wage_payment.tracking_code = request.data['saleReferenceId'] + # wage_payment.state = "completed" + # wage_payment.save() + # transaction.amount_with_tax = request.data['finalAmount'] + # transaction.refId = request.data['refId'] + # transaction.orderId = request.data['saleOrderId'] + # transaction.cardHolderPan = request.data['cardHolderPan'] + # transaction.saleReferenceId = request.data['saleReferenceId'] + # transaction.status = "completed" + # transaction.save() + # + # return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK) + + +class ObservatoryViewSet(viewsets.ModelViewSet): + queryset = Observatory.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ObservatorySerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + observatory = user.observatory_user.all() + + # send to serializer + serializer = self.serializer_class(observatory[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class POSTransactionsViewSet(viewsets.ModelViewSet): + queryset = POSTransactions.objects.all() + permission_classes = [AllowAny] + serializer_class = POSTransactionsSerializer + + def create(self, request, *args, **kwargs): + pos = POSMachine.objects.get(pos_id=request.data['posid'], trash=False) + pos.Lat = request.data['lot'] + pos.Long = request.data['lng'] + pos.save() + guild = Guilds.objects.get(key=pos.guild.key, trash=False) + guilds_ware_house = GuildsWareHouse.objects.filter(guilds=guild).first() + if 'paid' in request.data.keys(): + if request.data['paid'] == False: + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + transaction = serializer.create(validated_data=request.data) + transaction.guild = guild + transaction.user = guild.user + transaction.registered = True + transaction.save() + serializer = self.serializer_class(transaction) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(self.serializer_class.errors, status=status.HTTP_400_BAD_REQUEST) + else: + if request.data['checkout'] == False: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + transaction = serializer.create(validated_data=request.data) + transaction.guild = guild + transaction.user = guild.user + transaction.registered = True + transaction.save() + else: + transaction = POSTransactions.objects.get(resnum=request.data['resnum']) + serializer = self.serializer_class(transaction) + serializer.update(instance=transaction, validated_data=request.data) + products = request.data['product'] + for product in products: + if product['name'] == 'مرغ گرم': + guild_product = Product.objects.get(name=product['name'], guild=guild, trash=False) + guild_product.sale_weight += product['cur_qty'] / 1000 + guild_product.remain_weight -= product['cur_qty'] / 1000 + guild_product.save() + guilds_ware_house.allocated_total_weight_of_carcasses += product['cur_qty'] / 1000 + guilds_ware_house.remain_total_weight_of_carcasses -= product['cur_qty'] / 1000 + guilds_ware_house.save() + serializer = self.serializer_class(transaction) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + # pos = POSMachine.objects.get(pos_id=request.GET['posid'], trash=False) + guild = Guilds.objects.get(key=request.GET['guild_key'], trash=False) + transactions = POSTransactions.objects.filter(guild=guild).order_by('-create_date') + serializer = self.serializer_class(transactions, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PosVersionViewSet(viewsets.ModelViewSet): + queryset = PosVersion.objects.all() + permission_classes = [AllowAny] + serializer_class = PosVersiontSerializer + + def create(self, request, *args, **kwargs): + pos_version = PosVersion.objects.filter(trash=False).first() + if not pos_version: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_version = serializer.create(validated_data=request.data) + return Response(serializer.data, status=status.HTTP_201_CREATED) + else: + serializer = self.serializer_class(pos_version) + serializer.update(instance=pos_version, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + pos_version = PosVersion.objects.filter(trash=False).first() + serializer = self.serializer_class(pos_version) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PosItemViewSet(viewsets.ModelViewSet): + queryset = PosItem.objects.all() + permission_classes = [AllowAny] + serializer_class = PosItemSerializer + + def create(self, request, *args, **kwargs): + try: + pos_item = PosItem.objects.get(name=request.data['name'], trash=False) + serializer = self.serializer_class(pos_item) + serializer.update(instance=pos_item, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + except: + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_version = serializer.create(validated_data=request.data) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + +class GuildRoomViewSet(viewsets.ModelViewSet): + queryset = GuildRoom.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = GuildRoomSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + guild_room = user.guild_room_user.all() + + # send to serializer + serializer = self.serializer_class(guild_room[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class POSMachineForServerViewSet(viewsets.ModelViewSet): + queryset = POSMachine.objects.all() + permission_classes = [AllowAny] + serializer_class = POSMachineForServerSerializer + + def list(self, request, *args, **kwargs): + guild = Guilds.objects.get(key=request.GET['guild_key'], trash=False) + pos_machine = POSMachine.objects.filter(guild=guild, trash=False) + serializer = self.serializer_class(pos_machine, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class POSMachineForInspectionViewSet(viewsets.ModelViewSet): + queryset = POSMachine.objects.all() + permission_classes = [AllowAny] + serializer_class = POSMachineForInspectionSerializer + + def list(self, request, *args, **kwargs): + pos_machine = POSMachine.objects.filter(trash=False) + serializer = self.serializer_class(pos_machine, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +def register_information_in_server(pos_machine, guild_key, server): + u = "https://pos.rasadyar.com/api/async/pos?id={}&shop={}&server={}".format( + pos_machine, guild_key, server) + + url = u.format() + + payload = {} + headers = {"Content-Type": "application/x-www-form-urlencoded"} + + response = requests.request("GET", url, headers=headers, data=payload) + if response.json()['code'] == 200: + pos = POSMachine.objects.get(pos_id=pos_machine, trash=False) + pos.server_register = True + pos.save() + + +class POSMachineViewSet(viewsets.ModelViewSet): + queryset = POSMachine.objects.all() + permission_classes = [AllowAny] + serializer_class = POSMachineSerializer + + def create(self, request, *args, **kwargs): + import string + import random + server = None + guild = None + kill_house = None + if 'serial' in request.data.keys() and request.data['serial'] is not None: + exist_pos = POSMachine.objects.filter(serial=request.data['serial'], trash=False).first() + if exist_pos: + exist_pos.serial = "" + exist_pos.password = None + exist_pos.save() + # return Response({"result": "شماره سریال دستگاه وارد شده قبلا استفاده شده است! "}, + # status=status.HTTP_403_FORBIDDEN) + if 'password' in request.data.keys() and request.data['password'] is None: + return Response({"result": "کلمه عبور مدیریتی را وارد کنید! "}, + status=status.HTTP_403_FORBIDDEN) + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if user.province.name == 'مرکزی': + server = 'markazi' + elif user.province.name == 'همدان': + server = 'hamedan' + else: + server = 'test' + company = PosCompany.objects.get(user=user, trash=False) + if 'guild_key' in request.data.keys(): + guild = Guilds.objects.get(key=request.data['guild_key'], trash=False) + request.data.pop('guild_key') + else: + kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + request.data.pop('kill_house_key') + + while (True): + res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=10)) + res = base_pos_id + res + if not POSMachine.objects.filter(pos_id=res).exists(): + break + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_machine = serializer.create(validated_data=request.data) + pos_machine.pos_id = res + if kill_house is not None: + pos_machine.user = kill_house.kill_house_operator.user + pos_machine.kill_house = kill_house + else: + pos_machine.user = guild.user + pos_machine.guild = guild + guild.has_pos = True + guild.save() + pos_machine.pos_company = company + pos_machine.save() + + # register_information_in_server_threading = threading.Thread( + # target=register_information_in_server, + # args=( + # pos_machine.pos_id, guild.key, server)) + # register_information_in_server_threading.start() + return Response({"result": "باموفقیت ثبت شد!"}, status=status.HTTP_201_CREATED) + + def update(self, request, *args, **kwargs): + if 'pos_id' in request.data.keys(): + pos = POSMachine.objects.get( + pos_id=request.data['pos_id']) + timestamp_date = request.data['timestamp_date'] + pos_date = datetime.fromtimestamp(timestamp_date) + request.data.pop('timestamp_date') + pos.last_check = pos_date + pos.save() + else: + pos = POSMachine.objects.get( + key=request.data['pos_key']) + request.data.pop('pos_key') + serializer = self.serializer_class(pos) + serializer.update(instance=pos, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class FinalPOSMachineViewSet(viewsets.ModelViewSet): + queryset = POSMachine.objects.all() + permission_classes = [AllowAny] + serializer_class = NewPOSMachineSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = POSMachineFilterSet + filterset_fields = [ + 'pos_id', + 'serial', + 'password', + 'pos_company__name', + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'user__mobile', + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + ] + + def create(self, request, *args, **kwargs): + import string + import random + user = SystemUserProfile.objects.get(user=request.user, trash=False) + company = PosCompany.objects.get(user=user, trash=False) + if 'serial' in request.data.keys() and request.data['serial'] is not None: + exist_pos = POSMachine.objects.filter(serial=request.data['serial'], trash=False).first() + if exist_pos: + exist_pos.serial = "" + exist_pos.password = None + exist_pos.save() + # return Response({"result": "شماره سریال دستگاه وارد شده قبلا استفاده شده است! "}, + # status=status.HTTP_403_FORBIDDEN) + if 'password' in request.data.keys() and request.data['password'] is None: + return Response({"result": "کلمه عبور مدیریتی را وارد کنید! "}, + status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_machine = serializer.create(validated_data=request.data) + pos_machine.pos_company = company + pos_machine.save() + return Response({"result": "باموفقیت ثبت شد!"}, status=status.HTTP_201_CREATED) + + def update(self, request, *args, **kwargs): + pos_machine = POSMachine.objects.get(key=request.data['key'], trash=False) + owner_type = request.data.get('owner_type') + if owner_type: + if owner_type == 'kill_house': + kill_house = KillHouse.objects.get(key=request.data['owner_key']) + pos_machine.kill_house = kill_house + pos_machine.guild = None + pos_machine.steward = None + pos_machine.user = kill_house.kill_house_operator.user + + else: + guild_steward = Guilds.objects.get(key=request.data['owner_key']) + pos_machine.guild = guild_steward + pos_machine.user = guild_steward.user + pos_machine.kill_house = None + pos_machine.steward = None + + if not pos_machine.pos_id: + while (True): + res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=10)) + res = base_pos_id + res + if not POSMachine.objects.filter(pos_id=res).exists(): + break + pos_machine.pos_id = res + pos_machine.save() + request.data.pop('owner_type') + request.data.pop('owner_key') + serializer = self.serializer_class(pos_machine) + serializer.update(instance=pos_machine, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + role = request.GET.get('role') + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if role == 'PosCompany': + company = PosCompany.objects.get(user=user, trash=False) + pos_machines = POSMachine.objects.filter(pos_company=company, trash=False).order_by('-create_date') + + else: + pos_machines = POSMachine.objects.filter(trash=False, cooperative__isnull=True).order_by('-create_date') + + if 'search' in request.GET: + pos_machines_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=pos_machines + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=pos_machines) + pos_machines_list = ps.filter() + pos_machines = [] if len(pos_machines_list) == 0 else pos_machines_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(pos_machines) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(pos_machines, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# class UserPOSMachineViewSet(viewsets.ModelViewSet): +# queryset = POSMachine.objects.all() +# +# def get_serializer_class(self): +# if self.action in ['list', 'retrieve']: +# return POSMachineReadSerializer +# return POSMachineTransferSerializer +# +# @action(detail=True, methods=['post']) +# def transfer(self, request, pk=None): +# pos = self.get_object() +# serializer = self.get_serializer( +# data=request.data, +# context={'pos': pos, 'request': request} +# ) +# serializer.is_valid(raise_exception=True) +# serializer.save() +# return Response({"detail": "انتقال با موفقیت انجام شد"}) + +class UserPOSMachineViewSet(viewsets.ModelViewSet): + queryset = POSMachine.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = UserPOSMachineSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = POSMachineFilterSet + filterset_fields = [ + 'pos_id', + 'serial', + 'receiver_number', + 'terminal_number', + 'pos_unique_id', + 'password', + 'pos_company__name', + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'user__mobile', + 'owner__first_name', + 'owner__last_name', + 'owner__fullname', + 'owner__mobile', + 'current_user__first_name', + 'current_user__last_name', + 'current_user__fullname', + 'current_user__mobile', + 'current_representative__first_name', + 'current_representative__last_name', + 'current_representative__mobile', + 'current_representative__city', + ] + + def list(self, request, *args, **kwargs): + role = request.GET.get('role') + pos_filter = { + 'trash': False + } + if role in ('KillHouse', 'Steward', 'Guilds'): + user = SystemUserProfile.objects.get(trash=False, user=request.user) + pos_filter['owner'] = user + + pos = POSMachine.objects.filter(**pos_filter).order_by('id') + if 'search' in request.GET: + pos_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=pos + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=pos) + pos_list = ps.filter() + pos = [] if len(pos_list) == 0 else pos_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(pos) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(pos, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + performed_by = SystemUserProfile.objects.get(user=request.user, trash=False) + pos_machine = POSMachine.objects.get(key=request.data['key'], trash=False) + recipient_type = request.data.pop('recipient_type', None) + recipient = request.data.pop('recipient_key', None) + if recipient_type in ('owner', 'current_user'): + recipient = SystemUserProfile.objects.get(key=recipient, trash=False) + else: + recipient = Representative.objects.get(key=recipient, trash=False) + serializer = self.serializer_class(POSTransferService.transfer( + pos_machine, + recipient_type, + recipient, + performed_by + )) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class POSMachineForLiveStackViewSet(viewsets.ModelViewSet): + queryset = POSMachine.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = POSMachineForLiveStockSerializer + + def list(self, request, *args, **kwargs): + if 'cooperative_key' in request.GET: + cooperative = Cooperative.objects.get(key=request.GET['cooperative_key'], trash=False) + pos = POSMachine.objects.filter(trash=False, cooperative=cooperative).order_by('id') + + else: + pos = POSMachine.objects.filter(trash=False).order_by('id') + + serializer = self.serializer_class(pos, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class POSDeviceSessionViewSet(viewsets.ModelViewSet): + queryset = POSDeviceSession.objects.all() + permission_classes = [AllowAny] + serializer_class = POSDeviceSessionSerializer + + def create(self, request, *args, **kwargs): + password = None + + validator = PosDeviceValidator(request) + + validation_error = validator.validation_version() + if validation_error: + return validation_error + + device_mac = request.headers.get('device-mac') + device_name = request.headers.get('device-name') + device_sdk = request.headers.get('device-sdk') + device_serial = request.headers.get('device-serial') + device_provider = request.headers.get('device-provider') + device_version = request.headers.get('device-version') + device_lng = request.headers.get('device-lng') + device_lot = request.headers.get('device-lot') + + client_ip = get_client_ip(request) + pos = None + if not device_mac or not device_provider or not device_version: + return Response({"result": "مقادیر ارسالی صحیح نمیباشد!"}, status=status.HTTP_403_FORBIDDEN) + + if 'pos' in request.data and 'password' in request.data: + password = request.data['password'] + pos = POSMachine.objects.filter(pos_id=request.data['pos'], trash=False).first() + request.data.pop('password') + request.data.pop('pos') + if not pos and device_serial and device_serial != 'unknown': + pos = POSMachine.objects.filter(serial=device_serial, trash=False).first() + password = pos.password if pos else None + + if not pos: + return Response({"result": "کد پذیرنده نامعتبر میباشد!"}, status=status.HTTP_403_FORBIDDEN) + + if not pos.active: + return Response({"result": "این پذیرنده توسط مدیریت مسدود شده است!"}, status=status.HTTP_403_FORBIDDEN) + if pos.pos_company.en_name != device_provider and not pos.multi_device: + return Response({"result": f"کد پذیرنده برای {pos.pos_company.name} تعریف شده است"}, + status=status.HTTP_403_FORBIDDEN) + body_data = { + "mac": device_mac, + "name": device_name, + "sdk": device_sdk, + "serial": device_serial, + "version": device_version, + "lng": device_lng, + "lot": device_lot, + "ip": client_ip, + "password": password, + "session_create_date": datetime.now(), + "session_last_seen_date": datetime.now(), + } + + pos_session = POSDeviceSession.objects.filter(pos=pos, trash=False) + + if pos_session: + curent_session = pos_session.filter(mac=device_mac).first() + if curent_session: + serializer = self.serializer_class(curent_session) + serializer.update(instance=curent_session, validated_data=body_data) + return Response({"result": "خوش آمدید", "pos_id": pos.pos_id, "pos_password": password, + 'fullname': pos.user.fullname, 'mobile': pos.user.mobile}, + status=status.HTTP_200_OK) + elif not pos.multi_device: + return Response({"result": "کد پذیرنده توسط دستگاه دیگری درحال استفاده میباشد!"}, + status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(data=body_data) + if serializer.is_valid(): + pos_session = serializer.create(validated_data=body_data) + pos_session.pos = pos + pos_session.password = password + pos_session.save() + return Response( + {"result": "خوش آمدید", "pos_id": pos.pos_id, "pos_password": password, 'fullname': pos.user.fullname, + 'mobile': pos.user.mobile}, + status=status.HTTP_200_OK) + return Response(serializer.errors) + + def update(self, request, *args, **kwargs): + if 'pos_id' in request.data.keys(): + pos = POSMachine.objects.get( + pos_id=request.data['pos_id']) + timestamp_date = request.data['timestamp_date'] + pos_date = datetime.fromtimestamp(timestamp_date) + request.data.pop('timestamp_date') + pos.last_check = pos_date + pos.save() + else: + pos = POSMachine.objects.get( + key=request.data['pos_key']) + request.data.pop('pos_key') + serializer = self.serializer_class(pos) + serializer.update(instance=pos, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class POSDeviceSessionForInspectionViewSet(viewsets.ModelViewSet): + queryset = POSDeviceSession.objects.all() + permission_classes = [AllowAny] + serializer_class = POSDeviceSessionForInspectionSerializer + + def list(self, request, *args, **kwargs): + pos_devices = POSDeviceSession.objects.filter(trash=False, lng__gt=0, lot__gt=0).order_by('id').select_related( + 'pos') + serializer = self.serializer_class(pos_devices, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + pos_session = POSDeviceSession.objects.get(key=request.GET['session_key'], trash=False) + pos_session.trash = True + pos_session.save() + + return Response({"result": "موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class PosDeviceVersionViewSet(viewsets.ModelViewSet): + queryset = PosDeviceVersion.objects.all() + permission_classes = [AllowAny] + serializer_class = PosDeviceVersionSerializer + + def create(self, request, *args, **kwargs): + if 'provider' not in request.data.keys() or request.data['provider'] == "": + return Response({"result": "invalid input"}, status=status.HTTP_403_FORBIDDEN) + + else: + company = PosCompany.objects.get(en_name=request.data['provider']) + request.data.pop('provider') + if 'code' not in request.data.keys() or request.data['code'] == "": + return Response({"result": "invalid input"}, status=status.HTTP_403_FORBIDDEN) + pos_version = PosDeviceVersion.objects.filter(company=company, code=request.data['code']).first() + if pos_version: + serializer = self.serializer_class(pos_version) + serializer.update(instance=pos_version, validated_data=request.data) + else: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_version = serializer.create(validated_data=request.data) + pos_version.company = company + pos_version.save() + return Response({"result": "done!"}, status=status.HTTP_200_OK) + + +class ColdHouseViewSet(viewsets.ModelViewSet): + queryset = ColdHouse.objects.all() + permission_classes = [AllowAny] + serializer_class = ColdHouseSerializer + + def create(self, request, *args, **kwargs): + steward = None + kill_house = None + if 'steward_key' in request.data.keys(): + steward = Guilds.objects.get(key=request.data['steward_key'], trash=False) + request.data.pop('steward_key') + else: + kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False) + request.data.pop('kill_house_key') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + cold_house = serializer.create(validated_data=request.data) + if steward: + cold_house.steward = steward + else: + cold_house.kill_house = kill_house + cold_house.save() + serializer = self.serializer_class(cold_house) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + if 'total' in request.GET: + cold_houses = ColdHouse.objects.all() + serializer = self.serializer_class(cold_houses, many=True) + else: + if request.GET['role'] == 'KillHouse': + if 'dashboard' in request.GET: + # kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + serializer = ColdHouseSerializer(cold_house) + + + elif 'allocation' in request.GET: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + cold_house = ColdHouse.objects.filter(trash=False).order_by('kill_house').exclude( + kill_house=kill_house) + + serializer = ColdHouseSerializer(cold_house, many=True) + + else: + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + cold_house = ColdHouse.objects.filter(trash=False).order_by('kill_house') + + # cold_house = ColdHouse.objects.filter( + # Q(kill_house=kill_house) | Q(steward__isnull=False), trash=False).order_by( + # 'kill_house') + serializer = ColdHouseSerializer(cold_house, many=True) + else: + # live_stock_support = LiveStockSupport.objects.get(user=user, trash=False) + cold_house = ColdHouse.objects.filter(live_stock_support__isnull=False, trash=False).first() + serializer = ColdHouseSerializer(cold_house) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + cold_house = ColdHouse.objects.get(key=request.data['cold_house_key'], trash=False) + request.data.pop('cold_house_key') + serializer = self.serializer_class(cold_house) + serializer.update(instance=cold_house, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalColdHouseDashboardForRolesViewSet(viewsets.ModelViewSet): + queryset = ColdHouse.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ColdHouseSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + cold_houses = ColdHouse.objects.filter(kill_house=kill_house, trash=False) + else: + steward = Guilds.objects.get(user=user, trash=False) + cold_houses = ColdHouse.objects.filter(steward=steward, trash=False) + + total_input_weight = cold_houses.aggregate(total=Sum('total_input_weight'))[ + 'total'] or 0 + total_allocated_weight = cold_houses.aggregate(total=Sum('total_allocated_weight'))[ + 'total'] or 0 + total_remain_weight = cold_houses.aggregate(total=Sum('total_remain_weight'))[ + 'total'] or 0 + + result = { + "total_cold_houses": len(cold_houses), + "total_input_weight": total_input_weight, + "total_allocated_weight": total_allocated_weight, + "total_remain_weight": total_remain_weight, + } + + return Response(result, status=status.HTTP_200_OK) + + +class ColdHouseForProvinceViewSet(viewsets.ModelViewSet): + queryset = ColdHouse.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ColdHouseSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = ColdHouseFilterSet + filterset_fields = [ + 'name', + 'province', + 'city', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + ] + + def list(self, request, *args, **kwargs): + type = request.GET.get('type') + if type == 'KillHouse': + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + cold_houses = ColdHouse.objects.filter(kill_house=kill_house, trash=False).order_by('id') + else: + steward = Guilds.objects.get(key=request.GET['steward_key'], trash=False) + cold_houses = ColdHouse.objects.filter(steward=steward, trash=False).order_by('id') + + if 'search' in request.GET: + cold_houses_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=cold_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=cold_houses) + cold_houses_list = ps.filter() + cold_houses = [] if len(cold_houses_list) == 0 else cold_houses_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(cold_houses) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(cold_houses, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ColdHouseTotalDashboardViewSet(viewsets.ModelViewSet): + queryset = ColdHouse.objects.all() + permission_classes = [AllowAny] + serializer_class = ColdHouseSerializer + + def list(self, request, *args, **kwargs): + cold_houses = ColdHouse.objects.filter(trash=False) + kill_house_cold_houses = cold_houses.filter(kill_house__isnull=False) + steward_cold_houses = cold_houses.filter(steward__isnull=False) + total_input_weight = cold_houses.aggregate( + total=Sum('total_input_weight'))['total'] or 0 + + total_allocated_weight = cold_houses.aggregate( + total=Sum('total_allocated_weight'))['total'] or 0 + + total_remain_weight = cold_houses.aggregate( + total=Sum('total_remain_weight'))['total'] or 0 + + result = { + "total_cold_houses": len(cold_houses), + "total_kill_house_cold_house": len(kill_house_cold_houses), + "total_steward_cold_house": len(steward_cold_houses), + "total_input_weight": total_input_weight, + "total_allocated_weight": total_allocated_weight, + "total_remain_weight": total_remain_weight, + } + + return Response(result, status=status.HTTP_200_OK) + + +class ColdHouseDashboardViewSet(viewsets.ModelViewSet): + queryset = ColdHouse.objects.all() + permission_classes = [AllowAny] + serializer_class = ColdHouseSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + cold_house = ColdHouse.objects.get(key=request.GET['cold_house_key'], trash=False) + + # if request.GET['role'] == 'KillHouse': + # # kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # # cold_house = ColdHouse.objects.get(kill_house=kill_house, trash=False) + # + # else: + # cold_house = ColdHouse.objects.filter(live_stock_support__isnull=False, trash=False).first() + + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + allocations = StewardAllocation.objects.filter(Q(to_cold_house=cold_house) | Q(other_cold_house=cold_house), + trash=False, to_cold_house=cold_house, date__date__gte=date1, + date__date__lte=date2, + receiver_state__in=('pending', 'accepted')) + + + else: + + allocations = StewardAllocation.objects.filter(trash=False, to_cold_house=cold_house, + receiver_state__in=('pending', 'accepted')) + + input_bars = 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_bars = 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) + + total_input_bars_weight = input_bars.aggregate( + total=Sum('real_weight_of_carcasses'))['total'] or 0 + total_output_bars_weight = output_bars.aggregate( + total=Sum('real_weight_of_carcasses'))['total'] or 0 + + result = { + "total_input_bars": len(input_bars), + "total_input_bars_weight": total_input_bars_weight, + "total_output_bars": len(output_bars), + "total_output_bars_weight": total_output_bars_weight, + } + + return Response(result, status=status.HTTP_200_OK) + + +class CheckColdHouseAllocationsViewSet(viewsets.ModelViewSet): + queryset = ColdHouseAllocations.objects.all() + permission_classes = [AllowAny] + serializer_class = ColdHouseAllocationsSerializer + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + allocation = ColdHouseAllocations.objects.get(key=request.data['allocation_key'], trash=False) + cold_house = ColdHouse.objects.get(key=allocation.cold_house.key, trash=False) + role = request.data['role'] + request.data.pop('allocation_key') + request.data.pop('role') + ware_house = KillHouseWareHouse.objects.get(key=allocation.kill_house_ware_house.key, trash=False) + kill_house_request = KillHouseRequest.objects.get(key=allocation.kill_house_request.key, trash=False) + + if request.data['state'] == 'accepted': + + if request.data['accepted_weight'] > kill_house_request.ware_house_accepted_real_weight or request.data[ + 'accepted_quantity'] > kill_house_request.ware_house_accepted_real_quantity: + return Response({"result": "حجم بار کمتر از مقدار وارد شده است!"}, + status=status.HTTP_403_FORBIDDEN) + + if request.data['accepted_quantity'] > allocation.quantity: + diffrent_quantity = request.data['accepted_quantity'] - allocation.quantity + diffrent_weight = request.data['accepted_weight'] - allocation.weight + if diffrent_quantity > ware_house.remain_total_number_of_carcasses and diffrent_weight > ware_house.remain_total_weight_of_carcasses: + return Response({"result": "موجودی انبار کمتر از مقدار وارد شده است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + allocation.accepted_quantity = request.data['accepted_quantity'] + allocation.accepted_weight = request.data['accepted_weight'] + allocation.save() + ware_house.allocated_total_number_of_carcasses += diffrent_quantity + ware_house.freezing_quantity += diffrent_quantity + ware_house.allocated_total_weight_of_carcasses += diffrent_weight + ware_house.freezing_weight += diffrent_weight + ware_house.save() + else: + diffrent_quantity = allocation.quantity - request.data['accepted_quantity'] + diffrent_weight = allocation.weight - request.data['accepted_weight'] + allocation.accepted_quantity = request.data['accepted_quantity'] + allocation.accepted_weight = request.data['accepted_weight'] + allocation.save() + ware_house.allocated_total_number_of_carcasses -= diffrent_quantity + ware_house.freezing_quantity -= diffrent_quantity + ware_house.allocated_total_weight_of_carcasses -= diffrent_weight + ware_house.freezing_weight -= diffrent_weight + ware_house.save() + cold_house.total_quantity += allocation.accepted_quantity + cold_house.total_weight += allocation.accepted_weight + cold_house.save() + + allocation.reviewer = { + "role": role, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()), + } + allocation.save() + serializer = self.serializer_class(allocation) + serializer.update(instance=allocation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + # return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_200_OK) + + +class ColdHouseAllocationsViewSet(viewsets.ModelViewSet): + queryset = ColdHouseAllocations.objects.all() + permission_classes = [AllowAny] + serializer_class = ColdHouseAllocationsSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = ColdHouseAllocationsFilterSet + filterset_fields = [ + 'name', + 'cold_house__live_stock_support__user__first_name', + 'cold_house__live_stock_support__user__last_name', + 'cold_house__live_stock_support__user__fullname', + 'cold_house__live_stock_support__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + ] + + def create(self, request, *args, **kwargs): + now = datetime.now().date() + product = RolesProducts.objects.get(key=request.data['product_key'], trash=False) + kill_house = KillHouse.objects.get(key=product.kill_house.key, trash=False) + cold_house = ColdHouse.objects.get(key=request.data['cold_house_key'], trash=False) + # kill_house_ware_house = KillHouseWareHouse.objects.get(key=request.data['ware_house_key'], trash=False) + date = datetime.now().date() + # date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date() + # request.data.pop('date') + request.data.pop('product_key') + request.data.pop('cold_house_key') + # request.data.pop('ware_house_key') + if OperationLimitation.objects.all().first().kill_house_freezing_limitation == True: + + if now != date: + return Response({"result": "به علت مغایرت تاریخ امکان انجماد وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + + # if request.data['weight'] > kill_house_request.ware_house_accepted_real_weight or request.data[ + # 'quantity'] > kill_house_request.ware_house_accepted_real_quantity: + # return Response({"result": "موجودی بار کمتر از مقدار وارد شده است!"}, + # status=status.HTTP_403_FORBIDDEN) + # if request.data['weight'] > kill_house_ware_house.remain_total_weight_of_carcasses or request.data[ + # 'quantity'] > kill_house_ware_house.remain_total_number_of_carcasses: + # return Response({"result": "موجودی انبار کمتر از مقدار وارد شده است!"}, + # status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + allocation = serializer.create(validated_data=request.data) + allocation.cold_house = cold_house + allocation.product = product + allocation.kill_house = kill_house + allocation.date = datetime(year=date.year, month=date.month, day=date.day, hour=10, minute=1, second=1) + allocation.allocation_type = 'governmental' + allocation.real_weight = allocation.weight + allocation.real_quantity = allocation.quantity + allocation.save() + kill_house_cold_house_allocations_product_warehousing(product) + # allocation.kill_house_request = kill_house_request + # allocation.kill_house_ware_house = kill_house_ware_house + # kill_house_ware_house.allocated_total_weight_of_carcasses += request.data['weight'] + # kill_house_ware_house.allocated_total_number_of_carcasses += request.data['quantity'] + # kill_house_ware_house.save() + # kill_house_request.freezing = True + # kill_house_request.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + allocations = ColdHouseAllocations.objects.filter(kill_house=kill_house, + date__date__gte=date1, date__date__lte=date2, + trash=False).order_by('id') + else: + allocations = ColdHouseAllocations.objects.filter(date__date__gte=date1, date__date__lte=date2, + trash=False).order_by('id') + + if 'search' in request.GET: + allocations_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=allocations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=allocations) + allocations_list = ps.filter() + allocations = [] if len(allocations_list) == 0 else allocations_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(allocations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + allocation = ColdHouseAllocations.objects.get(key=request.data['allocation_key'], + trash=False) + product = allocation.product + # kill_house_request = KillHouseRequest.objects.get(key=allocation.kill_house_request.key, trash=False) + + if allocation.state != 'pending': + return Response({"result": " به علت تایید تخصیص امکان ویرایش وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + # ware_house = KillHouseWareHouse.objects.get(key=allocation.kill_house_ware_house.key, trash=False) + if request.data['quantity'] > allocation.quantity or request.data['weight'] > allocation.weight: + # diffrent_quantity = request.data['quantity'] - allocation.quantity + # diffrent_weight = request.data['weight'] - allocation.weight + # if request.data['weight'] > kill_house_request.ware_house_accepted_real_weight or request.data[ + # 'quantity'] > kill_house_request.ware_house_accepted_real_quantity: + # return Response({"result": "موجودی بار کمتر از مقدار وارد شده است!"}, + # status=status.HTTP_403_FORBIDDEN) + # if diffrent_quantity > ware_house.remain_total_number_of_carcasses or diffrent_weight > ware_house.remain_total_weight_of_carcasses: + # return Response({"result": "موجودی انبار کمتر از مقدار وارد شده است!"}, + # status=status.HTTP_403_FORBIDDEN) + # else: + allocation.quantity = request.data['quantity'] + allocation.weight = request.data['weight'] + allocation.save() + # ware_house.allocated_total_number_of_carcasses += diffrent_quantity + # ware_house.freezing_quantity += diffrent_quantity + # ware_house.allocated_total_weight_of_carcasses += diffrent_weight + # ware_house.freezing_weight += diffrent_weight + # ware_house.save() + else: + diffrent_quantity = allocation.quantity - request.data['quantity'] + diffrent_weight = allocation.weight - request.data['weight'] + allocation.quantity = request.data['quantity'] + allocation.weight = request.data['weight'] + allocation.save() + # ware_house.allocated_total_number_of_carcasses -= diffrent_quantity + # ware_house.freezing_quantity -= diffrent_quantity + # ware_house.allocated_total_weight_of_carcasses -= diffrent_weight + # ware_house.freezing_weight -= diffrent_weight + # ware_house.save() + + allocation.real_quantity = request.data['quantity'] + allocation.real_weight = request.data['weight'] + allocation.save() + kill_house_cold_house_allocations_product_warehousing(product) + + return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + allocation = ColdHouseAllocations.objects.get(key=request.GET["allocation_key"]) + product = allocation.product + if allocation.state != 'pending': + return Response({"result": " به علت تایید تخصیص امکان حذف وجود ندارد!"}, status=status.HTTP_403_FORBIDDEN) + # ware_house = KillHouseWareHouse.objects.get(key=allocation.kill_house_ware_house.key) + # ware_house.allocated_total_number_of_carcasses -= allocation.quantity + # ware_house.allocated_total_weight_of_carcasses -= allocation.weight + # ware_house.freezing_quantity -= allocation.quantity + # ware_house.freezing_weight -= allocation.weight + # ware_house.save() + allocation.trash = True + allocation.save() + kill_house_cold_house_allocations_product_warehousing(product) + + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + +class OperationLimitationViewset(viewsets.ModelViewSet): + queryset = OperationLimitation.objects.all() + permission_classes = [AllowAny] + serializer_class = OperationLimitationSerializer + + def list(self, request, *args, **kwargs): + operation_limitation = OperationLimitation.objects.filter(trash=False).first() + + serializer = self.serializer_class(operation_limitation) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + operation_limitation = OperationLimitation.objects.filter(trash=False).first() + serializer = self.serializer_class(operation_limitation) + serializer.update(instance=operation_limitation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ApprovedPriceViewset(viewsets.ModelViewSet): + queryset = ApprovedPrice.objects.all() + permission_classes = [AllowAny] + serializer_class = ApprovedPriceSerializer + + def list(self, request, *args, **kwargs): + approved_price = ApprovedPrice.objects.filter(trash=False).first() + + serializer = self.serializer_class(approved_price) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + approved_price = ApprovedPrice.objects.filter(trash=False).first() + serializer = self.serializer_class(approved_price) + serializer.update(instance=approved_price, validated_data=request.data) + if request.data['approved'] == False: + price = BroadcastPrice.objects.filter(trash=False).first() + price.allow = False + price.save() + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + free_sale_province.allow = False + free_sale_province.save() + FreeCommitmentThread_Threading = threading.Thread( + target=FreeCommitmentThread, + args=(user.province.name,)) + + FreeCommitmentThread_Threading.start() + return Response(serializer.data, status=status.HTTP_200_OK) + + +class AnnouncementsViewset(viewsets.ModelViewSet): + queryset = Announcements.objects.all() + permission_classes = [AllowAny] + serializer_class = AnnouncementsSerializer + + def list(self, request, *args, **kwargs): + if 'total' in request.GET: + announcement = Announcements.objects.filter(trash=False).order_by('id') + serializer = self.serializer_class(announcement, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + announcement = Announcements.objects.get(role=request.GET['role'], trash=False) + + serializer = self.serializer_class(announcement) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + announcement = Announcements.objects.get(key=request.data['key'], trash=False) + serializer = self.serializer_class(announcement) + serializer.update(instance=announcement, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ChickenAgeRangeViewset(viewsets.ModelViewSet): + queryset = ChickenAgeRange.objects.all() + permission_classes = [AllowAny] + serializer_class = ChickenAgeRangeSerializer + + def list(self, request, *args, **kwargs): + age_range = ChickenAgeRange.objects.filter(trash=False).first() + + serializer = self.serializer_class(age_range) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + age_range = ChickenAgeRange.objects.filter(trash=False).first() + serializer = self.serializer_class(age_range) + serializer.update(instance=age_range, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TimeRangeViewset(viewsets.ModelViewSet): + queryset = TimeRange.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = TimeRangeSerializer + + def list(self, request, *args, **kwargs): + time_range = TimeRange.objects.filter(trash=False).first() + + serializer = self.serializer_class(time_range) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + time_range = TimeRange.objects.filter(trash=False).first() + serializer = self.serializer_class(time_range) + serializer.update(instance=time_range, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class SystemWalletViewset(viewsets.ModelViewSet): + queryset = SystemWallet.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = SystemWalletSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if request.GET['type'] == 'self': + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + try: + wallet = SystemWallet.objects.get(kill_house=kill_house, trash=False) + except: + wallet = SystemWallet(kill_house=kill_house) + wallet.save() + + serializer = self.serializer_class(wallet) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PaymentGatewayPercentageViewset(viewsets.ModelViewSet): + queryset = PaymentGatewayPercentage.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PaymentGatewayPercentageSerializer + + def list(self, request, *args, **kwargs): + percentage = PaymentGatewayPercentage.objects.filter(trash=False).first() + + serializer = self.serializer_class(percentage) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + percentage = PaymentGatewayPercentage.objects.filter(trash=False).first() + serializer = self.serializer_class(percentage) + serializer.update(instance=percentage, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalPaymentGatewayPercentageViewset(viewsets.ModelViewSet): + queryset = TotalPaymentGatewayPercentage.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = TotalPaymentGatewayPercentageSerializer + + def list(self, request, *args, **kwargs): + percentage = TotalPaymentGatewayPercentage.objects.filter(trash=False).first() + + serializer = self.serializer_class(percentage) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + percentage = TotalPaymentGatewayPercentage.objects.filter(trash=False).first() + serializer = self.serializer_class(percentage) + serializer.update(instance=percentage, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ShareTypeViewset(viewsets.ModelViewSet): + queryset = ShareType.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ShareTypeSerializer + + def create(self, request, *args, **kwargs): + if ShareType.objects.filter(name=request.data['name'], trash=False).exists(): + return Response({"result": "سهامدار وارد شده وجود دارد!"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + share_type = serializer.create(validated_data=request.data) + wage_types = WageType.objects.filter(trash=False) + for wage_type in wage_types: + percentage = PercentageOfWageType( + wage_type=wage_type, + share_type=share_type, + ) + percentage.save() + + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +class WageTypeViewset(viewsets.ModelViewSet): + queryset = WageType.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = WageTypeSerializer + + def list(self, request, *args, **kwargs): + wage_types = WageType.objects.filter(trash=False).order_by('id') + + serializer = self.serializer_class(wage_types, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + wage_type = WageType.objects.get(key=request.data['key'], trash=False) + percentages = request.data['percentages'] + request.data.pop('percentages') + for percentage in percentages: + wage_percentage = PercentageOfWageType.objects.get(share_type__name=percentage['name'], wage_type=wage_type, + trash=False) + wage_percentage.percent = percentage['percent'] + wage_percentage.save() + serializer = self.serializer_class(wage_type) + serializer.update(instance=wage_type, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryOutProvinceWageTypeViewset(viewsets.ModelViewSet): + queryset = WageType.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = WageTypeForPoultryOutProvinceRequestSerializer + + def list(self, request, *args, **kwargs): + wage_type = WageType.objects.get(en_name='poultry-sell-out-province', trash=False) + serializer = self.serializer_class(wage_type) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PercentageOfWageTypeViewset(viewsets.ModelViewSet): + queryset = PercentageOfWageType.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PercentageOfWageTypeSerializer + + +class SubSectorPercentageOfWageTypeViewset(viewsets.ModelViewSet): + queryset = SubSectorPercentageOfWageType.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = SubSectorPercentageOfWageTypeSerializer + + def list(self, request, *args, **kwargs): + if request.GET['type'] == 'city': + + sub_sector_wage_type = SubSectorPercentageOfWageType.objects.filter(city=True, trash=False).order_by('id') + else: + sub_sector_wage_type = SubSectorPercentageOfWageType.objects.filter(trash=False).order_by('id') + + serializer = self.serializer_class(sub_sector_wage_type, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + sub_sector_wage_type = SubSectorPercentageOfWageType.objects.get(key=request.data['sub_sector_wage_type_key'], + trash=False) + request.data.pop('sub_sector_wage_type_key') + serializer = self.serializer_class(sub_sector_wage_type) + serializer.update(instance=sub_sector_wage_type, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalWageInformationViewset(viewsets.ModelViewSet): + queryset = TotalWageInformation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = TotalWageInformationSerializer + + def list(self, request, *args, **kwargs): + try: + total_wage = TotalWageInformation.objects.get(trash=False) + except: + total_wage = TotalWageInformation() + total_wage.save() + + serializer = self.serializer_class(total_wage, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ParentCompanyTotalWageInformationViewset(viewsets.ModelViewSet): + queryset = TotalWageInformation.objects.all() + permission_classes = [AllowAny] + serializer_class = ParentCompanyTotalWageInformationSerializer + + def list(self, request, *args, **kwargs): + try: + total_wage = TotalWageInformation.objects.get(trash=False) + except: + total_wage = TotalWageInformation() + total_wage.save() + + serializer = self.serializer_class(total_wage, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class InternalTransactionViewset(viewsets.ModelViewSet): + queryset = InternalTransaction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = InternalTransactionSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = InternalTransactionFilterSet + filterset_fields = [ + 'saleReferenceId', + 'refId', + 'orderId', + 'cardHolderPan', + 'payer_fullname', + 'payer_mobile', + 'user__fullname', + 'user__first_name', + 'user__last_name', + 'user__mobile', + 'kill_house__name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'parent_kill_house__name', + 'parent_kill_house__kill_house_operator__user__fullname', + 'parent_kill_house__kill_house_operator__user__first_name', + 'parent_kill_house__kill_house_operator__user__last_name', + 'parent_kill_house__kill_house_operator__user__mobile', + + ] + + def create(self, request, *args, **kwargs): + kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) + parent_kill_house = kill_house + if kill_house.killer == True and kill_house.type == 'exclusive': + percentage = KillHousePercentage.objects.filter(kill_house=kill_house, trash=False).first() + parent_kill_house = percentage.kill_house_for_killer if percentage else kill_house + image = request.data['image'] + request.data.pop('image') + request.data.pop('kill_house_key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + transaction = serializer.create(validated_data=request.data) + transaction.payer_type = 'kill_house' + transaction.status = 'completed' + transaction.kill_house = kill_house + transaction.parent_kill_house = parent_kill_house + transaction.payer_fullname = kill_house.kill_house_operator.user.fullname + transaction.payer_mobile = kill_house.kill_house_operator.user.mobile + transaction.date = datetime.now() + if image != "": + transaction.image = send_image_to_server(image) + + transaction.save() + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + transactions_list = [] + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('-date') + + elif request.GET['role'] == 'ChainCompany': + chain_company = ChainCompany.objects.get(user=user, trash=False) + # chain_company = ChainCompany.objects.get(key=request.GET['chain_company_key'], trash=False) + + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('-date') + + else: + if 'kill_house_key' in request.GET: + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + + if request.GET['role'] == 'ProvinceOperator': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + union_share__gt=0, + status='completed', + trash=False).order_by('-date') + elif request.GET['role'] == 'Company': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + company_share__gt=0, + status='completed', + trash=False).order_by('-date') + elif request.GET['role'] == 'Guilds': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + guilds_share__gt=0, + status='completed', + trash=False).order_by('-date') + + elif request.GET['role'] == 'SuperAdmin': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).exclude(union_share=0, company_share=0, guilds_share=0).order_by('id') + + else: + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('-date') + + else: + chain_company = ChainCompany.objects.get(key=request.GET['chain_company_key'], trash=False) + if request.GET['role'] == 'ProvinceOperator': + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + date__date__gte=date1, + date__date__lte=date2, + union_share__gt=0, + status='completed', + trash=False).order_by('-date') + elif request.GET['role'] == 'Company': + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + date__date__gte=date1, + date__date__lte=date2, + company_share__gt=0, + status='completed', + trash=False).order_by('-date') + elif request.GET['role'] == 'Guilds': + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + date__date__gte=date1, + date__date__lte=date2, + guilds_share__gt=0, + status='completed', + trash=False).order_by('-date') + + elif request.GET['role'] == 'SuperAdmin': + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).exclude(union_share=0, company_share=0, guilds_share=0).order_by('-date') + + else: + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('-date') + + else: + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).order_by('id') + + elif request.GET['role'] == 'ChainCompany': + chain_company = ChainCompany.objects.get(user=user, trash=False) + # chain_company = ChainCompany.objects.get(key=request.GET['chain_company_key'], trash=False) + + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + status='completed', + trash=False).order_by('-date') + + else: + if 'kill_house_key' in request.GET: + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + + if request.GET['role'] == 'ProvinceOperator': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + union_share__gt=0, + status='completed', + trash=False).order_by('-date') + elif request.GET['role'] == 'Company': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + company_share__gt=0, + status='completed', + trash=False).order_by('-date') + + elif request.GET['role'] == 'Guilds': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + guilds_share__gt=0, + status='completed', + trash=False).order_by('-date') + + elif request.GET['role'] == 'SuperAdmin': + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).exclude(union_share=0, company_share=0, guilds_share=0).order_by('id') + + else: + transactions = InternalTransaction.objects.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + status='completed', + trash=False).order_by('-date') + + else: + chain_company = ChainCompany.objects.get(key=request.GET['chain_company_key'], trash=False) + if request.GET['role'] == 'ProvinceOperator': + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + union_share__gt=0, + status='completed', + trash=False).order_by('-date') + elif request.GET['role'] == 'Company': + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + company_share__gt=0, + status='completed', + trash=False).order_by('-date') + elif request.GET['role'] == 'Guilds': + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + guilds_share__gt=0, + status='completed', + trash=False).order_by('-date') + + elif request.GET['role'] == 'SuperAdmin': + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + status='completed', + trash=False).exclude(union_share=0, company_share=0, guilds_share=0).order_by('id') + else: + transactions = InternalTransaction.objects.filter( + chain_company=chain_company, + status='completed', + trash=False).order_by('-date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = self.serializer_class(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(transactions, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + transaction = InternalTransaction.objects.get(key=request.data['transaction_key'], trash=False) + request.data.pop('transaction_key') + if 'image' in request.data.keys(): + image = request.data['image'] + request.data.pop('image') + + if image != "": + transaction.image = send_image_to_server(image) + transaction.save() + serializer = self.serializer_class(transaction) + serializer.update(instance=transaction, validated_data=request.data) + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + transaction = InternalTransaction.objects.get(key=request.GET['transaction_key'], trash=False) + transaction.trash = True + transaction.save() + + return Response({"result": "موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class PoultryRequestInternalTransactionViewset(viewsets.ModelViewSet): + queryset = InternalTransaction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryOutRequestInternalTransactionSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = InternalTransactionFilterSet + filterset_fields = [ + 'saleReferenceId', + 'refId', + 'orderId', + 'cardHolderPan', + 'payer_fullname', + 'payer_mobile', + 'user__fullname', + 'user__first_name', + 'user__last_name', + 'user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__mobile', + 'out_province_poultry_request_buyer__user__fullname', + 'out_province_poultry_request_buyer__user__first_name', + 'out_province_poultry_request_buyer__user__last_name', + 'out_province_poultry_request_buyer__user__mobile', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + transactions_list = [] + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['type'] == 'poultry': + transactions = InternalTransaction.objects.filter( + payer_type='poultry', + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('-date') + + else: + transactions = InternalTransaction.objects.filter( + payer_type='buyer', + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('-date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = self.serializer_class(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(transactions, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TotalDashboardPoultryRequestInternalTransactionViewset(viewsets.ModelViewSet): + queryset = InternalTransaction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryOutRequestInternalTransactionSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + transactions = InternalTransaction.objects.filter(Q(payer_type='poultry') | Q(payer_type='buyer'), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('date') + poultry_transactions = transactions.filter(payer_type='poultry') + buyer_transactions = transactions.filter(payer_type='buyer') + total_transactions_amount = transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + poultries = len(poultry_transactions.values_list('poultry', flat=True).distinct()) + buyers = len(buyer_transactions.values_list('out_province_poultry_request_buyer', flat=True).distinct()) + poultry_transactions_total_amount = poultry_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + buyer_transactions_total_amount = buyer_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + transaction_info_dict = { + "total_number_of_transactions": len(transactions), + "total_amount_of_transactions": total_transactions_amount, + "total_number_of_payers": poultries + buyers, + "total_number_of_poultries": poultries, + "total_amount_of_poultries": poultry_transactions_total_amount, + "total_number_of_buyers": buyers, + "total_amount_of_buyers": buyer_transactions_total_amount, + } + return Response(transaction_info_dict, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_gate_way_payer_info(request): + first_char = request.GET['user_gate_way_id'][0] + if len(request.GET['user_gate_way_id']) > 7: + user_gate_way_id = request.GET['user_gate_way_id'][1:7] + order_code = request.GET['user_gate_way_id'][7:] + else: + user_gate_way_id = request.GET['user_gate_way_id'][1:] + order_code = None + if first_char == 'p': + role = 'Poultry' + elif first_char == 'b': + role = 'Buyer' + elif first_char == 'k': + role = 'KillHouse' + else: + role = 'ChainCompany' + + try: + user = SystemUserProfile.objects.get(user_gate_way_id=user_gate_way_id, trash=False) + except: + return Response({"result": "توکن کاربر معتبر نمیباشد!"}, status=status.HTTP_403_FORBIDDEN) + + if role == 'Poultry': + total_unpaid_wage = 0 + # poultry = Poultry.objects.get(user=user, trash=False) + if order_code is not None: + poultry_requests = PoultryRequest.objects.filter(order_code=order_code, poultry__user=user, + payer_type='poultry', + out_province_request_cancel=False, out=True, has_wage=True, + province_state='accepted', wage_pay=False, trash=False) + else: + poultry_requests = PoultryRequest.objects.filter(poultry__user=user, payer_type='poultry', + out_province_request_cancel=False, out=True, has_wage=True, + province_state='accepted', wage_pay=False, trash=False) + + total_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + total_unpaid_wage += poultry_requests.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + return Response( + { + "role": role, + "user_key": user.key, + "poultry": None, + "order_code": [order_code], + "fullname": user.fullname, + "mobile": user.mobile, + "city": user.city.name, + "province": user.province.name, + "number_of_requests": len(poultry_requests), + "total_quantity": total_quantity, + "total_weight": total_weight, + "total_amount": total_unpaid_wage, + }, + status=status.HTTP_200_OK + + ) + + elif role == 'Buyer': + total_unpaid_wage = 0 + now = datetime.now().date() + buyer = OutProvincePoultryRequestBuyer.objects.get(user=user, trash=False) + poultry_requests = PoultryRequest.objects.filter(out_province_poultry_request_buyer=buyer, payer_type='buyer', + out_province_request_cancel=False, + send_date__date=now, + out=True, has_wage=True, + province_state='accepted', wage_pay=False, trash=False) + total_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + total_unpaid_wage += poultry_requests.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + order_codes = poultry_requests.values_list('order_code', flat=True) + return Response( + { + "role": role, + "user_key": user.key, + "order_code": order_codes, + "fullname": user.fullname, + "mobile": user.mobile, + "city": user.city.name, + "province": user.province.name, + "number_of_requests": len(poultry_requests), + "total_quantity": total_quantity, + "total_weight": total_weight, + "total_amount": total_unpaid_wage + }, + status=status.HTTP_200_OK + + ) + elif role == 'KillHouse': + total_unpaid_wage = 0 + total_paid_wage = 0 + real_free_sale_wage = 0 + kill_house_kill_requests_wage = 0 + # wage_type = WageType.objects.filter(en_name='province-kill-request').first() + # total_check_wage = wage_type.amount + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + total_unpaid_wage = get_finance_info(kill_house)['total_price'] + + 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 + + return Response( + { + "role": role, + "user_key": user.key, + "name": kill_house.name, + "fullname": user.fullname, + "mobile": user.mobile, + "city": user.city.name, + "province": user.province.name, + "total_amount": total_unpaid_wage - (total_paid_wage + kill_house.off) + }, + status=status.HTTP_200_OK + + ) + else: + total_unpaid_wage = 0 + total_paid_wage = 0 + chain_company = ChainCompany.objects.get(user=user, trash=False) + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, state='accepted', + trash=False) + chain_allocations_total_wage = chain_allocations.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_unpaid_wage += chain_allocations_total_wage + chain_company_transactions = InternalTransaction.objects.filter(chain_company=chain_company, + status='completed', trash=False) + total_paid_wage += chain_company_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + return Response( + { + "role": role, + "user_key": user.key, + "name": chain_company.name, + "fullname": user.fullname, + "mobile": user.mobile, + "city": user.city.name, + "province": user.province.name, + "total_amount": total_unpaid_wage - total_paid_wage + }, + status=status.HTTP_200_OK + + ) + + # if 'order_code' in request.GET: + # poultry_request = PoultryRequest.objects.get(order_code=request.GET['order_code'], trash=False) + # role = 'Poultry' + # fullname = poultry_request.poultry.user.fullname if poultry_request.payer_type == 'poultry' else \ + # poultry_request.buyer['firstName'] + " " + poultry_request.buyer[ + # 'lastName'] + # return Response( + # { + # "role": role, + # "order_code": poultry_request.order_code, + # "poultry": poultry_request.poultry.unit_name, + # "fullname": fullname, + # "mobile": poultry_request.poultry.user.mobile, + # "city": poultry_request.poultry.user.city.name, + # "province": poultry_request.poultry.user.province.name, + # "total_amount": poultry_request.total_wage_amount + # }, + # status=status.HTTP_200_OK + # + # ) + # else: + # + # total_unpaid_wage = 0 + # total_paid_wage = 0 + # role = None + # try: + # user = SystemUserProfile.objects.get(user_gate_way_id=request.GET['user_gate_way_id'], trash=False) + # except: + # return Response({"result": "توکن کاربر معتبر نمیباشد!"}, status=status.HTTP_403_FORBIDDEN) + # + # kill_house_role = Group.objects.get(name='KillHouse') + # if kill_house_role in user.role.all(): + # role = 'KillHouse' + # kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + # province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, + # state__in=('pending', 'accepted'), trash=False, + # return_to_province=False, + # first_car_allocated_quantity=0, + # archive_wage=False, + # ) + # kill_house_requests = KillHouseRequest.objects.filter( + # Q(Q(killer=kill_house) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) & Q(killhouse_user=kill_house)) | Q( + # Q(killer__isnull=True) | Q(killer=kill_house)), + # # killhouse_user=kill_house, + # archive_wage=False, + # trash=False + # ) + # + # kill_house_requests = kill_house_requests.filter(Q(killer=kill_house) | Q(killhouse_user=kill_house)) + # + # free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, archive_wage=False, + # trash=False) + # + # total_unpaid_wage += province_kill_requests.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # total_unpaid_wage += free_bars.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # total_unpaid_wage += \ + # kill_house_requests.aggregate(total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + # 'total'] or 0 + # slaughter_transactions = InternalTransaction.objects.filter( + # kill_house=kill_house, status='completed', + # trash=False) + # + # total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + # 'total'] or 0 + # + # return Response( + # { + # "role": role, + # "user_key": user.key, + # "name": kill_house.name, + # "fullname": user.fullname, + # "mobile": user.mobile, + # "city": user.city.name, + # "province": user.province.name, + # "total_amount": total_unpaid_wage - total_paid_wage + # }, + # status=status.HTTP_200_OK + # + # ) + # else: + # role = 'ChainCompany' + # chain_company = ChainCompany.objects.get(user=user, trash=False) + # chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, state='accepted', + # trash=False) + # chain_allocations_total_wage = chain_allocations.aggregate(total=Sum('total_wage_amount'))[ + # 'total'] or 0 + # total_unpaid_wage += chain_allocations_total_wage + # chain_company_transactions = InternalTransaction.objects.filter(chain_company=chain_company, + # status='completed', trash=False) + # total_paid_wage += chain_company_transactions.aggregate(total=Sum('amount'))[ + # 'total'] or 0 + # + # return Response( + # { + # "role": role, + # "user_key": user.key, + # "name": chain_company.name, + # "fullname": user.fullname, + # "mobile": user.mobile, + # "city": user.city.name, + # "province": user.province.name, + # "total_amount": total_unpaid_wage - total_paid_wage + # }, + # status=status.HTTP_200_OK + # + # ) + + +class TotalInternalTransactionViewset(viewsets.ModelViewSet): + queryset = InternalTransaction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = InternalTransactionSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = InternalTransactionFilterSet + filterset_fields = [ + 'saleReferenceId', + 'refId', + 'orderId', + 'cardHolderPan', + 'payer_fullname', + 'payer_mobile', + 'user__fullname', + 'user__first_name', + 'user__last_name', + 'user__mobile', + 'kill_house__name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'parent_kill_house__name', + 'parent_kill_house__kill_house_operator__user__fullname', + 'parent_kill_house__kill_house_operator__user__first_name', + 'parent_kill_house__kill_house_operator__user__last_name', + 'parent_kill_house__kill_house_operator__user__mobile' + + ] + + def list(self, request, *args, **kwargs): + transactions_list = [] + # todo: موقت دکتر گفته بزارمش روی کشتارگاه ها + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + transactions = InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', payer_type='kill_house', + trash=False).order_by('-date') + else: + transactions = InternalTransaction.objects.filter( + status='completed', payer_type='kill_house', + trash=False).order_by('-date') + + # if request.GET['role'] == 'ProvinceOperator': + # transactions = transactions.filter(union_share__gt=0) + # elif request.GET['role'] == 'Company': + # transactions = transactions.filter(company_share__gt=0) + # elif request.GET['role'] == 'Guilds': + # transactions = transactions.filter(guilds_share__gt=0) + # elif request.GET['role'] == 'SuperAdmin': + # transactions = transactions.filter().exclude(guilds_share=0, company_share=0, union_share=0) + # else: + # pass + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = self.serializer_class(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(transactions, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ParentCompanyTotalInternalTransactionViewset(viewsets.ModelViewSet): + queryset = InternalTransaction.objects.all() + permission_classes = [AllowAny] + serializer_class = InternalTransactionSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = InternalTransactionFilterSet + filterset_fields = [ + 'saleReferenceId', + 'refId', + 'orderId', + 'cardHolderPan', + 'payer_fullname', + 'payer_mobile', + 'user__fullname', + 'user__first_name', + 'user__last_name', + 'user__mobile', + 'kill_house__name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'parent_kill_house__name', + 'parent_kill_house__kill_house_operator__user__fullname', + 'parent_kill_house__kill_house_operator__user__first_name', + 'parent_kill_house__kill_house_operator__user__last_name', + 'parent_kill_house__kill_house_operator__user__mobile' + + ] + + def list(self, request, *args, **kwargs): + transactions_list = [] + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + transactions = InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('-date') + else: + transactions = InternalTransaction.objects.filter( + status='completed', + trash=False).order_by('-date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = self.serializer_class(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(transactions, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PayersInternalTransactionViewset(viewsets.ModelViewSet): + queryset = InternalTransaction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = InternalTransactionSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = InternalTransactionFilterSet + filterset_fields = [ + 'saleReferenceId', + 'refId', + 'orderId', + 'cardHolderPan', + + ] + + def list(self, request, *args, **kwargs): + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(user=request.user) + transactions_list = [] + transactions = InternalTransaction.objects.filter( + trash=False).order_by('id') + if request.GET['type'] == 'success': + + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + transactions = transactions.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='completed', + ) + + elif request.GET['role'] == 'ChainCompany': + chain_company = ChainCompany.objects.get(user=user, trash=False) + + transactions = transactions.filter( + chain_company=chain_company, + date__date__gte=date1, + date__date__lte=date2, + status='completed', + ) + + if request.GET['type'] == 'failed': + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + transactions = transactions.filter( + Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), + date__date__gte=date1, + date__date__lte=date2, + status='failed', + ) + + elif request.GET['role'] == 'ChainCompany': + chain_company = ChainCompany.objects.get(user=user, trash=False) + + transactions = transactions.filter( + chain_company=chain_company, + date__date__gte=date1, + date__date__lte=date2, + status='failed', + ) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = self.serializer_class(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(transactions, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityLivestockViewSet(viewsets.ModelViewSet): + queryset = CityLivestock.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityLivestockSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + city_livestock = user.city_livestock_user.all() + + # send to serializer + serializer = self.serializer_class(city_livestock[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class FinalApprovalOutProvinceViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityLivestockSerializer + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.now().date() + poultry_requests = PoultryRequest.objects.filter(trash=False, out_province_request_cancel=False, out=True, + send_date__date=now, province_state='pending', + final_state='pending', state_process='pending') + poultry = SystemUserProfile.objects.filter( + key__in=poultry_requests.filter(payer_type='poultry', sms=False).values_list('poultry__user__key', + flat=True)).values_list('id', + flat=True) + buyer = SystemUserProfile.objects.filter( + key__in=poultry_requests.filter(payer_type='buyer', sms=False).values_list( + 'out_province_poultry_request_buyer__user__key', + flat=True)).values_list('id', flat=True) + poultry_requests_for_sms = poultry_requests.filter(payer_type='poultry').values_list('id', flat=True).distinct() + wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() + if wage_type and wage_type.status == True: + sms = threading.Thread(target=send_sms_for_final_approval_out_province_threading, + args=(list(buyer), list(poultry_requests_for_sms))) + sms.start() + for poultry_request in poultry_requests: + # if poultry_request.has_wage == False: + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + if hatching.left_over >= poultry_request.quantity: + hatching.out_province_killed_weight += int(poultry_request.quantity * poultry_request.Index_weight) + hatching.out_province_killed_quantity += poultry_request.quantity + hatching.save() + else: + different_quantity = poultry_request.quantity - hatching.left_over + hatching.out_province_killed_weight += int(hatching.left_over * poultry_request.Index_weight) + hatching.out_province_killed_quantity += hatching.left_over + hatching.extra_killed_quantity += different_quantity + hatching.save() + url = f'https://rasadyar.net/pay/{base_url_for_sms_report}' + if poultry_request.payer_type == 'poultry': + poultry_request.payment_link = f'{url}/p{poultry_request.poultry.user.user_gate_way_id}{poultry_request.order_code}' + else: + poultry_request.payment_link = f'{url}/b{poultry_request.out_province_poultry_request_buyer.user.user_gate_way_id}' + poultry_request.final_state = 'archive' + poultry_request.province_state = 'accepted' + poultry_request.state_process = 'accepted' + poultry_request.agent = { + "role": None, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.now()) + } + poultry_request.hatching_left_over = poultry_request.hatching.left_over + + poultry_request.save() + + return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_201_CREATED) + + +class ImprovingLivestockViewSet(viewsets.ModelViewSet): + queryset = ImprovingLivestock.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ImprovingLivestockSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + # get operator profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + # get operator object + improving_livestock = user.improving_livestock_user.all() + + # send to serializer + serializer = self.serializer_class(improving_livestock[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ReportSubmissionTimeViewset(viewsets.ModelViewSet): + queryset = ReportSubmissionTime.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ReportSubmissionTimeSerializer + + def list(self, request, *args, **kwargs): + report_submission = ReportSubmissionTime.objects.filter(trash=False).first() + serializer = self.serializer_class(report_submission) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + report_submission = ReportSubmissionTime.objects.filter(trash=False).first() + serializer = self.serializer_class(report_submission) + serializer.update(instance=report_submission, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ReportsViewset(viewsets.ModelViewSet): + queryset = Reports.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ReportsSerializer + + def list(self, request, *args, **kwargs): + reports = Reports.objects.filter(trash=False, active=False).order_by('id') + serializer = self.serializer_class(reports, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ReportsUsersViewset(viewsets.ModelViewSet): + queryset = ReportsUsers.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ReportsUsersSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = ReportsUsersFilterSet + filterset_fields = [ + 'firstname', + 'lastname', + 'fullname', + 'mobile', + 'position', + 'city', + + ] + + def create(self, request, *args, **kwargs): + if ReportsUsers.objects.filter(mobile=request.data['mobile']).exists(): + return Response({"result": "این کاربر قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + user = serializer.create(validated_data=request.data) + reports = Reports.objects.filter(active=True, trash=False) + if reports: + for report in reports: + user_report = UserReports( + user=user, + report=report + ) + user_report.save() + report.active = True + report.save() + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + users_list = [] + reports_users = ReportsUsers.objects.filter(trash=False).order_by('id') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=reports_users + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=reports_users) + users_list = ps.filter() + reports_users = [] if len(users_list) == 0 else users_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(reports_users) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(reports_users, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + reports_user = ReportsUsers.objects.get(key=request.data['user_key'], trash=False) + request.data.pop('user_key') + if 'mobile' in request.data.keys() and request.data['mobile'] != reports_user.mobile: + if ReportsUsers.objects.filter(mobile=request.data['mobile']).exists(): + return Response({"result": "این کاربر قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(reports_user) + serializer.update(instance=reports_user, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class UserReportsViewset(viewsets.ModelViewSet): + queryset = UserReports.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = UserReportsSerializer + + def create(self, request, *args, **kwargs): + reports = Reports.objects.filter(key__in=request.data['reports_list']) + reports_users = ReportsUsers.objects.filter(trash=False).order_by('id') + + for report in reports: + for user in reports_users: + user_report = UserReports( + user=user, + report=report + ) + user_report.save() + report.active = True + report.save() + + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + + def update(self, request, pk=None, *args, **kwargs): + if 'user_report_key' in request.data.keys(): + user_report = UserReports.objects.get(key=request.data['user_report_key'], trash=False) + request.data.pop('user_report_key') + serializer = self.serializer_class(user_report) + serializer.update(instance=user_report, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + report = Reports.objects.get(key=request.data['report_key'], trash=False) + user_reports = UserReports.objects.filter(report=report) + if not user_reports: + return Response({"result": "گزارشی ثبت نشده"}, status=status.HTTP_403_FORBIDDEN) + for user_report in user_reports: + user_report.active = request.data['active'] + user_report.save() + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + +class MovingTextDashboardStatusViewset(viewsets.ModelViewSet): + queryset = MovingTextDashboardStatus.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = MovingTextDashboardStatusSerializer + + def list(self, request, *args, **kwargs): + moving_text_dashboard = MovingTextDashboardStatus.objects.filter(trash=False).first() + serializer = self.serializer_class(moving_text_dashboard) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + moving_text_dashboard = MovingTextDashboardStatus.objects.filter(trash=False).first() + serializer = self.serializer_class(moving_text_dashboard) + serializer.update(instance=moving_text_dashboard, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class MovingTextViewset(viewsets.ModelViewSet): + queryset = MovingText.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = MovingTextSerializer + pagination_class = CustomPagination + + def create(self, request, *args, **kwargs): + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + moving_text = serializer.create(validated_data=request.data) + roles = MovingTextRole.objects.filter(trash=False) + if roles: + for role in roles: + moving_text_with_role = MovingTextWithRole( + moving_text=moving_text, + role=role + ) + moving_text_with_role.save() + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + if 'dashboard' in request.GET: + role = SystemUserProfile.objects.get(user=request.user, trash=False).role.all().values_list('name', + flat=True) + moving_text_id = MovingTextWithRole.objects.filter(trash=False, active=True, + role__role__in=role).values_list('moving_text', + flat=True) + moving_text = MovingText.objects.filter(id__in=moving_text_id, trash=False).order_by('id') + serializer = MovingTextForDashboardSerializer(moving_text, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + + else: + moving_text = MovingText.objects.filter(trash=False).order_by('id') + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(moving_text) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(moving_text, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + moving_text = MovingText.objects.get(trash=False, key=request.data['moving_text_key']) + request.data.pop('moving_text_key') + serializer = self.serializer_class(moving_text) + serializer.update(instance=moving_text, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class MovingTextWithRoleViewset(viewsets.ModelViewSet): + queryset = MovingTextWithRole.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = MovingTextWithRoleSerializer + + def update(self, request, pk=None, *args, **kwargs): + moving_text_role = MovingTextWithRole.objects.get(trash=False, key=request.data['moving_text_role_key']) + request.data.pop('moving_text_role_key') + serializer = self.serializer_class(moving_text_role) + serializer.update(instance=moving_text_role, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class NewProductViewset(viewsets.ModelViewSet): + queryset = NewProduct.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = NewProductSerializer + + def create(self, request, *args, **kwargs): + parent = None + if 'parent_key' in request.data.keys(): + if request.data['parent_key'] is not None: + parent = NewProduct.objects.get(key=request.data['parent_key']) + request.data.pop('parent_key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + product = serializer.create(validated_data=request.data) + if parent is not None: + product.parent = parent + product.save() + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + products = NewProduct.objects.filter(trash=False) + serializer = self.serializer_class(products, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class RolesProductsViewset(viewsets.ModelViewSet): + queryset = RolesProducts.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = RolesProductsSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + products = RolesProducts.objects.filter(kill_house=kill_house, trash=False) + + elif request.GET['role'] in ['Guild', 'Steward']: + products = RolesProducts.objects.filter(guild__user=user, guild__active=True, trash=False) + + else: + products = RolesProducts.objects.filter(trash=False) + serializer = self.serializer_class(products, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PosRolesProductsViewset(viewsets.ModelViewSet): + queryset = RolesProducts.objects.all() + permission_classes = [AllowAny] + serializer_class = PosRolesProductsSerializer + + def list(self, request, *args, **kwargs): + pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False) + if pos.kill_house: + products = RolesProducts.objects.filter(kill_house=pos.kill_house, trash=False) + else: + products = RolesProducts.objects.filter(guild=pos.guild, trash=False) + + serializer = self.serializer_class(products, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + product = RolesProducts.objects.get(key=request.data['product_key'], trash=False) + request.data.pop('product_key') + serializer = self.serializer_class(product) + serializer.update(instance=product, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PosPosOtherProductsViewset(viewsets.ModelViewSet): + queryset = OtherProducts.objects.all() + permission_classes = [AllowAny] + serializer_class = PosOtherProductsSerializer + + def list(self, request, *args, **kwargs): + pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False) + if pos.kill_house: + products = OtherProducts.objects.filter(kill_house=pos.kill_house, trash=False) + else: + products = OtherProducts.objects.filter(guild=pos.guild, trash=False) + + serializer = self.serializer_class(products, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + image = None + kill_house = None + guild = None + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + if 'image' in request.data.keys(): + image = request.data['image'] + request.data.pop('image') + pos = POSMachine.objects.get(pos_id=validation_device, trash=False) + if pos.kill_house: + kill_house = KillHouse.objects.get(key=pos.kill_house.key, trash=False) + else: + guild = Guilds.objects.get(key=pos.guild.key, trash=False) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + product = serializer.create(validated_data=request.data) + if image: + product.image = send_image_to_server(image) + if kill_house: + product.kill_house = kill_house + else: + product.guild = guild + + product.save() + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + + def update(self, request, pk=None, *args, **kwargs): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + image = None + try: + product = OtherProducts.objects.get(trash=False, key=request.data['product_key']) + request.data.pop('product_key') + except: + return Response({"result": "محصول مورد نظر یافت نشد!"}, status=status.HTTP_200_OK) + + if 'image' in request.data.keys(): + image = request.data['image'] + request.data.pop('image') + product.image = send_image_to_server(image) + serializer = self.serializer_class(product) + serializer.update(instance=product, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + product = OtherProducts.objects.get(trash=False, key=request.GET["product_key"]) + product.trash = True + product.save() + return Response({"result": "با موفقیت حذف شد."}, status=status.HTTP_200_OK) + + +class CombinedPosProductsViewSet(viewsets.ModelViewSet): + permission_classes = [AllowAny] + serializer_class = CombinedPosProductSerializer + + def get_queryset(self, pos_id, version): + pos = POSMachine.objects.get(pos_id=pos_id, trash=False) + if pos.kill_house: + roles_products = RolesProducts.objects.filter(kill_house=pos.kill_house, trash=False) + other_products = OtherProducts.objects.filter(kill_house=pos.kill_house, trash=False) + elif pos.guild: + roles_products = RolesProducts.objects.filter(guild=pos.guild, trash=False) + other_products = OtherProducts.objects.filter(guild=pos.guild, trash=False) + else: + if int(version) <= 217: + live_stock_products = LiveStockRolseProduct.objects.filter(cooperative=pos.cooperative, + parent_product__name='سبوس', trash=False) + else: + live_stock_products = LiveStockRolseProduct.objects.filter(cooperative=pos.cooperative, trash=False) + return list(live_stock_products) + + return list(roles_products) + list(other_products) + + def list(self, request, *args, **kwargs): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + version = request.headers.get('device-version') + queryset = self.get_queryset(validation_device, version) + serializer = self.get_serializer(queryset, many=True, context={'validation_device': validation_device}) + return Response(serializer.data, status=status.HTTP_200_OK) +class NewCombinedPosProductsViewSet(viewsets.ModelViewSet): + permission_classes = [AllowAny] + serializer_class = NewCombinedPosProductSerializer + + def get_queryset(self, pos, version,role): + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=pos.owner).first() + roles_products = RolesProducts.objects.filter(kill_house=kill_house, trash=False) + other_products = OtherProducts.objects.filter(kill_house=kill_house, trash=False) + + elif role == 'Steward': + steward = Steward.objects.filter(user=pos.owner).first() + roles_products = RolesProducts.objects.filter(steward=steward, trash=False) + other_products = OtherProducts.objects.filter(steward=steward, trash=False) + elif role == 'Guilds': + guild = Guilds.objects.filter(user=pos.owner).first() + roles_products = RolesProducts.objects.filter(guild=guild, trash=False) + other_products = OtherProducts.objects.filter(guild=guild, trash=False) + else: + if int(version) <= 217: + live_stock_products = LiveStockRolseProduct.objects.filter(cooperative=pos.cooperative, + parent_product__name='سبوس', trash=False) + else: + live_stock_products = LiveStockRolseProduct.objects.filter(cooperative=pos.cooperative, trash=False) + return list(live_stock_products) + + return list(roles_products) + list(other_products) + + def list(self, request, *args, **kwargs): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_pos() + version = request.headers.get('device-version') + role = request.headers.get('device-role') + queryset = self.get_queryset(validation_device, version,role) + serializer = self.get_serializer(queryset, many=True, context={'validation_device': validation_device}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class AdminXViewSet(viewsets.ModelViewSet): + queryset = AdminX.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = AdminXSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + super_admin = user.admin_x_user.all() + + serializer = self.serializer_class(super_admin[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class SupporterViewSet(viewsets.ModelViewSet): + queryset = Supporter.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = SupporterSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + super_admin = SystemUserProfile.objects.get(user=request.user, trash=False).supporter_user.first() + + serializer = self.serializer_class(super_admin) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ZarinPalAccountsViewset(viewsets.ModelViewSet): + queryset = ZarinPalAccounts.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ZarinPalAccountsSerializer + + def list(self, request, *args, **kwargs): + zarinpal_accounts = ZarinPalAccounts.objects.filter(trash=False).order_by('id') + serializer = self.serializer_class(zarinpal_accounts, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + zarinpal_account = ZarinPalAccounts.objects.get(trash=False, key=request.data['account_key']) + request.data.pop('account_key') + serializer = self.serializer_class(zarinpal_account) + serializer.update(instance=zarinpal_account, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryExportViewset(viewsets.ModelViewSet): + queryset = PoultryExport.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryExportSerializer + + def list(self, request, *args, **kwargs): + poultry_export = PoultryExport.objects.filter(trash=False).first() + serializer = self.serializer_class(poultry_export) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + poultry_export = PoultryExport.objects.filter(trash=False).first() + serializer = self.serializer_class(poultry_export) + serializer.update(instance=poultry_export, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryOutProvinceRequestViewset(viewsets.ModelViewSet): + queryset = PoultryOutProvinceRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryOutProvinceRequestSerializer + + def list(self, request, *args, **kwargs): + poultry_out_province = PoultryOutProvinceRequest.objects.filter(trash=False).first() + serializer = self.serializer_class(poultry_out_province) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + poultry_out_province = PoultryOutProvinceRequest.objects.filter(trash=False).first() + serializer = self.serializer_class(poultry_out_province) + serializer.update(instance=poultry_out_province, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +def pos_machine_to_dict(pos): + return { + "pos_id": pos.pos_id, + "receiver_number": pos.receiver_number, + "terminal_number": pos.terminal_number, + "Lat": pos.Lat, + "Long": pos.Long, + "pos-company": pos.pos_company.en_name, + } + + +def get_pos_details(pos_machines): + return [pos_machine_to_dict(pos) for pos in pos_machines] + + +def get_role_user_details(role_type, user, name, pos_details): + return { + "type": role_type, + "user-key": user.user_gate_way_id, + "fullname": user.fullname, + "firstname": user.first_name, + "lastname": user.last_name, + "mobile": user.mobile, + "name": name, + "pos-list": pos_details, + } + + +@api_view(['GET']) +@permission_classes([AllowAny]) +def Rolesusers(request): + pos_id = request.query_params.get('pos_id') + role_type = request.query_params.get('type', 'all').lower() + user_key = request.query_params.get('user_key') + + pos_machines = POSMachine.objects.filter(trash=False).select_related('pos_company') + + # If pos_id is provided + if pos_id: + try: + pos_machine = POSMachine.objects.filter(pos_id=pos_id) \ + .select_related('pos_company', 'kill_house', 'guild', 'steward', 'dispenser') \ + .get() + except POSMachine.DoesNotExist: + return Response({"message": "POSMachine not found"}, status=404) + + pos_details = pos_machine_to_dict(pos_machine) + if pos_machine.kill_house: + owner = pos_machine.kill_house.kill_house_operator.user + type_match = "kill-house" + name = pos_machine.kill_house.name + elif pos_machine.guild: + owner = pos_machine.guild.user + type_match = "guilds" + name = pos_machine.guild.guilds_name + elif pos_machine.dispenser: + owner = pos_machine.dispenser.user + type_match = "dispenser" + name = pos_machine.dispenser.user.fullname + elif pos_machine.steward: + owner = pos_machine.steward + type_match = "steward" + name = pos_machine.steward.fullname + else: + return Response({"message": "POSMachine has no related owner"}, status=404) + + if user_key and owner.user_gate_way_id != user_key: + return Response({"message": "User does not match POSMachine owner"}, status=404) + + if role_type != 'all' and role_type != type_match: + return Response({"message": "Type does not match"}, status=404) + + return Response(get_role_user_details(type_match, owner, name, [pos_details])) + + # If no pos_id, handle filtering by type and user_key + kill_house_filters = {} + filters = {} + if user_key: + try: + user_profile = SystemUserProfile.objects.get(user_gate_way_id=user_key) + kill_house_filters['kill_house_operator__user'] = user_profile + filters['user'] = user_profile + except SystemUserProfile.DoesNotExist: + return Response({"message": "User not found"}, status=404) + + roles_users_list = [] + + if role_type in ['all', 'kill-house']: + kill_houses = KillHouse.objects.filter( + out_province=False, trash=False, **kill_house_filters + ).select_related('kill_house_operator__user') \ + .prefetch_related(Prefetch('kill_house_pos', queryset=pos_machines)) \ + .only('kill_house_operator__user__fullname', 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name', 'kill_house_operator__user__mobile', 'name') + + for kh in kill_houses: + if role_type in ['all', 'kill-house']: + roles_users_list.append( + get_role_user_details("KillHouse", kh.kill_house_operator.user, kh.name, + get_pos_details(kh.kill_house_pos.all())) + ) + + if role_type in ['all', 'guilds', 'steward']: + guilds_stewards = Guilds.objects.filter( + trash=False, **filters + ).select_related('user') \ + .prefetch_related(Prefetch('guild_pos', queryset=pos_machines)) \ + .only('user__fullname', 'user__first_name', 'user__last_name', 'user__mobile', 'guilds_name') + + for gs in guilds_stewards: + if role_type in ['all', 'guilds']: + roles_users_list.append( + get_role_user_details("Guilds", gs.user, gs.guilds_name, get_pos_details(gs.guild_pos.all())) + ) + + if role_type in ['all', 'dispenser']: + dispensers = Dispenser.objects.filter( + trash=False, **filters + ).select_related('user') \ + .prefetch_related(Prefetch('dispenser_pos', queryset=pos_machines)) \ + .only('user__fullname', 'user__first_name', 'user__last_name', 'user__mobile') + + for disp in dispensers: + if role_type in ['all', 'dispenser']: + roles_users_list.append( + get_role_user_details("Dispenser", disp.user, disp.user.fullname, + get_pos_details(disp.dispenser_pos.all())) + ) + + if not roles_users_list: + return Response({"message": "Not found"}, status=404) + + return Response(roles_users_list) + + +class VetFarmAggregatePermissionViewset(viewsets.ModelViewSet): + queryset = VetFarmAggregatePermission.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = VetFarmAggregatePermissionSerializer + + def list(self, request, *args, **kwargs): + aggregate_permission = VetFarmAggregatePermission.objects.filter(trash=False).first() + serializer = self.serializer_class(aggregate_permission) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + aggregate_permission = VetFarmAggregatePermission.objects.filter(trash=False).first() + serializer = self.serializer_class(aggregate_permission) + serializer.update(instance=aggregate_permission, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseBarLimitationViewset(viewsets.ModelViewSet): + queryset = KillHouseBarLimitation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseBarLimitationSerializer + + def list(self, request, *args, **kwargs): + bar_limitation = KillHouseBarLimitation.objects.filter(trash=False).first() + serializer = self.serializer_class(bar_limitation) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + bar_limitation = KillHouseBarLimitation.objects.filter(trash=False).first() + serializer = self.serializer_class(bar_limitation) + serializer.update(instance=bar_limitation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHouseDistributionManagementStewardGuildViewset(viewsets.ModelViewSet): + queryset = KillHouse.objects.filter(trash=False, out_province=False).order_by('id') + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHouseDistributionManagementStewardGuildSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = KillHouseFilterSet + filterset_fields = [ + 'name', + 'kill_house_operator__user__fullname', + 'kill_house_operator__user__first_name', + 'kill_house_operator__user__last_name', + 'kill_house_operator__user__mobile', + + ] + + def list(self, request, *args, **kwargs): + role = request.GET.get('role') + if role in ('CityOperator', 'CityJahad', 'CityCommerce', 'CitySupervisor', 'CityGuild'): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_houses = KillHouse.objects.filter(address__city=user.city, trash=False, out_province=False).order_by( + 'id') + else: + + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).order_by('id') + kill_house_list = [] + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=kill_houses + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=kill_houses) + kill_house_list = ps.filter() + kill_houses = [] if len(kill_house_list) == 0 else kill_house_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_houses) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(kill_houses, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class StewardDistributionManagementGuildViewset(viewsets.ModelViewSet): + queryset = Guilds.objects.filter(trash=False, steward=True).order_by('id') + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardDistributionManagementGuildSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsFilterSet + + def list(self, request, *args, **kwargs): + stewards = Guilds.objects.filter(trash=False, steward=True).order_by('id') + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + stewards = stewards.filter( + self.build_query(value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(stewards.distinct()) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = GuildsSerializer(stewards.distinct(), many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def build_query(self, value): + from django.db.models import Q + query = Q() + for field in self.filterset_class.Meta.fields: + query |= Q(**{f"{field}__icontains": value}) + return query + + +class OutOfProvinceSellingCarcassesPermissionViewset(viewsets.ModelViewSet): + queryset = OutOfProvinceSellingCarcassesPermission.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = OutOfProvinceSellingCarcassesPermissionSerializer + + def list(self, request, *args, **kwargs): + permission = OutOfProvinceSellingCarcassesPermission.objects.filter(trash=False).first() + serializer = self.serializer_class(permission) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + permission = OutOfProvinceSellingCarcassesPermission.objects.filter(trash=False).first() + serializer = self.serializer_class(permission) + serializer.update(instance=permission, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class BaseOutProvinceCarcassesBuyerViewSet(viewsets.ModelViewSet): + queryset = BaseOutProvinceCarcassesBuyer.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = BaseOutProvinceCarcassesBuyerSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = BaseOutProvinceCarcassesBuyerFilterSet + filterset_fields = [ + 'mobile', + 'first_name', + 'last_name', + 'fullname', + 'unit_name', + 'city', + 'province', + + ] + + def list(self, request, *args, **kwargs): + buyer_list = [] + if 'state' in request.GET: + buyers = BaseOutProvinceCarcassesBuyer.objects.filter(trash=False).order_by('id') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=buyers + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=buyers) + buyer_list = ps.filter() + buyers = [] if len(buyer_list) == 0 else buyer_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(buyers) + if page is not None: + serializer = BaseOutProvinceCarcassesBuyerFordispensersSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + elif 'mobile' in request.GET: + buyer = BaseOutProvinceCarcassesBuyer.objects.filter(mobile=request.GET['mobile'], trash=False) + if buyer: + serializer = self.get_serializer(buyer.first()) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response({"result": "خریداری یافت نشد!"}, status=status.HTTP_404_NOT_FOUND) + + + else: + buyers = BaseOutProvinceCarcassesBuyer.objects.filter(active=True, trash=False).order_by('id') + serializer = self.get_serializer(buyers, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class OutProvinceCarcassesBuyerViewSet(viewsets.ModelViewSet): + LEGAL_DOCUMENT_ENDPOINT = "https://pay.rasadyar.net/national-documents" + + queryset = OutProvinceCarcassesBuyer.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = OutProvinceCarcassesBuyerrSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = OutProvinceCarcassesBuyerFilterSet + filterset_fields = [ + 'mobile', + 'first_name', + 'last_name', + 'fullname', + 'unit_name', + + ] + + def _fetch_legal_person_payload(self, info_value: str): + info_value = info_value or self.request.data.get('info_value') + if not info_value: + return None + try: + response = requests.get( + self.LEGAL_DOCUMENT_ENDPOINT, + params={'info': info_value, 'type': 'unit'}, + ) + if response.status_code == 200: + return response.json() + except: + return None + + def _normalize_branch_list(self, value): + if value in (None, ''): + return value + if isinstance(value, str): + return value + try: + return json.dumps(value, ensure_ascii=False) + except (TypeError, ValueError): + return str(value) + + def _apply_legal_person_payload(self, base_buyer, payload, is_real_person): + base_buyer.isRealPerson = is_real_person + if not payload: + return None + base_buyer.status = payload.get('status', False) + base_buyer.statusCode = payload.get('statusCode') + base_buyer.apiLogId = payload.get('apiLogId') + + data = payload.get('data') or {} + base_buyer.legalPersonInfoDtoId = data.get('legalPersonInfoDtoId') + base_buyer.parentLegalPersonId = data.get('parentLegalPersonId') + base_buyer.successful = data.get('successful', False) + base_buyer.message = data.get('message') + base_buyer.name = data.get('name') + base_buyer.nationalCode = data.get('nationalCode') + base_buyer.postCode = data.get('postCode') + base_buyer.address = data.get('address') + base_buyer.legalPersonType = data.get('legalPersonType') + base_buyer.registerNumber = data.get('registerNumber') + base_buyer.registerUnit = data.get('registerUnit') + base_buyer.registerDate = data.get('registerDate') + base_buyer.registerDateUnix = data.get('registerDateUnix') + base_buyer.residency = data.get('residency') + base_buyer.state = data.get('state') + base_buyer.isSettle = data.get('isSettle', False) + base_buyer.settleDate = data.get('settleDate') + base_buyer.isBreakUp = data.get('isBreakUp', False) + base_buyer.breakUpdate = data.get('breakUpdate') + base_buyer.isBranch = data.get('isBranch', False) + base_buyer.branchList = self._normalize_branch_list(data.get('branchList')) + base_buyer.establishmentDate = data.get('establishmentDate') + base_buyer.isDbResult = data.get('isDbResult', False) + base_buyer.serviceType = data.get('serviceType') + + parent = data.get('parentLegalPerson') or {} + base_buyer.parentLegalPersonInfoDtoId = parent.get('legalPersonInfoDtoId') + base_buyer.parentLegalPersonParentId = parent.get('parentLegalPersonId') + base_buyer.parentLegalPersonSuccessful = parent.get('successful', False) + base_buyer.parentLegalPersonMessage = parent.get('message') + base_buyer.parentLegalPersonName = parent.get('name') + base_buyer.parentLegalPersonNationalCode = parent.get('nationalCode') + base_buyer.parentLegalPersonPostCode = parent.get('postCode') + base_buyer.parentLegalPersonAddress = parent.get('address') + base_buyer.parentLegalPersonType = parent.get('legalPersonType') + base_buyer.parentLegalPersonRegisterNumber = parent.get('registerNumber') + base_buyer.parentLegalPersonRegisterUnit = parent.get('registerUnit') + base_buyer.parentLegalPersonRegisterDate = parent.get('registerDate') + base_buyer.parentLegalPersonRegisterDateUnix = parent.get('registerDateUnix') + base_buyer.parentLegalPersonResidency = parent.get('residency') + base_buyer.parentLegalPersonState = parent.get('state') + base_buyer.parentLegalPersonIsSettle = parent.get('isSettle', False) + base_buyer.parentLegalPersonSettleDate = parent.get('settleDate') + base_buyer.parentLegalPersonIsBreakUp = parent.get('isBreakUp', False) + base_buyer.parentLegalPersonBreakUpdate = parent.get('breakUpdate') + base_buyer.parentLegalPersonIsBranch = parent.get('isBranch', False) + base_buyer.parentLegalPersonBranchList = self._normalize_branch_list(parent.get('branchList')) + base_buyer.parentLegalPersonEstablishmentDate = parent.get('establishmentDate') + base_buyer.parentLegalPersonIsDbResult = parent.get('isDbResult', False) + base_buyer.parentLegalPersonServiceType = parent.get('serviceType') + + def create(self, request, *args, **kwargs): + role = request.data.pop('role', None) + operator_user = SystemUserProfile.objects.get(user=request.user, trash=False) + if request.data.get('info_value'): + if BaseOutProvinceCarcassesBuyer.objects.filter(trash=False, + nationalCode=request.data.get('info_value')).exists(): + return Response({"result": "کاربر وجود دارد! "}, status=status.HTTP_403_FORBIDDEN) + if role: + steward = Guilds.objects.get(user=operator_user, active=True, trash=False) + + + else: + kill_house = KillHouse.objects.filter(kill_house_operator__user=operator_user, trash=False).first() + + if SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).exists(): + system_profile = SystemUserProfile.objects.get(mobile=request.data['mobile'], trash=False) + else: + password = "123456" + data = { + "username": request.data['mobile'], + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code in (200, 400): + user = User(username=request.data['mobile'], first_name=request.data['first_name'], + last_name=request.data['last_name']) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=request.data['mobile'], + first_name=request.data['first_name'], + last_name=request.data['last_name'], + user=user, + base_order=base_id, + password=password, + national_id=request.data['national_id'], + city=operator_user.city, + province=operator_user.province + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است! "}, status=status.HTTP_403_FORBIDDEN) + + base_buyer = BaseOutProvinceCarcassesBuyer.objects.filter(trash=False, user=system_profile) + if base_buyer: + base_buyer = base_buyer.first() + else: + base_buyer = BaseOutProvinceCarcassesBuyer( + user=system_profile, + ) + base_buyer.first_name = request.data['first_name'] + base_buyer.last_name = request.data['last_name'] + base_buyer.mobile = request.data['mobile'] + base_buyer.unit_name = request.data['unit_name'] + base_buyer.city = request.data['city'] + base_buyer.province = request.data['province'] + base_buyer.national_id = request.data['national_id'] + + if 'isRealPerson' in request.data: + is_real_person_value = request.data.get('isRealPerson') + if isinstance(is_real_person_value, bool): + is_real_person = is_real_person_value + else: + is_real_person = str(is_real_person_value).strip().lower() in ( + 'true', '1', 'yes', 'y', 'on', 'real', 'حقیقی' + ) + legal_info_value = ( + request.data.get('info_value') + or request.data.get('legalNationalCode') + or request.data.get('legal_national_code') + or request.data.get('national_id') + ) + legal_payload = self._fetch_legal_person_payload(legal_info_value) + self._apply_legal_person_payload(base_buyer, legal_payload, is_real_person) + base_buyer.save() + if role: + if OutProvinceCarcassesBuyer.objects.filter(buyer=base_buyer, steward=steward).exists(): + return Response({"result": "خریدار قبلا برای مباشر ثبت شده است!"}, status=status.HTTP_403_FORBIDDEN) + else: + if OutProvinceCarcassesBuyer.objects.filter(buyer=base_buyer, Kill_house=kill_house).exists(): + return Response({"result": "خریدار قبلا برای کشتارگاه ثبت شده است!"}, status=status.HTTP_403_FORBIDDEN) + if 'info_value' in request.data: + request.data.pop('info_value') + if 'isRealPerson' in request.data: + request.data.pop('isRealPerson') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + buyer = serializer.create(validated_data=request.data) + if role: + buyer.steward = steward + + else: + buyer.Kill_house = kill_house + + buyer.buyer = base_buyer + buyer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + buyer_list = [] + if 'state' in request.GET: + if request.GET['role'] == "KillHouse": + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + buyers = OutProvinceCarcassesBuyer.objects.filter(Kill_house=kill_house, trash=False).order_by('id') + + elif request.GET['role'] == "Steward": + steward = Guilds.objects.get(user=user, active=True, trash=False) + + buyers = OutProvinceCarcassesBuyer.objects.filter(steward=steward, trash=False).order_by('id') + else: + buyers = OutProvinceCarcassesBuyer.objects.filter(trash=False).order_by('id') + + buyer_type = request.GET.get('type') + if buyer_type: + buyer_type = str(buyer_type).strip().lower() + if buyer_type == 'real': + buyers = buyers.filter(buyer__isRealPerson=True) + elif buyer_type == 'legal': + buyers = buyers.filter(buyer__isRealPerson=False) + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=buyers + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=buyers) + buyer_list = ps.filter() + buyers = [] if len(buyer_list) == 0 else buyer_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(buyers) + if page is not None: + serializer = OutProvinceCarcassesBuyerForBuyerRequestSerializer(page, many=True, + context={'request': request}) + return self.get_paginated_response(serializer.data) + else: + if request.GET['role'] == "KillHouse": + + buyers = OutProvinceCarcassesBuyer.objects.filter(Kill_house__kill_house_operator__user=user, + active=True, trash=False).order_by('id') + elif request.GET['role'] == "Steward": + + buyers = OutProvinceCarcassesBuyer.objects.filter(steward__user=user, + active=True, trash=False).order_by('id') + else: + buyers = OutProvinceCarcassesBuyer.objects.filter(active=True, trash=False).order_by('id') + + buyer_type = request.GET.get('type') + if buyer_type: + buyer_type = str(buyer_type).strip().lower() + if buyer_type == 'real': + buyers = buyers.filter(buyer__isRealPerson=True) + elif buyer_type == 'legal': + buyers = buyers.filter(buyer__isRealPerson=False) + + serializer = OutProvinceCarcassesBuyerForChoosingBuyerSerializer(buyers, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + buyer = OutProvinceCarcassesBuyer.objects.get(key=request.data['buyer_key'], trash=False) + + if 'mobile' in request.data.keys(): + base_buyer = buyer.buyer + system_user_profile = base_buyer.user if base_buyer else None + + if system_user_profile: + first_mobile_number = system_user_profile.mobile + second_mobile_number = request.data['mobile'] + + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exclude( + id=system_user_profile.id).exists(): + return Response( + {"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN + ) + + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + + buyer.mobile = second_mobile_number + buyer.save() + if base_buyer: + base_buyer.mobile = second_mobile_number + base_buyer.save() + + request.data.pop('mobile') + + request.data.pop('buyer_key') + serializer = self.serializer_class(buyer) + serializer.update(instance=buyer, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + buyer = OutProvinceCarcassesBuyer.objects.get(key=request.GET["buyer_key"], trash=False) + buyer.trash = True + buyer.save() + return Response({"result": "با موفقیت حذف شد."}, status=status.HTTP_200_OK) + + +class PosOutProvinceCarcassesBuyerViewSet(viewsets.ModelViewSet): + queryset = OutProvinceCarcassesBuyer.objects.all() + permission_classes = [AllowAny] + serializer_class = OutProvinceCarcassesBuyerrSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = OutProvinceCarcassesBuyerFilterSet + filterset_fields = [ + 'mobile', + 'first_name', + 'last_name', + 'fullname', + 'unit_name', + + ] + + def list(self, request, *args, **kwargs): + pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False) + buyers = OutProvinceCarcassesBuyer.objects.filter(Kill_house=pos.kill_house, + active=True, trash=False).order_by('id') + serializer = OutProvinceCarcassesBuyerForChoosingBuyerSerializer(buyers, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProductPricingTypeViewset(viewsets.ModelViewSet): + queryset = ProductPricingType.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProductPricingTypeSerializer + + def list(self, request, *args, **kwargs): + pricing_type = ProductPricingType.objects.filter(trash=False).first() + serializer = self.serializer_class(pricing_type) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + pricing_type = ProductPricingType.objects.filter(trash=False).first() + serializer = self.serializer_class(pricing_type) + serializer.update(instance=pricing_type, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class KillHousePricePermissionViewset(viewsets.ModelViewSet): + queryset = KillHousePricePermission.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = KillHousePricePermissionSerializer + + def list(self, request, *args, **kwargs): + kill_house_permission = KillHousePricePermission.objects.filter(trash=False).first() + serializer = self.serializer_class(kill_house_permission) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + kill_house_permission = KillHousePricePermission.objects.filter(trash=False).first() + serializer = self.serializer_class(kill_house_permission) + serializer.update(instance=kill_house_permission, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class AutomaticDirectBuyingPermissionViewSet(viewsets.ModelViewSet): + queryset = AutomaticDirectBuyingPermission.objects.all() + permission_classes = [AllowAny] + serializer_class = AutomaticDirectBuyingPermissionSerializer + + def list(self, request, *args, **kwargs): + query = self.queryset.first() + ser_data = self.serializer_class(query) + return Response(ser_data.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + query = self.queryset.first() + ser_data = self.serializer_class(query) + ser_data.update(instance=query, validated_data=request.data) + return Response(ser_data.data, status=status.HTTP_200_OK) + + +class PosMachineTransactionViewSet(viewsets.ModelViewSet): + queryset = PosMachineTransactions.objects.all() + permission_classes = [AllowAny] + serializer_class = PosMachineTransactionsSerializer + + def create(self, request, *args, **kwargs): + # timestamp_date = request.data['timestamp_date'] + # transaction_date = datetime.fromtimestamp(timestamp_date) + try: + product = RolesProducts.objects.get(key=request.data['product_key']) + except: + return Response({"result": "محصول موجود نمی باشد!"}, status=status.HTTP_403_FORBIDDEN) + pos = POSMachine.objects.get(pos_id=request.data['pos-id']) + # request.data.pop('timestamp_date') + request.data.pop('product_key') + request.data.pop('pos-id') + + try: + pos_transaction = PosMachineTransactions.objects.get(check_id=request.data['check_id']) + serializer = self.serializer_class(pos_transaction) + serializer.update(instance=pos_transaction, validated_data=request.data) + if pos_transaction.paid: + pos_allocation_weight_for_product(product) + return Response(serializer.data, status=status.HTTP_200_OK) + + + except: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_transaction = serializer.create(validated_data=request.data) + # pos_transaction.date = transaction_date + pos_transaction.product = product + pos_transaction.pos = pos + pos_transaction.save() + if pos_transaction.paid: + pos_allocation_weight_for_product(product) + + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def update(self, request, *args, **kwargs): + # timestamp_date = request.data['timestamp_date'] + # transaction_date = datetime.fromtimestamp(timestamp_date) + + try: + product = RolesProducts.objects.get(key=request.data['product_key']) + except: + return Response({"result": "محصول موجود نمی باشد!"}, status=status.HTTP_403_FORBIDDEN) + + pos = POSMachine.objects.get(pos_id=request.data['pos-id']) + # request.data.pop('timestamp_date') + request.data.pop('product_key') + request.data.pop('pos-id') + + try: + pos_transaction = PosMachineTransactions.objects.get(check_id=request.data['check_id']) + serializer = self.serializer_class(pos_transaction) + serializer.update(instance=pos_transaction, validated_data=request.data) + if pos_transaction.paid: + pos_allocation_weight_for_product(product) + return Response(serializer.data, status=status.HTTP_200_OK) + + + except: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_transaction = serializer.create(validated_data=request.data) + # pos_transaction.date = transaction_date + pos_transaction.product = product + pos_transaction.pos = pos + pos_transaction.save() + if pos_transaction.paid: + pos_allocation_weight_for_product(product) + + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class NewPosMachineTransactionViewSet(viewsets.ModelViewSet): + queryset = PosMachineTransactions.objects.all() + permission_classes = [AllowAny] + serializer_class = PosMachineTransactionsSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = PosMachineTransactionsFilterSet + filterset_fields = [ + 'mobile', + 'natcode', + 'fullname', + ] + + def create(self, request, *args, **kwargs): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device) + try: + pos_transaction = PosMachineTransactions.objects.filter(check_id=request.data['check_id']).first() + if pos_transaction: + paid = pos_transaction.paid + request.data.pop('products') + + serializer = self.serializer_class(pos_transaction) + serializer.update(instance=pos_transaction, validated_data=request.data) + if not paid and pos_transaction.paid: + + if not pos_transaction.live_stock: + + product_transaction = ProductsTransactions.objects.filter(transaction=pos_transaction, + trash=False, + product__isnull=False).first() + if product_transaction: + pos_allocation_weight_for_product(product_transaction.product) + else: + product_transaction = ProductsTransactions.objects.filter(transaction=pos_transaction, + trash=False, + live_stack_products__isnull=False).first() + if product_transaction: + cooperative_warehousing(product_transaction.live_stack_products) + rancher_warehousing(pos_transaction) + + else: + products = request.data['products'] + request.data.pop('products') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_transaction = serializer.create(validated_data=request.data) + pos_transaction.pos = pos + if pos.kill_house: + pos_transaction.kill_house = pos.kill_house + elif pos.guild: + pos_transaction.guild = pos.guild + pos_transaction.date = datetime.now() + pos_transaction.save() + for product in products: + product_transaction = ProductsTransactions( + transaction=pos_transaction, + cur_price=product['cur_price'], + cur_weight=product['cur_qty'], + price=product['price'], + name=product['name'], + image=product['image'], + unit=product['unit'], + targetunit=product['targetunit'], + price_approved=product['price_approved'], + ) + if product['product_type'] == 'roles_product': + roles_product = RolesProducts.objects.get(key=product['key']) + product_transaction.product = roles_product + elif product['product_type'] == 'other_product': + other_product = OtherProducts.objects.get(key=product['key']) + product_transaction.other_product = other_product + elif product['product_type'] == 'stock_product': + pos_transaction.live_stock = True + pos_transaction.save() + live_stock_product = LiveStockRolseProduct.objects.get(key=product['key']) + product_transaction.live_stack_products = live_stock_product + product_transaction.save() + if pos_transaction.paid: + if pos_transaction.live_stock == False: + product_transaction = ProductsTransactions.objects.filter(transaction=pos_transaction, + trash=False, + product__isnull=False).first() + if product_transaction: + pos_allocation_weight_for_product(product_transaction.product) + else: + product_transaction = ProductsTransactions.objects.filter(transaction=pos_transaction, + trash=False, + live_stack_products__isnull=False).first() + if product_transaction: + cooperative_warehousing(product_transaction.live_stack_products) + rancher_warehousing(pos_transaction) + + chat_ids = list( + User_Bale.objects.filter(trash=False, super_admin=True).values_list('chat_id', + flat=True).distinct()) + if pos_transaction.pos: + chat_id_list = chat_ids + list( + User_Bale.objects.filter(rasadyar_user=pos_transaction.pos.user, trash=False).values_list( + 'chat_id', + flat=True).distinct()) + else: + chat_id_list = [] + send_transaction(pos_transaction, chat_id_list) + return Response(serializer.data, status=status.HTTP_200_OK) + except Exception as e: + error_message = str(e) + error_title = e.__class__.__name__ + error_traceback = traceback.format_exc() + print(error_message) + print(error_title) + print(error_traceback) + + return Response( + { + "result": "خطای سرور داخلی رخ داده است. لطفا بعدا تلاش کنید.", + "error_message": error_message, + "error_title": error_title, + "error_traceback": error_traceback, + }, + status=status.HTTP_500_INTERNAL_SERVER_ERROR + ) + + def update(self, request, *args, **kwargs): + # timestamp_date = request.data['timestamp_date'] + # transaction_date = datetime.fromtimestamp(timestamp_date) + + try: + product = RolesProducts.objects.get(key=request.data['product_key']) + except: + return Response({"result": "محصول موجود نمی باشد!"}, status=status.HTTP_403_FORBIDDEN) + + pos = POSMachine.objects.get(pos_id=request.data['pos-id']) + # request.data.pop('timestamp_date') + request.data.pop('product_key') + request.data.pop('pos-id') + + try: + pos_transaction = PosMachineTransactions.objects.get(check_id=request.data['check_id']) + serializer = self.serializer_class(pos_transaction) + serializer.update(instance=pos_transaction, validated_data=request.data) + if pos_transaction.paid: + pos_allocation_weight_for_product(product) + return Response(serializer.data, status=status.HTTP_200_OK) + + + except: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_transaction = serializer.create(validated_data=request.data) + # pos_transaction.date = transaction_date + pos_transaction.product = product + pos_transaction.pos = pos + pos_transaction.save() + if pos_transaction.paid: + pos_allocation_weight_for_product(product) + + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + filters = {} + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + price_type = request.GET.get('price_type') + paid = request.GET.get('paid') + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device, trash=False) + filters['trash'] = False + filters['pos'] = pos + + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters['date__date__gte'] = date1 + filters['date__date__lte'] = date2 + + if price_type: + filters['price_type__in'] = price_type.split(',') + + if paid: + filters['paid'] = True if paid == 'true' else False + + transactions = PosMachineTransactions.objects.filter(**filters).order_by('-date') + if 'search' in request.GET and 'value' in request.GET: + transactions_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = NewPosMachineTransactionsSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = NewPosMachineTransactionsSerializer(transactions, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class LiveStockTransactionViewSet(viewsets.ModelViewSet): + queryset = PosMachineTransactions.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PosMachineTransactionsSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = PosMachineTransactionsFilterSet + filterset_fields = [ + 'mobile', + 'natcode', + 'fullname', + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + state = request.GET.get('state') + filters = {} + products = { + "bran": "سبوس", + "barley": "جو", + "soy": "سویا", + "corn": "ذرت", + "sheep_concentrate": "کنسانتره گوسفندی", + "high_cow_concentrate": "کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate": "کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate": "کنسانتره گوساله پرواری", + } + product = products[request.GET.get('name')] + if state: + if state == 'paid': + filters['paid'] = True + elif state == 'unpaid': + filters['paid'] = False + else: + pass + + cooperative_key = request.GET.get('cooperative_key') + if role in ('LiveStockProvinceJahad', 'Union'): + if product: + product_transactions = ProductsTransactions.objects.filter( + live_stack_products__parent_product__name=product, trash=False).values_list('transaction__id', + flat=True) + transactions = PosMachineTransactions.objects.filter(id__in=product_transactions, trash=False, + live_stock=True).order_by('-date') + + else: + transactions = PosMachineTransactions.objects.filter(trash=False, live_stock=True).order_by('-date') + + + elif cooperative_key: + cooperative = Cooperative.objects.get(key=cooperative_key) + if product: + product_transactions = ProductsTransactions.objects.filter( + live_stack_products__parent_product__name=product, live_stack_products__cooperative=cooperative, + trash=False).values_list('transaction__id', + flat=True) + transactions = PosMachineTransactions.objects.filter(id__in=product_transactions, trash=False, + live_stock=True).order_by('-date') + else: + + transactions = PosMachineTransactions.objects.filter(pos__cooperative=cooperative, trash=False, + live_stock=True).order_by('-date') + + + + else: + cooperative = Cooperative.objects.get(user=user) + if product: + product_transactions = ProductsTransactions.objects.filter( + live_stack_products__parent_product__name=product, live_stack_products__cooperative=cooperative, + trash=False).values_list('transaction__id', + flat=True) + transactions = PosMachineTransactions.objects.filter(id__in=product_transactions, trash=False, + live_stock=True).order_by('-date') + + else: + + transactions = PosMachineTransactions.objects.filter(pos__cooperative=cooperative, trash=False, + live_stock=True).order_by('-date') + + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters['date__date__gte'] = date1 + filters['date__date__lte'] = date2 + + transactions = transactions.filter(**filters).order_by('-date') + if 'search' in request.GET and 'value' in request.GET: + transactions_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = PosMachineTransactionsForLiveStockSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = PosMachineTransactionsForLiveStockSerializer(transactions, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class LiveStockTransactionDashboeardViewSet(viewsets.ModelViewSet): + queryset = PosMachineTransactions.objects.all() + serializer_class = PosMachineTransactionsSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = PosMachineTransactionsFilterSet + filterset_fields = [ + 'mobile', + 'natcode', + 'fullname', + ] + + def list(self, request, *args, **kwargs): + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + state = request.GET.get('state') + filters = {} + if state: + if state == 'paid': + filters['paid'] = True + elif state == 'unpaid': + filters['paid'] = False + else: + pass + + products = { + "bran": "سبوس", + "barley": "جو", + "soy": "سویا", + "corn": "ذرت", + "sheep_concentrate": "کنسانتره گوسفندی", + "high_cow_concentrate": "کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate": "کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate": "کنسانتره گوساله پرواری", + } + product = products[request.GET.get('name')] + + cooperative_key = request.GET.get('cooperative_key') + if role in ('LiveStockProvinceJahad', 'Union'): + if product: + product_transactions = ProductsTransactions.objects.filter( + live_stack_products__parent_product__name=product, trash=False).values_list('transaction__id', + flat=True) + transactions = PosMachineTransactions.objects.filter(id__in=product_transactions, trash=False, + live_stock=True).prefetch_related( + 'transaction_products_transactions').only('id', 'additional', 'date').order_by('-date') + + + else: + + transactions = PosMachineTransactions.objects.filter(trash=False, paid=True, + live_stock=True).prefetch_related( + 'transaction_products_transactions').only('id', 'additional', 'date').order_by('-date') + + + elif cooperative_key: + cooperative = Cooperative.objects.get(key=cooperative_key) + if product: + product_transactions = ProductsTransactions.objects.filter( + live_stack_products__parent_product__name=product, live_stack_products__cooperative=cooperative, + trash=False).values_list('transaction__id', + flat=True) + transactions = PosMachineTransactions.objects.filter(id__in=product_transactions, trash=False, + live_stock=True).prefetch_related( + 'transaction_products_transactions').only('id', 'additional', 'date').order_by('-date') + + else: + transactions = PosMachineTransactions.objects.filter(pos__cooperative=cooperative, trash=False, + live_stock=True).prefetch_related( + 'transaction_products_transactions').only('id', 'additional', 'date').order_by('-date') + + + + else: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + cooperative = Cooperative.objects.get(user=user) + + if product: + product_transactions = ProductsTransactions.objects.filter( + live_stack_products__parent_product__name=product, live_stack_products__cooperative=cooperative, + trash=False).values_list('transaction__id', + flat=True) + transactions = PosMachineTransactions.objects.filter(id__in=product_transactions, trash=False, + live_stock=True).prefetch_related( + 'transaction_products_transactions').only('id', 'additional', 'date').order_by('-date') + else: + transactions = PosMachineTransactions.objects.filter(pos__cooperative=cooperative, trash=False, + live_stock=True).prefetch_related( + 'transaction_products_transactions').only('id', 'additional', 'date').order_by('-date') + + if date1 and date2: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters['date__date__gte'] = date1 + filters['date__date__lte'] = date2 + + transactions = transactions.filter(**filters).order_by('-date') + if 'search' in request.GET and 'value' in request.GET: + transactions_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + + weights_by_transaction = defaultdict(int) + product_weights = ProductsTransactions.objects.filter( + trash=False, + live_stack_products__isnull=False, + transaction__in=transactions + ).values( + 'transaction_id' + ).annotate( + total_weight=Sum('cur_weight') + ) + + for item in product_weights: + weights_by_transaction[item['transaction_id']] = item['total_weight'] or 0 + + price = transactions.aggregate(total=Sum('price'))[ + 'total'] or 0 + total_cooperative_price = 0 + total_union_price = 0 + total_company_price = 0 + cur_heavy = 0 + cur_light = 0 + weight = 0 + for transaction in transactions: + total_weight = weights_by_transaction.get(transaction.id, 0) + additional_data = json.loads(transaction.additional) + for share in additional_data.get('shares', []): + share_price = int(share.get('price', 0)) + if share.get('name') == 'union': + total_union_price += share_price * total_weight + else: + total_company_price += share_price * total_weight + total_cooperative_price += additional_data.get('cooperative_price', 0) + cur_heavy += additional_data.get('cur_heavy', 0) + cur_light += additional_data.get('cur_light', 0) + weight += total_weight + + dict_result = { + 'lenTransaction': len(transactions), + 'price': price, + 'totalCooperativePrice': total_cooperative_price, + 'totalUnionPrice': total_union_price, + 'totalCompanyPrice': total_company_price, + 'curHeavy': cur_heavy, + 'curLight': cur_light, + 'curWeight': weight, + } + + return Response(dict_result, status=status.HTTP_200_OK) + + +class PosAllocationTransactionsViewSet(viewsets.ModelViewSet): + queryset = PosAllocationTransactions.objects.all() + permission_classes = [AllowAny] + serializer_class = PosAllocationTransactionsSerializer + pagination_class = CustomPagination + + def list(self, request, *args, **kwargs): + + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + paid = request.GET.get('paid') + if date1: + filters = { + 'date__date__gte': date1, + 'date__date__lte': date2, + 'trash': False, + } + else: + filters = { + 'trash': False, + } + if paid: + filters['paid'] = paid + + transactions = PosAllocationTransactions.objects.filter(**filters).order_by('-date') + if 'page_size' in request.GET: + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(transactions, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + timestamp_date = request.data['timestamp_date'] + transaction_date = datetime.fromtimestamp(timestamp_date) + pos = POSMachine.objects.get(pos_id=request.data['pos-id']) + allocation = StewardAllocation.objects.get(key=request.data['allocation_key']) + request.data.pop('timestamp_date') + request.data.pop('allocation_key') + request.data.pop('pos-id') + + try: + allocation_transaction = PosAllocationTransactions.objects.get(check_id=request.data['check_id']) + serializer = self.serializer_class(allocation_transaction) + serializer.update(instance=allocation_transaction, validated_data=request.data) + if allocation_transaction.paid: + allocation_calculate_price(allocation) + return Response(serializer.data, status=status.HTTP_200_OK) + + + except: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + allocation_transaction = serializer.create(validated_data=request.data) + allocation_transaction.date = transaction_date + allocation_transaction.pos = pos + allocation_transaction.allocation = allocation + allocation_transaction.save() + if allocation_transaction.paid: + allocation_calculate_price(allocation) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class BroadcastPriceViewset(viewsets.ModelViewSet): + queryset = BroadcastPrice.objects.all() + permission_classes = [AllowAny] + serializer_class = BroadcastPriceSerializer + + def list(self, request, *args, **kwargs): + price = BroadcastPrice.objects.filter(trash=False).first() + + serializer = self.serializer_class(price) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + kill_house_price = 0 + steward_price = 0 + guild_price = 0 + price = BroadcastPrice.objects.filter(trash=False).first() + # approved_price = ApprovedPrice.objects.filter(trash=False).first() + # if request.data['active'] == True: + # if approved_price.approved == False: + # return Response({"result":"ابتدا در استان قیمت مصوب مرغ زنده رو در استان فعال کنید !"},status=status.HTTP_403_FORBIDDEN) + parent_product = NewProduct.objects.get(trash=False) + parent_product.approved_price_status = request.data['active'] + if 'kill_house_price' in request.data.keys(): + parent_product.approved_price = int(request.data['kill_house_price']) + kill_house_price = int(request.data['kill_house_price']) + steward_price = int(request.data['steward_price']) + guild_price = int(request.data['guild_price']) + parent_product.save() + roles_products_thread = threading.Thread(target=change_roles_products_state, + args=( + request.data['active'], kill_house_price, steward_price, + guild_price)) + + roles_products_thread.start() + + serializer = self.serializer_class(price) + serializer.update(instance=price, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class NewPosBroadcastPriceViewset(viewsets.ModelViewSet): + queryset = BroadcastPrice.objects.all() + permission_classes = [AllowAny] + serializer_class = BroadcastPriceSerializer + + def list(self, request, *args, **kwargs): + price = BroadcastPrice.objects.filter(trash=False).first() + allow = AllowRegisterCodeForStewardAllocation.objects.filter(trash=False).first() + steward_free_sale = AllowRegisterCodeForStewardFreeSaleBarInformation.objects.filter(trash=False).first() + kill_free_sale = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False).first() + + result = { + "active": price.active, + "kill_house_price": int(price.kill_house_price), + "steward_price": int(price.steward_price), + "guild_price": int(price.guild_price), + "kill_house_in_province_allocation_register_code": allow.active, + "steward_in_province_allocation_register_code": allow.active, + "kill_house_free_sale_register_code": kill_free_sale.active, + "steward_free_sale_register_code": steward_free_sale.active, + } + + return Response(result, status=status.HTTP_200_OK) + + +class OutProvinceSaleLimitationViewset(viewsets.ModelViewSet): + queryset = OutProvinceSaleLimitation.objects.all() + permission_classes = [AllowAny] + serializer_class = OutProvinceSaleLimitationSerializer + + def list(self, request, *args, **kwargs): + limitation = OutProvinceSaleLimitation.objects.filter(trash=False).first() + + serializer = self.serializer_class(limitation) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + limitation = BroadcastPrice.objects.filter(trash=False).first() + serializer = self.serializer_class(limitation) + serializer.update(instance=limitation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PosBroadcastPriceViewset(viewsets.ModelViewSet): + queryset = BroadcastPrice.objects.all() + permission_classes = [AllowAny] + serializer_class = BroadcastPriceSerializer + + def list(self, request, *args, **kwargs): + price = BroadcastPrice.objects.filter(trash=False).first() + type = request.GET.get('type') + if type: + if type in ('KillHouse_Steward', 'KillHouse_Guild'): + price_amount = price.kill_house_price + approved_price_status = False if price.active == False else True + + elif type in ( + 'KillHouse_KillHouse', 'Steward_Steward', 'Steward_KillHouse', 'Guild_KillHouse', 'Guild_Guild', + 'Guild_Steward'): + price_amount = price.guild_price + approved_price_status = False + + else: + price_amount = price.steward_price + approved_price_status = False if price.active == False else True + else: + price_amount = price.guild_price + approved_price_status = False + + result = { + "price": int(price_amount), + # "approved_price_status": approved_price_status, + "approved_price_status": False, + } + + return Response(result, status=status.HTTP_200_OK) + + +class ParentCompanyViewSet(viewsets.ModelViewSet): + queryset = ParentCompany.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ParentCompanySerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + parent_company = SystemUserProfile.objects.get(user=request.user, trash=False).parent_company_user.first() + + serializer = self.serializer_class(parent_company) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityGuildViewSet(viewsets.ModelViewSet): + queryset = CityGuild.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityGuildSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + city_guild = SystemUserProfile.objects.get(user=request.user, trash=False).city_guild_user.first() + + serializer = self.serializer_class(city_guild) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityGuildForSubSectorViewSet(viewsets.ModelViewSet): + queryset = CityGuild.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityGuildForSubSectorSerializer + + def list(self, request, *args, **kwargs): + city_guilds = CityGuild.objects.filter(trash=False) + serializer = self.serializer_class(city_guilds, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityGuildForSubSectorTransactionsViewSet(viewsets.ModelViewSet): + queryset = CityGuild.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityGuildForSubsectorTransactionSerializer + + def list(self, request, *args, **kwargs): + city_guilds = CityGuild.objects.filter(trash=False) + serializer = self.serializer_class(city_guilds, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CityGuildWageDashboardViewSet(viewsets.ModelViewSet): + queryset = CityGuild.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CityGuildSerializer + + def list(self, request, *args, **kwargs): + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) + other_province_kill_request_percent = percentages_wage_type.filter( + wage_type__en_name='province-kill-request', share_type__en_name='other').first().percent / 100 + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + allocations = StewardAllocation.objects.filter(trash=False, to_guilds__isnull=False, calculate_status=True, + temporary_trash=False, temporary_deleted=False, + receiver_state='accepted', date__date__gte=date1, + date__date__lte=date2) + transactions = PosMachineTransactions.objects.filter(paid=True, trash=False, date__date__gte=date1, + date__date__lte=date2) + sub_transactions = SubSectorTransactions.objects.filter(trash=False, city_guild__isnull=False, + date__date__gte=date1, date__date__lte=date2) + else: + allocations = StewardAllocation.objects.filter(trash=False, to_guilds__isnull=False, calculate_status=True, + temporary_trash=False, temporary_deleted=False, + receiver_state='accepted') + transactions = PosMachineTransactions.objects.filter(paid=True, trash=False) + sub_transactions = SubSectorTransactions.objects.filter(trash=False, city_guild__isnull=False) + allocations_weight = allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + transactions_weight = transactions.aggregate(total=Sum('weight'))[ + 'total'] or 0 + transactions_weight = transactions_weight / 1000 if transactions_weight > 0 else 0 + total_wage = transactions_weight * (province_live_wage_amount * other_province_kill_request_percent) + + sub_transactions_amount = sub_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + remain_wage = total_wage - sub_transactions_amount + + result = { + "buy_weight": allocations_weight, + "sell_weight": transactions_weight, + "total_wage": total_wage, + "guild_deposit": sub_transactions_amount, + "remain_wage": remain_wage + } + + return Response(result, status=status.HTTP_200_OK) + + +class TotalCitySubSectorWageDashboardViewSet(viewsets.ModelViewSet): + queryset = ProvinceOperator.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceOperatorSerializer + + def list(self, request, *args, **kwargs): + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + + poultries = Poultry.objects.filter(trash=False, city_operator__isnull=False).order_by('id') + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + has_wage=True, wage_pay=True, poultry__in=poultries, + temporary_deleted=False, send_date__date__gte=date1, + send_date__date__lte=date2) + 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, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + 'id') + 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 + ) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted', acceptor_date__date__gte=date1, + acceptor_date__date__lte=date2) + city_operator_deposit = SubSectorTransactions.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2) + else: + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + has_wage=True, wage_pay=True, poultry__in=poultries, + temporary_deleted=False) + + 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') + + 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 + ) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted') + + city_operator_deposit = SubSectorTransactions.objects.filter(trash=False) + hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by( + 'poultry') + + hatching_list1 = hatchings.filter( + pk__in=province_kill_requests.values_list('province_request__poultry_request__hatching', flat=True), + poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True) + hatching_list2 = hatchings.filter( + pk__in=kill_house_requests.values_list('province_request__poultry_request__hatching', flat=True), + poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True) + hatching_list3 = hatchings.filter(pk__in=poultry_requests.values_list('hatching', flat=True), + poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', + flat=True) + total_hatching_list = chain(hatching_list1, hatching_list2, hatching_list3) + hatchings = hatchings.filter(pk__in=total_hatching_list) + + total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + total_province_live_quantity += kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + + total_province_live_weight += \ + difference_requests.aggregate(total=Sum('weight'))['total'] or 0 + + total_province_carcasses_weight = total_province_live_weight * 0.75 + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + else: + date1 = None + date2 = None + + total_pure_province_carcasses_weight = total_province_carcasses_weight - get_difference_carcasses_weight( + kill_houses, date1, date2) + # return Response(total_pure_province_carcasses_weight) + internal_total_pure_province_carcasses_weight = ( + ( + total_pure_province_carcasses_weight / total_province_carcasses_weight) if total_province_carcasses_weight > 0 else 0) * total_province_carcasses_weight + external_total_pure_province_carcasses_weight = total_province_carcasses_weight - internal_total_pure_province_carcasses_weight + + total_pure_province_carcasses_price = internal_total_pure_province_carcasses_weight * province_live_wage_amount + total_out_selling_province_carcasses_price = external_total_pure_province_carcasses_weight * free_sell_carcesses_weight_amount + + hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_requests = poultry_requests.filter(hatching__id__in=hatching_list3) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + union_out_province_poultry_request_amount = poultry_requests.aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + 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 + + union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell', + share_type__en_name='union').first().percent / 100 + union_province_kill_request_wage = total_pure_province_carcasses_price * union_province_kill_request_percent + union_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * union_free_sell_carcasses_percent + + city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100 + city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100 + city_percent_out_sell_carcasses = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100 + + union_total_wage = union_province_kill_request_wage + union_out_province_poultry_request_amount + union_free_sell_carcasses_wage + hatching_killing_percent = (( + out_province_poultry_request_quantity + total_province_live_quantity) / hatching_quantity if hatching_quantity > 0 else 0) * 100 + + city_province_kill_request_wage = union_province_kill_request_wage * city_percent_province_kill_request + city_out_province_poultry_request = union_out_province_poultry_request_amount * city_percent_out_poultry_request + city_out_province_sell_carcasses = union_free_sell_carcasses_wage * city_percent_out_sell_carcasses + city_total_wage = city_province_kill_request_wage + city_out_province_poultry_request + city_out_province_sell_carcasses + + city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0 + city_total_remain_wage_amount = city_total_wage - city_deposit + + result = { + "wage_counting_type": wage_counting_type, + "poultries": len(poultries), + "hatchings": len(hatchings), + "hatchings_quantity": hatching_quantity, + "total_province_kill_requests_quantity": total_province_live_quantity, + "total_province_kill_requests_weight": total_province_live_weight, + "total_province_kill_requests_total_carcasses_weight": total_province_carcasses_weight, + "total_province_kill_requests_carcasses_weight": internal_total_pure_province_carcasses_weight, + "total_out_selling_province_carcasses_weight": external_total_pure_province_carcasses_weight, + "out_province_poultry_request_quantity": out_province_poultry_request_quantity, + "out_province_poultry_request_weight": out_province_poultry_request_weight, + "total_killed_quantity": out_province_poultry_request_quantity + total_province_live_quantity, + "hatching_killing_percent": hatching_killing_percent, + "out_province_poultry_request_amount": union_out_province_poultry_request_amount, + "total_pure_province_carcasses_price": union_province_kill_request_wage, + "union_total_out_selling_province_carcasses_price": union_free_sell_carcasses_wage, + "union_total_wage": union_total_wage, + "city_total_wage": city_total_wage, + "city_deposit": city_deposit, + "city_total_remain_wage_amount": city_total_remain_wage_amount, + } + + return Response(result, status=status.HTTP_200_OK) + + +# class TotalCitySubSectortransactionDashboardViewSet(viewsets.ModelViewSet): +# queryset = ProvinceOperator.objects.all() +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = ProvinceOperatorSerializer +# +# def list(self, request, *args, **kwargs): +# total_wage_type = WageType.objects.filter(trash=False) +# province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount +# city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter( +# percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100 +# city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter( +# percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100 +# city_percent_out_sell_carcasses = SubSectorPercentageOfWageType.objects.filter( +# percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100 +# +# 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 +# kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') +# poultries = Poultry.objects.filter(trash=False).order_by('id') +# hatchings = PoultryHatching.objects.filter(poultry__in=poultries, trash=False).order_by('poultry') +# +# poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), +# province_state__in=('pending', 'accepted'), out=True, +# out_province_request_cancel=False, temporary_trash=False, +# temporary_deleted=False, hatching__in=hatchings) +# +# union_out_province_poultry_request_amount = poultry_requests.aggregate(total=Sum('union_share'))[ +# 'total'] or 0 +# +# province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, +# archive_wage=False, +# state__in=('pending', 'accepted'), +# temporary_trash=False, temporary_deleted=False, +# province_request__poultry_request__hatching__in=hatchings) +# +# total_province_kill_requests_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ +# 'total'] or 0 +# total_province_live_weight = total_province_kill_requests_weight +# +# kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, +# archive_wage=False, +# calculate_status=True, +# trash=False) +# kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter( +# kill_house__in=kill_houses, +# archive_wage=False, +# calculate_status=True, +# trash=False) +# total_out_selling_province_carcasses_weight = \ +# kill_house_free_sale_bar_info.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 +# union_total_out_selling_province_carcasses_price = \ +# kill_house_free_sale_bar_info.aggregate(total=Sum('union_share'))['total'] or 0 +# +# total_province_carcasses_weight = total_province_live_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_pure_province_carcasses_price = total_pure_province_carcasses_weight * province_live_wage_amount +# union_province_kill_request_wage = int( +# total_pure_province_carcasses_price * union_province_kill_request_percent) +# union_total_wage = union_province_kill_request_wage + union_out_province_poultry_request_amount + union_total_out_selling_province_carcasses_price +# +# city_province_kill_request_wage = union_province_kill_request_wage * city_percent_province_kill_request +# city_out_province_poultry_request = union_out_province_poultry_request_amount * city_percent_out_poultry_request +# city_out_province_out_sell_carcasses_price = union_total_out_selling_province_carcasses_price * city_percent_out_sell_carcasses +# city_total_wage = city_province_kill_request_wage + city_out_province_poultry_request + city_out_province_out_sell_carcasses_price +# city_operator_deposit = SubSectorTransactions.objects.filter(trash=False) +# city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0 +# city_total_remain_wage_amount = city_total_wage - city_deposit +# +# result = { +# "wage_counting_type": wage_counting_type, +# "city_out_province_poultry_request": city_out_province_poultry_request, +# "city_province_kill_request_wage": city_province_kill_request_wage, +# "city_out_province_out_sell_carcasses_wage": city_out_province_out_sell_carcasses_price, +# "union_total_wage": union_total_wage, +# "city_total_wage": city_total_wage, +# "city_deposit": city_deposit, +# "city_total_remain_wage_amount": city_total_remain_wage_amount, +# } +# +# return Response(result, status=status.HTTP_200_OK) +class TotalCitySubSectortransactionDashboardViewSet(viewsets.ModelViewSet): + queryset = ProvinceOperator.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProvinceOperatorSerializer + + def list(self, request, *args, **kwargs): + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcesses_weight_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + 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') + 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 = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + total_province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + total_province_live_quantity += 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) + + # return Response(total_pure_province_carcasses_weight) + internal_total_pure_province_carcasses_weight = ( + total_pure_province_carcasses_weight / total_province_carcasses_weight) * total_province_carcasses_weight + external_total_pure_province_carcasses_weight = total_province_carcasses_weight - internal_total_pure_province_carcasses_weight + + total_pure_province_carcasses_price = internal_total_pure_province_carcasses_weight * province_live_wage_amount + total_out_selling_province_carcasses_price = external_total_pure_province_carcasses_weight * free_sell_carcesses_weight_amount + + poultries = Poultry.objects.filter(trash=False, city_operator__isnull=False).order_by('id') + hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by( + 'poultry') + + hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + has_wage=True, wage_pay=True, + temporary_deleted=False, hatching__in=hatchings) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + union_out_province_poultry_request_amount = poultry_requests.aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + 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 + + union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell', + share_type__en_name='union').first().percent / 100 + union_province_kill_request_wage = total_pure_province_carcasses_price * union_province_kill_request_percent + union_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * union_free_sell_carcasses_percent + + city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100 + city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100 + city_percent_out_sell_carcasses = SubSectorPercentageOfWageType.objects.filter( + percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100 + + union_total_wage = union_province_kill_request_wage + union_out_province_poultry_request_amount + union_free_sell_carcasses_wage + hatching_killing_percent = (( + out_province_poultry_request_quantity + total_province_live_quantity) / hatching_quantity) * 100 + + city_province_kill_request_wage = union_province_kill_request_wage * city_percent_province_kill_request + city_out_province_poultry_request = union_out_province_poultry_request_amount * city_percent_out_poultry_request + city_out_province_sell_carcasses = union_free_sell_carcasses_wage * city_percent_out_sell_carcasses + city_total_wage = city_province_kill_request_wage + city_out_province_poultry_request + city_out_province_sell_carcasses + city_operator_deposit = SubSectorTransactions.objects.filter(trash=False) + city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0 + city_total_remain_wage_amount = city_total_wage - city_deposit + + result = { + "wage_counting_type": wage_counting_type, + "city_out_province_poultry_request": city_out_province_poultry_request, + "city_province_kill_request_wage": city_province_kill_request_wage, + "city_out_province_out_sell_carcasses_wage": city_out_province_sell_carcasses, + "union_total_wage": union_total_wage, + "city_total_wage": city_total_wage, + "city_deposit": city_deposit, + "city_total_remain_wage_amount": city_total_remain_wage_amount, + } + + return Response(result, status=status.HTTP_200_OK) + + +class SubSectorTransactionsViewSet(viewsets.ModelViewSet): + queryset = SubSectorTransactions.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = SubSectorTransactionsSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = SubSectorTransactionsFilterSet + filterset_fields = [ + 'city_operator__user__first_name', + 'city_operator__user__last_name', + 'city_operator__user__fullname', + 'city_operator__user__mobile', + 'city_operator__user__city__name', + 'from_account', + 'to_account', + + ] + + def create(self, request, *args, **kwargs): + operator = None + vet = None + guild = None + role_type = request.data['role_type'] + if role_type == 'vet': + vet = Vet.objects.get(key=request.data['role_key'], trash=False) + + elif role_type == 'guild': + guild = CityGuild.objects.get(key=request.data['role_key'], trash=False) + else: + operator = CityOperator.objects.get(key=request.data['role_key'], trash=False) + request.data.pop('role_type') + request.data.pop('role_key') + image = request.data['image'] + request.data.pop('image') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + transaction = serializer.create(validated_data=request.data) + transaction.image = send_image_to_server(image) + if operator: + transaction.city_operator = operator + + elif guild: + transaction.city_guild = guild + + else: + transaction.vet = vet + + transaction.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + role_type = request.GET['type'] + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if role_type == 'city': + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + city_operator__isnull=False, + trash=False).order_by('-date') + elif role_type == 'vet': + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + vet__isnull=False, + trash=False).order_by('-date') + else: + operator_transactions = SubSectorTransactions.objects.filter(date__date__gte=date1, + date__date__lte=date2, + city_guild__isnull=False, + trash=False).order_by('-date') + + + else: + if role_type == 'city': + operator_transactions = SubSectorTransactions.objects.filter(city_operator__isnull=False, + trash=False).order_by('-date') + + elif role_type == 'vet': + operator_transactions = SubSectorTransactions.objects.filter(vet__isnull=False, trash=False).order_by( + '-date') + else: + operator_transactions = SubSectorTransactions.objects.filter(city_guild__isnull=False, + trash=False).order_by('-date') + + if 'search' in request.GET: + operator_transactions_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=operator_transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=operator_transactions) + operator_transactions_list = ps.filter() + operator_transactions = [] if len(operator_transactions_list) == 0 else operator_transactions_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(operator_transactions) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(operator_transactions, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + transaction = SubSectorTransactions.objects.get(key=request.data['transaction_key'], trash=False) + if 'image' in request.data.keys(): + if request.data['image'] != None or request.data['image'] != "": + transaction.image = send_image_to_server(request.data['image']) + transaction.save() + + request.data.pop('image') + request.data.pop('transaction_key') + serializer = self.serializer_class(transaction) + serializer.update(instance=transaction, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + transaction = SubSectorTransactions.objects.get(key=request.GET["transaction_key"], trash=False) + transaction.trash = True + transaction.save() + return Response({"result": "با موفقیت حذف شد."}, status=status.HTTP_200_OK) + + +class PosSegmentationViewSet(viewsets.ModelViewSet): + queryset = PosSegmentation.objects.all() + permission_classes = [AllowAny] + serializer_class = PosSegmentationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = PosSegmentationFilterSet + filterset_fields = [ + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'guild__guilds_name' + ] + + def create(self, request, *args, **kwargs): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device, trash=False) + guild = Guilds.objects.get(id=pos.guild.id, trash=False) + product = RolesProducts.objects.get(key=request.data['product_key'], trash=False) + request.data.pop('product_key') + if product.total_remain_weight < request.data['weight']: + return Response({"result": "موجودی انبار کمتر از وزن وارد شده است!"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + segmentation = serializer.create(validated_data=request.data) + segmentation.guild = guild + segmentation.product = product + segmentation.date = datetime.now() + segmentation.save() + guild_steward_product_segmentation(product) + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device, trash=False) + segmentations = PosSegmentation.objects.filter(guild=pos.guild, + date__date__gte=date1, + date__date__lte=date2, + trash=False).order_by('-date') + + if 'search' in request.GET and 'value' in request.GET: + segmentation_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=segmentations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=segmentations) + segmentation_list = ps.filter() + segmentations = [] if len(segmentation_list) == 0 else segmentation_list + if 'page' in request.GET: + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(segmentations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(segmentations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + now = datetime.now().date() + segmentation = PosSegmentation.objects.get(key=request.data['key']) + if now != segmentation.date.date(): + return Response({"result": "مهلت ویرایش به اتمام رسیده است !"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(segmentation) + serializer.update(instance=segmentation, validated_data=request.data) + guild_steward_product_segmentation(segmentation.product) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + now = datetime.now().date() + segmentation = PosSegmentation.objects.get(key=request.GET['key']) + if now != segmentation.date.date(): + return Response({"result": "مهلت حذف به اتمام رسیده است !"}, status=status.HTTP_403_FORBIDDEN) + product = segmentation.product + segmentation.trash = True + segmentation.save() + guild_steward_product_segmentation(product) + + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class NewPosSegmentationViewSet(viewsets.ModelViewSet): + queryset = PosSegmentation.objects.all() + permission_classes = [AllowAny] + serializer_class = PosSegmentationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = PosSegmentationFilterSet + filterset_fields = [ + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'guild__guilds_name' + ] + + def create(self, request, *args, **kwargs): + + pos = POSMachine.objects.get(pos_id=request.data['pos-id'], trash=False) + guild = None + kill_house = None + quota = None + product = RolesProducts.objects.get(key=request.data['product_key'], trash=False) + if pos.guild: + guild = product.guild + else: + kill_house = product.kill_house + quota = request.data['quota'] + to_guild = None + if 'guild_key' in request.data.keys(): + to_guild = Guilds.objects.get(key=request.data['guild_key'], trash=False) + request.data.pop('guild_key') + + request.data.pop('product_key') + if kill_house: + kill_house_total_input_warehouse_governmental_weight = kill_house.total_input_warehouse_governmental_weight + kill_house_total_input_warehouse_free_weight = kill_house.total_input_warehouse_free_weight + if request.data['sale_type'] == 'free': + quota = request.data['quota'] + if quota == 'governmental': + if not kill_house.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + if kill_house.total_input_warehouse_governmental_weight < ( + kill_house.total_selling_warehouse_governmental_weight + request.data['weight']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_input_warehouse_free_weight < ( + kill_house.total_selling_warehouse_free_weight + request.data['weight']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + if quota == 'governmental': + segmentation_sale_type = request.data['sale_type'] + if kill_house.governmental_selling_permission: + if segmentation_sale_type == 'free': + if not kill_house.free_sale_form_governmental_quota: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + if kill_house.total_commitment_segmentation_governmental_weight > 0: + if kill_house.total_segmentation_governmental_weight + request.data[ + 'weight'] > kill_house.total_commitment_segmentation_governmental_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if kill_house.free_selling_permission: + if kill_house.total_commitment_selling_in_province_free_weight > kill_house.total_selling_in_province_free_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if kill_house.total_commitment_segmentation_free_weight > 0: + if kill_house.total_segmentation_free_weight + request.data[ + 'weight'] > kill_house.total_commitment_segmentation_free_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if request.data['sale_type'] == 'free': + quota = request.data['quota'] + if quota == 'governmental': + if not guild.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + if guild.total_input_warehouse_governmental_weight < ( + guild.total_selling_warehouse_governmental_weight + request.data['weight']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if guild.total_input_warehouse_free_weight < ( + guild.total_selling_warehouse_free_weight + request.data['weight']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + if quota == 'governmental': + segmentation_sale_type = request.data['sale_type'] + if guild.governmental_selling_permission: + if segmentation_sale_type == 'free': + if not guild.free_sale_form_governmental_quota: + if guild.total_commitment_selling_in_province_governmental_weight > guild.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if guild.total_commitment_selling_in_province_governmental_weight > guild.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + if guild.total_commitment_segmentation_governmental_weight > 0: + if guild.total_segmentation_governmental_weight + request.data[ + 'weight'] > guild.total_commitment_segmentation_governmental_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if guild.free_selling_permission: + if guild.total_commitment_selling_in_province_free_weight > guild.total_selling_in_province_free_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if guild.total_commitment_segmentation_free_weight > 0: + if guild.total_segmentation_free_weight + request.data[ + 'weight'] > guild.total_commitment_segmentation_free_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if product.total_remain_weight < request.data['weight']: + return Response({"result": "موجودی انبار کمتر از وزن وارد شده است!"}, status=status.HTTP_403_FORBIDDEN) + + now_time = datetime.now().time() + + production_date = datetime.strptime(str(request.data['production_date']), '%Y-%m-%d').date() + production_date = datetime(year=production_date.year, month=production_date.month, day=production_date.day, + hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + request.data.pop('production_date') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + segmentation = serializer.create(validated_data=request.data) + if guild: + segmentation.guild = guild + else: + + segmentation.kill_house = kill_house + if to_guild: + segmentation.to_guild = to_guild + + segmentation.product = product + segmentation.date = datetime.now() + segmentation.production_date = production_date + segmentation.save() + guild_steward_product_segmentation(product) + + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False) + if role: + + if date1: + + if role == 'KillHouse': + segmentations = PosSegmentation.objects.filter(kill_house=pos.kill_house, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + segmentations = PosSegmentation.objects.filter(guild=pos.guild, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + if role == 'KillHouse': + segmentations = PosSegmentation.objects.filter(kill_house=pos.kill_house, + trash=False) + else: + segmentations = PosSegmentation.objects.filter(guild=pos.guild, + trash=False) + else: + segmentations = PosSegmentation.objects.filter(trash=False) + + if 'search' in request.GET and 'value' in request.GET: + segmentation_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=segmentations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=segmentations) + segmentation_list = ps.filter() + segmentations = [] if len(segmentation_list) == 0 else segmentation_list + if 'page' in request.GET: + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(segmentations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(segmentations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + now = datetime.now().date() + segmentation = PosSegmentation.objects.get(key=request.data['key']) + if now != segmentation.date.date(): + return Response({"result": "مهلت ویرایش به اتمام رسیده است !"}, status=status.HTTP_403_FORBIDDEN) + if segmentation.kill_house: + if segmentation.quota == 'governmental': + if segmentation.kill_house.total_input_warehouse_governmental_weight < ( + (segmentation.kill_house.total_selling_warehouse_governmental_weight - segmentation.weight) + + request.data[ + 'weight']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if segmentation.kill_house.total_input_warehouse_free_weight < ( + (segmentation.kill_house.total_selling_warehouse_free_weight - segmentation.weight) + + request.data[ + 'weight']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if segmentation.quota == 'governmental': + if segmentation.guild.total_input_warehouse_governmental_weight < ( + (segmentation.guild.total_selling_warehouse_governmental_weight - segmentation.weight) + + request.data[ + 'weight']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if segmentation.guild.total_input_warehouse_free_weight < ( + (segmentation.guild.total_selling_warehouse_free_weight - segmentation.weight) + request.data[ + 'weight']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(segmentation) + serializer.update(instance=segmentation, validated_data=request.data) + guild_steward_product_segmentation(segmentation.product) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + now = datetime.now().date() + segmentation = PosSegmentation.objects.get(key=request.GET['key']) + if now != segmentation.date.date(): + return Response({"result": "مهلت حذف به اتمام رسیده است !"}, status=status.HTTP_403_FORBIDDEN) + product = segmentation.product + segmentation.trash = True + segmentation.save() + # if segmentation.guild: + guild_steward_product_segmentation(product) + + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class AppSegmentationViewSet(viewsets.ModelViewSet): + queryset = PosSegmentation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = AppSegmentationSerializer + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = PosSegmentationFilterSet + filterset_fields = [ + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'guild__guilds_name', + 'to_guild__user__first_name', + 'to_guild__user__last_name', + 'to_guild__user__fullname', + 'to_guild__user__mobile', + 'to_guild__guilds_name' + ] + + def create(self, request, *args, **kwargs): + guild = None + kill_house = None + quota = None + dispenser = request.data.pop('dispenser',None) + representative = request.data.pop('representative',None) + product = RolesProducts.objects.get(key=request.data['product_key'], trash=False) + if product.guild: + guild = product.guild + else: + kill_house = product.kill_house + quota = request.data['quota'] + to_guild = None + if 'guild_key' in request.data.keys(): + to_guild = Guilds.objects.get(key=request.data['guild_key'], trash=False) + request.data.pop('guild_key') + + request.data.pop('product_key') + if kill_house: + kill_house_total_input_warehouse_governmental_weight = kill_house.total_input_warehouse_governmental_weight + kill_house_total_input_warehouse_free_weight = kill_house.total_input_warehouse_free_weight + if request.data['sale_type'] == 'free': + quota = request.data['quota'] + if quota == 'governmental': + if not kill_house.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + if kill_house.total_input_warehouse_governmental_weight < ( + kill_house.total_selling_warehouse_governmental_weight + request.data['weight']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_input_warehouse_free_weight < ( + kill_house.total_selling_warehouse_free_weight + request.data['weight']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + if quota == 'governmental': + segmentation_sale_type = request.data['sale_type'] + if kill_house.governmental_selling_permission: + if segmentation_sale_type == 'free': + if not kill_house.free_sale_form_governmental_quota: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + if kill_house.total_commitment_segmentation_governmental_weight > 0: + if kill_house.total_segmentation_governmental_weight + request.data[ + 'weight'] > kill_house.total_commitment_segmentation_governmental_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if kill_house.free_selling_permission: + if kill_house.total_commitment_selling_in_province_free_weight > kill_house.total_selling_in_province_free_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if kill_house.total_commitment_segmentation_free_weight > 0: + if kill_house.total_segmentation_free_weight + request.data[ + 'weight'] > kill_house.total_commitment_segmentation_free_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if request.data['sale_type'] == 'free': + quota = request.data['quota'] + if quota == 'governmental': + if not guild.free_sale_form_governmental_quota: + return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if quota == 'governmental': + if guild.total_input_warehouse_governmental_weight < ( + guild.total_selling_warehouse_governmental_weight + request.data['weight']): + return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if guild.total_input_warehouse_free_weight < ( + guild.total_selling_warehouse_free_weight + request.data['weight']): + return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + if quota == 'governmental': + segmentation_sale_type = request.data['sale_type'] + if guild.governmental_selling_permission: + if segmentation_sale_type == 'free': + if not guild.free_sale_form_governmental_quota: + if guild.total_commitment_selling_in_province_governmental_weight > guild.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if guild.total_commitment_selling_in_province_governmental_weight > guild.total_selling_in_province_governmental_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + if guild.total_commitment_segmentation_governmental_weight > 0: + if guild.total_segmentation_governmental_weight + request.data[ + 'weight'] > guild.total_commitment_segmentation_governmental_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if guild.free_selling_permission: + if guild.total_commitment_selling_in_province_free_weight > guild.total_selling_in_province_free_weight: + return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN) + + if guild.total_commitment_segmentation_free_weight > 0: + if guild.total_segmentation_free_weight + request.data[ + 'weight'] > guild.total_commitment_segmentation_free_weight: + return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"}, + status=status.HTTP_403_FORBIDDEN) + + if product.total_remain_weight < request.data['weight']: + return Response({"result": "موجودی انبار کمتر از وزن وارد شده است!"}, status=status.HTTP_403_FORBIDDEN) + + now_time = datetime.now().time() + + production_date = datetime.strptime(str(request.data['production_date']), '%Y-%m-%d').date() + production_date = datetime(year=production_date.year, month=production_date.month, day=production_date.day, + hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + request.data.pop('production_date') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + segmentation = serializer.create(validated_data=request.data) + if guild: + segmentation.guild = guild + else: + + segmentation.kill_house = kill_house + if to_guild: + segmentation.to_guild = to_guild + + segmentation.product = product + segmentation.date = datetime.now() + segmentation.production_date = production_date + segmentation.dispenser = dispenser if dispenser else None + segmentation.representative = representative if representative else None + segmentation.save() + guild_steward_product_segmentation(product) + + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + steward_key = request.GET.get('steward_key') + user = SystemUserProfile.objects.get(user=request.user) + if role: + if steward_key: + if steward_key == 'all': + if role in ['CityJahad']: + segmentations = PosSegmentation.objects.filter(guild__isnull=False, guild__user__city=user.city, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + segmentations = PosSegmentation.objects.filter(guild__isnull=False, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + guild = Guilds.objects.get(key=steward_key, trash=False) + if role in ['CityJahad']: + segmentations = PosSegmentation.objects.filter(guild=guild, guild__user__city=user.city, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + + segmentations = PosSegmentation.objects.filter(guild=guild, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first() + segmentations = PosSegmentation.objects.filter(kill_house=kill_house, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + guild = Guilds.objects.get(user=user, active=True, trash=False) + segmentations = PosSegmentation.objects.filter(guild=guild, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + else: + guild = Guilds.objects.get(user=user, active=True, trash=False) + segmentations = PosSegmentation.objects.filter(guild=guild, + date__date__gte=date1, + date__date__lte=date2, + trash=False) + + if 'search' in request.GET and 'value' in request.GET: + segmentation_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=segmentations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=segmentations) + segmentation_list = ps.filter() + segmentations = [] if len(segmentation_list) == 0 else segmentation_list + if 'page' in request.GET: + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(segmentations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(segmentations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + now = datetime.now().date() + segmentation = PosSegmentation.objects.get(key=request.data['key']) + if now != segmentation.date.date(): + return Response({"result": "مهلت ویرایش به اتمام رسیده است !"}, status=status.HTTP_403_FORBIDDEN) + if segmentation.kill_house: + if segmentation.quota == 'governmental': + if segmentation.kill_house.total_input_warehouse_governmental_weight < ( + (segmentation.kill_house.total_selling_warehouse_governmental_weight - segmentation.weight) + + request.data[ + 'weight']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if segmentation.kill_house.total_input_warehouse_free_weight < ( + (segmentation.kill_house.total_selling_warehouse_free_weight - segmentation.weight) + + request.data[ + 'weight']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + + else: + if segmentation.quota == 'governmental': + if segmentation.guild.total_input_warehouse_governmental_weight < ( + (segmentation.guild.total_selling_warehouse_governmental_weight - segmentation.weight) + + request.data[ + 'weight']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if segmentation.guild.total_input_warehouse_free_weight < ( + (segmentation.guild.total_selling_warehouse_free_weight - segmentation.weight) + request.data[ + 'weight']): + return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"}, + status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(segmentation) + serializer.update(instance=segmentation, validated_data=request.data) + guild_steward_product_segmentation(segmentation.product) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + now = datetime.now().date() + segmentation = PosSegmentation.objects.get(key=request.GET['key']) + if now != segmentation.date.date(): + return Response({"result": "مهلت حذف به اتمام رسیده است !"}, status=status.HTTP_403_FORBIDDEN) + product = segmentation.product + segmentation.trash = True + segmentation.save() + # if segmentation.guild: + guild_steward_product_segmentation(product) + + return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class SegmentationDashboardViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + filterset_class = PosSegmentationFilterSet + filterset_fields = [ + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'guild__guilds_name', + 'to_guild__user__first_name', + 'to_guild__user__last_name', + 'to_guild__user__fullname', + 'to_guild__user__mobile', + 'to_guild__guilds_name' + ] + + def get(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + steward_key = request.GET.get('steward_key') + user = SystemUserProfile.objects.get(user=request.user) + if role: + if role == 'KillHouse': + filters = {'trash': False, 'kill_house__kill_house_operator__user': user} + else: + if steward_key: + if steward_key == 'all': + filters = {'trash': False, 'guild__isnull': False} + else: + filters = {'trash': False, 'guild__key': steward_key} + + else: + filters = {'trash': False, 'guild__user': user} + + + else: + filters = {'trash': False, 'guild__user': user} + if date1: + filters['date__date__gte'] = date1 + filters['date__date__lte'] = date2 + segmentations = PosSegmentation.objects.filter(**filters) + if 'search' in request.GET and 'value' in request.GET: + segmentation_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=segmentations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=segmentations) + segmentation_list = ps.filter() + segmentations = [] if len(segmentation_list) == 0 else segmentation_list + + segmentations_aggregates = segmentations.aggregate( + total_count=Count('id'), + total_self_count=Count('id', filter=Q(to_guild__isnull=True)), + total_other_count=Count('id', filter=Q(to_guild__isnull=False)), + total_weight=Sum('weight'), + total_self_weight=Sum('weight', filter=Q(to_guild__isnull=True)), + total_other_weight=Sum('weight', filter=Q(to_guild__isnull=False)), + + ) + + result = { + "total_count": segmentations_aggregates['total_count'] or 0, + "total_weight": segmentations_aggregates['total_weight'] or 0, + "total_self_count": segmentations_aggregates['total_self_count'] or 0, + "total_self_weight": segmentations_aggregates['total_self_weight'] or 0, + "total_other_count": segmentations_aggregates['total_other_count'] or 0, + "total_other_weight": segmentations_aggregates['total_other_weight'] or 0 + + } + return Response(result, status=status.HTTP_200_OK) + + +class GuildsForPosMachineTransactionsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + serializer_class = GuildsPosMachineForTransactionsNewSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = GuildsForPostationFilterSet + filterset_fields = [ + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'guild__guilds_name' + ] + + # def get_filtered_guilds(self, request): + # if 'date1' in request.GET and 'date2' in request.GET: + # date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + # date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + # + # guilds = Guilds.objects.filter( + # id__in=PosMachineTransactions.objects.filter( + # trash=False, + # date__date__gte=date1, + # date__date__lte=date2, + # pos__guild__isnull=False, + # paid=True + # ).values_list('pos__guild__id', flat=True).distinct() + # ).annotate( + # transaction_count=Count( + # 'guild_pos__roles_products_pos_transactions', + # filter=Q(guild_pos__roles_products_pos_transactions__trash=False) & + # Q(guild_pos__roles_products_pos_transactions__paid=True) + # ) + # ).order_by('-transaction_count') + # + # else: + # guilds = Guilds.objects.annotate( + # transaction_count=Count( + # 'guild_pos__roles_products_pos_transactions', + # filter=Q(guild_pos__roles_products_pos_transactions__trash=False) & + # Q(guild_pos__roles_products_pos_transactions__paid=True) + # ) + # ).order_by('-transaction_count') + # + # return guilds + + def get_filtered_guilds(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + + if date1 and date2: + date1 = datetime.strptime(date1, '%Y-%m-%d').date() + date2 = datetime.strptime(date2, '%Y-%m-%d').date() + + guilds = Guilds.objects.filter( + Q( + id__in=PosMachineTransactions.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + pos__guild__isnull=False, + paid=True + ).values_list('pos__guild__id', flat=True) + ) | + Q( + id__in=StewardAllocation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + to_guilds__isnull=False, + to_cold_house__isnull=True, + temporary_trash=False, + trash=False, + calculate_status=True + ).values_list('to_guilds__id', flat=True) + ) + ).annotate( + transaction_count=Count( + 'guild_pos__roles_products_pos_transactions', + filter=Q( + guild_pos__roles_products_pos_transactions__trash=False, + guild_pos__roles_products_pos_transactions__paid=True, + guild_pos__roles_products_pos_transactions__date__date__gte=date1, + guild_pos__roles_products_pos_transactions__date__date__lte=date2 + ), + distinct=True + ) + ).order_by('-transaction_count') + + else: + guilds = Guilds.objects.filter( + Q( + id__in=PosMachineTransactions.objects.filter( + trash=False, + paid=True, + pos__guild__isnull=False + ).values_list('pos__guild__id', flat=True) + ) | + Q( + id__in=StewardAllocation.objects.filter( + to_guilds__isnull=False, + to_cold_house__isnull=True, + temporary_trash=False, + trash=False, + calculate_status=True + ).values_list('to_guilds__id', flat=True) + ) + ).annotate( + transaction_count=Count( + 'guild_pos__roles_products_pos_transactions', + filter=Q( + guild_pos__roles_products_pos_transactions__trash=False, + guild_pos__roles_products_pos_transactions__paid=True + ), + distinct=True + ) + ).order_by('-transaction_count') + + return guilds + + def apply_search_filter(self, request, guilds): + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + guilds = guilds.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + return guilds + + def list(self, request, *args, **kwargs): + guilds = self.get_filtered_guilds(request) + guilds = self.apply_search_filter(request, guilds) + + serializer = self.serializer_class(guilds, many=True, context={'request': request}) + data = serializer.data + + data = sorted(data, key=lambda x: x['transaction']['total_carcasses_weight'], reverse=True) + + if 'page' in request.GET: + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(data) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(data) + + return Response(data, status=status.HTTP_200_OK) + + +# class GuildsForPosMachineTransactionsViewSet(viewsets.ModelViewSet): +# queryset = Guilds.objects.all() +# serializer_class = GuildsPosMachineForTransactionsNewSerializer +# permission_classes = [TokenHasReadWriteScope] +# filter_backends = [DjangoFilterBackend] +# pagination_class = CustomPagination +# filterset_class = GuildsForPostationFilterSet +# filterset_fields = [ +# 'guild__user__first_name', +# 'guild__user__last_name', +# 'guild__user__fullname', +# 'guild__user__mobile', +# 'guild__guilds_name' +# ] +# +# def _get_date_range(self, request): +# d1 = request.GET.get('date1') +# d2 = request.GET.get('date2') +# if d1 and d2: +# try: +# date1 = datetime.strptime(d1, '%Y-%m-%d').date() +# date2 = datetime.strptime(d2, '%Y-%m-%d').date() +# return date1, date2 +# except ValueError: +# return None, None +# return None, None +# +# def get_filtered_guild_ids(self, request): +# date1, date2 = self._get_date_range(request) +# +# if date1 and date2: +# pos_qs = PosMachineTransactions.objects.filter( +# trash=False, +# date__date__gte=date1, +# date__date__lte=date2, +# pos__guild__isnull=False, +# paid=True +# ).values_list('pos__guild__id', flat=True) +# alloc_qs = StewardAllocation.objects.filter( +# date__date__gte=date1, +# date__date__lte=date2, +# to_guilds__isnull=False, +# to_cold_house__isnull=True, +# temporary_trash=False, +# trash=False, +# receiver_state='accepted', +# calculate_status=True +# ).values_list('to_guilds__id', flat=True) +# else: +# pos_qs = PosMachineTransactions.objects.filter( +# trash=False, paid=True, pos__guild__isnull=False +# ).values_list('pos__guild__id', flat=True) +# alloc_qs = StewardAllocation.objects.filter( +# to_guilds__isnull=False, +# to_cold_house__isnull=True, +# temporary_trash=False, +# trash=False, +# receiver_state='accepted', +# calculate_status=True +# ).values_list('to_guilds__id', flat=True) +# +# guild_ids_from_related = set(pos_qs) | set(alloc_qs) +# guilds_base = Guilds.objects.filter(id__in=guild_ids_from_related).order_by('id') +# +# if request.GET.get('search') == 'filter' and request.GET.get('value') not in ["", "undefined", None]: +# value = request.GET.get('value') +# for f in self.filterset_fields: +# query = QueryDict(f'{f}__contains={value}') +# qs = self.filterset_class(data=query, queryset=guilds_base).qs +# if qs.exists(): +# guilds_base = qs +# break +# +# return list(guilds_base.values_list('id', flat=True)), guilds_base +# +# def list(self, request, *args, **kwargs): +# guild_ids, guilds_qs_for_pagination = self.get_filtered_guild_ids(request) +# guild_id_set = set(guild_ids) +# +# date1, date2 = self._get_date_range(request) +# +# pos_filter = Q(trash=False, paid=True, pos__guild__id__in=guild_ids, pos__guild__isnull=False) +# if date1 and date2: +# pos_filter &= Q(date__date__gte=date1, date__date__lte=date2) +# pos_values = PosMachineTransactions.objects.filter(pos_filter).values( +# 'pos__guild__id', 'price', 'weight' +# ) +# +# seg_filter = Q(trash=False, guild__id__in=guild_ids) +# if date1 and date2: +# seg_filter &= Q(date__date__gte=date1, date__date__lte=date2) +# seg_values = PosSegmentation.objects.filter(seg_filter).values('guild__id', 'weight') +# +# alloc_filter = Q(trash=False, calculate_status=True, to_guilds__isnull=False, +# receiver_state='accepted', to_cold_house__isnull=True, temporary_trash=False) +# if date1 and date2: +# alloc_filter &= Q(date__date__gte=date1, date__date__lte=date2) +# alloc_values = StewardAllocation.objects.filter(alloc_filter).values('to_guilds__id', 'real_weight_of_carcasses') +# +# product_values = RolesProducts.objects.filter(trash=False, guild__id__in=guild_ids).values( +# 'guild__id', 'name', 'total_remain_weight' +# ).order_by('guild__id') +# +# agg = {gid: { +# "len_transaction": 0, +# "total_price": 0, +# "pos_weight": 0, +# "pos_segmentation_weight": 0, +# "allocation_carcass_weight": 0, +# "product": None, +# "total_remain_weight": 0, +# } for gid in guild_ids} +# +# for p in pos_values: +# gid = p.get('pos__guild__id') +# if gid in guild_id_set: +# agg_g = agg[gid] +# agg_g['len_transaction'] += 1 +# agg_g['total_price'] += p.get('price') or 0 +# agg_g['pos_weight'] += p.get('weight') or 0 +# +# for s in seg_values: +# gid = s.get('guild__id') +# if gid in guild_id_set: +# agg[gid]['pos_segmentation_weight'] += s.get('weight') or 0 +# +# for a in alloc_values: +# gid = a.get('to_guilds__id') +# if gid in guild_id_set: +# agg[gid]['allocation_carcass_weight'] += a.get('real_weight_of_carcasses') or 0 +# +# seen_products = set() +# for pr in product_values: +# gid = pr.get('guild__id') +# if gid in guild_id_set and gid not in seen_products: +# agg[gid]['product'] = pr.get('name') or '-' +# agg[gid]['total_remain_weight'] = pr.get('total_remain_weight') or 0 +# seen_products.add(gid) +# +# precomputed = {} +# for gid, v in agg.items(): +# pos_weight_kg = round((v['pos_weight'] or 0) / 1000, 1) +# seg_weight_kg = round((v['pos_segmentation_weight'] or 0) / 1000, 1) +# total_carcasses = v['allocation_carcass_weight'] or 0 +# +# precomputed[gid] = { +# "len_transaction": v['len_transaction'], +# "total_price": v['total_price'], +# "real_allocated_weight": round(pos_weight_kg + seg_weight_kg, 1), +# "product": v['product'] or '-', +# "total_carcasses_weight": total_carcasses, +# "total_remain_weight": v['total_remain_weight'] or 0, +# } +# +# page = self.paginate_queryset(guilds_qs_for_pagination) +# to_serialize = page if page is not None else guilds_qs_for_pagination +# context = {'request': request, 'precomputed_transactions': precomputed} +# serializer = self.get_serializer(to_serialize, many=True, context=context) +# +# if page is not None: +# return self.get_paginated_response(serializer.data) +# return Response(serializer.data, status=status.HTTP_200_OK) + + +class PosMachineTransactionsForInsPectionViewSet(viewsets.ModelViewSet): + queryset = PosMachineTransactions.objects.all() + serializer_class = PosMachineTransactionsForInspectionSerializer + permission_classes = [AllowAny] + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = PosMachineTransactionsFilterSet + filterset_fields = [ + 'pos__guild__user__first_name', + 'pos__guild__user__last_name', + 'pos__guild__user__fullname', + 'pos__guild__user__mobile', + 'pos__guild__guilds_name' + ] + + def list(self, request, *args, **kwargs): + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + transactions = PosMachineTransactions.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2, pos__key=request.GET['pos_key'], + paid=True) + else: + transactions = PosMachineTransactions.objects.filter(trash=False, pos__key=request.GET['pos_key'], + paid=True) + + if 'search' in request.GET and 'value' in request.GET: + transactions_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + if 'page' in request.GET: + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + ser_data = self.serializer_class(transactions, many=True).data + return Response(ser_data, status=status.HTTP_200_OK) + + +class DetailsOfGuildsForPosMachineTransactionsViewSet(viewsets.ModelViewSet): + queryset = PosMachineTransactions.objects.all() + serializer_class = PosMachineTransactionsForInspectionSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = PosMachineTransactionsFilterSet + filterset_fields = [ + 'pos__guild__user__first_name', + 'pos__guild__user__last_name', + 'pos__guild__user__fullname', + 'pos__guild__user__mobile', + 'pos__guild__guilds_name' + ] + + def list(self, request, *args, **kwargs): + guild = Guilds.objects.get(key=request.GET['key']) + if 'date1' in request.GET: + date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + transactions = PosMachineTransactions.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2, pos__guild=guild, + paid=True).order_by('-date') + else: + transactions = PosMachineTransactions.objects.filter(trash=False, pos__guild=guild, + paid=True).order_by('-date') + + if 'search' in request.GET and 'value' in request.GET: + transactions_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=transactions + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=transactions) + transactions_list = ps.filter() + transactions = [] if len(transactions_list) == 0 else transactions_list + if 'page' in request.GET: + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(transactions) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + ser_data = self.serializer_class(transactions, many=True).data + return Response(ser_data, status=status.HTTP_200_OK) + + +class DashboardOfGuildsForPosMachineTransactionsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + serializer_class = GuildsPosMachineForTransactionsSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + pagination_class = CustomPagination + filterset_class = GuildsForPostationFilterSet + filterset_fields = [ + 'guild__user__first_name', + 'guild__user__last_name', + 'guild__user__fullname', + 'guild__user__mobile', + 'guild__guilds_name' + ] + + def get_filtered_guilds(self, request): + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + guilds = Guilds.objects.filter( + id__in=PosMachineTransactions.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + pos__guild__isnull=False, + paid=True + ).values_list('pos__guild__id', flat=True).distinct() + ) + else: + guilds = Guilds.objects.filter( + trash=False + ) + + return guilds + + def apply_search_filter(self, request, guilds): + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + guilds = guilds.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + return guilds + + def list(self, request, *args, **kwargs): + guilds = self.get_filtered_guilds(request) + guilds = self.apply_search_filter(request, guilds) + pos = PosMachineTransactions.objects.filter(trash=False, pos__guild__in=guilds, paid=True) + total_price = pos.aggregate(total=Sum('price'))[ + 'total'] or 0 + + result = { + 'lenGuild': len(guilds), + "totalPrice": total_price, + "lenPosTransaction": len(pos), + } + + return Response(result, status=status.HTTP_200_OK) + + +class CooperativeWarehouseDashboardViewSet(viewsets.ModelViewSet): + queryset = Cooperative.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CooperativeForAllocationsReportSerializer + filterset_class = CooperativeFilterSet + pagination_class = CustomPagination + + def list(self, request, *args, **kwargs): + cooperatives = Cooperative.objects.filter(trash=False).order_by('id') + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + cooperatives = cooperatives.filter( + build_query(self.filterset_class.Meta.fields, search) + ) + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + page = self.paginate_queryset(cooperatives) + if page is not None: + serializer = self.serializer_class(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(cooperatives, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class DashboardForCooperativeWarehouseViewSet(viewsets.ModelViewSet): + queryset = Cooperative.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CooperativeForAllocationsReportSerializer + filterset_class = CooperativeFilterSet + pagination_class = CustomPagination + + def list(self, request, *args, **kwargs): + cooperatives = Cooperative.objects.filter(trash=False).order_by('id') + value = request.GET.get('value') + search = request.GET.get('search') + products = { + "bran": "سبوس", + "barley": "جو", + "soy": "سویا", + "corn": "ذرت", + "sheep_concentrate": "کنسانتره گوسفندی", + "high_cow_concentrate": "کنسانتره گاو شیری پرتولید", + "medium_cow_concentrate": "کنسانتره گاو شیری متوسط", + "fattening_calf_concentrate": "کنسانتره گوساله پرواری", + } + name = products[request.GET.get('name')] + if value and search == 'filter': + if search != 'undefined' and search.strip(): + cooperatives = cooperatives.filter( + build_query(self.filterset_class.Meta.fields, search) + ) + cooperative_roles = LiveStockRolseProduct.objects.filter(cooperative__in=cooperatives, + parent_product__name=name) + product_transactions = ProductsTransactions.objects.filter(live_stack_products__in=cooperative_roles, + transaction__paid=True) + transactions = PosMachineTransactions.objects.filter( + pk__in=product_transactions.values_list('transaction', flat=True), trash=False) + transactions_amount = product_transactions.aggregate( + total=Sum('total_price') + )['total'] or 0 + + total_transactions_weight = product_transactions.aggregate( + total=Sum('cur_weight') + )['total'] or 0 + total_weight = cooperative_roles.aggregate( + total=Sum('total_weight') + )['total'] or 0 + total_receipt_weight = cooperative_roles.aggregate( + total=Sum('total_receipt_weight') + )['total'] or 0 + total_weight = cooperative_roles.aggregate( + total=Sum('total_weight') + )['total'] or 0 + total_remain_weight = cooperative_roles.aggregate( + total=Sum('total_remain_weight') + )['total'] or 0 + total_allocated_weight = cooperative_roles.aggregate( + total=Sum('total_allocated_weight') + )['total'] or 0 + result_dict = { + "totalTransactionsPrice": transactions_amount, + "totalTransactionsWeight": total_transactions_weight, + "transactions": len(transactions), + "totalWeight": total_weight, + "totalReceiptWeight": total_receipt_weight, + "totalAllocatedWeight": total_allocated_weight, + "totalRemainWeight": total_remain_weight, + } + return Response(result_dict, status=status.HTTP_200_OK) + + +class PriceConfirmationViewset(viewsets.ModelViewSet): + queryset = PriceConfirmation.objects.all() + permission_classes = [AllowAny] + serializer_class = PriceConfirmationSerializer + + def list(self, request, *args, **kwargs): + price_confirmation = PriceConfirmation.objects.filter(trash=False).first() + + serializer = self.serializer_class(price_confirmation) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + price_confirmation = PriceConfirmation.objects.filter(trash=False).first() + serializer = self.serializer_class(price_confirmation) + serializer.update(instance=price_confirmation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CompanyBeneficiaryAccountViewset(viewsets.ModelViewSet): + queryset = CompanyBeneficiaryAccount.objects.all() + permission_classes = [AllowAny] + serializer_class = CompanyBeneficiaryAccountSerializer + + def create(self, request, *args, **kwargs): + # accounts = CompanyBeneficiaryAccount.objects.filter(trash=False) + # percents = accounts.aggregate(total=Sum('percent'))['total'] or 0 + # if request.data['percent'] + percents > 100: + # return Response({"result": " مجموع درصد ها نباید از 100 بیشتر شود !"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + account = serializer.create(validated_data=request.data) + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + accounts = CompanyBeneficiaryAccount.objects.filter(trash=False).order_by('id') + serializer = self.serializer_class(accounts, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + account = CompanyBeneficiaryAccount.objects.get(key=request.data['account_key']) + request.data.pop('account_key') + if 'percent' in request.data: + percent = request.data['percent'] + accounts = CompanyBeneficiaryAccount.objects.filter(trash=False).exclude(id=account.id) + percents = accounts.aggregate(total=Sum('percent'))['total'] or 0 + # if percent + percents > 100: + # return Response({"result": " مجموع درصد ها نباید از 100 بیشتر شود !"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(account) + serializer.update(instance=account, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + account = CompanyBeneficiaryAccount.objects.get(key=request.GET['account_key']) + account.trash = True + account.save() + return Response({"result": " با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +from django.db.models.expressions import RawSQL, Subquery + +from django.db.models.fields import IntegerField, BooleanField, TextField + + +def filter_json_text_field(*args, **kwargs): + queryset = PosMachineTransactions.objects.filter( + ~Q(additional=''), + additional__isnull=False, + additional__regex=r'^\s*{' + ) + + for i in range(0, len(args), 2): + if i + 1 >= len(args): + break + + key = args[i] + value = args[i + 1] + + if isinstance(value, bool): + field_type = BooleanField() + elif isinstance(value, int): + field_type = IntegerField() + else: + field_type = TextField() + + annotation_name = f'json_{key}' + queryset = queryset.annotate(**{ + annotation_name: RawSQL( + """ + jsonb_extract_path_text(additional::jsonb, %s) + """, + [key] + ) + }).annotate( + **{f'cast_{key}': Cast(F(annotation_name), field_type)} + ).filter(**{f'cast_{key}': value}) + + return queryset.filter(**kwargs) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_T(request): + results = filter_json_text_field( + 'cur_heavy', 2, + 'isTaavoni', True, + 'ownerNatcode', '4060603546' + ) + + return Response(results.count()) + + +class ReportPosDeviceSessionViewSet(viewsets.ModelViewSet): + queryset = POSDeviceSession.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = POSDeviceSessionForCompanySerializer + pagination_class = CustomPagination + filterset_class = POSDeviceSessionForCompanyFilterSet + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.filter(trash=False, user=request.user).first() + company = request.GET.get('company') + role_check = request.GET['role'] + filters = {"trash": False} + if role_check in ('AdminX', 'SuperAdmin', 'Jahad', 'GuildRoom'): + if company and company is not None: + filters['key'] = request.GET['company'] + + else: + filters['user'] = user + pos_company = PosCompany.objects.filter(**filters) + + pos = POSMachine.objects.filter(pos_company__in=pos_company, trash=False).annotate( + session_count=Count('pos_device_session', filter=Q(pos_device_session__trash=False)) + ).filter(session_count__gt=0) + pos_sessions = POSDeviceSession.objects.filter(pos__in=pos, trash=False) + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + pos_sessions = pos_sessions.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + page = self.paginate_queryset(pos_sessions) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = POSDeviceSessionForCompanySerializer(pos_sessions, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ProteinGuildViewSet(viewsets.ModelViewSet): + queryset = ProteinGuild.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ProteinGuildSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + guild = user.protein_guild_user.all() + serializer = self.serializer_class(guild[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def get_all_pos_company(request): + pos_company = PosCompany.objects.filter(trash=False).order_by('id') + ser_data = PosCompanySerializer(pos_company, many=True) + return Response(ser_data.data, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def get_all_pos_version(request): + pos_version = PosDeviceVersion.objects.filter(trash=False).order_by('-code').values_list('code', + flat=True).distinct() + pos_company = PosCompany.objects.all().order_by('en_name') + ser_data = PosCompanyForPosVersionSerializer(pos_company, many=True) + result_dict = { + 'pos_version': pos_version, + 'company': ser_data.data + } + return Response(result_dict, 200) + + +class GetOnePosVersionViewSet(viewsets.ModelViewSet): + queryset = PosDeviceVersion.objects.all() + serializer_class = PosDeviceVersionForOneCompanySerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + pos_version = PosDeviceVersion.objects.filter(trash=False, code=int(request.GET['code'])).order_by( + 'company__en_name') + ser_data = self.serializer_class(pos_version, many=True) + + return Response(ser_data.data, 200) + + def update(self, request, *args, **kwargs): + key = request.data.pop('key') + query = self.queryset.get(key=key) + serializer = self.serializer_class(query) + serializer.update(instance=query, validated_data=request.data) + return Response(serializer.data, 200) + + def create(self, request, *args, **kwargs): + company_id = request.data.pop('id', None) + if company_id: + company = PosCompany.objects.get(id=int(company_id)) + + else: + company = PosCompany.objects.filter(trash=False, en_name='Unknown').first() + + if self.queryset.filter(trash=False, company=company, code=int(request.data['code'])).exists(): + return Response({"result": f'برای {company.name} نسخه {request.data["code"]} قبلا ثبت شده است.'}) # noqa + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + pos_device_version = serializer.create(validated_data=request.data) + pos_device_version.company = company + pos_device_version.save() + return Response({"result": f"با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + +class CommonlyUsedViewSet(viewsets.ModelViewSet): + queryset = CommonlyUsed.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = CommonlyUsedSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = CommonlyUsedFilterSet + filterset_fields = [ + 'kill_house__name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'guild__guilds_name', + 'guild__user__last_name', + 'guild__user__first_name', + 'guild__user__fullname', + 'guild__user__mobile', + + ] + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.data.pop('role') + guilds = Guilds.objects.filter(key__in=request.data.pop('guild_key_list'), trash=False) + + serializer = self.serializer_class(data=request.data) + if not serializer.is_valid(): + return Response(serializer.errors) + + validated_data = serializer.validated_data + if role == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + + commonly_used_instances = [ + CommonlyUsed( + **validated_data, + kill_house=kill_house, + guild=guild + ) + for guild in guilds + ] + + else: + steward = Guilds.objects.get(user=user, steward=True, trash=False) + + commonly_used_instances = [ + CommonlyUsed( + **validated_data, + steward=steward, + guild=guild + ) + for guild in guilds + ] + + CommonlyUsed.objects.bulk_create(commonly_used_instances) + + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(trash=False, user=request.user) + role = request.GET.get('role') + today = datetime.now().date() + allocations = None + commonly_used = None + + if role == 'KillHouse': + kill_house = KillHouse.objects.filter( + kill_house_operator__user=user, trash=False + ).first() + + allocations = StewardAllocation.objects.filter( + Q(to_steward__isnull=False) | Q(to_guilds__isnull=False), + kill_house=kill_house, + date__date=today + ) + + filter_args = {'kill_house': kill_house, 'trash': False} + + else: + steward = Guilds.objects.get( + user=user, steward=True, trash=False + ) + + allocations = StewardAllocation.objects.filter( + Q(to_steward__isnull=False) | Q(to_guilds__isnull=False), + steward=steward, + date__date=today + ) + + filter_args = {'steward': steward, 'trash': False} + + excluded_guild_ids = allocations.filter(to_guilds__isnull=False).values_list('to_guilds', flat=True) + excluded_steward_ids = allocations.filter(to_steward__isnull=False).values_list('to_steward', flat=True) + + commonly_used = CommonlyUsed.objects.filter(**filter_args).exclude( + Q(guild__in=excluded_guild_ids) | Q(guild__in=excluded_steward_ids) + ) + + if 'search' in request.GET: + commonly_used_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=commonly_used + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=commonly_used) + commonly_used_list = ps.filter() + commonly_used = [] if len(commonly_used_list) == 0 else commonly_used_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(commonly_used) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(commonly_used, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + commonly_used = CommonlyUsed.objects.get(key=request.GET["commonly_used_key"], trash=False) + commonly_used.trash = True + commonly_used.save() + return Response({"result": "با موفقیت حذف شد."}, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def get_all_guilds(request): + steward = Guilds.objects.filter(trash=False, steward=True).select_related('user').only('key', + 'guilds_name', + 'user__mobile', + 'user__fullname') \ + .order_by('id') + ser_data = GetAllGuildsSerializer(steward, many=True).data + return Response(ser_data, status=status.HTTP_200_OK) + + +class PercentageDropLimitationViewset(viewsets.ModelViewSet): + queryset = PercentageDropLimitation.objects.all() + permission_classes = [AllowAny] + serializer_class = PercentageDropLimitationSerializer + + def list(self, request, *args, **kwargs): + drop_limitation = PercentageDropLimitation.objects.filter(trash=False).first() + + serializer = self.serializer_class(drop_limitation) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + drop_limitation = PercentageDropLimitation.objects.filter(trash=False).first() + serializer = self.serializer_class(drop_limitation) + serializer.update(instance=drop_limitation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class UploadImageLimitationViewset(viewsets.ModelViewSet): + queryset = UploadImageLimitation.objects.all() + permission_classes = [AllowAny] + serializer_class = UploadImageLimitationSerializer + + def list(self, request, *args, **kwargs): + image_limitation = UploadImageLimitation.objects.filter(trash=False).first() + + serializer = self.serializer_class(image_limitation) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + image_limitation = UploadImageLimitation.objects.filter(trash=False).first() + serializer = self.serializer_class(image_limitation) + serializer.update(instance=image_limitation, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ApkInfoViewset(viewsets.ModelViewSet): + queryset = ApkInfo.objects.all() + permission_classes = [AllowAny] + serializer_class = ApkInfoSerializer + + def list(self, request, *args, **kwargs): + apk = ApkInfo.objects.filter(trash=False).first() + + serializer = self.serializer_class(apk) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + apk = ApkInfo.objects.filter(trash=False).first() + serializer = self.serializer_class(apk) + serializer.update(instance=apk, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class DirectBuyingVerificationViewset(viewsets.ModelViewSet): + queryset = DirectBuyingVerification.objects.filter(trash=False) + permission_classes = [AllowAny] + serializer_class = DirectBuyingVerificationSerializer + + def get_object(self): + instance, created = DirectBuyingVerification.objects.get_or_create( + trash=False) + return instance + + def list(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance, data=request.data, partial=True) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + + +class FinePermissionViewset(viewsets.ModelViewSet): + queryset = FinePermission.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = FinePermissionSerializer + + def list(self, request, *args, **kwargs): + fines = FinePermission.objects.filter(trash=False).order_by('id') + serializer = self.serializer_class(fines, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + fine = FinePermission.objects.get(trash=False, key=request.data['key']) + serializer = self.serializer_class(fine) + serializer.update(instance=fine, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ShowMarketRequestViewset(viewsets.ModelViewSet): + queryset = ShowMarketRequest.objects.filter(trash=False) + permission_classes = [AllowAny] + serializer_class = ShowMarketRequestSerializer + + def get_object(self): + instance, created = ShowMarketRequest.objects.get_or_create( + trash=False) + return instance + + def list(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance, data=request.data, partial=True) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + + +class IndexWeightCategoryViewSet(viewsets.ModelViewSet): + queryset = IndexWeightCategory.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = IndexWeightCategorySerializer + + def list(self, request, *args, **kwargs): + index_weight = IndexWeightCategory.objects.filter(trash=False).order_by('id') + serializer = self.serializer_class(index_weight, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + index_weight = IndexWeightCategory.objects.get(trash=False, key=request.data['key']) + serializer = self.serializer_class(index_weight) + serializer.update(instance=index_weight, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class GetAllPoultryForPoultryScienceViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + poultry_science = PoultryScience.objects.filter(trash=False, poultry__isnull=False).values_list('poultry__id', + flat=True).distinct() + + poultry = Poultry.objects.filter(trash=False).exclude(id__in=poultry_science).select_related('user', + 'address').order_by( + 'id') + serializer = GetAllPoultryForPoultryScienceSerializer(poultry, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryScienceViewSet(viewsets.ModelViewSet): + queryset = PoultryScience.objects.filter(trash=False) + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryScienceSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryScienceFilterSet + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + poultry_science = user.poultry_science_user.all() + serializer = self.serializer_class(poultry_science[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + query = self.queryset.get(id=request.data['poultry_science_id']) + query.poultry.set(request.data['poultry']) + return Response({'result': 'باموفقیت انجام شد.'}, status=status.HTTP_200_OK) + + def list(self, request, *args, **kwargs): + query = self.queryset + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + query = query.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(query) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryScienceReportViewSet(viewsets.ModelViewSet): + queryset = PoultryScienceReport.objects.filter(trash=False) + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryScienceReportSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryScienceReportFilterSet + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + query = self.queryset.order_by('-id') + role = request.GET['role'] + + if role == 'PoultryScience': + query = query.filter(poultry_science__user=user) + + elif role == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + hatching_ids = PoultryHatching.objects.filter( + poultry__in=poultries + ).values_list('id', flat=True) + query = query.filter(hatching__id__in=hatching_ids) + + elif role == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + hatching_ids = PoultryHatching.objects.filter( + poultry__city_operator=city_operator.unit_name + ).values_list('id', flat=True) + query = query.filter(hatching__id__in=hatching_ids) + + elif role == 'CityJahad': + hatching_ids = PoultryHatching.objects.filter( + poultry__address__city=user.city + ).values_list('id', flat=True) + query = query.filter(hatching__id__in=hatching_ids) + + elif role == 'CityPoultry': + hatching_ids = PoultryHatching.objects.filter( + poultry__address__city=user.city + ).values_list('id', flat=True) + query = query.filter(hatching__id__in=hatching_ids) + + else: + query = query.filter(user=user) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + query = query.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(query) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + user = get_object_or_404(SystemUserProfile, user=request.user, trash=False) + poultry_science = PoultryScience.objects.filter(trash=False, user=user).first() + + # if poultry_science: + # if not poultry_science.poultry.exists(): + # return Response( + # {"result": "برای این کارشناس مرغداری ثبت نشده است!"}, + # status=status.HTTP_403_FORBIDDEN + # ) + + hatching_id = request.data.get("hatching_id") + hatching = PoultryHatching.objects.filter(trash=False, id=hatching_id).first() + # if self.queryset.filter(hatching=hatching).exists(): + # return Response( + # {"result": "برای این واحد قبلا گزارش ثبت شده است!"}, + # status=status.HTTP_403_FORBIDDEN + # ) + if not hatching: + return Response( + {"result": "جوجه‌ریزی وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN + ) + + # دریافت JSON از request + report_json = request.data.get('json') or request.data.get('report_information') + if isinstance(report_json, str): + try: + report_json = json.loads(report_json) + except json.JSONDecodeError: + report_json = None + + poultry_science_report = PoultryScienceReport( + hatching=hatching, + poultry_science=poultry_science or None, + user=user, + reporter_fullname=user.fullname, + reporter_mobile=user.mobile, + reporter_role=request.data.get('role'), + date=datetime.now(), + lat=request.data.get('lat', None), + log=request.data.get('log', None), + report_information=report_json, + chicken_age=hatching.chicken_age, + ) + + # files = request.FILES.getlist("file") + # if not files: + # single_file = request.FILES.get("file") + # if single_file: + # files = [single_file] + # if files: + # poultry_science_report.image = [ + # send_image_to_server_for_poultry_science(f, f.name) for f in files + # ] + + poultry_science_report.save() + + ser_data = self.serializer_class(poultry_science_report) + return Response(ser_data.data, status=status.HTTP_201_CREATED) + + +class PoultryAndHatchingForPoultryScience(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + + def get(self, request): + type_page = request.GET.get('type') + hatching_has_report = request.GET.get('report') + role = request.GET.get('role') + user = get_object_or_404(SystemUserProfile, user=request.user, trash=False) + poultry_science = PoultryScience.objects.filter(trash=False, user=user).first() + if poultry_science: + poultry = poultry_science.poultry.filter(trash=False) + hatching = PoultryHatching.objects.filter( + state='pending', + allow_hatching='pending', + archive=False, + trash=False, + poultry__in=poultry + ).order_by('-date', 'poultry') + else: + hatching = PoultryHatching.objects.filter( + state='pending', + allow_hatching='pending', + archive=False, + trash=False, + ).order_by('-date', 'poultry') + + if type_page == 'farm': + + poultry = poultry_science.poultry.filter(trash=False) + page_size = request.query_params.get('page_size') + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry) + if page is not None: + serializer = PoultryDetailForPoultryScienceSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + ser_data = PoultryDetailForPoultryScienceSerializer(poultry, many=True).data + return Response(ser_data, status=status.HTTP_200_OK) + + elif type_page == 'hatching': + if hatching_has_report: + hatching = hatching.exclude( + id__in=PoultryScienceReport.objects.filter(trash=False).values_list('hatching__id', + flat=True).distinct()) + if role == 'PoultryScience': + poultry_science = PoultryScience.objects.filter(user=user, trash=False) + allowed_poultry_ids = poultry_science.values_list('poultry', flat=True).distinct() + hatching = hatching.filter(poultry__in=allowed_poultry_ids) + + elif role == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + hatching = hatching.filter( + poultry__in=poultries + ) + elif role == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + hatching = hatching.filter( + poultry__city_operator=city_operator.unit_name + ) + elif role == 'CityJahad': + city_jahad = CityJahad.objects.get(user=user, trash=False) + hatching = hatching.filter( + poultry__address__city=city_jahad.address.city + ) + elif role == 'CityPoultry': + city_poultry = CityPoultry.objects.get(user=user, trash=False) + hatching = hatching.filter( + poultry__address__city=city_poultry.city + ) + else: + hatching = hatching + + page_size = request.query_params.get('page_size') + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(hatching) + if page is not None: + serializer = PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + ser_data = PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer(hatching, many=True).data + return Response(ser_data, status=status.HTTP_200_OK) + + else: + hatching_aggregate = hatching.aggregate( + total_quantity=Sum('quantity'), + total_left_over=Sum('left_over'), + total_losses=Sum('losses'), + total_killed_quantity=Sum('killed_quantity'), + ) + poultry_count = hatching.values_list('poultry', flat=True).distinct() + result = { + "farm_count": poultry_count.count(), + "hatching_count": hatching.count(), + "hatching_quantity": hatching_aggregate['total_quantity'] or 0, + "hatching_left_over": hatching_aggregate['total_left_over'] or 0, + "hatching_losses": hatching_aggregate['total_losses'] or 0, + "hatching_killed_quantity": hatching_aggregate['total_killed_quantity'] or 0, + "hatching_max_age": hatching.order_by( + '-chicken_age').first().chicken_age if hatching.exists() else None, + "hatching_min_age": hatching.order_by('chicken_age').first().chicken_age if hatching.exists() else None, + } + return Response(result, status=status.HTTP_200_OK) + + +class AllowRegisterCodeForGuildsViewSet(viewsets.ModelViewSet): + queryset = AllowRegisterCodeForGuilds.objects.filter(trash=False) + serializer_class = AllowRegisterCodeForGuildsSerializer + permission_classes = [TokenHasReadWriteScope] + + +class StewardAppLoginViewSet(viewsets.ModelViewSet): + queryset = StewardAppLogin.objects.filter(trash=False) + serializer_class = StewardAppLoginSerializer + permission_classes = [AllowAny] + + def create(self, request, *args, **kwargs): + steward = Guilds.objects.get(user__mobile=request.data['mobile'], trash=False) + request.data.pop('mobile') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + login = serializer.create(validated_data=request.data) + login.steward = steward + login.save() + return Response({"result": f"با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + +class GuildsGeneralConfigsViewSet(viewsets.ModelViewSet): + queryset = GuildsGeneralConfigs.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = GuildsGeneralConfigsSerializer + + def list(self, request, *args, **kwargs): + configs = GuildsGeneralConfigs.objects.filter(trash=False).first() + serializer = self.serializer_class(configs) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + stewards = Guilds.objects.filter(trash=False, steward=True).order_by('id') + configs = GuildsGeneralConfigs.objects.filter(trash=False).first() + serializer = self.serializer_class(configs, data=request.data, partial=True) + serializer.is_valid(raise_exception=True) + serializer.save() + update_data = serializer.validated_data + fields_to_update = [] + for field in update_data.keys(): + if hasattr(Guilds, field): + fields_to_update.append(field) + for steward in stewards: + setattr(steward, field, update_data[field]) + + if fields_to_update: + Guilds.objects.bulk_update(stewards, fields_to_update) + + return Response(serializer.data, status=status.HTTP_200_OK) + + +class GuildsForGeneralConfigsViewSet(viewsets.ModelViewSet): + queryset = Guilds.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = GuildsForGeneralConfigsSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsForGeneralConfigsFilterSet + + def list(self, request, *args, **kwargs): + stewards = Guilds.objects.filter(trash=False, steward=True).order_by('id') + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + stewards = stewards.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(stewards) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(stewards, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + steward = Guilds.objects.get(key=request.data['key']) + serializer = self.serializer_class(steward) + serializer.update(instance=steward, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class StewardSalesInformationViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + steward = Guilds.objects.get(user=user, steward=True, active=True, trash=False) + product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first() + archives = WarehouseArchive.objects.filter(Q(steward=steward) | Q(guild=steward), trash=False, warehouse=True) + + guild_steward_allocations = StewardAllocation.objects.filter( + Q(guilds=steward) | Q(to_guilds=steward) | Q(steward=steward) | Q( + to_steward=steward), + trash=False, calculate_status=True, warehouse=True, steward_warehouse=True) + + output_steward_allocations = guild_steward_allocations.filter(Q(guilds=steward) | Q(steward=steward)) + input_steward_allocations = guild_steward_allocations.filter( + Q(to_guilds=steward) | Q(to_steward=steward)) + + steward_free_bar_informations = StewardFreeBarInformation.objects.filter(steward=steward, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True) + steward_free_Sale_bar_informations = StewardFreeSaleBarInformation.objects.filter( + steward=steward, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True) + + segmentations = PosSegmentation.objects.filter(guild=steward, trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False, + warehouse=True) + + total_input_allocations_governmental_weight = \ + input_steward_allocations.filter(receiver_state='accepted', quota='governmental').aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_input_allocations_free_weight = \ + input_steward_allocations.filter(receiver_state='accepted', quota='free').aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_input_free_bar_carcasses_weight = \ + steward_free_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_steward_free_sale_bar_carcasses_weight = \ + steward_free_Sale_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_steward_free_sale_bar_carcasses_governmental_weight = \ + steward_free_Sale_bar_informations.filter(quota='governmental').aggregate( + total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + total_steward_house_free_sale_bar_carcasses_free_weight = \ + steward_free_Sale_bar_informations.filter(quota='free').aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + total_steward_in_province_allocations_weight = \ + output_steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_steward_in_province_allocations_governmental_weight = \ + output_steward_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_steward_in_province_allocations_free_weight = \ + output_steward_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + segmentations_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_governmental_weight = \ + segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_free_weight = \ + segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + pos_allocated_weight_info = transactions.aggregate( + pos_allocated_weight=Sum('cur_weight'), + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + archives_info = archives.aggregate( + archives_governmental_weight=Sum('weight', + filter=Q(quota='governmental')), + archives_free_weight=Sum('weight', + filter=Q(quota='free')), + + ) + archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 + archives_free_weight = archives_info['archives_free_weight'] or 0 + pos_allocated_weight = pos_allocated_weight_info['pos_allocated_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + + total_governmental_input_weight = total_input_allocations_governmental_weight + total_free_input_weight = total_input_allocations_free_weight + total_input_free_bar_carcasses_weight + total_governmental_output_weight = total_steward_free_sale_bar_carcasses_governmental_weight + segmentations_governmental_weight + total_steward_in_province_allocations_governmental_weight + int( + pos_governmental_allocated_weight / 1000) + total_free_output_weight = total_steward_house_free_sale_bar_carcasses_free_weight + total_steward_in_province_allocations_free_weight + segmentations_free_weight + int( + pos_free_allocated_weight / 1000) + total_governmental_remain_weight = ( + total_governmental_input_weight - total_governmental_output_weight) - archives_governmental_weight + total_free_remain_weight = (total_free_input_weight - total_free_output_weight) - archives_free_weight + + result = { + + "total_governmental_input_weight": int(total_governmental_input_weight), + "total_free_input_weight": int(total_free_input_weight), + "total_governmental_output_weight": int(total_governmental_output_weight), + "total_free_output_weight": int(total_free_output_weight), + "total_governmental_remain_weight": int(total_governmental_remain_weight), + "total_free_remain_weight": int(total_free_remain_weight), + "total_steward_free_sale_bar_carcasses_weight": int(total_steward_free_sale_bar_carcasses_weight), + "total_steward_in_province_allocations_weight": int(total_steward_in_province_allocations_weight), + "segmentations_weight": int(segmentations_weight), + "total_selling_in_province_governmental_weight": steward.total_selling_in_province_governmental_weight, + "total_selling_in_province_free_weight": steward.total_selling_in_province_free_weight, + "total_commitment_selling_in_province_governmental_weight": steward.total_commitment_selling_in_province_governmental_weight, + "total_commitment_selling_in_province_governmental_remain_weight": steward.total_commitment_selling_in_province_governmental_remain_weight, + "total_commitment_selling_in_province_free_weight": steward.total_commitment_selling_in_province_free_weight, + "total_commitment_selling_in_province_free_remain_weight": steward.total_commitment_selling_in_province_free_remain_weight, + "pos_allocated_weight": int(pos_allocated_weight / 1000), + "pos_governmental_allocated_weight": int(pos_governmental_allocated_weight / 1000), + "pos_free_allocated_weight": int(pos_free_allocated_weight / 1000), + "archives_governmental_weight": archives_governmental_weight, + "archives_free_weight": archives_free_weight, + + } + + return Response(result, status=200) + + +class ReturnStewardAllocationViewSet(viewsets.ModelViewSet): + queryset = StewardAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = StewardAllocationSerializer + + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + allocation = StewardAllocation.objects.get(key=request.data['key']) + quota = allocation.quota + if allocation.kill_house: + if quota == 'governmental': + if allocation.kill_house.total_remain_warehouse_governmental_weight < allocation.real_weight_of_carcasses: + return Response({"result": "باقیمانده وزن دولتی کمتر از تخصیص برگشت داده شده است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + if allocation.kill_house.total_remain_warehouse_free_weight < allocation.real_weight_of_carcasses: + return Response({"result": "باقیمانده وزن آزاد کمتر از تخصیص برگشت داده شده است!"}, + status=status.HTTP_403_FORBIDDEN) + allocation.trash = False + allocation.return_trash = True + allocation.returner_trash = user.fullname + allocation.return_trash_date = datetime.now() + allocation.save() + if allocation.seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(allocation.product) + else: + guild_steward_allocations_product_warehousing(allocation.product) + return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_200_OK) + + +class StewardRequestViewSet(viewsets.ModelViewSet): + queryset = StewardRequest.objects.filter(trash=False) + serializer_class = StewardRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + steward = Guilds.objects.get(key=request.data['key']) + + request.data.pop('key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + steward_request = serializer.create(validated_data=request.data) + steward_request.steward = steward + steward_request.registerer = user.fullname + steward_request.registerer_mobile = user.mobile + steward_request.save() + return Response({"result": f"با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + +class RestrictionCarcassDistributionViewSet(viewsets.ModelViewSet): + queryset = RestrictionCarcassDistribution.objects.filter(trash=False).order_by('id') + serializer_class = RestrictionCarcassDistributionSerializer + permission_classes = [TokenHasReadWriteScope] + + +class AllowRegisterCodeForKillHouseFreeSaleBarInformationViewSet(viewsets.ModelViewSet): + queryset = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False) + serializer_class = AllowRegisterCodeForKillHouseFreeSaleBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + + def get_queryset(self): + return AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False) + + def list(self, request, *args, **kwargs): + instance = self.get_queryset().first() + serializer = self.get_serializer(instance) + return Response(serializer.data) + + +class AllowRegisterCodeForStewardFreeSaleBarInformationViewSet(viewsets.ModelViewSet): + queryset = AllowRegisterCodeForStewardFreeSaleBarInformation.objects.filter(trash=False) + serializer_class = AllowRegisterCodeForStewardFreeSaleBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + + def get_queryset(self): + return AllowRegisterCodeForStewardFreeSaleBarInformation.objects.filter(trash=False) + + def list(self, request, *args, **kwargs): + instance = self.get_queryset().first() + serializer = self.get_serializer(instance) + return Response(serializer.data) + + +class LimitationForDirectPurchaseAndBarInformationViewSet(viewsets.ModelViewSet): + queryset = LimitationForDirectPurchaseAndBarInformation.objects.filter(trash=False) + serializer_class = LimitationForDirectPurchaseAndBarInformationSerializer + permission_classes = [TokenHasReadWriteScope] + + def get_queryset(self): + return LimitationForDirectPurchaseAndBarInformation.objects.filter(trash=False) + + def list(self, request, *args, **kwargs): + instance = self.get_queryset().first() + serializer = self.get_serializer(instance) + return Response(serializer.data) + + +class PosSalesInformationViewSet(APIView): + permission_classes = [AllowAny] + + def kill_house_info(self, kill_house): + product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False) + pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0 + pos_governmental_allocated_weight = transactions.filter(price_approved=True).aggregate(total=Sum('cur_weight'))[ + 'total'] or 0 + pos_free_allocated_weight = transactions.filter(price_approved=False).aggregate(total=Sum('cur_weight'))[ + 'total'] or 0 + archives = WarehouseArchive.objects.filter(kill_house=kill_house, trash=False, warehouse=True) + + kill_house_requests = KillHouseRequest.objects.filter( + input_warehouse=kill_house, + temporary_trash=False, + temporary_deleted=False, + trash=False, calculate_status=True, warehouse=True) + + kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(input_warehouse=kill_house, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, + warehouse=True).exclude( + entered_message='ورود به انبار مجازی') + kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + trash=False, + temporary_trash=False, + temporary_deleted=False, + calculate_status=True, warehouse=True) + kill_house_allocations = StewardAllocation.objects.filter(kill_house=kill_house, trash=False, + receiver_state__in=('pending', 'accepted'), + temporary_trash=False, + temporary_deleted=False, + to_cold_house__isnull=True, + calculate_status=True, warehouse=True) + + segmentations = PosSegmentation.objects.filter(kill_house=kill_house, trash=False, warehouse=True) + cold_house_allocations = StewardAllocation.objects.filter( + kill_house=kill_house, + to_cold_house__isnull=False, + receiver_state__in=('accepted', 'pending'), + trash=False, warehouse=True) + total_entered_kill_house_requests_carcasses_governmental_weight = \ + kill_house_requests.filter(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=False).aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + total_entered_kill_house_requests_carcasses_free_weight = \ + kill_house_requests.filter(ware_house_confirmation=True, + province_request__poultry_request__free_sale_in_province=True).aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + total_entered_kill_house_free_bar_carcasses_weight = \ + kill_house_free_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_free_sale__bar_carcasses_governmental_weight = \ + kill_house_free_Sale_bar_informations.filter(quota='governmental').aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_free_sale__bar_carcasses_free_weight = \ + kill_house_free_Sale_bar_informations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_kill_house_allocations_governmental_weight = \ + kill_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_kill_house_allocations_free_weight = \ + kill_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + segmentations_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + + segmentations_governmental_weight = \ + segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_free_weight = \ + segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + + cold_house_allocations_governmental_weight = \ + cold_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + cold_house_allocations_free_weight = \ + cold_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + archives_info = archives.aggregate( + archives_governmental_weight=Sum('weight', + filter=Q(quota='governmental')), + archives_free_weight=Sum('weight', + filter=Q(quota='free')), + + ) + + archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 + archives_free_weight = archives_info['archives_free_weight'] or 0 + + total_governmental_input_weight = total_entered_kill_house_requests_carcasses_governmental_weight + total_free_input_weight = total_entered_kill_house_requests_carcasses_free_weight + total_entered_kill_house_free_bar_carcasses_weight + total_governmental_output_weight = total_kill_house_free_sale__bar_carcasses_governmental_weight + segmentations_governmental_weight + total_kill_house_allocations_governmental_weight + cold_house_allocations_governmental_weight + int( + (pos_governmental_allocated_weight / 1000)) + total_free_output_weight = total_kill_house_free_sale__bar_carcasses_free_weight + total_kill_house_allocations_free_weight + segmentations_free_weight + cold_house_allocations_free_weight + int( + pos_free_allocated_weight / 1000) + total_governmental_remain_weight = ( + total_governmental_input_weight - total_governmental_output_weight) - archives_governmental_weight + total_free_remain_weight = (total_free_input_weight - total_free_output_weight) - archives_free_weight + result = { + + "total_governmental_input_weight": int(total_governmental_input_weight), + "total_free_input_weight": int(total_free_input_weight), + "total_governmental_output_weight": int(total_governmental_output_weight), + "total_free_output_weight": int(total_free_output_weight), + "total_governmental_remain_weight": int(total_governmental_remain_weight), + "total_free_remain_weight": int(total_free_remain_weight), + "segmentations_weight": int(segmentations_weight), + "total_output": int(total_governmental_output_weight + total_free_output_weight), + "total_input": int(total_governmental_input_weight + total_free_input_weight), + "pos_allocated_weight": int(pos_allocated_weight / 1000), + "archives_governmental_weight": archives_governmental_weight, + "archives_free_weight": archives_free_weight, + + } + + return result + + def guild_steward_info(self, steward): + product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first() + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False) + pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0 + pos_governmental_allocated_weight = transactions.filter(price_approved=True).aggregate(total=Sum('cur_weight'))[ + 'total'] or 0 + pos_free_allocated_weight = transactions.filter(price_approved=False).aggregate(total=Sum('cur_weight'))[ + 'total'] or 0 + + archives = WarehouseArchive.objects.filter(Q(steward=steward) | Q(guild=steward), trash=False, warehouse=True) + + guild_steward_allocations = StewardAllocation.objects.filter( + Q(guilds=steward) | Q(to_guilds=steward) | Q(steward=steward) | Q( + to_steward=steward), + trash=False, calculate_status=True, warehouse=True, steward_warehouse=True) + + output_steward_allocations = guild_steward_allocations.filter(Q(guilds=steward) | Q(steward=steward)) + input_steward_allocations = guild_steward_allocations.filter( + Q(to_guilds=steward) | Q(to_steward=steward)) + + steward_free_bar_informations = StewardFreeBarInformation.objects.filter(steward=steward, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True) + steward_free_Sale_bar_informations = StewardFreeSaleBarInformation.objects.filter( + steward=steward, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True) + + segmentations = PosSegmentation.objects.filter(guild=steward, trash=False, warehouse=True) + + total_input_allocations_governmental_weight = \ + input_steward_allocations.filter(receiver_state='accepted', quota='governmental').aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_input_allocations_free_weight = \ + input_steward_allocations.filter(receiver_state='accepted', quota='free').aggregate( + total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_input_free_bar_carcasses_weight = \ + steward_free_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_steward_free_sale_bar_carcasses_weight = \ + steward_free_Sale_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_steward_free_sale_bar_carcasses_governmental_weight = \ + steward_free_Sale_bar_informations.filter(quota='governmental').aggregate( + total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + total_steward_house_free_sale_bar_carcasses_free_weight = \ + steward_free_Sale_bar_informations.filter(quota='free').aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + + total_steward_in_province_allocations_weight = \ + output_steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + total_steward_in_province_allocations_governmental_weight = \ + output_steward_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + total_steward_in_province_allocations_free_weight = \ + output_steward_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] or 0 + + segmentations_weight = \ + segmentations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_governmental_weight = \ + segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[ + 'total'] or 0 + segmentations_free_weight = \ + segmentations.filter(quota='free').aggregate(total=Sum('weight'))[ + 'total'] or 0 + + archives_info = archives.aggregate( + archives_governmental_weight=Sum('weight', + filter=Q(quota='governmental')), + archives_free_weight=Sum('weight', + filter=Q(quota='free')), + + ) + + archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 + archives_free_weight = archives_info['archives_free_weight'] or 0 + + total_governmental_input_weight = total_input_allocations_governmental_weight + total_free_input_weight = total_input_allocations_free_weight + total_input_free_bar_carcasses_weight + total_governmental_output_weight = total_steward_free_sale_bar_carcasses_governmental_weight + segmentations_governmental_weight + total_steward_in_province_allocations_governmental_weight + int( + (pos_governmental_allocated_weight / 1000)) + total_free_output_weight = total_steward_house_free_sale_bar_carcasses_free_weight + total_steward_in_province_allocations_free_weight + segmentations_free_weight + int( + (pos_free_allocated_weight / 1000)) + total_governmental_remain_weight = ( + total_governmental_input_weight - total_governmental_output_weight) - archives_governmental_weight + total_free_remain_weight = (total_free_input_weight - total_free_output_weight) - archives_free_weight + + result = { + + "total_governmental_input_weight": int(total_governmental_input_weight), + "total_free_input_weight": int(total_free_input_weight), + "total_governmental_output_weight": int(total_governmental_output_weight), + "total_free_output_weight": int(total_free_output_weight), + "total_governmental_remain_weight": int(total_governmental_remain_weight), + "total_free_remain_weight": int(total_free_remain_weight), + "segmentations_weight": int(segmentations_weight), + "total_output": int(total_governmental_output_weight + total_free_output_weight), + "total_input": int(total_governmental_input_weight + total_free_input_weight), + "pos_allocated_weight": int(pos_allocated_weight / 1000), + "archives_governmental_weight": archives_governmental_weight, + "archives_free_weight": archives_free_weight, + + } + + return result + + def get(self, request): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device) + if pos.kill_house: + result = self.kill_house_info(pos.kill_house) + else: + + result = self.guild_steward_info(pos.guild) + + return Response(result, status=status.HTTP_200_OK) + + +class PosColdHouseViewSet(APIView): + permission_classes = [AllowAny] + serializer_class = ColdHouseSerializer + + def get(self, request): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device) + + cold_house = ColdHouse.objects.filter(trash=False).order_by('kill_house') + + serializer = ColdHouseSerializer(cold_house, many=True) + + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PosRemainWeightViewSet(APIView): + permission_classes = [AllowAny] + + def kill_house_info(self, kill_house): + + today = datetime.now().date() + yesterday = today - timedelta(days=1) + two_days_ago = yesterday - timedelta(days=1) + days = (two_days_ago, yesterday, today) + product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() + archives = WarehouseArchive.objects.filter(kill_house=kill_house, trash=False, date__date__gte=two_days_ago, + date__date__lte=today) + + kill_house_requests = KillHouseRequest.objects.filter(input_warehouse=kill_house, + kill_request__recive_date__date__gte=two_days_ago, + kill_request__recive_date__date__lte=today, + ware_house_confirmation=True, trash=False, + calculate_status=True, warehouse=True) + kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(trash=False, + calculate_status=True, warehouse=True, + date__date__gte=two_days_ago, + date__date__lte=today, + input_warehouse=kill_house) \ + .exclude(entered_message='ورود به انبار مجازی') + kill_house_allocations = StewardAllocation.objects.filter( + kill_house=kill_house, trash=False, calculate_status=True, warehouse=True, + receiver_state__in=('pending', 'accepted'), production_date__date__gte=two_days_ago, + production_date__date__lte=today) + + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, + production_date__date__gte=two_days_ago, + production_date__date__lte=today, + trash=False, + calculate_status=True, + warehouse=True) + segmentations = PosSegmentation.objects.filter(kill_house=kill_house, production_date__date__gte=two_days_ago, + production_date__date__lte=today, trash=False, + warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, + transaction__date__date__gte=two_days_ago, + transaction__date__date__lte=today, trash=False, + warehouse=True) + + governmental_list = [] + free_list = [] + final_dict = {} + + for day in days: + kill_house_requests_info = kill_house_requests.aggregate( + total_kill_house_request_governmental_weight=Sum('ware_house_accepted_real_weight', filter=Q( + province_request__poultry_request__free_sale_in_province=False, + kill_request__recive_date__date=day)), + total_kill_house_request_free_weight=Sum('ware_house_accepted_real_weight', filter=Q( + province_request__poultry_request__free_sale_in_province=True, + kill_request__recive_date__date=day)), + + ) + + kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate( + total_kill_house_free_buying_bars_weight=Sum('weight_of_carcasses', filter=Q(date__date=day))) + + kill_house_allocations_info = kill_house_allocations.aggregate( + total_kill_house_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental', + production_date__date=day)), + total_kill_house_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free', production_date__date=day)), + + ) + + kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate( + total_kill_house_free_sale_bars_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental', + production_date__date=day)), + total_kill_house_free_sale_bars_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free', production_date__date=day)), + + ) + + segmentations_info = segmentations.aggregate( + segmentations_governmental_weight=Sum('weight', + filter=Q(quota='governmental', production_date__date=day)), + segmentations_free_weight=Sum('weight', filter=Q(quota='free', production_date__date=day)), + + ) + pos_allocated_weight_info = transactions.aggregate( + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True, transaction__date__date=day)), + pos_free_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=False, transaction__date__date=day)), + + ) + + archives_info = archives.aggregate( + archives_governmental_weight=Sum('weight', + filter=Q(quota='governmental', date__date=day)), + archives_free_weight=Sum('weight', + filter=Q(quota='free', date__date=day)), + + ) + + total_kill_house_request_governmental_weight = kill_house_requests_info[ + 'total_kill_house_request_governmental_weight'] or 0 + total_kill_house_request_free_weight = kill_house_requests_info['total_kill_house_request_free_weight'] or 0 + total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info[ + 'total_kill_house_free_buying_bars_weight'] or 0 + total_kill_house_allocations_governmental_weight = kill_house_allocations_info[ + 'total_kill_house_allocations_governmental_weight'] or 0 + total_kill_house_allocations_free_weight = kill_house_allocations_info[ + 'total_kill_house_allocations_free_weight'] or 0 + total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info[ + 'total_kill_house_free_sale_bars_governmental_weight'] or 0 + total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info[ + 'total_kill_house_free_sale_bars_free_weight'] or 0 + segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 + segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 + archives_free_weight = archives_info['archives_free_weight'] or 0 + total_governmental_input = total_kill_house_request_governmental_weight + total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight + total_governmental_output = total_kill_house_allocations_governmental_weight + total_kill_house_free_sale_bars_governmental_weight + segmentations_governmental_weight + int( + pos_governmental_allocated_weight / 1000) + total_free_output = total_kill_house_allocations_free_weight + total_kill_house_free_sale_bars_free_weight + segmentations_free_weight + int( + pos_free_allocated_weight / 1000) + governmental_data = { + 'day': jdatetime.date.fromgregorian(date=day).strftime('%Y-%m-%d'), + 'amount': (total_governmental_input - total_governmental_output) - archives_governmental_weight, + } + free_data = { + 'day': jdatetime.date.fromgregorian(date=day).strftime('%Y-%m-%d'), + 'amount': (total_free_input - total_free_output) - archives_free_weight, + } + + governmental_list.append(governmental_data) + free_list.append(free_data) + final_dict['governmental'] = governmental_list + final_dict['free'] = free_list + return final_dict + + def guild_steward_info(self, steward): + today = datetime.now().date() + yesterday = today - timedelta(days=1) + two_days_ago = yesterday - timedelta(days=1) + days = (two_days_ago, yesterday, today) + product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first() + archives = WarehouseArchive.objects.filter(Q(steward=steward) | Q(guild=steward), trash=False, warehouse=True, + date__date__gte=two_days_ago, date__date__lte=today) + + guild_steward_allocations = StewardAllocation.objects.filter( + Q(guilds=steward) | Q(to_guilds=steward) | Q(steward=steward) | Q( + to_steward=steward), + trash=False, calculate_status=True, warehouse=True, steward_warehouse=True) + + output_steward_allocations = guild_steward_allocations.filter(Q(guilds=steward) | Q(steward=steward), + production_date__date__gte=two_days_ago, + production_date__date__lte=today, ) + input_steward_allocations = guild_steward_allocations.filter( + Q(to_guilds=steward) | Q(to_steward=steward), date__date__gte=two_days_ago, date__date__lte=today, ) + + steward_free_bar_informations = StewardFreeBarInformation.objects.filter(steward=steward, + date__date__gte=two_days_ago, + date__date__lte=today, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True) + steward_free_Sale_bar_informations = StewardFreeSaleBarInformation.objects.filter( + steward=steward, + production_date__date__gte=two_days_ago, + production_date__date__lte=today, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True) + + segmentations = PosSegmentation.objects.filter(guild=steward, production_date__date__gte=two_days_ago, + production_date__date__lte=today, trash=False, warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, + transaction__date__date__gte=two_days_ago, + transaction__date__date__lte=today, trash=False, + warehouse=True) + + governmental_list = [] + free_list = [] + final_dict = {} + + for day in days: + input_steward_allocations_info = input_steward_allocations.aggregate( + total_input_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(receiver_state='accepted', + quota='governmental', date__date=day)), + total_input_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(receiver_state='accepted', quota='free', + date__date=day)) + ) + output_steward_allocations_info = output_steward_allocations.aggregate( + total_output_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental', + production_date__date=day)), + total_output_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free', production_date__date=day)) + + ) + steward_free_bar_info = steward_free_bar_informations.aggregate( + total_free_bar_weight=Sum('weight_of_carcasses', filter=Q(date__date=day)), + + ) + + steward_free_Sale_bar_info = steward_free_Sale_bar_informations.aggregate( + total_free_Sale_bar_governmental_weight=Sum('weight_of_carcasses', + filter=Q(quota='governmental', production_date__date=day)), + total_free_Sale_bar_free_weight=Sum('weight_of_carcasses', + filter=Q(quota='free', production_date__date=day)) + + ) + + segmentations_info = segmentations.aggregate( + segmentations_governmental_weight=Sum('weight', + filter=Q(quota='governmental', production_date__date=day)), + segmentations_free_weight=Sum('weight', filter=Q(quota='free', production_date__date=day)), + + ) + pos_allocated_weight_info = transactions.aggregate( + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True, transaction__date__date=day)), + pos_free_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=False, transaction__date__date=day)), + + ) + + archives_info = archives.aggregate( + archives_governmental_weight=Sum('weight', + filter=Q(quota='governmental', date__date=day)), + archives_free_weight=Sum('weight', + filter=Q(quota='free', date__date=day)), + + ) + + total_input_steward_allocations_governmental_weight = input_steward_allocations_info[ + 'total_input_allocations_governmental_weight'] or 0 + total_input_steward_allocations_free_weight = input_steward_allocations_info[ + 'total_input_allocations_free_weight'] or 0 + total_steward_free_buying_bars_weight = steward_free_bar_info[ + 'total_free_bar_weight'] or 0 + total_output_steward_allocations_governmental_weight = output_steward_allocations_info[ + 'total_output_allocations_governmental_weight'] or 0 + total_output_steward_allocations_free_weight = output_steward_allocations_info[ + 'total_output_allocations_free_weight'] or 0 + total_steward_free_sale_bars_governmental_weight = steward_free_Sale_bar_info[ + 'total_free_Sale_bar_governmental_weight'] or 0 + total_steward_free_sale_bars_free_weight = steward_free_Sale_bar_info[ + 'total_free_Sale_bar_free_weight'] or 0 + segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 + segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 + archives_free_weight = archives_info['archives_free_weight'] or 0 + total_governmental_input = total_input_steward_allocations_governmental_weight + total_free_input = total_input_steward_allocations_free_weight + total_steward_free_buying_bars_weight + total_governmental_output = total_output_steward_allocations_governmental_weight + total_steward_free_sale_bars_governmental_weight + segmentations_governmental_weight + int( + pos_governmental_allocated_weight / 1000) + total_free_output = total_output_steward_allocations_free_weight + total_steward_free_sale_bars_free_weight + segmentations_free_weight + int( + pos_free_allocated_weight / 1000) + governmental_data = { + 'day': jdatetime.date.fromgregorian(date=day).strftime('%Y-%m-%d'), + 'amount': (total_governmental_input - total_governmental_output) - archives_governmental_weight, + } + free_data = { + 'day': jdatetime.date.fromgregorian(date=day).strftime('%Y-%m-%d'), + 'amount': (total_free_input - total_free_output) - archives_free_weight, + } + + governmental_list.append(governmental_data) + free_list.append(free_data) + final_dict['governmental'] = governmental_list + final_dict['free'] = free_list + return final_dict + + def get(self, request): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device) + + if pos.kill_house: + final_dict = self.kill_house_info(pos.kill_house) + else: + final_dict = self.guild_steward_info(pos.guild) + + return Response(final_dict, status=status.HTTP_200_OK) + + +class PosRemainWeightWithDateViewSet(APIView): + permission_classes = [AllowAny] + + def kill_house_info(self, kill_house, date): + + product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first() + + kill_house_requests = KillHouseRequest.objects.filter(input_warehouse=kill_house, + kill_request__recive_date__date=date, + ware_house_confirmation=True, trash=False, + calculate_status=True, warehouse=True) + kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(trash=False, + calculate_status=True, warehouse=True, + date__date=date, + input_warehouse=kill_house) \ + .exclude(entered_message='ورود به انبار مجازی') + kill_house_allocations = StewardAllocation.objects.filter( + kill_house=kill_house, trash=False, calculate_status=True, warehouse=True, + receiver_state__in=('pending', 'accepted'), production_date__date=date) + + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, + production_date__date=date, + trash=False, + calculate_status=True, + warehouse=True) + segmentations = PosSegmentation.objects.filter(kill_house=kill_house, production_date__date=date, trash=False, + warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, + transaction__date__date=date, trash=False, warehouse=True) + archives = WarehouseArchive.objects.filter(kill_house=kill_house, trash=False, warehouse=True, date__date=date) + + final_dict = {} + + kill_house_requests_info = kill_house_requests.aggregate( + total_kill_house_request_governmental_weight=Sum('ware_house_accepted_real_weight', filter=Q( + province_request__poultry_request__free_sale_in_province=False)), + total_kill_house_request_free_weight=Sum('ware_house_accepted_real_weight', filter=Q( + province_request__poultry_request__free_sale_in_province=True)), + + ) + + kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate( + total_kill_house_free_buying_bars_weight=Sum('weight_of_carcasses')) + + kill_house_allocations_info = kill_house_allocations.aggregate( + total_kill_house_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental')), + total_kill_house_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free')), + + ) + + kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate( + total_kill_house_free_sale_bars_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental')), + total_kill_house_free_sale_bars_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free')), + + ) + + segmentations_info = segmentations.aggregate( + segmentations_governmental_weight=Sum('weight', + filter=Q(quota='governmental')), + segmentations_free_weight=Sum('weight', filter=Q(quota='free')), + + ) + pos_allocated_weight_info = transactions.aggregate( + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + archives_info = archives.aggregate( + archives_governmental_weight=Sum('weight', + filter=Q(quota='governmental')), + archives_free_weight=Sum('weight', + filter=Q(quota='free')), + + ) + archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 + archives_free_weight = archives_info['archives_free_weight'] or 0 + + total_kill_house_request_governmental_weight = kill_house_requests_info[ + 'total_kill_house_request_governmental_weight'] or 0 + total_kill_house_request_free_weight = kill_house_requests_info['total_kill_house_request_free_weight'] or 0 + total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info[ + 'total_kill_house_free_buying_bars_weight'] or 0 + total_kill_house_allocations_governmental_weight = kill_house_allocations_info[ + 'total_kill_house_allocations_governmental_weight'] or 0 + total_kill_house_allocations_free_weight = kill_house_allocations_info[ + 'total_kill_house_allocations_free_weight'] or 0 + total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info[ + 'total_kill_house_free_sale_bars_governmental_weight'] or 0 + total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info[ + 'total_kill_house_free_sale_bars_free_weight'] or 0 + segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 + segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + total_governmental_input = total_kill_house_request_governmental_weight + total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight + total_governmental_output = total_kill_house_allocations_governmental_weight + total_kill_house_free_sale_bars_governmental_weight + segmentations_governmental_weight + int( + pos_governmental_allocated_weight / 1000) + total_free_output = total_kill_house_allocations_free_weight + total_kill_house_free_sale_bars_free_weight + segmentations_free_weight + int( + pos_free_allocated_weight / 1000) + date = datetime.strptime(date, '%Y-%m-%d').date() + + governmental_data = { + 'day': jdatetime.date.fromgregorian(date=date).strftime('%Y-%m-%d'), + 'amount': (total_governmental_input - total_governmental_output) - archives_governmental_weight, + } + free_data = { + 'day': jdatetime.date.fromgregorian(date=date).strftime('%Y-%m-%d'), + 'amount': (total_free_input - total_free_output) - archives_free_weight, + } + + final_dict['governmental'] = governmental_data + final_dict['free'] = free_data + return final_dict + + def guild_steward_info(self, steward, date): + + product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first() + guild_steward_allocations = StewardAllocation.objects.filter( + Q(guilds=steward) | Q(to_guilds=steward) | Q(steward=steward) | Q( + to_steward=steward), + trash=False, calculate_status=True, warehouse=True, steward_warehouse=True) + + output_steward_allocations = guild_steward_allocations.filter(Q(guilds=steward) | Q(steward=steward), + production_date__date=date) + input_steward_allocations = guild_steward_allocations.filter( + Q(to_guilds=steward) | Q(to_steward=steward), date__date=date) + + steward_free_bar_informations = StewardFreeBarInformation.objects.filter(steward=steward, + date__date=date, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True) + steward_free_Sale_bar_informations = StewardFreeSaleBarInformation.objects.filter( + steward=steward, + production_date__date=date, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True) + + segmentations = PosSegmentation.objects.filter(guild=steward, production_date__date=date, trash=False, + warehouse=True) + transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, + transaction__date__date=date, trash=False, warehouse=True) + archives = WarehouseArchive.objects.filter(Q(steward=steward) | Q(guild=steward), trash=False, + date__date=date, + warehouse=True) + + final_dict = {} + + input_steward_allocations_info = input_steward_allocations.aggregate( + total_input_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(receiver_state='accepted', + quota='governmental')), + total_input_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(receiver_state='accepted', quota='free')) + ) + output_steward_allocations_info = output_steward_allocations.aggregate( + total_output_allocations_governmental_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='governmental')), + total_output_allocations_free_weight=Sum('real_weight_of_carcasses', + filter=Q(quota='free')) + + ) + steward_free_bar_info = steward_free_bar_informations.aggregate( + total_free_bar_weight=Sum('weight_of_carcasses'), + + ) + + steward_free_Sale_bar_info = steward_free_Sale_bar_informations.aggregate( + total_free_Sale_bar_governmental_weight=Sum('weight_of_carcasses', + filter=Q(quota='governmental')), + total_free_Sale_bar_free_weight=Sum('weight_of_carcasses', filter=Q(quota='free')) + + ) + + segmentations_info = segmentations.aggregate( + segmentations_governmental_weight=Sum('weight', + filter=Q(quota='governmental')), + segmentations_free_weight=Sum('weight', filter=Q(quota='free')), + + ) + pos_allocated_weight_info = transactions.aggregate( + pos_governmental_allocated_weight=Sum('cur_weight', + filter=Q(price_approved=True)), + pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)), + + ) + archives_info = archives.aggregate( + archives_governmental_weight=Sum('weight', + filter=Q(quota='governmental')), + archives_free_weight=Sum('weight', + filter=Q(quota='free')), + + ) + archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 + archives_free_weight = archives_info['archives_free_weight'] or 0 + + total_input_steward_allocations_governmental_weight = input_steward_allocations_info[ + 'total_input_allocations_governmental_weight'] or 0 + total_input_steward_allocations_free_weight = input_steward_allocations_info[ + 'total_input_allocations_free_weight'] or 0 + total_steward_free_buying_bars_weight = steward_free_bar_info[ + 'total_free_bar_weight'] or 0 + total_output_steward_allocations_governmental_weight = output_steward_allocations_info[ + 'total_output_allocations_governmental_weight'] or 0 + total_output_steward_allocations_free_weight = output_steward_allocations_info[ + 'total_output_allocations_free_weight'] or 0 + total_steward_free_sale_bars_governmental_weight = steward_free_Sale_bar_info[ + 'total_free_Sale_bar_governmental_weight'] or 0 + total_steward_free_sale_bars_free_weight = steward_free_Sale_bar_info[ + 'total_free_Sale_bar_free_weight'] or 0 + segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 + segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 + pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 + pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 + total_governmental_input = total_input_steward_allocations_governmental_weight + total_free_input = total_input_steward_allocations_free_weight + total_steward_free_buying_bars_weight + total_governmental_output = total_output_steward_allocations_governmental_weight + total_steward_free_sale_bars_governmental_weight + segmentations_governmental_weight + int( + pos_governmental_allocated_weight / 1000) + total_free_output = total_output_steward_allocations_free_weight + total_steward_free_sale_bars_free_weight + segmentations_free_weight + int( + pos_free_allocated_weight / 1000) + date = datetime.strptime(date, '%Y-%m-%d').date() + governmental_data = { + 'day': jdatetime.date.fromgregorian(date=date).strftime('%Y-%m-%d'), + 'amount': (total_governmental_input - total_governmental_output) - archives_governmental_weight, + } + free_data = { + 'day': jdatetime.date.fromgregorian(date=date).strftime('%Y-%m-%d'), + 'amount': (total_free_input - total_free_output) - archives_free_weight, + } + + final_dict['governmental'] = governmental_data + final_dict['free'] = free_data + return final_dict + + def get(self, request): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + pos = POSMachine.objects.get(pos_id=validation_device) + date = request.GET.get('date') + + if pos.kill_house: + final_dict = self.kill_house_info(pos.kill_house, date) + else: + final_dict = self.guild_steward_info(pos.guild, date) + + return Response(final_dict, status=status.HTTP_200_OK) + + +# class StewardRemainWeightViewSet(APIView): +# permission_classes = [TokenHasReadWriteScope] +# +# def get(self, request): +# user = SystemUserProfile.objects.get(user=request.user, trash=False) +# steward = Guilds.objects.get(user=user, trash=False) +# product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first() +# today = datetime.now().date() +# yesterday = today - timedelta(days=1) +# two_days_ago = yesterday - timedelta(days=1) +# days = (two_days_ago, yesterday, today) +# archives = WarehouseArchive.objects.filter(Q(steward=steward) | Q(guild=steward), trash=False, +# date__date__gte=two_days_ago, date__date__lte=today) +# +# guild_steward_allocations = StewardAllocation.objects.filter( +# Q(guilds=steward) | Q(to_guilds=steward) | Q(steward=steward) | Q( +# to_steward=steward), +# trash=False, calculate_status=True, warehouse=True, steward_warehouse=True) +# +# output_steward_allocations = guild_steward_allocations.filter(Q(guilds=steward) | Q(steward=steward), +# production_date__date__gte=two_days_ago, +# production_date__date__lte=today, ) +# input_steward_allocations = guild_steward_allocations.filter( +# Q(to_guilds=steward) | Q(to_steward=steward), date__date__gte=two_days_ago, date__date__lte=today, ) +# +# steward_free_bar_informations = StewardFreeBarInformation.objects.filter(steward=steward, +# date__date__gte=two_days_ago, +# date__date__lte=today, +# trash=False, +# temporary_trash=False, +# temporary_deleted=False, +# warehouse=True) +# steward_free_Sale_bar_informations = StewardFreeSaleBarInformation.objects.filter( +# steward=steward, +# production_date__date__gte=two_days_ago, +# production_date__date__lte=today, +# trash=False, +# temporary_trash=False, +# temporary_deleted=False, +# warehouse=True) +# +# segmentations = PosSegmentation.objects.filter(guild=steward, production_date__date__gte=two_days_ago, +# production_date__date__lte=today, trash=False, warehouse=True) +# transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, +# transaction__date__date__gte=two_days_ago, +# transaction__date__date__lte=today, trash=False, +# warehouse=True) +# +# governmental_list = [] +# free_list = [] +# final_dict = {} +# +# for day in days: +# input_steward_allocations_info = input_steward_allocations.aggregate( +# total_input_allocations_governmental_weight=Sum('real_weight_of_carcasses', +# filter=Q(receiver_state='accepted', +# quota='governmental', date__date=day)), +# total_input_allocations_free_weight=Sum('real_weight_of_carcasses', +# filter=Q(receiver_state='accepted', quota='free', +# date__date=day)) +# ) +# output_steward_allocations_info = output_steward_allocations.aggregate( +# total_output_allocations_governmental_weight=Sum('real_weight_of_carcasses', +# filter=Q(quota='governmental', +# production_date__date=day)), +# total_output_allocations_free_weight=Sum('real_weight_of_carcasses', +# filter=Q(quota='free', production_date__date=day)) +# +# ) +# steward_free_bar_info = steward_free_bar_informations.aggregate( +# total_free_bar_weight=Sum('weight_of_carcasses', filter=Q(date__date=day)), +# +# ) +# +# steward_free_Sale_bar_info = steward_free_Sale_bar_informations.aggregate( +# total_free_Sale_bar_governmental_weight=Sum('weight_of_carcasses', +# filter=Q(quota='governmental', production_date__date=day)), +# total_free_Sale_bar_free_weight=Sum('weight_of_carcasses', +# filter=Q(quota='free', production_date__date=day)) +# +# ) +# +# segmentations_info = segmentations.aggregate( +# segmentations_governmental_weight=Sum('weight', +# filter=Q(quota='governmental', production_date__date=day)), +# segmentations_free_weight=Sum('weight', filter=Q(quota='free', production_date__date=day)), +# +# ) +# pos_allocated_weight_info = transactions.aggregate( +# pos_governmental_allocated_weight=Sum('cur_weight', +# filter=Q(price_approved=True, transaction__date__date=day)), +# pos_free_allocated_weight=Sum('cur_weight', +# filter=Q(price_approved=False, transaction__date__date=day)), +# +# ) +# archives_info = archives.aggregate( +# archives_governmental_weight=Sum('weight', +# filter=Q(quota='governmental', date__date=day)), +# archives_free_weight=Sum('weight', +# filter=Q(quota='free', date__date=day)), +# +# ) +# +# total_input_steward_allocations_governmental_weight = input_steward_allocations_info[ +# 'total_input_allocations_governmental_weight'] or 0 +# total_input_steward_allocations_free_weight = input_steward_allocations_info[ +# 'total_input_allocations_free_weight'] or 0 +# total_steward_free_buying_bars_weight = steward_free_bar_info[ +# 'total_free_bar_weight'] or 0 +# total_output_steward_allocations_governmental_weight = output_steward_allocations_info[ +# 'total_output_allocations_governmental_weight'] or 0 +# total_output_steward_allocations_free_weight = output_steward_allocations_info[ +# 'total_output_allocations_free_weight'] or 0 +# total_steward_free_sale_bars_governmental_weight = steward_free_Sale_bar_info[ +# 'total_free_Sale_bar_governmental_weight'] or 0 +# total_steward_free_sale_bars_free_weight = steward_free_Sale_bar_info[ +# 'total_free_Sale_bar_free_weight'] or 0 +# segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0 +# segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0 +# pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0 +# pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0 +# archives_governmental_weight = archives_info['archives_governmental_weight'] or 0 +# archives_free_weight = archives_info['archives_free_weight'] or 0 +# total_governmental_input = total_input_steward_allocations_governmental_weight +# total_free_input = total_input_steward_allocations_free_weight + total_steward_free_buying_bars_weight +# total_governmental_output = total_output_steward_allocations_governmental_weight + total_steward_free_sale_bars_governmental_weight + segmentations_governmental_weight + int( +# pos_governmental_allocated_weight / 1000) +# total_free_output = total_output_steward_allocations_free_weight + total_steward_free_sale_bars_free_weight + segmentations_free_weight + int( +# pos_free_allocated_weight / 1000) +# governmental_data = { +# 'day': day, +# 'amount': (total_governmental_input - total_governmental_output) - archives_governmental_weight, +# } +# free_data = { +# 'day': day, +# 'amount': (total_free_input - total_free_output) - archives_free_weight, +# } +# +# governmental_list.append(governmental_data) +# free_list.append(free_data) +# final_dict['governmental'] = governmental_list +# final_dict['free'] = free_list +# +# return Response(final_dict, status=status.HTTP_200_OK) + +class StewardRemainWeightViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + steward = Guilds.objects.get(user=user, active=True, trash=False) + product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first() + target_date = request.GET.get('date') + today = datetime.now().date() if not target_date else datetime.strptime(target_date, "%Y-%m-%d").date() + month_ago = today - timedelta(days=30) + yesterday = today - timedelta(days=1) + two_days_ago = yesterday - timedelta(days=1) + + days = [month_ago + timedelta(days=i) for i in range(31)] + target_days = {two_days_ago, yesterday, today} + + archives_vals = list(WarehouseArchive.objects.filter( + Q(steward=steward) | Q(guild=steward), + trash=False, + date__date__gte=month_ago, + date__date__lte=today, + warehouse=True, + ).values('date__date', 'quota', 'weight')) + + # allocations_vals = list(StewardAllocation.objects.filter( + # Q(guilds=steward) | Q(to_guilds=steward) | Q(steward=steward) | Q(to_steward=steward), + # trash=False, + # calculate_status=True, + # warehouse=True, + # steward_warehouse=True + # ).values('production_date__date', 'date__date', 'quota', 'real_weight_of_carcasses', 'receiver_state')) + + allocations_vals = StewardAllocation.objects.filter( + Q(guilds=steward) | Q(to_guilds=steward) | Q(steward=steward) | Q(to_steward=steward), + trash=False, + calculate_status=True, + warehouse=True, + production_date__isnull=False, + steward_warehouse=True + ) + input_allocations_vals = allocations_vals.filter(Q(to_guilds=steward,to_steward__isnull=True) | Q(to_steward=steward,to_guilds__isnull=True),receiver_state='accepted').values('production_date__date', 'date__date', 'quota', 'real_weight_of_carcasses', 'receiver_state') + output_allocations_vals = allocations_vals.filter(Q(guilds=steward,steward__isnull=True) | Q(steward=steward,guilds__isnull=True),receiver_state__in=('accepted','pending')).values('production_date__date', 'date__date', 'quota', 'real_weight_of_carcasses', 'receiver_state') + + + free_bar_vals = list(StewardFreeBarInformation.objects.filter( + steward=steward, + date__date__gte=month_ago, + date__date__lte=today, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True + ).values('date__date', 'weight_of_carcasses')) + + free_sale_vals = list(StewardFreeSaleBarInformation.objects.filter( + steward=steward, + production_date__date__gte=month_ago, + production_date__date__lte=today, + trash=False, + temporary_trash=False, + temporary_deleted=False, + warehouse=True + ).values('production_date__date', 'quota', 'weight_of_carcasses')) + + seg_vals = list(PosSegmentation.objects.filter( + guild=steward, + production_date__date__gte=month_ago, + production_date__date__lte=today, + trash=False, + warehouse=True + ).values('production_date__date', 'quota', 'weight')) + + pos_vals = list(ProductsTransactions.objects.filter( + product=product, + transaction__paid=True, + transaction__date__date__gte=month_ago, + transaction__date__date__lte=today, + trash=False, + warehouse=True + ).values('transaction__date__date', 'price_approved', 'cur_weight')) + + archives_daily = {} + for a in archives_vals: + d = a['date__date'] + q = a['quota'] + w = a['weight'] or 0 + if d not in archives_daily: + archives_daily[d] = {'governmental': 0, 'free': 0} + archives_daily[d][q] += w + + input_alloc_daily = {} + output_alloc_daily = {} + # for a in allocations_vals: + # date_field = 'date__date' if a['receiver_state'] == 'accepted' else 'production_date__date' + # w = a['real_weight_of_carcasses'] or 0 + # q = a['quota'] + # if a['receiver_state'] == 'accepted': # input + # if a[date_field] not in input_alloc_daily: + # input_alloc_daily[a[date_field]] = {'governmental': 0, 'free': 0} + # input_alloc_daily[a[date_field]][q] += w + # print(w) + # else: # output + # if a[date_field] not in output_alloc_daily: + # output_alloc_daily[a[date_field]] = {'governmental': 0, 'free': 0} + # output_alloc_daily[a[date_field]][q] += w + for a in input_allocations_vals: + date_field = 'date__date' + w = a['real_weight_of_carcasses'] or 0 + q = a['quota'] + if a[date_field] not in input_alloc_daily: + input_alloc_daily[a[date_field]] = {'governmental': 0, 'free': 0} + input_alloc_daily[a[date_field]][q] += w + + + for a in output_allocations_vals: + date_field = 'production_date__date' + w = a['real_weight_of_carcasses'] or 0 + q = a['quota'] + if a[date_field] not in output_alloc_daily: + output_alloc_daily[a[date_field]] = {'governmental': 0, 'free': 0} + output_alloc_daily[a[date_field]][q] += w + + + free_bar_daily = {} + for f in free_bar_vals: + d = f['date__date'] + free_bar_daily[d] = free_bar_daily.get(d, 0) + (f['weight_of_carcasses'] or 0) + + free_sale_daily = {} + for f in free_sale_vals: + d = f['production_date__date'] + q = f['quota'] + w = f['weight_of_carcasses'] or 0 + if d not in free_sale_daily: + free_sale_daily[d] = {'governmental': 0, 'free': 0} + free_sale_daily[d][q] += w + + seg_daily = {} + for s in seg_vals: + d = s['production_date__date'] + q = s['quota'] + w = s['weight'] or 0 + if d not in seg_daily: + seg_daily[d] = {'governmental': 0, 'free': 0} + seg_daily[d][q] += w + + pos_daily = {} + for p in pos_vals: + d = p['transaction__date__date'] + w = p['cur_weight'] or 0 + if d not in pos_daily: + pos_daily[d] = {'governmental': 0, 'free': 0} + if p['price_approved']: + pos_daily[d]['governmental'] += w + else: + pos_daily[d]['free'] += w + + governmental_list = [] + free_list = [] + + for day in days: + gov_in = input_alloc_daily.get(day, {}).get('governmental', 0) + free_in = input_alloc_daily.get(day, {}).get('free', 0) + free_bar_daily.get(day, 0) + + gov_out = ( + output_alloc_daily.get(day, {}).get('governmental', 0) + + free_sale_daily.get(day, {}).get('governmental', 0) + + seg_daily.get(day, {}).get('governmental', 0) + + (pos_daily.get(day, {}).get('governmental', 0) // 1000) + ) + + free_out = ( + output_alloc_daily.get(day, {}).get('free', 0) + + free_sale_daily.get(day, {}).get('free', 0) + + seg_daily.get(day, {}).get('free', 0) + + (pos_daily.get(day, {}).get('free', 0) // 1000) + ) + + governmental_list.append({ + 'day': day, + 'governmental': gov_in, + 'amount': (gov_in - gov_out) - archives_daily.get(day, {}).get('governmental', 0) if ( + gov_in - gov_out) - archives_daily.get( + day, {}).get('governmental', 0) > 0 else 0, + 'active': day in target_days + }) + + free_list.append({ + 'day': day, + 'amount': (free_in - free_out) - archives_daily.get(day, {}).get('free', 0) if ( + free_in - free_out) - archives_daily.get( + day, {}).get('free', 0) > 0 else 0, + 'active': day in target_days + }) + + return Response({ + 'governmental': governmental_list, + 'free': free_list + }, status=status.HTTP_200_OK) + + +class TotalStewardRemainWeightViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = TotalStewardRemainWeightSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsForPostationFilterSet + filterset_fields = [ + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'user__mobile', + 'guilds_name' + ] + + def get(self, request): + owner_type = request.GET.get('owner_type') + guild_steward_filters = {'trash': False, 'total_remain_warehouse_weight__gt': 0, 'active': True} + guild_steward_filters['steward'] = True if owner_type == 'steward' else False + guild_steward = Guilds.objects.filter(**guild_steward_filters).order_by('id') + + if 'search' in request.GET: + guild_steward_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=guild_steward + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=guild_steward) + guild_steward_list = ps.filter() + guild_steward = [] if len( + guild_steward_list) == 0 else guild_steward_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(guild_steward) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(guild_steward, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# class TotalStewardRemainWeightViewSet(GenericAPIView): +# permission_classes = [TokenHasReadWriteScope] +# serializer_class = TotalStewardRemainWeightSerializer +# pagination_class = CustomPagination +# filter_backends = [DjangoFilterBackend] +# filterset_class = GuildsForPostationFilterSet +# filterset_fields = [ +# 'user__first_name', +# 'user__last_name', +# 'user__fullname', +# 'user__mobile', +# 'guilds_name' +# ] +# +# def get(self, request): +# from collections import defaultdict +# from datetime import datetime, timedelta +# +# owner_type = request.GET.get('owner_type') +# filters = {'trash': False, 'total_remain_warehouse_weight__gt': 0, 'steward': owner_type == 'steward'} +# guilds = Guilds.objects.filter(**filters).order_by('id') +# +# if request.GET.get('search') == 'filter' and request.GET.get('value') not in ["", "undefined"]: +# value = request.GET['value'] +# for f in self.filterset_fields: +# query = QueryDict(f'{f}__contains={value}') +# qs = self.filterset_class(data=query, queryset=guilds).qs +# if qs.exists(): +# guilds = qs +# break +# +# guild_ids = list(guilds.values_list('id', flat=True)) +# if not guild_ids: +# return Response([]) +# +# allocations = StewardAllocation.objects.filter( +# Q(guilds_id__in=guild_ids) | Q(to_guilds_id__in=guild_ids) | +# Q(steward_id__in=guild_ids) | Q(to_steward_id__in=guild_ids), +# trash=False, calculate_status=True, warehouse=True, steward_warehouse=True +# ).values('guilds_id', 'to_guilds_id', 'steward_id', 'to_steward_id', 'quota', 'receiver_state', +# 'real_weight_of_carcasses', 'date', 'production_date') +# +# free_bars = StewardFreeBarInformation.objects.filter( +# steward_id__in=guild_ids, trash=False, temporary_trash=False, temporary_deleted=False, warehouse=True +# ).values('steward_id', 'date', 'weight_of_carcasses') +# +# free_sales = StewardFreeSaleBarInformation.objects.filter( +# steward_id__in=guild_ids, trash=False, temporary_trash=False, temporary_deleted=False, warehouse=True +# ).values('steward_id', 'production_date', 'quota', 'weight_of_carcasses') +# +# segmentations = PosSegmentation.objects.filter( +# guild_id__in=guild_ids, trash=False, warehouse=True +# ).values('guild_id', 'production_date', 'quota', 'weight') +# +# archives = WarehouseArchive.objects.filter( +# Q(guild_id__in=guild_ids) | Q(steward_id__in=guild_ids), trash=False +# ).values('guild_id', 'steward_id', 'date', 'quota', 'weight') +# +# data = defaultdict(lambda: defaultdict(lambda: {'gov': 0, 'free': 0})) +# today = datetime.now().date() +# exclude_days = {today, today - timedelta(days=1), today - timedelta(days=2)} +# +# def add(gid, day, gov, free): +# if not gid or not day or day in exclude_days: +# return +# data[gid][day]['gov'] += gov +# data[gid][day]['free'] += free +# +# for a in allocations: +# for gid in [a['guilds_id'], a['to_guilds_id'], a['steward_id'], a['to_steward_id']]: +# if not gid or gid not in guild_ids: +# continue +# quota = a['quota'] +# val = a['real_weight_of_carcasses'] or 0 +# if a['receiver_state'] == 'accepted' and a['date']: +# add(gid, a['date'], val if quota == 'governmental' else 0, val if quota == 'free' else 0) +# if a['production_date']: +# add(gid, a['production_date'], -val if quota == 'governmental' else 0, -val if quota == 'free' else 0) +# +# for b in free_bars: +# add(b['steward_id'], b['date'], 0, b['weight_of_carcasses'] or 0) +# +# for s in free_sales: +# val = s['weight_of_carcasses'] or 0 +# add(s['steward_id'], s['production_date'], -val if s['quota'] == 'governmental' else 0, -val if s['quota'] == 'free' else 0) +# +# for seg in segmentations: +# val = seg['weight'] or 0 +# add(seg['guild_id'], seg['production_date'], -val if seg['quota'] == 'governmental' else 0, -val if seg['quota'] == 'free' else 0) +# +# for arc in archives: +# gid = arc['guild_id'] or arc['steward_id'] +# val = arc['weight'] or 0 +# add(gid, arc['date'], -val if arc['quota'] == 'governmental' else 0, -val if arc['quota'] == 'free' else 0) +# +# precomputed = {} +# for gid, days in data.items(): +# gov_by_day = defaultdict(float) +# free_by_day = defaultdict(float) +# for d, v in days.items(): +# if v['gov'] > 0: +# gov_by_day[d.strftime('%Y-%m-%d')] += v['gov'] +# if v['free'] > 0: +# free_by_day[d.strftime('%Y-%m-%d')] += v['free'] +# +# precomputed[gid] = { +# 'governmental': [{'day': day, 'amount': amt} for day, amt in sorted(gov_by_day.items())], +# 'free': [{'day': day, 'amount': amt} for day, amt in sorted(free_by_day.items())], +# } +# +# page_size = request.query_params.get('page_size') +# if page_size: +# self.pagination_class.page_size = int(page_size) +# +# page = self.paginate_queryset(guilds) +# context = {'precomputed_data': precomputed} +# serializer = self.get_serializer(page or guilds, many=True, context=context) +# +# if page: +# return self.get_paginated_response(serializer.data) +# return Response(serializer.data, status=status.HTTP_200_OK) + +class WarehouseArchiveViewSet(viewsets.ModelViewSet): + queryset = WarehouseArchive.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = WarehouseArchiveSerializer + pagination_class = CustomPagination + filterset_class = WarehouseArchiveFilterSet + + def create(self, request, *args, **kwargs): + now = datetime.now() + now_time = now.time() + role = request.data.get('role') + image = request.data.get('image') + owner_key = request.data['owner_key'] + archive_type = request.data['archive_type'] + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date() + date = datetime(year=date.year, month=date.month, + day=date.day, + hour=now_time.hour, + minute=now_time.minute, + second=now_time.second) + request.data.pop('date') + request.data.pop('owner_key') + request.data.pop('archive_type') + request.data.pop('role') + if 'image' in request.data.keys(): + request.data.pop('image') + if archive_type == 'kill_house': + kill_house = KillHouse.objects.get(key=owner_key) + else: + guild_steward = Guilds.objects.get(key=owner_key) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + archive = serializer.create(validated_data=request.data) + archive.date = date + + if archive_type == 'kill_house': + archive.kill_house = kill_house + elif archive_type == 'steward': + archive.steward = guild_steward + else: + archive.guild = guild_steward + + if image: + archive.image = send_image_to_server(image) + archive.registerer = user.fullname + archive.registerer_mobile = user.mobile + archive.registerer_role = role + archive.save() + if archive.kill_house: + kill_house_archive_warehousing(archive.kill_house) + elif archive.steward: + guild_steward_archive_warehousing(archive.steward) + + else: + guild_steward_archive_warehousing(archive.guild) + + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + role = request.GET.get('role') + archive_type = request.GET.get('archive_type') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + filters = {"trash": False} + if date1: + filters['create_date__date__gte'] = date1 + filters['create_date__date__lte'] = date2 + if archive_type == 'kill_house': + filters['kill_house__isnull'] = False + elif archive_type == 'steward': + filters['steward__isnull'] = False + + elif archive_type == 'guild': + filters['guild__isnull'] = False + else: + filters['kill_house__isnull'] = False + + archives = WarehouseArchive.objects.filter(**filters) + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + archives = archives.filter( + build_query(self.filterset_class.Meta.fields, value) + ) + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + page = self.paginate_queryset(archives) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = POSDeviceSessionForCompanySerializer(archives, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + archive = WarehouseArchive.objects.get(key=request.GET['key']) + archive.trash = True + archive.save() + if archive.kill_house: + kill_house_archive_warehousing(archive.kill_house) + elif archive.steward: + guild_steward_archive_warehousing(archive.steward) + + else: + guild_steward_archive_warehousing(archive.guild) + return Response({"result": " با موفقیت حذف شد !"}, status=status.HTTP_200_OK) + + +class SmsRecipientViewSet(viewsets.ModelViewSet): + queryset = SmsRecipient.objects.all() + serializer_class = SmsRecipientSerializer + permission_classes = [TokenHasReadWriteScope] + + +def persian_date_to_datetime(persian_date_str): + """ + تبدیل تاریخ فارسی (مثل ۱۴۰۰/۰۵/۲۱) به datetime + """ + if not persian_date_str: + return None + + try: + # تبدیل اعداد فارسی به انگلیسی + persian_numbers = '۰۱۲۳۴۵۶۷۸۹' + english_numbers = '0123456789' + translation_table = str.maketrans(persian_numbers, english_numbers) + english_date = persian_date_str.translate(translation_table) + + # جدا کردن سال، ماه، روز + parts = english_date.split('/') + if len(parts) != 3: + return None + + year = int(parts[0]) + month = int(parts[1]) + day = int(parts[2]) + + # استفاده از تابع موجود برای تبدیل + from panel.convert_date import convert_to_miladi + return convert_to_miladi(year=year, month=month, day=day) + except: + return None + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +def create_or_update_guild_by_national_id(request): + if 'file' not in request.FILES: + return Response({"result": "فایل اکسل الزامی است"}, status=status.HTTP_400_BAD_REQUEST) + + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + + failed_records = [] + success_count = 0 + update_count = 0 + + all_cities_cache = list(City.objects.filter(trash=False).values('id', 'name')) + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + national_id = str(row[0]) if row[0] else None + if not national_id: + continue + + try: + try: + person_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_id}&type=person" + ) + person_data = person_response.json() + if not person_data.get('status'): + failed_records.append({"national_id": national_id, "reason": "اطلاعات شخص یافت نشد"}) + continue + person_info = person_data.get('data', {}) + except Exception as e: + failed_records.append({"national_id": national_id, "reason": f"خطا در دریافت اطلاعات شخصی: {str(e)}"}) + continue + + try: + guild_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_id}&type=guild" + ) + guild_data = guild_response.json() + if not guild_data.get('status') or not guild_data.get('data'): + failed_records.append({"national_id": national_id, "reason": "اطلاعات صنفی یافت نشد"}) + continue + + guild_list = guild_data.get('data', []) + guild_info = None + + for guild in guild_list: + license_status_value = guild.get('licenseStatus', '') + if license_status_value and 'فعال' in license_status_value: + guild_info = guild + break + + if not guild_info: + failed_records.append({"national_id": national_id, + "reason": "هیچ پروانه کسب فعالی برای این کد ملی یافت نشد (تمام پروانه‌ها ابطال شده‌اند)"}) + continue + + guild_layer_two = guild_info.get('layerTwo', {}) + except Exception as e: + failed_records.append({"national_id": national_id, "reason": f"خطا در دریافت اطلاعات صنفی: {str(e)}"}) + continue + + first_name = person_info.get('firstName') + last_name = person_info.get('lastName') + father_name = person_info.get('fatherName') + gender = person_info.get('gender') + identity_no = person_info.get('identityNo') + is_alive = person_info.get('isLive', True) + birth_date = person_info.get('birthDate') + jalali_date = jdatetime.datetime.strptime(birth_date, "%Y/%m/%d").togregorian().date() + birthday_str = jalali_date.strftime("%Y-%m-%d") + city_name = guild_info.get('city') + address_text = guild_info.get('address') + postal_code = guild_layer_two.get('postalcode') + license_number = guild_info.get('licenseNumber') + license_expire_date = guild_info.get('licenseExpireDate') + license_issue_date = guild_layer_two.get('licenseIssueDate') + license_type = guild_info.get('licenseType') + license_status = guild_info.get('licenseStatus') + type_activity_name = guild_info.get('isicname') + mobile = guild_layer_two.get('mobilenumber') + company_name = guild_layer_two.get('corporationName') + company_identifier = guild_layer_two.get('nationalId') + union_name = guild_layer_two.get('unionName') + phone_number = guild_layer_two.get('phonenumber') + + def parse_yes_no(val): + if not val: + return False + return str(val).strip() == 'بله' + + has_partner = parse_yes_no(guild_layer_two.get('hasPartner')) + steward = parse_yes_no(guild_layer_two.get('hasSteward')) + is_foreign_national = parse_yes_no(guild_layer_two.get('isForeigner')) + + try: + group = Group.objects.get(name__exact="Guilds") + except Group.DoesNotExist: + failed_records.append({"national_id": national_id, "reason": "گروه Guilds یافت نشد"}) + continue + + def _normalize_fa_ar(text): + if not text: + return text + mapping = { + 'ك': 'ک', + 'ي': 'ی', + 'ى': 'ی', + '\u0649': 'ی', + '\u06CC': 'ی', + '\u064A': 'ی', + 'ۀ': 'ه', + 'ة': 'ه', + 'ؤ': 'و', + 'أ': 'ا', + 'إ': 'ا', + 'ٱ': 'ا', + '\u200c': ' ', + } + out = str(text) + for src, dst in mapping.items(): + out = out.replace(src, dst) + return out.strip() + + city = City.objects.filter(name__icontains=city_name, trash=False).first() + if not city: + normalized_city = _normalize_fa_ar(city_name) + city = City.objects.filter(name__icontains=normalized_city, trash=False).first() + if not city: + alt_city = str(city_name or '') + alt_city = alt_city.replace('ک', 'ك').replace('ی', 'ي') + city = City.objects.filter(name__icontains=alt_city, trash=False).first() + if not city: + try: + target = _normalize_fa_ar(city_name or '') + best_id = None + best_ratio = 0.0 + for c in all_cities_cache: + cand = _normalize_fa_ar(c.get('name', '') or '') + ratio = difflib.SequenceMatcher(None, target, cand).ratio() + if ratio > best_ratio: + best_ratio = ratio + best_id = c['id'] + if best_id is not None and best_ratio >= 0.72: + city = City.objects.filter(id=best_id, trash=False).first() + except Exception: + city = None + if not city: + failed_records.append({"national_id": national_id, "reason": f"شهر '{city_name}' یافت نشد"}) + continue + + province = city.province + + existing_guild = Guilds.objects.filter(user__national_id=national_id, trash=False) + + system_profile = SystemUserProfile.objects.filter(national_id=national_id, trash=False) + + if not system_profile: + if not mobile: + failed_records.append( + {"national_id": national_id, "reason": "شماره موبایل در اطلاعات صنفی یافت نشد"}) + continue + + password = "00100" + data = { + "username": mobile, + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=mobile, first_name=first_name, last_name=last_name) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=first_name + " " + last_name, + user=user, + base_order=base_id, + password=password, + national_id=national_id, + national_code=identity_no, + city=city, + province=province, + father_name=father_name, + gender=gender, + birthday=birthday_str, + is_alive=is_alive + ) + system_profile.save() + else: + failed_records.append({"national_id": national_id, "reason": "در ثبت کاربر مشکلی بوجود آمده است"}) + continue + + else: + system_profile.national_id = national_id + system_profile.national_code = identity_no + system_profile.father_name = father_name + system_profile.gender = gender + system_profile.birthday = birthday_str + system_profile.is_alive = is_alive + system_profile.save() + + address = SystemAddress(city=city, province=province, address=address_text, + postal_code=postal_code) + address.save() + system_profile.role.add(group) + + if not existing_guild: + wallet = Wallet() + wallet.save() + else: + wallet = existing_guild.wallet + + role = request.data.get('role', 'ProvinceOperator') + + type_activity = TypeActivity.objects.filter(title__icontains=type_activity_name, trash=False).first() + if not type_activity: + type_activity = TypeActivity.objects.filter(trash=False).first() + + area_activity = AreaActivity.objects.filter(trash=False).first() + + if existing_guild: + try: + guilds = existing_guild + guilds.guilds_name = guild_info.get('title', '') + guilds.license_number = license_number + guilds.license_type = license_type + guilds.license_status = license_status + guilds.is_foreign_national = is_foreign_national + guilds.has_partner = has_partner + guilds.has_inquiry = True + guilds.steward = steward + guilds.company_name = company_name + guilds.company_identifier = company_identifier + guilds.user = system_profile + guilds.registerar_fullname = 'سیستمی' + guilds.registerar_mobile = '09000000000' + guilds.registerar_role = role + guilds.address = address + guilds.wallet = wallet + guilds.type_activity = type_activity.title if type_activity else type_activity_name + guilds.area_activity = area_activity.title if area_activity else '' + guilds.guild_type_activity = type_activity + guilds.guild_area_activity = area_activity + guilds.phone_number = phone_number + guilds.union_name = union_name + + if license_issue_date: + converted_date = persian_date_to_datetime(license_issue_date) + if converted_date: + guilds.license_issue_date = converted_date + + if license_expire_date: + converted_date = persian_date_to_datetime(license_expire_date) + if converted_date: + guilds.license_expire_date = converted_date + + guilds.save() + update_count += 1 + except Exception as e: + failed_records.append({"national_id": national_id, "reason": f"خطا در آپدیت: {str(e)}"}) + continue + + else: + try: + guilds = Guilds( + guilds_name=guild_info.get('title', ''), + license_number=license_number, + license_type=license_type, + license_status=license_status, + is_foreign_national=is_foreign_national, + has_partner=has_partner, + has_inquiry=True, + steward=steward, + company_name=company_name, + phone_number=phone_number, + union_name=union_name, + company_identifier=company_identifier, + user=system_profile, + registerar_fullname='سیستمی', + registerar_mobile='09000000000', + registerar_role=role, + address=address, + wallet=wallet, + type_activity=type_activity.title if type_activity else type_activity_name, + area_activity=area_activity.title if area_activity else '', + province_accept_state='pending', + guild_type_activity=type_activity, + guild_area_activity=area_activity, + ) + + if license_issue_date: + converted_date = persian_date_to_datetime(license_issue_date) + if converted_date: + guilds.license_issue_date = converted_date + + if license_expire_date: + converted_date = persian_date_to_datetime(license_expire_date) + if converted_date: + guilds.license_expire_date = converted_date + + guilds.save() + + parent_product = NewProduct.objects.all().first() + price = BroadcastPrice.objects.filter(trash=False).first() + + if parent_product and price: + approved_price = price.steward_price if guilds.steward else price.guild_price + approved_type = price.active if approved_price > 0 else False + + product = RolesProducts( + parent_product=parent_product, + guild=guilds, + name='مرغ گرم', + approved_price_status=approved_type, + approved_price=approved_price, + ) + product.save() + + if role == 'KillHouse': + try: + user = SystemUserProfile.objects.get(user=request.user) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).order_by( + 'id').first() + if kill_house: + guilds.kill_house_centers_allocation = [ + {"label": kill_house.name, "value": str(kill_house.key)}] + guilds.province_accept_state = 'pending' + guilds.kill_house_register = True + guilds.save() + + if guilds.steward == True: + guilds.steward_kill_house.add(kill_house) + else: + guilds.kill_house.add(kill_house) + except: + pass + + elif role == 'Guilds': + try: + user = SystemUserProfile.objects.get(user=request.user) + steward = Steward.objects.get(guilds__user=user, trash=False) + + guilds.centers_allocation = [ + {"label": steward.guilds.user.fullname, "value": str(steward.key)}] + guilds.province_accept_state = 'pending' + guilds.steward_register = True + guilds.save() + except: + pass + + elif role == 'PosCompany': + guilds.province_accept_state = 'pending' + guilds.pos_company_register = True + guilds.save() + + success_count += 1 + + except Exception as e: + failed_records.append({"national_id": national_id, "reason": f"خطا در ساخت: {str(e)}"}) + continue + + except Exception as e: + failed_records.append({"national_id": national_id, "reason": f"خطای کلی: {str(e)}"}) + continue + + return Response({ + "result": "پردازش کامل شد", + "success_count": success_count, + "update_count": update_count, + "failed_count": len(failed_records), + "failed_records": failed_records + }, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +def update_guild_by_national_id(request): + national_id = request.data.get('national_id') + has_inquery = request.data.get('has_inquiry') + update_flag = request.data.get('update_flag') + mobile = request.data.get('mobile') + steward = request.data.get('steward', False) + active_register_code = request.data.get('active_register_code', False) + + first_name = request.data.get('firstName') + last_name = request.data.get('lastName') + father_name = request.data.get('fatherName') + gender = request.data.get('gender') + identity_no = request.data.get('identityNo') + is_alive = request.data.get('isLive', True) + birth_date = request.data.get('birthDate') + + city_name = request.data.get('city') + address_text = request.data.get('address') + postal_code = request.data.get('postalcode') + license_number = request.data.get('licenseNumber') + license_expire_date = request.data.get('licenseExpireDate') + license_issue_date = request.data.get('licenseIssueDate') + license_type = request.data.get('licenseType') + license_status = request.data.get('licenseStatus') + type_activity_name = request.data.get('isicname') + mobilenumber = request.data.get('mobilenumber') + company_name = request.data.get('corporationName') + company_identifier = request.data.get('nationalId') + union_name = request.data.get('unionName') + phone = request.data.get('phonenumber') + has_partner_val = request.data.get('hasPartner') + is_foreigner_val = request.data.get('isForeigner') + title = request.data.get('title', '') + + try: + user = SystemUserProfile.objects.get(tras=False, user=request.user) + registerar_fullname = user.fullname + registerar_mobile = user.mobile + except: + registerar_fullname = 'سیستمی' + registerar_mobile = '09000000000' + + if not national_id: + return Response({"result": "کد ملی الزامی است"}, status=status.HTTP_400_BAD_REQUEST) + + try: + if not mobile: + mobile = mobilenumber + + if not mobile: + return Response({"result": "شماره موبایل الزامی است"}, + status=status.HTTP_400_BAD_REQUEST) + + try: + if birth_date: + jalali_date = jdatetime.datetime.strptime(birth_date, "%Y/%m/%d").togregorian().date() + birthday_str = jalali_date.strftime("%Y-%m-%d") + else: + birthday_str = None + except: + birthday_str = None + + def parse_yes_no(val): + if isinstance(val, bool): + return val + if isinstance(val, str): + x = False if val == 'خیر' else True + return x + return bool(val) + + has_partner = parse_yes_no(has_partner_val) + is_foreign_national = parse_yes_no(is_foreigner_val) + + def _normalize_fa_ar(text): + if not text: + return text + mapping = { + 'ك': 'ک', + 'ي': 'ی', + 'ى': 'ی', + '\u0649': 'ی', + '\u06CC': 'ی', + '\u064A': 'ی', + 'ۀ': 'ه', + 'ة': 'ه', + 'ؤ': 'و', + 'أ': 'ا', + 'إ': 'ا', + 'ٱ': 'ا', + '\u200c': ' ', + } + out = str(text) + for src, dst in mapping.items(): + out = out.replace(src, dst) + return out.strip() + + all_cities_cache = list(City.objects.filter(trash=False).values('id', 'name')) + + city = City.objects.filter(name__icontains=city_name, trash=False).first() + if not city: + normalized_city = _normalize_fa_ar(city_name) + city = City.objects.filter(name__icontains=normalized_city, trash=False).first() + if not city: + alt_city = str(city_name or '') + alt_city = alt_city.replace('ک', 'ك').replace('ی', 'ي') + city = City.objects.filter(name__icontains=alt_city, trash=False).first() + if not city: + try: + target = _normalize_fa_ar(city_name or '') + best_id = None + best_ratio = 0.0 + for c in all_cities_cache: + cand = _normalize_fa_ar(c.get('name', '') or '') + ratio = difflib.SequenceMatcher(None, target, cand).ratio() + if ratio > best_ratio: + best_ratio = ratio + best_id = c['id'] + if best_id is not None and best_ratio >= 0.72: + city = City.objects.filter(id=best_id, trash=False).first() + except Exception: + city = None + if not city: + return Response({"result": f"شهر '{city_name}' یافت نشد"}, status=status.HTTP_404_NOT_FOUND) + + province = city.province + + system_profile = SystemUserProfile.objects.filter(Q(national_id=national_id) | Q(mobile=mobile), + trash=False).first() + if not system_profile: + if not mobile: + return Response({"result": "شماره موبایل الزامی است"}, + status=status.HTTP_400_BAD_REQUEST) + + password = "123456" + data = { + "username": mobile, + "password": password, + "api_key": PROJECT_API_KEY + } + + try: + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=mobile, first_name=first_name, last_name=last_name) + user.save() + + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + + system_profile = SystemUserProfile( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=first_name + " " + last_name, + user=user, + base_order=base_id, + password=password, + national_id=national_id, + national_code=identity_no, + city=city, + province=province, + father_name=father_name, + gender=gender, + birthday=birthday_str, + is_alive=is_alive + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + except Exception as e: + return Response({"result": f"خطا در ثبت کاربر: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + else: + has_killhouse = system_profile.role.filter(name='KillHouse').exists() + if has_killhouse: + if request.GET.get('role') == 'AdminX': + if system_profile.national_id == national_id: + return Response({"result": "کد ملی به نام {} ثبت شده است!".format(system_profile.fullname)}, + status=status.HTTP_403_FORBIDDEN) + elif system_profile.mobile == mobile: + return Response( + {"result": "شماره موبایل به نام {} ثبت شده است!".format(system_profile.fullname)}, + status=status.HTTP_403_FORBIDDEN) + return Response({"result": "کاربر قبلا در سامانه ثبت شده است!"}, status=status.HTTP_403_FORBIDDEN) + + if mobile and system_profile.mobile != mobile: + if not has_killhouse: + first_mobile_number = system_profile.mobile + second_mobile_number = mobile + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + user = User.objects.get(id=system_profile.user.id) + user.username = second_mobile_number + user.save() + system_profile.mobile = second_mobile_number + system_profile.save() + else: + return Response({"result": "شماره همراه قبلا در سامانه ثبت شده است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "شماره همراه قبلا در سامانه ثبت شده است!"}, + status=status.HTTP_403_FORBIDDEN) + system_profile.first_name = first_name + system_profile.last_name = last_name + system_profile.fullname = first_name + " " + last_name + system_profile.national_id = national_id + system_profile.national_code = identity_no + system_profile.father_name = father_name + system_profile.gender = gender + system_profile.birthday = birthday_str + system_profile.is_alive = is_alive + system_profile.city = city + system_profile.province = province + system_profile.save() + + address = SystemAddress(city=city, province=province, address=address_text, postal_code=postal_code) + address.save() + + existing_guild = Guilds.objects.filter(user__national_id=national_id, trash=False, active=True).first() + + if not existing_guild: + wallet = Wallet() + wallet.save() + else: + wallet = existing_guild.wallet + + type_activity = TypeActivity.objects.filter(title__icontains=type_activity_name, trash=False).first() + if not type_activity: + type_activity = TypeActivity.objects.filter(trash=False).first() + + area_activity = AreaActivity.objects.filter(trash=False).first() + + if existing_guild: + try: + guilds = existing_guild + guilds.guilds_name = title + guilds.license_number = license_number + guilds.license_type = license_type + guilds.license_status = license_status + guilds.is_foreign_national = is_foreign_national + guilds.has_partner = has_partner + guilds.has_inquiry = has_inquery + guilds.steward = steward + guilds.company_name = company_name + guilds.company_identifier = company_identifier + guilds.user = system_profile + guilds.registerar_fullname = registerar_fullname + guilds.registerar_mobile = registerar_mobile + guilds.address = address + guilds.wallet = wallet + guilds.type_activity = type_activity.title if type_activity else type_activity_name + guilds.area_activity = area_activity.title if area_activity else '' + guilds.guild_type_activity = type_activity + guilds.guild_area_activity = area_activity + guilds.union_name = union_name + guilds.phone_number = phone + guilds.active = True + + if license_issue_date: + converted_date = persian_date_to_datetime(license_issue_date) + if converted_date: + guilds.license_issue_date = converted_date + + if license_expire_date: + converted_date = persian_date_to_datetime(license_expire_date) + if converted_date: + guilds.license_expire_date = converted_date + + guilds.save() + + guilds_group = Group.objects.get(name__exact="Guilds") + steward_group = Group.objects.get(name__exact="Steward") + + role_changed = False + if steward: + if system_profile.role.filter(name='Guilds').exists(): + role_changed = True + try: + req = requests.post( + url=ARTA_URL_REMOVE_USER_ROLE, + data={"mobile": system_profile.mobile, "role": "Guilds"}, + verify=False + ) + if req.status_code == 200 or req.status_code == 400: + system_profile.role.remove(guilds_group) + except: + pass + if not system_profile.role.filter(name='Steward').exists(): + system_profile.role.add(steward_group) + else: + if system_profile.role.filter(name='Steward').exists(): + role_changed = True + try: + req = requests.post( + url=ARTA_URL_REMOVE_USER_ROLE, + data={"mobile": system_profile.mobile, "role": "Steward"}, + verify=False + ) + if req.status_code == 200 or req.status_code == 400: + system_profile.role.remove(steward_group) + except: + pass + if not system_profile.role.filter(name='Guilds').exists(): + system_profile.role.add(guilds_group) + + # اگر نقش عوض شد، StewardAllocation ها را به‌روزرسانی کن + if role_changed: + update_steward_allocations_on_role_change(system_profile, guilds, steward) + + if active_register_code: + number = random.randint(10000, 99000) + guilds.register_code = number + guilds.active_register_code = True + guilds.register_date_register_code = datetime.now() + guilds.save() + + try: + send_sms_for_guild(guilds) + except: + pass + + ser_data = GuildsSerializer(guilds).data + return Response(ser_data, status=status.HTTP_200_OK) + + except Exception as e: + return Response({"result": f"خطا در به‌روزرسانی صنف: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + else: + if request.GET.get('role') in ('AdminX', 'SuperAdmin'): + province_accept = 'accepted' + else: + province_accept = 'pending' + has_killhouse = system_profile.role.filter(name='KillHouse').exists() + if has_killhouse: + return Response({"result": "کاربر قبلا در سامانه ثبت شده است!"}, status=status.HTTP_403_FORBIDDEN) + try: + guilds = Guilds( + guilds_name=title, + license_number=license_number, + license_type=license_type, + license_status=license_status, + is_foreign_national=is_foreign_national, + has_partner=has_partner, + has_inquiry=has_inquery, + steward=steward, + company_name=company_name, + company_identifier=company_identifier, + user=system_profile, + registerar_fullname=registerar_fullname, + registerar_mobile=registerar_mobile, + address=address, + wallet=wallet, + type_activity=type_activity.title if type_activity else type_activity_name, + area_activity=area_activity.title if area_activity else '', + province_accept_state=province_accept, + guild_type_activity=type_activity, + guild_area_activity=area_activity, + union_name=union_name, + phone_number=phone, + active=True, + ) + + if license_issue_date: + converted_date = persian_date_to_datetime(license_issue_date) + if converted_date: + guilds.license_issue_date = converted_date + + if license_expire_date: + converted_date = persian_date_to_datetime(license_expire_date) + if converted_date: + guilds.license_expire_date = converted_date + + guilds.save() + + guilds_group = Group.objects.get(name__exact="Guilds") + steward_group = Group.objects.get(name__exact="Steward") + + role_changed = False + if steward: + if system_profile.role.filter(name='Guilds').exists(): + role_changed = True + try: + req = requests.post( + url=ARTA_URL_REMOVE_USER_ROLE, + data={"mobile": system_profile.mobile, "role": "Guilds"}, + verify=False + ) + if req.status_code == 200: + system_profile.role.remove(guilds_group) + except: + pass + if not system_profile.role.filter(name='Steward').exists(): + system_profile.role.add(steward_group) + else: + if system_profile.role.filter(name='Steward').exists(): + role_changed = True + try: + req = requests.post( + url=ARTA_URL_REMOVE_USER_ROLE, + data={"mobile": system_profile.mobile, "role": "Steward"}, + verify=False + ) + if req.status_code == 200: + system_profile.role.remove(steward_group) + except: + pass + if not system_profile.role.filter(name='Guilds').exists(): + system_profile.role.add(guilds_group) + + # اگر نقش عوض شد، StewardAllocation ها را به‌روزرسانی کن + if role_changed: + update_steward_allocations_on_role_change(system_profile, guilds, steward) + + parent_product = NewProduct.objects.all().first() + price = BroadcastPrice.objects.filter(trash=False).first() + + if parent_product and price: + approved_price = price.steward_price if guilds.steward else price.guild_price + approved_type = price.active if approved_price > 0 else False + + product = RolesProducts( + parent_product=parent_product, + guild=guilds, + name='مرغ گرم', + approved_price_status=approved_type, + approved_price=approved_price, + ) + product.save() + if active_register_code: + number = random.randint(10000, 99000) + guilds.register_code = number + guilds.active_register_code = True + guilds.register_date_register_code = datetime.now() + guilds.save() + + try: + send_sms_for_guild(guilds) + except: + pass + ser_data = GuildsSerializer(guilds).data + return Response(ser_data, status=status.HTTP_201_CREATED) + + except Exception as e: + return Response({"result": f"خطا در ایجاد صنف: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + except Exception as e: + return Response({"result": f"خطای کلی: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +def register_legal_guild(request): + first_name = request.data.get('first_name') + last_name = request.data.get('last_name') + national_id = request.data.get('national_id') + province_name = request.data.get('province') + address_text = request.data.get('address') + unit_name = request.data.get('unit_name') + mobile = request.data.get('mobile') + city_name = request.data.get('city') + + if not national_id: + return Response({"result": "کد ملی الزامی است"}, status=status.HTTP_400_BAD_REQUEST) + + if not mobile: + return Response({"result": "شماره موبایل الزامی است"}, + status=status.HTTP_400_BAD_REQUEST) + + if not unit_name: + return Response({"result": "نام واحد الزامی است"}, + status=status.HTTP_400_BAD_REQUEST) + + try: + user = SystemUserProfile.objects.get(tras=False, user=request.user) + registerar_fullname = user.fullname + registerar_mobile = user.mobile + except: + registerar_fullname = 'سیستمی' + registerar_mobile = '09000000000' + + try: + # جستجوی شهر + if base_url_for_sms_report == 'ha': + city = City.objects.filter(name__icontains='همدان', trash=False).first() + elif base_url_for_sms_report == 'ku': + city = City.objects.filter(name__icontains='کردستان', trash=False).first() + elif base_url_for_sms_report == 'ma': + city = City.objects.filter(name__icontains='مرکزی', trash=False).first() + else: + city = City.objects.filter(name__icontains='تست', trash=False).first() + province = city.province + + system_profile = SystemUserProfile.objects.filter(Q(national_id=national_id) | Q(mobile=mobile), + trash=False).first() + if not system_profile: + password = "123456" + data = { + "username": mobile, + "password": password, + "api_key": PROJECT_API_KEY + } + + try: + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=mobile, first_name=first_name, last_name=last_name) + user.save() + + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + + system_profile = SystemUserProfile( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=first_name + " " + last_name, + user=user, + base_order=base_id, + password=password, + national_id=national_id, + city=city, + province=province, + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + except Exception as e: + return Response({"result": f"خطا در ثبت کاربر: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + else: + has_killhouse = system_profile.role.filter(name='KillHouse').exists() + if has_killhouse: + if request.GET.get('role') == 'AdminX': + if system_profile.national_id == national_id: + return Response({"result": "کد ملی به نام {} ثبت شده است!".format(system_profile.fullname)}, + status=status.HTTP_403_FORBIDDEN) + elif system_profile.mobile == mobile: + return Response( + {"result": "شماره موبایل به نام {} ثبت شده است!".format(system_profile.fullname)}, + status=status.HTTP_403_FORBIDDEN) + return Response({"result": "کاربر قبلا در سامانه ثبت شده است!"}, status=status.HTTP_403_FORBIDDEN) + + if mobile and system_profile.mobile != mobile: + if not has_killhouse: + first_mobile_number = system_profile.mobile + second_mobile_number = mobile + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + user = User.objects.get(id=system_profile.user.id) + user.username = second_mobile_number + user.save() + system_profile.mobile = second_mobile_number + system_profile.save() + else: + return Response({"result": "شماره همراه قبلا در سامانه ثبت شده است!"}, + status=status.HTTP_403_FORBIDDEN) + else: + return Response({"result": "شماره همراه قبلا در سامانه ثبت شده است!"}, + status=status.HTTP_403_FORBIDDEN) + + system_profile.first_name = first_name + system_profile.last_name = last_name + system_profile.fullname = first_name + " " + last_name + system_profile.national_id = national_id + system_profile.city = city + system_profile.province = province + system_profile.save() + + address = SystemAddress(city=city, province=province, address=address_text) + address.save() + + existing_guild = Guilds.objects.filter(user__national_id=national_id, trash=False, active=True, + is_real_person=False).first() + + if not existing_guild: + wallet = Wallet() + wallet.save() + else: + wallet = existing_guild.wallet + + type_activity = TypeActivity.objects.filter(trash=False, key=request.data.get('type_activity')).first() + area_activity = AreaActivity.objects.filter(trash=False).first() + + if existing_guild: + try: + guilds = existing_guild + guilds.guilds_name = unit_name + guilds.license_number = national_id + guilds.user = system_profile + guilds.registerar_fullname = registerar_fullname + guilds.registerar_mobile = registerar_mobile + guilds.address = address + guilds.wallet = wallet + guilds.type_activity = type_activity.title if type_activity else '' + guilds.area_activity = area_activity.title if area_activity else '' + guilds.guild_type_activity = type_activity + guilds.guild_area_activity = area_activity + guilds.city_name = city_name + guilds.province_name = province_name + guilds.active = True + guilds.is_real_person = False + guilds.save() + + guilds_group = Group.objects.get(name__exact="Guilds") + if not system_profile.role.filter(name='Guilds').exists(): + system_profile.role.add(guilds_group) + + ser_data = GuildsSerializer(guilds).data + return Response(ser_data, status=status.HTTP_200_OK) + + except Exception as e: + return Response({"result": f"خطا در به‌روزرسانی صنف: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + else: + if request.GET.get('role') in ('AdminX', 'SuperAdmin'): + province_accept = 'accepted' + else: + province_accept = 'pending' + has_killhouse = system_profile.role.filter(name='KillHouse').exists() + if has_killhouse: + return Response({"result": "کاربر قبلا در سامانه ثبت شده است!"}, status=status.HTTP_403_FORBIDDEN) + try: + guilds = Guilds( + guilds_name=unit_name, + license_number=national_id, # استفاده از national_id به عنوان شماره صنف + user=system_profile, + registerar_fullname=registerar_fullname, + registerar_mobile=registerar_mobile, + address=address, + wallet=wallet, + type_activity=type_activity.title if type_activity else '', + area_activity=area_activity.title if area_activity else '', + province_accept_state=province_accept, + guild_type_activity=type_activity, + guild_area_activity=area_activity, + city_name=city_name, + province_name=province_name, + active=True, + is_real_person=False, + ) + + guilds.save() + + guilds_group = Group.objects.get(name__exact="Guilds") + if not system_profile.role.filter(name='Guilds').exists(): + system_profile.role.add(guilds_group) + + parent_product = NewProduct.objects.all().first() + price = BroadcastPrice.objects.filter(trash=False).first() + + if parent_product and price: + approved_price = price.guild_price + approved_type = price.active if approved_price > 0 else False + + product = RolesProducts( + parent_product=parent_product, + guild=guilds, + name='مرغ گرم', + approved_price_status=approved_type, + approved_price=approved_price, + ) + product.save() + + ser_data = GuildsSerializer(guilds).data + return Response(ser_data, status=status.HTTP_201_CREATED) + + except Exception as e: + return Response({"result": f"خطا در ایجاد صنف: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + except Exception as e: + return Response({"result": f"خطای کلی: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +class TotalGuildStewardWarehouseArchiveDashboardViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = TotalGuildStewardWarehouseArchiveDashboardSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = GuildsForArchiveFilterSet + filterset_fields = [ + 'guilds_name', + 'user__mobile', + 'user__fullname', + 'user__first_name', + 'user__last_name' + + ] + + def get(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + owner_type = request.GET.get('owner_type') + if owner_type == 'steward': + archives_filters = {"trash": False, "steward__isnull": False} + else: + archives_filters = {"trash": False, "guild__isnull": False} + + if date1: + archives_filters['create_date__date__gte'] = date1 + archives_filters['create_date__date__lte'] = date2 + + archives = WarehouseArchive.objects.filter(**archives_filters) + + if owner_type == 'steward': + guilds = Guilds.objects.filter(id__in=archives.values_list('steward__id', flat=True), trash=False) + else: + guilds = Guilds.objects.filter(id__in=archives.values_list('guild__id', flat=True), trash=False) + + if 'search' in request.GET: + guilds_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=guilds + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=guilds) + guilds_list = ps.filter() + guilds = [] if len( + guilds_list) == 0 else guilds_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(guilds) + if page is not None: + serializer = self.get_serializer(page, many=True, + context={'date1': date1, 'date2': date2, 'owner_type': owner_type}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(guilds, many=True, + context={'date1': date1, 'date2': date2, 'owner_type': owner_type}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class MarketDailyLimitationViewset(viewsets.ModelViewSet): + queryset = MarketDailyLimitation.objects.filter(trash=False) + permission_classes = [TokenHasReadWriteScope] + serializer_class = MarketDailyLimitationSerializer + + def get_object(self): + instance, created = MarketDailyLimitation.objects.get_or_create( + trash=False) + return instance + + def list(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + instance = self.get_object() + data = request.data.copy() + data.update({ + "register_fullname": user.fullname, + "register_mobile": user.mobile, + }) + serializer = self.get_serializer(instance, data=data, partial=True) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + + +class HatchingArchivePercentViewset(viewsets.ModelViewSet): + queryset = HatchingArchivePercent.objects.filter(trash=False) + permission_classes = [TokenHasReadWriteScope] + serializer_class = HatchingArchivePercentSerializer + + def get_object(self): + instance, created = HatchingArchivePercent.objects.get_or_create( + trash=False) + return instance + + def list(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance, data=request.data, partial=True) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def check_steward_allocation_role_mismatch(request): + fixed_count = 0 + problems = [] + + steward_guilds = Guilds.objects.filter(steward=True, trash=False, active=True) + + for guild in steward_guilds: + wrong_allocations = StewardAllocation.objects.filter( + (Q(guilds=guild) | Q(to_guilds=guild)), + trash=False + ) + + for allocation in wrong_allocations: + if allocation.to_cold_house or allocation.other_cold_house: + continue + + if allocation.guilds == guild: + allocation.steward = guild + allocation.guilds = None + elif allocation.to_guilds == guild: + allocation.to_steward = guild + allocation.to_guilds = None + + if allocation.to_cold_house or allocation.other_cold_house: + pass + elif allocation.to_steward: + if allocation.steward: + allocation.type = 'steward_steward' + elif allocation.kill_house: + allocation.type = 'killhouse_steward' + elif allocation.to_guilds: + if allocation.steward: + allocation.type = 'steward_guild' + elif allocation.kill_house: + allocation.type = 'killhouse_guild' + + allocation.save() + fixed_count += 1 + + problems.append({ + 'guild_id': guild.id, + 'guild_name': guild.guilds_name, + 'guild_user_mobile': guild.user.mobile if guild.user else None, + 'guild_user_fullname': guild.user.fullname if guild.user else None, + 'allocation_id': allocation.id, + 'allocation_key': str(allocation.key) if allocation.key else None, + 'fixed': True + }) + + normal_guilds = Guilds.objects.filter(steward=False, trash=False, active=True) + + for guild in normal_guilds: + wrong_allocations = StewardAllocation.objects.filter( + (Q(steward=guild) | Q(to_steward=guild)), + trash=False + ) + + for allocation in wrong_allocations: + if allocation.to_cold_house or allocation.other_cold_house: + continue + + if allocation.steward == guild: + allocation.guilds = guild + allocation.steward = None + elif allocation.to_steward == guild: + allocation.to_guilds = guild + allocation.to_steward = None + + if allocation.to_cold_house or allocation.other_cold_house: + pass + elif allocation.to_steward: + if allocation.steward: + allocation.type = 'steward_steward' + elif allocation.kill_house: + allocation.type = 'killhouse_steward' + elif allocation.to_guilds: + if allocation.steward: + allocation.type = 'steward_guild' + elif allocation.kill_house: + allocation.type = 'killhouse_guild' + + allocation.save() + fixed_count += 1 + + problems.append({ + 'guild_id': guild.id, + 'guild_name': guild.guilds_name, + 'guild_user_mobile': guild.user.mobile if guild.user else None, + 'guild_user_fullname': guild.user.fullname if guild.user else None, + 'allocation_id': allocation.id, + 'allocation_key': str(allocation.key) if allocation.key else None, + 'fixed': True + }) + + return Response({ + 'result': 'اصلاح کامل شد', + 'total_fixed': fixed_count, + 'fixed_allocations': problems + }, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def get_dispenser_user_info(request): + national_code = request.GET.get('national_code') + if not national_code: + return Response({'result': 'ورود کد ملی الزامیست!'}, status=status.HTTP_403_FORBIDDEN) + if Dispenser.objects.filter(trash=False, user__national_id=national_code).exists(): + return Response({'result': 'این توزیع کننده قبلا ثبت شده!'}, status=status.HTTP_403_FORBIDDEN) + person_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_code}&type=person" + ) + person_data = person_response.json() + return Response(person_data, status=status.HTTP_200_OK) diff --git a/panel/ReportingPanel/__init__.py b/panel/ReportingPanel/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/ReportingPanel/excel_output.py b/panel/ReportingPanel/excel_output.py new file mode 100644 index 0000000..190b2f0 --- /dev/null +++ b/panel/ReportingPanel/excel_output.py @@ -0,0 +1,174 @@ +# if 'excel_export' in request.GET: +# options = [ +# 'مرغدار', +# 'شهر', +# 'استان', +# 'کد پستی', +# 'موبایل', +# 'تاریخ تولد', +# 'کد ملی', +# 'کد اکونومی', +# 'کد سیستمی', +# 'کد اپیدمیلوژیک', +# 'کد یکتا', +# 'ظرفیت کل', +# 'شماره مجوز', +# 'شماره گواهی بهداشتی', +# 'تعداد درخواست ها', +# 'تاریخ جوجه ریزی', +# 'تعداد جوجه ریزی', +# 'تعاونی', +# 'سفارشات', +# 'تعداد درخواست مرغدار', +# 'تاریخ درخواست', +# 'نوع مرغ', +# 'وزن جفت مرغ', +# 'تاییدیه شهرستان', +# 'اپراتور شهرستان', +# 'تاییدیه استان', +# 'اپراتور استان', +# 'موبایل اپراتور شهرستان', +# 'موبایل اپراتور استان', +# 'تاریخ تاییدیه شهرستان', +# 'تاریخ تاییدیه استان', +# 'کد سفارش', +# 'سن جوجه ها', +# 'وزن کل', +# 'قیمت کل', +# 'کارمزد', +# 'بارکد فاکتور', +# 'تاریخ فاکتور', +# 'نام مقصد پرداختی', +# 'شماره کارت مقصد پرداختی', +# 'شماره شبا مقصد پرداختی', +# ] +# excel_options = request.GET['excel_export'].split(',') +# if request.GET['excel_export'] == "": +# excel_options = options +# data_list = [] +# orders = [] +# for x in range(len(serializer.data)): +# nested_data_list = {} +# nested_data_list['مرغدار'] = serializer.data[x]['user']['fullname'] +# nested_data_list['مرغدار2'] = serializer.data[x]['id'] +# nested_data_list['شهر'] = serializer.data[x]['user']['address']['city'] +# nested_data_list['استان'] = serializer.data[x]['user']['address']['province'] +# nested_data_list['کد پستی'] = serializer.data[x]['user']['address']['postal_code'] +# nested_data_list['موبایل'] = serializer.data[x]['user']['mobile'] +# nested_data_list['تاریخ تولد'] = serializer.data[x]['user']['birthday'] +# nested_data_list['کد ملی'] = serializer.data[x]['user']['natinal_id'] +# nested_data_list['کد اکونومی'] = serializer.data[x]['user']['economic_code'] +# nested_data_list['کد سیستمی'] = serializer.data[x]['user']['system_code'] +# nested_data_list['کد اپیدمیلوژیک'] = serializer.data[x]['user']['epidemiological_code'] +# nested_data_list['کد یکتا'] = serializer.data[x]['user']['breeding_unique_id'] +# nested_data_list['ظرفیت کل'] = serializer.data[x]['user']['total_capacity'] +# nested_data_list['شماره مجوز'] = serializer.data[x]['user']['licence_number'] +# nested_data_list['شماره گواهی بهداشتی'] = serializer.data[x]['user'][ +# 'health_certificate_number'] +# nested_data_list['تعداد درخواست ها'] = serializer.data[x]['user']['number_of_requests'] +# nested_data_list['تاریخ جوجه ریزی'] = serializer.data[x]['user']['incubation_date'] +# nested_data_list['تعداد جوجه ریزی'] = serializer.data[x]['user']['number_of_incubators'] +# nested_data_list['تعاونی'] = serializer.data[x]['user']['cooperative'] +# if 'kill_house_assinment' in serializer.data[x].keys(): +# if len(serializer.data[x]['kill_house_assinment']['bars']) != 0: +# for i in serializer.data[x]['kill_house_assinment']['bars']: +# if 'poultry_net_weight' in i.keys(): +# poultry_net_weight = i['poultry_net_weight'] +# else: +# poultry_net_weight = "" +# if 'poultry_state' in i.keys(): +# state = i['poultry_state'] +# else: +# state = "" +# barcode = i['barcode'] +# kill_house_name = i['kill_house_name'] +# quantity = i['quantity'] +# date = i['date'] +# time = i['time'] +# name = i['car_info']['name'] +# car_quantity = i['car_info']['quantity'] +# pelak = i['car_info']['pelak'] +# driver_name = i['car_info']['driver_name'] +# order_string = "بارکد سفارش : {0}\n نام کشتارگاه : {1} \n تعداد : {2} \n تاریخ " \ +# ": {3} \n زمان : {4} \n مدل ماشین : {5} \n ظرفیت ماشین : {6} \n " \ +# "پلاک : {7} \n نام راننده : {8} \n وزن خالص : {9} \n وضعیت : {9} \n".format( +# barcode, +# kill_house_name, +# quantity, +# date, +# time, +# name, +# car_quantity, +# pelak, +# driver_name, +# poultry_net_weight, +# state, +# ) +# orders.append(order_string) +# nested_data_list['سفارشات'] = "".join(orders) +# nested_data_list['تعداد درخواست مرغدار'] = serializer.data[x]['quantity'] +# nested_data_list['تاریخ درخواست'] = serializer.data[x]['send_date'] +# nested_data_list['نوع مرغ'] = serializer.data[x]['chicken_breed'] +# nested_data_list['وزن جفت مرغ'] = serializer.data[x]['Index_weight'] +# nested_data_list['تاییدیه شهرستان'] = serializer.data[x]['state']['city_state'] +# nested_data_list['اپراتور شهرستان'] = serializer.data[x]['state']['city_operator'] +# nested_data_list['تاییدیه استان'] = serializer.data[x]['state']['province_state'] +# nested_data_list['اپراتور استان'] = serializer.data[x]['state']['province_operator'] +# nested_data_list['موبایل اپراتور شهرستان'] = serializer.data[x]['state']['city_operator_mobile'] +# if 'province_operator_mobile' in serializer.data[x]['state'].keys(): +# nested_data_list['موبایل اپراتور استان'] = serializer.data[x]['state'][ +# 'province_operator_mobile'] +# if 'city_operator_date_time_accepted' in serializer.data[x]['state'].keys(): +# nested_data_list['تاریخ تاییدیه شهرستان'] = serializer.data[x]['state'][ +# 'city_operator_date_time_accepted'] +# if 'province_operator_date_time_accepted' in serializer.data[x]['state'].keys(): +# nested_data_list['تاریخ تاییدیه استان'] = serializer.data[x]['state'][ +# 'province_operator_date_time_accepted'] +# nested_data_list['کد سفارش'] = serializer.data[x]['order_code'] +# nested_data_list['سن جوجه ها'] = serializer.data[x]['chicken_age'] +# if 'province_to_killhouse_factor' in serializer.data[x].keys(): +# nested_data_list['وزن کل'] = serializer.data[x]['province_to_killhouse_factor'][ +# 'total_weight'] +# nested_data_list['قیمت کل'] = serializer.data[x]['province_to_killhouse_factor'][ +# 'total_price'] +# nested_data_list['کارمزد'] = serializer.data[x]['province_to_killhouse_factor'][ +# 'factor_fee'] +# nested_data_list['بارکد فاکتور'] = serializer.data[x]['province_to_killhouse_factor'][ +# 'factor_bar_code'] +# nested_data_list['تاریخ فاکتور'] = serializer.data[x]['province_to_killhouse_factor'][ +# 'factor_date'] +# nested_data_list['نام مقصد پرداختی'] = \ +# serializer.data[x]['province_to_killhouse_factor']['bank']['bank_info'] +# nested_data_list['شماره کارت مقصد پرداختی'] = \ +# serializer.data[x]['province_to_killhouse_factor']['bank']['bank_card'] +# nested_data_list['شماره شبا مقصد پرداختی'] = \ +# serializer.data[x]['province_to_killhouse_factor']['bank']['bank_shaba'] +# data_list.append( +# nested_data_list, +# ) +# output = BytesIO() +# workbook = xlsxwriter.Workbook(output) +# worksheet = workbook.add_worksheet() +# for count in range(len(excel_options)): +# worksheet.write(0, count, excel_options[count]) +# +# for item in range(len(data_list)): +# for x in range(len(excel_options)): +# if excel_options[x] in data_list[item].keys(): +# worksheet.write(item + 1, x, data_list[item][excel_options[x]]) +# else: +# worksheet.write(item + 1, x, " ") +# workbook.close() +# output.seek(0) +# +# # create a response +# response = HttpResponse(content_type='application/vnd.ms-excel') +# +# # tell the browser what the file is named +# response['Content-Disposition'] = 'attachment;filename="Reporting.xlsx"' +# +# # put the spreadsheet data into the response +# response.write(output.getvalue()) +# +# # return the response +# return response diff --git a/panel/ReportingPanel/filterset.py b/panel/ReportingPanel/filterset.py new file mode 100644 index 0000000..b14caf0 --- /dev/null +++ b/panel/ReportingPanel/filterset.py @@ -0,0 +1,61 @@ +from url_filter.filtersets import ModelFilterSet + +from authentication.models import SystemUserProfile +from panel.models import ( + PoultryRequest, + KillHouseRequest, + CityOperatorCheckRequest, + ProvinceCheckOperatorRequest, + VetCheckRequest, + VetFarm, + KillHouseVet, + PoultryHatching, Poultry +) + + +class UserProfileFilterSet(ModelFilterSet): + class Meta(object): + model = SystemUserProfile + + +class PoultryFilterSet(ModelFilterSet): + class Meta(object): + model = Poultry + + +class PoultryRequestFilterSet(ModelFilterSet): + class Meta(object): + model = PoultryRequest + + +class KillHouseRequestFilterSet(ModelFilterSet): + class Meta(object): + model = KillHouseRequest + + +class CityOperatorCheckFilterSet(ModelFilterSet): + class Meta(object): + model = CityOperatorCheckRequest + + +class ProvinceOperatorCheckFilterSet(ModelFilterSet): + class Meta(object): + model = ProvinceCheckOperatorRequest + + +class VetOperatorCheckFilterSet(ModelFilterSet): + class Meta(object): + model = VetCheckRequest + + +class PoultryHatchingFilterSet(ModelFilterSet): + class Meta(object): + model = PoultryHatching + +class ProfileFilterSet(ModelFilterSet): + class Meta(object): + model = SystemUserProfile + +class ManagementVetFarmFilterSet(ModelFilterSet): + class Meta(object): + model = VetFarm diff --git a/panel/ReportingPanel/helper.py b/panel/ReportingPanel/helper.py new file mode 100644 index 0000000..d1b0e04 --- /dev/null +++ b/panel/ReportingPanel/helper.py @@ -0,0 +1,173 @@ + +poultry_request_fields = [ + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__national_id', + 'poultry__user__national_code', + 'poultry__address__province__name', + 'poultry__address__city__name', + 'poultry__natinal_id', + 'poultry__unit_name', + 'poultry__gis_code', + 'poultry__operating_licence_capacity', + 'poultry__number_of_halls', + 'poultry__person_type', + 'poultry__economic_code', + 'poultry__system_code', + 'poultry__epidemiological_code', + 'poultry__total_capacity', + 'poultry__licence_number', + 'poultry__health_certificate_number', + 'poultry__number_of_requests', + 'poultry__hatching_date', + 'hatching__quantity', + 'hatching__chicken_breed', + 'poultry__last_party_date', + 'poultry__number_of_incubators', + 'poultry__herd_age_by_day', + 'poultry__herd_age_by_week', + 'poultry__number_of_party', + 'poultry__communication_type', + 'poultry__cooperative', + 'poultry__date_of_register', + 'poultry__unit_status', + 'poultry__samasat_user_code', + 'poultry__incubation_date', + 'poultry__address__breeding_unique_id', + 'order_code', + 'quantity', + 'chicken_breed', + 'Index_weight', + 'user__address__postal_code', + 'user__company' + + # 'bar_code', +] + +user_fields = [ + 'mobile', + 'fullname', + 'first_name', + 'last_name', + 'province__name', + 'city__name', + 'national_code', + 'national_id', +] + +city_operator_fields = [ + 'city_operator_system__user__mobile', + 'city_operator_system__user__fullname', + 'city_operator_system__user__first_name', + 'city_operator_system__user__last_name', + 'city_operator_system__user__national_code', + 'city_operator_system__user__national_id', +] + +province_operator_fields = [ + 'province_operator_system__user__mobile', + 'province_operator_system__user__fullname', + 'province_operator_system__user__first_name', + 'province_operator_system__user__last_name', + 'province_operator_system__user__national_code', + 'province_operator_system__user__national_id', +] + +kill_house_operator_fields = [ + 'killhouse_user__userprofile__mobile', + 'killhouse_user__userprofile__fullname', + 'killhouse_user__userprofile__first_name', + 'killhouse_user__userprofile__last_name', + 'killhouse_user__userprofile__national_code', + 'killhouse_user__userprofile__national_id', + 'killhouse_user__name', + 'killhouse_user__phone', + 'killhouse_user__capacity', + 'capacity', + 'quantity', + 'bar_code', +] + +vet_operator_fields = [ + 'vet__user__mobile', + 'vet__user__fullname', + 'vet__user__first_name', + 'vet__user__last_name', + 'vet__user__national_code', + 'vet__user__national_id', +] + +poultry_hatching_fields = [ + 'quantity', + 'losses', + 'left_over', + 'hall', + 'chicken_breed', + 'period', + 'state' +] + +# new + +poultry_filterset_fields = [ + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__city__name', + 'user__province_name', + 'unit_name', + 'gis_code', + 'operating_licence_capacity', + 'number_of_halls', + 'economic_code', + 'system_code', + 'epidemiological_code', + 'total_capacity', + 'licence_number', + 'health_certificate_number', +] + +poultry_hatching_filterset_fields = [ + 'quantity', + 'losses', + 'left_over', + 'hall', + 'chicken_breed', + 'period', + 'state' +] + +poultry_request_new_fields = [ + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__national_id', + 'poultry__user__national_code', + 'poultry__address__province__name', + 'poultry__address__city__name', + 'poultry__unit_name', + 'order_code', + 'quantity', + 'chicken_breed', + 'Index_weight', + + # 'bar_code', +] + +kill_house_request_filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__user__city__name', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + +] + + + diff --git a/panel/ReportingPanel/models.py b/panel/ReportingPanel/models.py new file mode 100644 index 0000000..e6b0dce --- /dev/null +++ b/panel/ReportingPanel/models.py @@ -0,0 +1,10 @@ +from authentication.models import BaseModel +from django.db import models + + +class SearchFields(BaseModel): + type = models.CharField(max_length=100, null=True) + field_name = models.CharField(max_length=200, null=True) + + def save(self, *args, **kwargs): + super(SearchFields, self).save(*args, **kwargs) diff --git a/panel/ReportingPanel/serializer.py b/panel/ReportingPanel/serializer.py new file mode 100644 index 0000000..8bc4dbc --- /dev/null +++ b/panel/ReportingPanel/serializer.py @@ -0,0 +1,1873 @@ +import datetime + +from django.db.models import Q, Sum, F + +from rest_framework import serializers + +from deposit_percent import wage_percent, carcases_sell +from panel.models import ReportingFieldRoleLimitation, ProvinceKillRequest, KillHousePercentage, \ + KillHouseRequest, KillHouseFreeBarInformation, InternalTransaction, ChainAllocation, KillHouse, WageType, \ + PercentageOfWageType, KillHouseFreeSaleBarInformation, IranProvinces, IranCities, AgeNotificationPoultry, \ + CookieSamasat, HatchingLossManagement +from authentication.serializers import GroupSerializer +from .models import SearchFields + + +# class ReportingPanelSerializer(serializers.ModelSerializer): +# class Meta: +# model = PoultryRequest + + +class ReportingFieldLimitationSerializer(serializers.ModelSerializer): + role_name = GroupSerializer(required=False) + + class Meta: + model = ReportingFieldRoleLimitation + fields = [ + 'role_name', + 'fields' + ] + + def create(self, validated_data): + return ReportingFieldRoleLimitation.objects.create(**validated_data) + + +class SearchFieldsSerializer(serializers.ModelSerializer): + class Meta: + model = SearchFields + fields = ['type', 'field_name'] + + +class HatchingLossManagementSerializer(serializers.ModelSerializer): + class Meta: + model = HatchingLossManagement + fields = [ + 'id', + 'include_total_disease_losses', + 'include_total_flock_destruction', + 'include_total_normal_flock_losses', + 'include_total_force_majeure_losses', + 'include_total_fire_losses' + ] + read_only_fields = ['id'] + + +class DetailsGeneraWageSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['id', 'info'] + + def get_info(self, obj): + real_free_sale_wage = 0 + union_real_free_sale_wage = 0 + company_real_free_sale_wage = 0 + guilds_real_free_sale_wage = 0 + other_real_free_sale_wage = 0 + total_check_wage = 0 + union_wage_percent = 0 + company_wage_percent = 0 + guilds_wage_percent = 0 + other_wage_percent = 0 + wage_type = WageType.objects.filter(en_name='province-kill-request').first() + total_check_wage = wage_type.amount + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + union_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name == 'company': + company_wage_percent = percentage_wage_type.percent / 100 + + elif percentage_wage_type.share_type.en_name == 'guilds': + guilds_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name in ['city', 'wallet']: + pass + else: + other_wage_percent = percentage_wage_type.percent / 100 + + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False) + free_sales_weight = free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + free_sales_wage = free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False) + free_sales_weight = free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + free_sales_wage = free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + union_free_sales = free_sales.filter(union_share__gt=0, trash=False) + union_free_sales_weight = union_free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + union_free_sales_wage = union_free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + company_free_sales = free_sales.filter(company_share__gt=0, trash=False) + company_free_sales_weight = company_free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + company_free_sales_wage = company_free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + guilds_free_sales = free_sales.filter(guilds_share__gt=0, trash=False) + guilds_free_sales_weight = guilds_free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + guilds_free_sales_wage = guilds_free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + other_free_sales = free_sales.filter(other_share__gt=0, trash=False) + other_free_sales_weight = other_free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + other_free_sales_wage = other_free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + if carcases_sell == True: + real_free_sale_wage = (free_sales_weight * total_check_wage) - free_sales_wage if (free_sales_weight * total_check_wage) - free_sales_wage > 0 else 0 + + union_real_free_sale_wage = (union_free_sales_weight * union_wage_percent) - union_free_sales_wage if (union_free_sales_weight * union_wage_percent) - union_free_sales_wage > 0 else 0 + + company_real_free_sale_wage = (company_free_sales_weight * company_wage_percent) - company_free_sales_wage if (company_free_sales_weight * company_wage_percent) - company_free_sales_wage > 0 else 0 + + + guilds_real_free_sale_wage = (guilds_free_sales_weight * guilds_wage_percent) - guilds_free_sales_wage if (guilds_free_sales_weight * guilds_wage_percent) - guilds_free_sales_wage > 0 else 0 + + other_real_free_sale_wage = (other_free_sales_weight * other_wage_percent) - other_free_sales_wage if (other_free_sales_weight * other_wage_percent) - other_free_sales_wage > 0 else 0 + + if obj.killer == True: + killer = True + else: + killer = False + if obj.killer == True and obj.type == 'exclusive': + parent = KillHousePercentage.objects.get(kill_house=obj, trash=False) + killer_type = f'کشتارکن اختصاصی {parent.kill_house_for_killer.name}' + elif obj.killer == True and obj.type == 'public': + killer_type = 'کشتارکن عمومی' + else: + killer_type = 'کشتارگاه' + role = self.context.get('request').GET['role'] + + if self.context.get('request').GET['date1'] != 'null': + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + trash=False, + return_to_province=False, + first_car_allocated_quantity=0, + archive_wage=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).exclude(union_share=0, company_share=0, + guilds_share=0).only( + 'total_killed_weight', 'union_share', 'company_share', + 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + 'company_share', + 'guilds_share', 'total_wage_amount', + 'total_killed_quantity') + + kill_house_requests = KillHouseRequest.objects.filter( + Q(Q(killer=obj) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) | Q(killer=obj)), + archive_wage=False, + trash=False, kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).select_related('province_kill_request').only('accepted_real_weight', + 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', + 'accepted_real_quantity', 'accepted_real_quantity') + + kill_house_requests = kill_house_requests.filter(Q(killer=obj) | Q(killhouse_user=obj)).select_related( + 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity') + + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True).select_related( + 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity') + + free_bars = KillHouseFreeBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, kill_house=obj, + archive_wage=False, + trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount' + ) + + slaughter_transactions = InternalTransaction.objects.filter(date__date__gte=date1, + date__date__lte=date2, + kill_house=obj, status='completed', + trash=False).only('union_share', + 'company_share', + 'guilds_share', 'amount') + + else: + province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=obj, + state__in=('pending', 'accepted'), + trash=False, + return_to_province=False, + first_car_allocated_quantity=0, + archive_wage=False, + ).exclude(union_share=0, company_share=0, + guilds_share=0).only( + 'total_killed_weight', 'union_share', 'company_share', + 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + 'company_share', + 'guilds_share', 'total_wage_amount', + 'total_killed_quantity') + + kill_house_requests = KillHouseRequest.objects.filter( + Q(Q(killer=obj) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) & Q(killhouse_user=obj)) | Q( + Q(killer__isnull=True) | Q(killer=obj)), + archive_wage=False, + trash=False + ).select_related('province_kill_request').only('accepted_real_weight', + 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', + 'accepted_real_quantity', 'accepted_real_quantity') + kill_house_requests = kill_house_requests.filter(Q(killer=obj) | Q(killhouse_user=obj)).select_related( + 'province_kill_request').only( + 'accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity') + + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True).select_related( + 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity') + + free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=obj, archive_wage=False, + trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount' + ) + slaughter_transactions = InternalTransaction.objects.filter( + kill_house=obj, status='completed', + trash=False).only('union_share', 'company_share', 'guilds_share', 'amount') + + province_kill_requests_total_wage = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_wage_amount'))[ + 'total'] or 0 + if wage_percent > 0: + province_kill_requests_total_wage -= province_kill_requests_total_wage * wage_percent + freezing_province_kill_request_total_wage = \ + freezing_province_kill_requests.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + kill_house_reqest_total_wage = \ + kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + if wage_percent > 0: + kill_house_reqest_total_wage -= kill_house_reqest_total_wage * wage_percent + freezing_kill_house_reqest_total_wage = \ + freezing_kill_house_requests.aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + + free_bars_live_total_wage = free_bars_live.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + + free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_wage = free_bars_carcases_total_wage + kill_house_reqest_total_wage + \ + freezing_kill_house_reqest_total_wage + province_kill_requests_total_wage + \ + freezing_province_kill_request_total_wage + free_bars_live_total_wage + + total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + union_province_kill_request_total_wage = \ + province_kill_requests.filter(union_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('union_share'))[ + 'total'] or 0 + union_province_kill_request_kill_house_requests_total_wage = \ + kill_house_requests.filter(province_kill_request__union_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + if wage_percent > 0: + union_province_kill_request_kill_house_requests_total_wage -= union_province_kill_request_kill_house_requests_total_wage * wage_percent + union_province_kill_request_total_wage += union_province_kill_request_kill_house_requests_total_wage + + freezing_union_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + freezing_union_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + + union_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + union_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_paid_wage = \ + slaughter_transactions.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_wage = union_province_kill_request_total_wage + freezing_union_province_kill_request_total_wage + union_kill_house_free_live_bar_total_wage + union_kill_house_free_carcases_bar_total_wage + union_total_unpaid_wage = union_total_wage - union_total_paid_wage + + company_province_kill_request_total_wage = \ + province_kill_requests.filter(company_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('company_share'))[ + 'total'] or 0 + if wage_percent > 0: + company_province_kill_request_total_wage -= company_province_kill_request_total_wage * wage_percent + company_province_kill_request_kill_house_requests_total_wage = \ + kill_house_requests.filter(province_kill_request__company_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + if wage_percent > 0: + company_province_kill_request_kill_house_requests_total_wage -= company_province_kill_request_kill_house_requests_total_wage * wage_percent + + company_province_kill_request_total_wage += company_province_kill_request_kill_house_requests_total_wage + freezing_company_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + + company_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + + company_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_paid_wage = \ + slaughter_transactions.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_wage = company_province_kill_request_total_wage + freezing_company_province_kill_request_total_wage + company_kill_house_free_live_bar_total_wage + company_kill_house_free_carcases_bar_total_wage + company_total_unpaid_wage = company_total_wage - company_total_paid_wage + + guilds_province_kill_request_total_wage = \ + province_kill_requests.filter(guilds_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('guilds_share'))[ + 'total'] or 0 + if wage_percent > 0: + guilds_province_kill_request_total_wage -= guilds_province_kill_request_total_wage * wage_percent + + guilds_province_kill_request_kill_house_requests_total_wage = \ + kill_house_requests.filter(province_kill_request__guilds_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + + if wage_percent > 0: + guilds_province_kill_request_kill_house_requests_total_wage -= guilds_province_kill_request_kill_house_requests_total_wage * wage_percent + + guilds_province_kill_request_total_wage += guilds_province_kill_request_kill_house_requests_total_wage + freezing_guilds_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + + guilds_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + + guilds_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_total_paid_wage = \ + slaughter_transactions.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + + accepted_real_weight = \ + kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + if wage_percent > 0: + accepted_real_weight -= accepted_real_weight * wage_percent + total_killed_weights = \ + province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + + if wage_percent > 0: + total_killed_weights -= total_killed_weights * wage_percent + total_killed_quantitys = \ + province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + accepted_real_quantity = \ + kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + + guilds_total_wage = guilds_province_kill_request_total_wage + freezing_guilds_province_kill_request_total_wage + guilds_kill_house_free_live_bar_total_wage + guilds_kill_house_free_carcases_bar_total_wage + guilds_total_unpaid_wage = guilds_total_wage - guilds_total_paid_wage + + other_province_kill_request_total_wage = \ + province_kill_requests.filter(other_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('other_share'))[ + 'total'] or 0 + if wage_percent > 0: + other_province_kill_request_total_wage -= other_province_kill_request_total_wage * wage_percent + + other_province_kill_request_kill_house_requests_total_wage = \ + kill_house_requests.filter(province_kill_request__other_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__other_share_percent') / 100)))[ + 'total'] or 0 + if wage_percent > 0: + other_province_kill_request_kill_house_requests_total_wage -= other_province_kill_request_kill_house_requests_total_wage * wage_percent + other_province_kill_request_total_wage += other_province_kill_request_kill_house_requests_total_wage + freezing_other_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(other_share__gt=0).aggregate(total=Sum('other_share'))[ + 'total'] or 0 + freezing_other_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__other_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__other_share_percent') / 100)))[ + 'total'] or 0 + + other_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', other_share__gt=0).aggregate(total=Sum('other_share'))[ + 'total'] or 0 + + other_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', other_share__gt=0).aggregate(total=Sum('other_share'))[ + 'total'] or 0 + other_total_paid_wage = \ + slaughter_transactions.filter(other_share__gt=0).aggregate(total=Sum('other_share'))[ + 'total'] or 0 + other_total_wage = other_province_kill_request_total_wage + freezing_other_province_kill_request_total_wage + other_kill_house_free_live_bar_total_wage + other_kill_house_free_carcases_bar_total_wage + other_total_unpaid_wage = other_total_wage - other_total_paid_wage + not_paied = total_wage - total_paid_wage + values_list3 = { + "type": killer_type, + "killer": killer, + "kill_house_name": obj.name, + "fullname": obj.kill_house_operator.user.fullname, + "mobile": obj.kill_house_operator.user.mobile, + "city": obj.kill_house_operator.user.city.name, + "len_province_kill_requests": len(province_kill_requests), + "total_killed_quantity": total_killed_quantitys, + "total_killed_weight": total_killed_weights, + "len_kill_house_requests": len(kill_house_requests), + "accepted_real_quantity": accepted_real_quantity, + "accepted_real_weight": accepted_real_weight, + "union_total_wage": union_total_wage - union_real_free_sale_wage if (union_total_wage - union_real_free_sale_wage) > 0 else 0, + "union_total_unpaid_wage": union_total_unpaid_wage, + "union_total_paid_wage": union_total_paid_wage, + } + + if role == 'ProvinceOperator': + pass + elif role == 'AdminX': + values_list3.update({ + "off": obj.off, + "len_slaughter_transactions": len(slaughter_transactions), + "total_wage": total_wage - real_free_sale_wage if (total_wage - real_free_sale_wage) > 0 else 0 , + "company_total_wage": company_total_wage - company_real_free_sale_wage if (company_total_wage - company_real_free_sale_wage) > 0 else 0, + "union_total_wage": union_total_wage - union_real_free_sale_wage if (union_total_wage - union_real_free_sale_wage) >0 else 0, + "guilds_total_wage": guilds_total_wage - guilds_real_free_sale_wage if (guilds_total_wage - guilds_real_free_sale_wage) > 0 else 0, + "other_total_wage": other_total_wage - other_real_free_sale_wage if (other_total_wage - other_real_free_sale_wage) > 0 else 0, + "not_paied": not_paied - obj.off, + "company_total_unpaid_wage": company_total_unpaid_wage, + "union_total_unpaid_wage": union_total_unpaid_wage, + "guilds_total_unpaid_wage": guilds_total_unpaid_wage, + "other_total_unpaid_wage": other_total_unpaid_wage, + "total_paid_wage": total_paid_wage, + "union_total_paid_wage": union_total_paid_wage, + "company_total_paid_wage": company_total_paid_wage, + "guilds_total_paid_wage": guilds_total_paid_wage, + "other_total_paid_wage": other_total_paid_wage, + }) + else: + values_list3.update({ + "off": obj.off, + "total_wage": total_wage - real_free_sale_wage if (total_wage - real_free_sale_wage) > 0 else 0 , + "company_total_wage": company_total_wage - company_real_free_sale_wage if (company_total_wage - company_real_free_sale_wage) > 0 else 0, + "len_slaughter_transactions": len(slaughter_transactions), + "union_total_wage": union_total_wage - union_real_free_sale_wage if (union_total_wage - union_real_free_sale_wage) >0 else 0, + "guilds_total_wage": guilds_total_wage - guilds_real_free_sale_wage if (guilds_total_wage - guilds_real_free_sale_wage) > 0 else 0, + # "not_paied": not_paied - other_total_unpaid_wage, + "not_paied": not_paied - obj.off, + "company_total_unpaid_wage": company_total_unpaid_wage, + "union_total_unpaid_wage": union_total_unpaid_wage, + "guilds_total_unpaid_wage": guilds_total_unpaid_wage, + "total_paid_wage": total_paid_wage , + "company_total_paid_wage": company_total_paid_wage, + "union_total_paid_wage": union_total_paid_wage, + "guilds_total_paid_wage": guilds_total_paid_wage, + }) + + return values_list3 + + +class DashboardDetailsGeneraWageSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['id', 'info'] + + def get_info(self, obj): + role = self.context.get('request').GET['role'] + total_weight = 0 + total_wage = 0 + total_paid_wage = 0 + union_total_paid_wage = 0 + + union_chain_allocation_total_wage = 0 + + company_total_paid_wage = 0 + + company_chain_allocation_total_wage = 0 + + guilds_total_paid_wage = 0 + + guilds_chain_allocation_total_wage = 0 + + other_total_weight = 0 + other_total_wage = 0 + other_total_paid_wage = 0 + other_chain_allocation_total_wage = 0 + + other_chain_allocation_total_weight = 0 + real_free_sale_wage = 0 + union_real_free_sale_wage = 0 + company_real_free_sale_wage = 0 + guilds_real_free_sale_wage = 0 + other_real_free_sale_wage = 0 + total_check_wage = 0 + union_wage_percent = 0 + company_wage_percent = 0 + guilds_wage_percent = 0 + other_wage_percent = 0 + wage_type = WageType.objects.filter(en_name='province-kill-request').first() + total_check_wage = wage_type.amount + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + union_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name == 'company': + company_wage_percent = percentage_wage_type.percent / 100 + + elif percentage_wage_type.share_type.en_name == 'guilds': + guilds_wage_percent = percentage_wage_type.percent / 100 + elif percentage_wage_type.share_type.en_name in ['city', 'wallet']: + pass + else: + other_wage_percent = percentage_wage_type.percent / 100 + + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False) + free_sales_weight = free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + free_sales_wage = free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False) + free_sales_weight = free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + free_sales_wage = free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + union_free_sales = free_sales.filter(union_share__gt=0, trash=False) + union_free_sales_weight = union_free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + union_free_sales_wage = union_free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + company_free_sales = free_sales.filter(company_share__gt=0, trash=False) + company_free_sales_weight = company_free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + company_free_sales_wage = company_free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + guilds_free_sales = free_sales.filter(guilds_share__gt=0, trash=False) + guilds_free_sales_weight = guilds_free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + guilds_free_sales_wage = guilds_free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + other_free_sales = free_sales.filter(other_share__gt=0, trash=False) + other_free_sales_weight = other_free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0 + + other_free_sales_wage = other_free_sales.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + if carcases_sell == True: + real_free_sale_wage = (free_sales_weight * total_check_wage) - free_sales_wage if (free_sales_weight * total_check_wage) - free_sales_wage > 0 else 0 + + union_real_free_sale_wage = (union_free_sales_weight * union_wage_percent) - union_free_sales_wage if (union_free_sales_weight * union_wage_percent) - union_free_sales_wage > 0 else 0 + + company_real_free_sale_wage = (company_free_sales_weight * company_wage_percent) - company_free_sales_wage if (company_free_sales_weight * company_wage_percent) - company_free_sales_wage > 0 else 0 + + + guilds_real_free_sale_wage = (guilds_free_sales_weight * guilds_wage_percent) - guilds_free_sales_wage if (guilds_free_sales_weight * guilds_wage_percent) - guilds_free_sales_wage > 0 else 0 + + other_real_free_sale_wage = (other_free_sales_weight * other_wage_percent) - other_free_sales_wage if (other_free_sales_weight * other_wage_percent) - other_free_sales_wage > 0 else 0 + + + if self.context.get('request').GET['date1'] != 'null': + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + province_kill_requests = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), + trash=False, + return_to_province=False, + first_car_allocated_quantity=0, + archive_wage=False, kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).exclude(union_share=0, company_share=0, + guilds_share=0).only('total_killed_weight', 'union_share', 'company_share', + 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + 'company_share', + 'guilds_share', 'total_wage_amount', + 'total_killed_quantity') + + kill_house_requests = KillHouseRequest.objects.filter( + archive_wage=False, + trash=False, kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).select_related('province_kill_request').only('accepted_real_weight', + 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', + 'accepted_real_quantity').select_related( + 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity', + 'accepted_real_quantity') + + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True).select_related( + 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity') + + free_bars = KillHouseFreeBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, archive_wage=False, + trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount' + ) + + slaughter_transactions = InternalTransaction.objects.filter(date__date__gte=date1, + date__date__lte=date2, + status='completed', kill_house__isnull=False, + trash=False).only('union_share', + 'company_share', + 'guilds_share', 'amount') + + + else: + province_kill_requests = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), + trash=False, + return_to_province=False, + first_car_allocated_quantity=0, + archive_wage=False, + ).exclude(union_share=0, company_share=0, + guilds_share=0).only( + 'total_killed_weight', 'union_share', 'company_share', + 'guilds_share', 'total_wage_amount', 'total_killed_quantity') + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + 'company_share', + 'guilds_share', 'total_wage_amount', + 'total_killed_quantity') + + kill_house_requests = KillHouseRequest.objects.filter( + archive_wage=False, + trash=False + ).select_related('province_kill_request').only( + 'accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity').only('accepted_real_weight', + 'province_kill_request__union_share_percent', + 'province_kill_request__wage', + 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', + 'accepted_real_quantity', + 'accepted_real_quantity') + + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True).select_related( + 'province_kill_request').only('accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity') + + free_bars = KillHouseFreeBarInformation.objects.filter(archive_wage=False, + trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount') + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + 'total_wage_amount' + ) + slaughter_transactions = InternalTransaction.objects.filter( + kill_house__isnull=False, status='completed', + trash=False).only('union_share', 'company_share', 'guilds_share', 'amount') + + province_kill_requests_total_wage = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_wage_amount'))[ + 'total'] or 0 + if wage_percent > 0: + province_kill_requests_total_wage -= province_kill_requests_total_wage * wage_percent + freezing_province_kill_request_total_wage = \ + freezing_province_kill_requests.aggregate(total=Sum('total_wage_amount'))['total'] or 0 + + total_wage += province_kill_requests_total_wage + freezing_province_kill_request_total_wage + province_kill_requests_total_weight = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + if wage_percent > 0: + province_kill_requests_total_weight -= province_kill_requests_total_weight * wage_percent + freezing_province_kill_request_total_weight = \ + freezing_province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + total_weight += province_kill_requests_total_weight + freezing_province_kill_request_total_weight + kill_house_reqest_total_wage = \ + kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + if wage_percent > 0: + kill_house_reqest_total_wage -= kill_house_reqest_total_wage * wage_percent + freezing_kill_house_reqest_total_wage = \ + freezing_kill_house_requests.aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + total_wage += kill_house_reqest_total_wage + freezing_kill_house_reqest_total_wage + + kill_house_reqest_total_weight = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + if wage_percent > 0: + kill_house_reqest_total_weight -= kill_house_reqest_total_weight * wage_percent + freezing_kill_house_reqest_total_weight = \ + freezing_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + total_weight += kill_house_reqest_total_weight + freezing_kill_house_reqest_total_weight + + free_bars_live_total_wage = free_bars_live.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_wage += free_bars_live_total_wage + free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + total_weight += free_bars_live_total_weight + free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum('total_wage_amount'))[ + 'total'] or 0 + total_wage += free_bars_carcases_total_wage + free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_weight += free_bars_carcases_total_weight + + total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[ + 'total'] or 0 + union_province_kill_request_total_weight = \ + province_kill_requests.filter(union_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + if wage_percent > 0: + union_province_kill_request_total_weight -= union_province_kill_request_total_weight * wage_percent + freezing_union_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(union_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + union_province_kill_request_kill_house_requests_total_weight = \ + kill_house_requests.filter(province_kill_request__union_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + if wage_percent > 0: + union_province_kill_request_kill_house_requests_total_weight -= union_province_kill_request_kill_house_requests_total_weight * wage_percent + union_province_kill_request_total_weight += union_province_kill_request_kill_house_requests_total_weight + + freezing_union_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + union_province_kill_request_total_wage = \ + province_kill_requests.filter(union_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('union_share'))[ + 'total'] or 0 + if wage_percent > 0: + union_province_kill_request_total_wage -= union_province_kill_request_total_wage * wage_percent + + union_province_kill_request_kill_house_requests_total_wage = \ + kill_house_requests.filter(province_kill_request__union_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + if wage_percent > 0: + union_province_kill_request_kill_house_requests_total_wage -= union_province_kill_request_kill_house_requests_total_wage * wage_percent + union_province_kill_request_total_wage += union_province_kill_request_kill_house_requests_total_wage + + freezing_union_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + freezing_union_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + + union_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + union_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_paid_wage += \ + slaughter_transactions.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_wage = union_province_kill_request_total_wage + freezing_union_province_kill_request_total_wage + union_chain_allocation_total_wage + union_kill_house_free_live_bar_total_wage + union_kill_house_free_carcases_bar_total_wage + union_total_unpaid_wage = union_total_wage - union_total_paid_wage + + company_province_kill_request_total_weight = \ + province_kill_requests.filter(company_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + + if wage_percent > 0: + company_province_kill_request_total_weight -= company_province_kill_request_total_weight * wage_percent + + company_province_kill_request_kill_house_requests_total_weight = \ + kill_house_requests.filter(province_kill_request__company_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + if wage_percent > 0: + company_province_kill_request_kill_house_requests_total_weight -= company_province_kill_request_kill_house_requests_total_weight * wage_percent + company_province_kill_request_total_weight += company_province_kill_request_kill_house_requests_total_weight + freezing_company_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(company_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + company_province_kill_request_total_wage = \ + province_kill_requests.filter(company_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('company_share'))[ + 'total'] or 0 + if wage_percent > 0: + company_province_kill_request_total_wage -= company_province_kill_request_total_wage * wage_percent + + company_province_kill_request_kill_house_requests_total_wage = \ + kill_house_requests.filter(province_kill_request__company_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + if wage_percent > 0: + company_province_kill_request_kill_house_requests_total_wage -= company_province_kill_request_kill_house_requests_total_wage * wage_percent + company_province_kill_request_total_wage += company_province_kill_request_kill_house_requests_total_wage + freezing_company_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + + company_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + + company_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_paid_wage += \ + slaughter_transactions.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_wage = company_province_kill_request_total_wage + freezing_company_province_kill_request_total_wage + company_chain_allocation_total_wage + company_kill_house_free_live_bar_total_wage + company_kill_house_free_carcases_bar_total_wage + company_total_unpaid_wage = company_total_wage - company_total_paid_wage + + guilds_province_kill_request_total_weight = \ + province_kill_requests.filter(guilds_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + if wage_percent > 0: + guilds_province_kill_request_total_weight -= guilds_province_kill_request_total_weight * wage_percent + + guilds_province_kill_request_kil_house_requests_total_weight = \ + kill_house_requests.filter(province_kill_request__guilds_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + if wage_percent > 0: + guilds_province_kill_request_kil_house_requests_total_weight -= guilds_province_kill_request_kil_house_requests_total_weight * wage_percent + + guilds_province_kill_request_total_weight += guilds_province_kill_request_kil_house_requests_total_weight + + freezing_guilds_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + guilds_province_kill_request_total_wage = \ + province_kill_requests.filter(guilds_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('guilds_share'))[ + 'total'] or 0 + if wage_percent > 0: + guilds_province_kill_request_total_wage -= guilds_province_kill_request_total_wage * wage_percent + guilds_province_kill_request_kill_house_requests_total_wage = \ + kill_house_requests.filter(province_kill_request__guilds_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + if wage_percent > 0: + guilds_province_kill_request_kill_house_requests_total_wage -= guilds_province_kill_request_kill_house_requests_total_wage * wage_percent + guilds_province_kill_request_total_wage += guilds_province_kill_request_kill_house_requests_total_wage + freezing_guilds_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + + guilds_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + + guilds_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_total_paid_wage += \ + slaughter_transactions.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + + accepted_real_weight = \ + kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + total_killed_weights = \ + province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + total_killed_quantitys = \ + province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + accepted_real_quantity = \ + kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + + guilds_total_wage = guilds_province_kill_request_total_wage + freezing_guilds_province_kill_request_total_wage + guilds_chain_allocation_total_wage + guilds_kill_house_free_live_bar_total_wage + guilds_kill_house_free_carcases_bar_total_wage + guilds_total_unpaid_wage = guilds_total_wage - guilds_total_paid_wage + + other_province_kill_request_total_weight = \ + province_kill_requests.filter(other_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + + if wage_percent > 0: + other_province_kill_request_total_weight -= other_province_kill_request_total_weight * wage_percent + + other_province_kill_request_kill_house_requests_total_weight = \ + kill_house_requests.filter(province_kill_request__other_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + if wage_percent > 0: + other_province_kill_request_kill_house_requests_total_weight -= other_province_kill_request_kill_house_requests_total_weight * wage_percent + + other_province_kill_request_total_weight += other_province_kill_request_kill_house_requests_total_weight + + freezing_other_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(other_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_other_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__other_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + other_province_kill_request_total_wage = \ + province_kill_requests.filter(other_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('other_share'))[ + 'total'] or 0 + if wage_percent > 0: + other_province_kill_request_total_wage -= other_province_kill_request_total_wage * wage_percent + + other_province_kill_request_kill_house_requests_total_wage = \ + kill_house_requests.filter(province_kill_request__other_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__other_share_percent') / 100)))[ + 'total'] or 0 + if wage_percent > 0: + other_province_kill_request_kill_house_requests_total_wage -= other_province_kill_request_kill_house_requests_total_wage * wage_percent + other_province_kill_request_total_wage += other_province_kill_request_kill_house_requests_total_wage + freezing_other_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(other_share__gt=0).aggregate(total=Sum('other_share'))[ + 'total'] or 0 + freezing_other_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__other_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__other_share_percent') / 100)))[ + 'total'] or 0 + other_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', other_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + other_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', other_share__gt=0).aggregate(total=Sum('other_share'))[ + 'total'] or 0 + + other_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', other_share__gt=0).aggregate( + total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + other_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', other_share__gt=0).aggregate(total=Sum('other_share'))[ + 'total'] or 0 + other_total_paid_wage += \ + slaughter_transactions.filter(other_share__gt=0).aggregate(total=Sum('other_share'))[ + 'total'] or 0 + + other_total_weight = other_province_kill_request_total_weight + freezing_other_province_kill_request_total_weight + other_chain_allocation_total_weight + other_kill_house_free_live_bar_total_weight + other_kill_house_free_carcases_bar_total_weight + other_total_wage = other_province_kill_request_total_wage + freezing_other_province_kill_request_total_wage + other_chain_allocation_total_wage + other_kill_house_free_live_bar_total_wage + other_kill_house_free_carcases_bar_total_wage + other_total_unpaid_wage = other_total_wage - other_total_paid_wage + kill_houses = KillHouse.objects.filter(trash=False, + id__in=province_kill_requests.values_list('killhouse_user', flat=True)) + total_off = kill_houses.aggregate(total=Sum('off'))[ + 'total'] or 0 + + not_paied = total_wage - total_paid_wage + + if role == 'ProvinceOperator': + values_list3 = { + "len_province_kill_requests": len(province_kill_requests), + "total_killed_quantity": total_killed_quantitys, + "total_killed_weight": total_killed_weights, + "len_kill_house_requests": len(kill_house_requests), + "accepted_real_quantity": accepted_real_quantity, + "accepted_real_weight": accepted_real_weight, + "union_total_wage": union_total_wage - union_real_free_sale_wage if (union_total_wage - union_real_free_sale_wage) > 0 else 0, + "union_total_unpaid_wage": union_total_unpaid_wage, + "union_total_paid_wage": union_total_paid_wage, + + } + return values_list3 + elif role == 'AdminX': + values_list3 = { + "len_province_kill_requests": len(province_kill_requests), + "total_killed_quantity": total_killed_quantitys, + "total_killed_weight": total_killed_weights, + "len_kill_house_requests": len(kill_house_requests), + "accepted_real_quantity": accepted_real_quantity, + "accepted_real_weight": accepted_real_weight, + "len_slaughter_transactions": len(slaughter_transactions), + "total_wage": total_wage - real_free_sale_wage if (total_wage - real_free_sale_wage) > 0 else 0, + "company_total_wage": company_total_wage - company_real_free_sale_wage if (company_total_wage - company_real_free_sale_wage) > 0 else 0 , + "union_total_wage": union_total_wage - union_real_free_sale_wage if (union_total_wage - union_real_free_sale_wage) > 0 else 0, + "guilds_total_wage": guilds_total_wage - guilds_real_free_sale_wage if (guilds_total_wage - guilds_real_free_sale_wage) > 0 else 0, + "other_total_wage": other_total_wage - other_real_free_sale_wage if (other_total_wage - other_real_free_sale_wage) > 0 else 0, + "not_paied": not_paied - total_off, + "company_total_unpaid_wage": company_total_unpaid_wage, + "union_total_unpaid_wage": union_total_unpaid_wage, + "guilds_total_unpaid_wage": guilds_total_unpaid_wage, + "other_total_unpaid_wage": other_total_unpaid_wage, + "total_paid_wage": total_paid_wage, + "union_total_paid_wage": union_total_paid_wage, + "company_total_paid_wage": company_total_paid_wage, + "guilds_total_paid_wage": guilds_total_paid_wage, + "other_total_paid_wage": other_total_paid_wage, + "total_off": total_off, + + } + return values_list3 + else: + values_list3 = { + "len_province_kill_requests": len(province_kill_requests), + "total_killed_quantity": total_killed_quantitys, + "total_killed_weight": total_killed_weights, + "len_kill_house_requests": len(kill_house_requests), + "accepted_real_quantity": accepted_real_quantity, + "accepted_real_weight": accepted_real_weight, + "len_slaughter_transactions": len(slaughter_transactions), + "total_wage": total_wage - real_free_sale_wage if (total_wage - real_free_sale_wage) > 0 else 0, + "company_total_wage": company_total_wage - company_real_free_sale_wage if (company_total_wage - company_real_free_sale_wage) > 0 else 0, + "union_total_wage": union_total_wage - union_real_free_sale_wage if (union_total_wage - union_real_free_sale_wage) > 0 else 0, + "guilds_total_wage": guilds_total_wage - guilds_real_free_sale_wage if (guilds_total_wage - guilds_real_free_sale_wage) > 0 else 0, + "not_paied": not_paied - total_off, + "company_total_unpaid_wage": company_total_unpaid_wage, + "union_total_unpaid_wage": union_total_unpaid_wage, + "guilds_total_unpaid_wage": guilds_total_unpaid_wage, + "total_paid_wage": total_paid_wage, + "union_total_paid_wage": union_total_paid_wage, + "company_total_paid_wage": company_total_paid_wage, + "guilds_total_paid_wage": guilds_total_paid_wage, + "total_off": total_off, + + } + return values_list3 + + +class NewDetailsGeneraWageSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = KillHouse + fields = ['id', 'info'] + + def get_info(self, obj): + request = self.context.get('request') + date1, date2 = self.parse_dates(request) + role = request.GET.get('role') + + province_kill_requests_filters = self.get_province_kill_requests_filters(obj, date1, date2) + kill_house_requests_filters = self.get_kill_house_requests_filters(obj, date1, date2) + free_bars_filters = self.get_free_bars_filters(obj, date1, date2) + slaughter_transactions_filters = self.get_slaughter_transactions_filters(obj, date1, date2) + province_kill_requests = self.filter_province_kill_requests(province_kill_requests_filters) + kill_house_requests = self.filter_kill_house_requests(kill_house_requests_filters, obj) + free_bars = self.filter_free_bars(free_bars_filters) + slaughter_transactions = self.filter_slaughter_transactions(slaughter_transactions_filters) + + wage_data = self.calculate_wage_data(obj, province_kill_requests, kill_house_requests, free_bars, + slaughter_transactions) + basic_info = self.get_basic_info(obj, province_kill_requests, kill_house_requests, free_bars, + slaughter_transactions, wage_data) + + return self.prepare_info(role, obj, basic_info, slaughter_transactions, wage_data) + + def parse_dates(self, request): + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + + if date1 != 'null' and date2 != 'null': + date1 = datetime.datetime.strptime(date1, '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(date2, '%Y-%m-%d').date() + else: + date1 = date2 = None + return date1, date2 + + def get_province_kill_requests_filters(self, obj, date1, date2): + filters = { + 'killhouse_user': obj, + 'state__in': ('pending', 'accepted'), + 'trash': False, + 'return_to_province': False, + 'first_car_allocated_quantity': 0, + 'archive_wage': False + } + if date1 and date2: + filters.update({ + 'kill_request__recive_date__date__gte': date1, + 'kill_request__recive_date__date__lte': date2, + }) + return filters + + def get_kill_house_requests_filters(self, obj, date1, date2): + filters = Q( + (Q(killer=obj) & Q(killhouse_user=obj)) | + Q(killer__isnull=True, killhouse_user=obj) | + Q(killer__isnull=True) | Q(killer=obj) + ) + filters &= Q(archive_wage=False, trash=False) + if date1 and date2: + filters &= Q(kill_request__recive_date__date__gte=date1) + filters &= Q(kill_request__recive_date__date__lte=date2) + return filters + + def get_free_bars_filters(self, obj, date1, date2): + filters = { + 'kill_house': obj, + 'trash': False, + 'archive_wage': False + } + if date1 and date2: + filters.update({ + 'date__date__gte': date1, + 'date__date__lte': date2, + }) + return filters + + def get_slaughter_transactions_filters(self, obj, date1, date2): + filters = { + 'kill_house': obj, + 'trash': False, + 'status': 'completed', + } + if date1 and date2: + filters.update({ + 'date__date__gte': date1, + 'date__date__lte': date2, + }) + return filters + + def filter_province_kill_requests(self, filters): + return ProvinceKillRequest.objects.filter(**filters).exclude( + union_share=0, company_share=0, guilds_share=0 + ).only( + 'total_killed_weight', 'union_share', 'company_share', + 'guilds_share', 'total_wage_amount', 'total_killed_quantity' + ) + + def filter_kill_house_requests(self, filters, obj): + return KillHouseRequest.objects.filter(filters).select_related( + 'province_kill_request' + ).only( + 'accepted_real_weight', 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent', 'accepted_real_quantity' + ).filter( + Q(killer=obj) | Q(killhouse_user=obj) + ) + + def filter_free_bars(self, filters): + return KillHouseFreeBarInformation.objects.filter(**filters).only( + 'live_weight', 'union_share', 'weight_of_carcasses', + 'company_share', 'guilds_share', 'total_wage_amount' + ) + + def filter_slaughter_transactions(self, filters): + return InternalTransaction.objects.filter(**filters).only( + 'union_share', 'company_share', 'guilds_share', 'amount' + ) + + def calculate_wage_data(self, obj, province_kill_requests, kill_house_requests, free_bars, slaughter_transactions): + def sum_field(queryset, field): + return queryset.aggregate(total=Sum(field))['total'] or 0 + + def calculate_wage(queryset, weight_field, percent_field): + return queryset.aggregate( + total=Sum(F(weight_field) * F(percent_field) / 100) + )['total'] or 0 + + wage_data = { + 'province_kill_requests_total_wage': sum_field(province_kill_requests, 'total_wage_amount'), + 'kill_house_requests_total_wage': sum_field(kill_house_requests, + F('accepted_real_weight') * F('province_kill_request__wage')), + 'free_bars_live_total_wage': sum_field(free_bars.filter(buy_type='live'), 'total_wage_amount'), + 'free_bars_carcases_total_wage': sum_field(free_bars.filter(buy_type='carcass'), 'total_wage_amount'), + 'total_paid_wage': sum_field(slaughter_transactions, 'amount'), + 'union_total_paid_wage': sum_field(slaughter_transactions, 'union_share'), + 'company_total_paid_wage': sum_field(slaughter_transactions, 'company_share'), + 'guilds_total_paid_wage': sum_field(slaughter_transactions, 'guilds_share'), + 'union_total_wage': calculate_wage(kill_house_requests, 'accepted_real_weight', + 'province_kill_request__union_share_percent') + sum_field( + province_kill_requests, 'union_share') + sum_field(free_bars, 'union_share'), + 'company_total_wage': calculate_wage(kill_house_requests, 'accepted_real_weight', + 'province_kill_request__company_share_percent') + sum_field( + province_kill_requests, 'company_share') + sum_field(free_bars, 'company_share'), + 'guilds_total_wage': calculate_wage(kill_house_requests, 'accepted_real_weight', + 'province_kill_request__guilds_share_percent') + sum_field( + province_kill_requests, 'guilds_share') + sum_field(free_bars, 'guilds_share'), + } + + wage_data['total_wage'] = sum(wage_data[key] for key in wage_data if + key in ['province_kill_requests_total_wage', 'kill_house_requests_total_wage', + 'free_bars_live_total_wage', 'free_bars_carcases_total_wage']) + wage_data['not_paied'] = wage_data['total_wage'] - (wage_data['total_paid_wage'] + obj.off) + wage_data['union_total_unpaid_wage'] = wage_data['union_total_wage'] - wage_data['union_total_paid_wage'] + wage_data['company_total_unpaid_wage'] = wage_data['company_total_wage'] - wage_data['company_total_paid_wage'] + wage_data['guilds_total_unpaid_wage'] = wage_data['guilds_total_wage'] - wage_data['guilds_total_paid_wage'] + + return wage_data + + def get_basic_info(self, obj, province_kill_requests, kill_house_requests, free_bars, slaughter_transactions, + wage_data): + def sum_field(queryset, field): + return queryset.aggregate(total=Sum(field))['total'] or 0 + + return { + "type": self.get_killer_type(obj), + "killer": obj.killer, + "kill_house_name": obj.name, + "fullname": obj.kill_house_operator.user.fullname, + "mobile": obj.kill_house_operator.user.mobile, + "city": obj.kill_house_operator.user.city.name, + "len_province_kill_requests": len(province_kill_requests), + "total_killed_quantity": sum_field(province_kill_requests, 'total_killed_quantity'), + "total_killed_weight": sum_field(province_kill_requests, 'total_killed_weight'), + "len_kill_house_requests": len(kill_house_requests), + "len_slaughter_transactions": len(slaughter_transactions), + "accepted_real_quantity": sum_field(kill_house_requests, 'accepted_real_quantity'), + "accepted_real_weight": sum_field(kill_house_requests, 'accepted_real_weight'), + "free_bar_live_quantity": sum_field(free_bars.filter(buy_type='live'), 'quantity'), + "free_bar_live_weight": sum_field(free_bars.filter(buy_type='live'), 'live_weight'), + "free_bar_carcasses_quantity": sum_field(free_bars.filter(buy_type='carcass'), 'number_of_carcasses'), + "free_bar_carcasses_weight": sum_field(free_bars.filter(buy_type='carcass'), 'weight_of_carcasses'), + "union_total_wage": wage_data['union_total_wage'], + "union_total_unpaid_wage": wage_data['union_total_unpaid_wage'], + "union_total_paid_wage": wage_data['total_paid_wage'], + } + + def get_killer_type(self, obj): + if obj.killer: + if obj.type == 'exclusive': + parent = KillHousePercentage.objects.get(kill_house=obj, trash=False) + return f'کشتارکن اختصاصی {parent.kill_house_for_killer.name}' + elif obj.type == 'public': + return 'کشتارکن عمومی' + return 'کشتارگاه' + + def prepare_info(self, role, obj, basic_info, slaughter_transactions, wage_data): + # def sum_field(queryset, field): + # return queryset.aggregate(total=Sum(field))['total'] or 0 + + if role == 'ProvinceOperator': + return basic_info + elif role == 'AdminX': + admin_info = { + "off": obj.off, + # "free_bars_live_weight": sum_field( + # KillHouseFreeBarInformation.objects.filter(kill_house=obj, trash=False, buy_type='live'), + # 'live_weight'), + # "free_bars_carcasses_weight": sum_field( + # KillHouseFreeBarInformation.objects.filter(kill_house=obj, trash=False, buy_type='carcass'), + # 'weight_of_carcasses'), + **wage_data + } + return {**basic_info, **admin_info} + return {} + + +class GenaeralWageSerailizer(serializers.ModelSerializer): + general = serializers.SerializerMethodField('get_general') + + class Meta: + model = ProvinceKillRequest + fields = ['key', 'general'] + + def get_general(self, province_kill_requests): + type = 'total_wage_amount' + share_type = 'amount' + + total_weight = 0 + total_wage = 0 + total_paid_wage = 0 + union_total_paid_wage = 0 + company_total_paid_wage = 0 + guilds_total_paid_wage = 0 + freezing_province_kill_requests = province_kill_requests.filter( + province_request__poultry_request__freezing=True).only('total_killed_weight', 'union_share', + 'company_share', + 'total_killed_weight', 'guilds_share') + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, archive_wage=False).exclude( + province_kill_request__union_share=0, province_kill_request__company_share=0, + province_kill_request__guilds_share=0).only('accepted_real_weight', + 'province_kill_request__union_share_percent', + 'province_kill_request__wage', 'accepted_real_weight', + 'province_kill_request__guilds_share_percent', + 'province_kill_request__company_share_percent') + freezing_kill_house_requests = kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=True) + + chain_allocations = ChainAllocation.objects.filter(trash=False, state='accepted').only('weight', 'union_share', + 'company_share', + 'guilds_share', + ) + free_bars = KillHouseFreeBarInformation.objects.filter(archive_wage=False, trash=False).only('live_weight', + 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + ) + total_slaughter_transactions = InternalTransaction.objects.filter(payer_type='kill_house', + status='completed', + trash=False).only('union_share', + 'company_share', + 'guilds_share') + total_chain_company_transactions = InternalTransaction.objects.filter(payer_type='chain_company', + status='completed', trash=False).only( + 'union_share', 'company_share', 'guilds_share') + + union_province_kill_request_total_weight = \ + province_kill_requests.filter(union_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_union_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(union_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + union_province_kill_request_total_weight += \ + kill_house_requests.filter(province_kill_request__union_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + freezing_union_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + union_province_kill_request_total_wage = \ + province_kill_requests.filter(union_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('union_share'))[ + 'total'] or 0 + union_province_kill_request_total_wage += \ + kill_house_requests.filter(province_kill_request__union_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + + freezing_union_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + freezing_union_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__union_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__union_share_percent') / 100)))[ + 'total'] or 0 + union_chain_allocation_total_weight = \ + chain_allocations.filter(union_share__gt=0).aggregate(total=Sum('weight'))[ + 'total'] or 0 + union_chain_allocation_total_wage = \ + chain_allocations.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + union_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + + union_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + union_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_paid_wage += \ + total_slaughter_transactions.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_paid_wage += \ + total_chain_company_transactions.filter(union_share__gt=0).aggregate(total=Sum('union_share'))[ + 'total'] or 0 + union_total_weight = union_province_kill_request_total_weight + freezing_union_province_kill_request_total_weight + union_chain_allocation_total_weight + union_kill_house_free_live_bar_total_weight + union_kill_house_free_carcases_bar_total_weight + union_total_wage = union_province_kill_request_total_wage + freezing_union_province_kill_request_total_wage + union_chain_allocation_total_wage + union_kill_house_free_live_bar_total_wage + union_kill_house_free_carcases_bar_total_wage + union_total_unpaid_wage = union_total_wage - union_total_paid_wage + + company_province_kill_request_total_weight = \ + province_kill_requests.filter(company_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + company_province_kill_request_total_weight += \ + kill_house_requests.filter(province_kill_request__company_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(company_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + company_province_kill_request_total_wage = \ + province_kill_requests.filter(company_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('company_share'))[ + 'total'] or 0 + company_province_kill_request_total_wage += \ + kill_house_requests.filter(province_kill_request__company_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + freezing_company_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + freezing_company_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__company_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__company_share_percent') / 100)))[ + 'total'] or 0 + company_chain_allocation_total_weight = \ + chain_allocations.filter(company_share__gt=0).aggregate(total=Sum('weight'))[ + 'total'] or 0 + company_chain_allocation_total_wage = \ + chain_allocations.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + company_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + + company_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate( + total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + company_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_paid_wage += \ + total_slaughter_transactions.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_paid_wage += \ + total_chain_company_transactions.filter(company_share__gt=0).aggregate(total=Sum('company_share'))[ + 'total'] or 0 + company_total_weight = company_province_kill_request_total_weight + freezing_company_province_kill_request_total_weight + company_chain_allocation_total_weight + company_kill_house_free_live_bar_total_weight + company_kill_house_free_carcases_bar_total_weight + company_total_wage = company_province_kill_request_total_wage + freezing_company_province_kill_request_total_wage + company_chain_allocation_total_wage + company_kill_house_free_live_bar_total_wage + company_kill_house_free_carcases_bar_total_wage + company_total_unpaid_wage = company_total_wage - company_total_paid_wage + + guilds_province_kill_request_total_weight = \ + province_kill_requests.filter(guilds_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + guilds_province_kill_request_total_weight += \ + kill_house_requests.filter(province_kill_request__guilds_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + freezing_guilds_province_kill_request_total_weight = \ + freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_weight += \ + freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + guilds_province_kill_request_total_wage = \ + province_kill_requests.filter(guilds_share__gt=0, + province_request__poultry_request__freezing=False).aggregate( + total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_province_kill_request_total_wage += \ + kill_house_requests.filter(province_kill_request__guilds_share__gt=0, + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_wage = \ + freezing_province_kill_requests.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + freezing_guilds_province_kill_request_total_wage += \ + freezing_kill_house_requests.filter(province_kill_request__guilds_share__gt=0).aggregate(total=Sum( + F('accepted_real_weight') * F('province_kill_request__wage') * ( + F('province_kill_request__guilds_share_percent') / 100)))[ + 'total'] or 0 + guilds_chain_allocation_total_weight = \ + chain_allocations.filter(guilds_share__gt=0).aggregate(total=Sum('weight'))[ + 'total'] or 0 + guilds_chain_allocation_total_wage = \ + chain_allocations.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_kill_house_free_live_bar_total_weight = \ + free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + guilds_kill_house_free_live_bar_total_wage = \ + free_bars.filter(buy_type='live', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + + guilds_kill_house_free_carcases_bar_total_weight = \ + free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate( + total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + guilds_kill_house_free_carcases_bar_total_wage = \ + free_bars.filter(buy_type='carcass', guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_total_paid_wage += \ + total_slaughter_transactions.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_total_paid_wage += \ + total_chain_company_transactions.filter(guilds_share__gt=0).aggregate(total=Sum('guilds_share'))[ + 'total'] or 0 + guilds_total_weight = guilds_province_kill_request_total_weight + freezing_guilds_province_kill_request_total_weight + guilds_chain_allocation_total_weight + guilds_kill_house_free_live_bar_total_weight + guilds_kill_house_free_carcases_bar_total_weight + guilds_total_wage = guilds_province_kill_request_total_wage + freezing_guilds_province_kill_request_total_wage + guilds_chain_allocation_total_wage + guilds_kill_house_free_live_bar_total_wage + guilds_kill_house_free_carcases_bar_total_wage + guilds_total_unpaid_wage = guilds_total_wage - guilds_total_paid_wage + + province_kill_requests_total_wage = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum(type))[ + 'total'] or 0 + province_kill_requests_total_wage += \ + kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + + freezing_province_kill_requests_total_wage = freezing_province_kill_requests.aggregate(total=Sum(type))[ + 'total'] or 0 + freezing_province_kill_requests_total_wage += \ + freezing_kill_house_requests.aggregate( + total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[ + 'total'] or 0 + + free_bars_live = free_bars.filter(buy_type='live', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + ) + free_bars_carcases = free_bars.filter(buy_type='carcass', trash=False).only('live_weight', 'union_share', + 'weight_of_carcasses', + 'company_share', + 'guilds_share', + ) + + total_wage += province_kill_requests_total_wage + freezing_province_kill_requests_total_wage + + province_kill_requests_total_weight = \ + province_kill_requests.filter(province_request__poultry_request__freezing=False).aggregate( + total=Sum('total_killed_weight'))[ + 'total'] or 0 + province_kill_requests_total_weight += kill_house_requests.filter( + province_kill_request__province_request__poultry_request__freezing=False).aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + freezing_province_kill_requests_total_weight = \ + freezing_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + freezing_province_kill_requests_total_weight += \ + freezing_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + total_weight += province_kill_requests_total_weight + freezing_province_kill_requests_total_weight + + chain_allocations_total_wage = chain_allocations.aggregate(total=Sum(type))[ + 'total'] or 0 + total_wage += chain_allocations_total_wage + chain_allocations_total_weight = chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + total_weight += chain_allocations_total_weight + free_bars_live_total_wage = free_bars_live.aggregate(total=Sum(type))[ + 'total'] or 0 + total_wage += free_bars_live_total_wage + free_bars_live_total_weight = free_bars_live.aggregate(total=Sum('live_weight'))[ + 'total'] or 0 + total_weight += free_bars_live_total_weight + free_bars_carcases_total_wage = free_bars_carcases.aggregate(total=Sum(type))[ + 'total'] or 0 + total_wage += free_bars_carcases_total_wage + free_bars_carcases_total_weight = free_bars_carcases.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] or 0 + total_weight += free_bars_carcases_total_weight + slaughter_transactions = InternalTransaction.objects.filter(payer_type='kill_house', status='completed', + trash=False) + + total_paid_wage += slaughter_transactions.aggregate(total=Sum(share_type))[ + 'total'] or 0 + chain_company_transactions = InternalTransaction.objects.filter(payer_type='chain_company', + status='completed', trash=False) + total_paid_wage += chain_company_transactions.aggregate(total=Sum(share_type))[ + 'total'] or 0 + + values_list = { + "total_weight": total_weight, + "total_wage": total_wage, + "union_total_wage": union_total_wage, + "company_total_wage": company_total_wage, + "guilds_total_wage": guilds_total_wage, + "total_paid_wage": total_paid_wage, + "union_total_paid_wage": union_total_paid_wage, + "company_total_paid_wage": company_total_paid_wage, + "guilds_total_paid_wage": guilds_total_paid_wage, + "total_wage - total_paid_wage": total_wage - total_paid_wage, + "union_total_unpaid_wage": union_total_unpaid_wage, + "company_total_unpaid_wage": company_total_unpaid_wage, + "guilds_total_unpaid_wage": guilds_total_unpaid_wage, + + } + + values_list2 = { + "province_kill_requests_total_weight": province_kill_requests_total_weight, + "province_kill_requests_total_wage": province_kill_requests_total_wage, + "freezing_province_kill_requests_total_weight": freezing_province_kill_requests_total_weight, + "freezing_province_kill_requests_total_wage": freezing_province_kill_requests_total_wage, + "chain_allocations_total_weight": chain_allocations_total_weight, + "chain_allocations_total_wage": chain_allocations_total_wage, + "free_bars_live_total_weight": free_bars_live_total_weight, + "free_bars_live_total_wage": free_bars_live_total_wage, + "free_bars_carcases_total_weight": free_bars_carcases_total_weight, + "free_bars_carcases_total_wage": free_bars_carcases_total_wage, + + } + + values_union = { + "union_province_kill_request_total_weight": union_province_kill_request_total_weight, + "union_province_kill_request_total_wage": union_province_kill_request_total_wage, + "freezing_union_province_kill_request_total_weight": freezing_union_province_kill_request_total_weight, + "freezing_union_province_kill_request_total_wage": freezing_union_province_kill_request_total_wage, + "union_chain_allocation_total_weight": union_chain_allocation_total_weight, + "union_chain_allocation_total_wage": union_chain_allocation_total_wage, + "union_kill_house_free_live_bar_total_weight": union_kill_house_free_live_bar_total_weight, + "union_kill_house_free_live_bar_total_wage": union_kill_house_free_live_bar_total_wage, + "union_kill_house_free_carcases_bar_total_weight": union_kill_house_free_carcases_bar_total_weight, + "union_kill_house_free_carcases_bar_total_wage": union_kill_house_free_carcases_bar_total_wage, + "union_total_wage": union_total_wage, + "union_total_paid_wage": union_total_paid_wage, + "union_total_unpaid_wage": union_total_unpaid_wage, + + } + + values_company = { + "company_province_kill_request_total_weight": company_province_kill_request_total_weight, + "company_province_kill_request_total_wage": company_province_kill_request_total_wage, + "freezing_company_province_kill_request_total_weight": freezing_company_province_kill_request_total_weight, + "freezing_company_province_kill_request_total_wage": freezing_company_province_kill_request_total_wage, + "company_chain_allocation_total_weight": company_chain_allocation_total_weight, + "company_chain_allocation_total_wage": company_chain_allocation_total_wage, + "company_kill_house_free_live_bar_total_weight": company_kill_house_free_live_bar_total_weight, + "company_kill_house_free_live_bar_total_wage": company_kill_house_free_live_bar_total_wage, + "company_kill_house_free_carcases_bar_total_weight": company_kill_house_free_carcases_bar_total_weight, + "company_kill_house_free_carcases_bar_total_wage": company_kill_house_free_carcases_bar_total_wage, + "company_total_wage": company_total_wage, + "company_total_paid_wage": company_total_paid_wage, + "company_total_unpaid_wage": company_total_unpaid_wage, + + } + + values_guild = { + "guilds_province_kill_request_total_weight": guilds_province_kill_request_total_weight, + "guilds_province_kill_request_total_wage": guilds_province_kill_request_total_wage, + "freezing_guilds_province_kill_request_total_weight": freezing_guilds_province_kill_request_total_weight, + "freezing_guilds_province_kill_request_total_wage": freezing_guilds_province_kill_request_total_wage, + "guilds_chain_allocation_total_weight": guilds_chain_allocation_total_weight, + "guilds_chain_allocation_total_wage": guilds_chain_allocation_total_wage, + "guilds_kill_house_free_live_bar_total_weight": guilds_kill_house_free_live_bar_total_weight, + "guilds_kill_house_free_live_bar_total_wage": guilds_kill_house_free_live_bar_total_wage, + "guilds_kill_house_free_carcases_bar_total_weight": guilds_kill_house_free_carcases_bar_total_weight, + "guilds_kill_house_free_carcases_bar_total_wage": guilds_kill_house_free_carcases_bar_total_wage, + "guilds_total_wage": guilds_total_wage, + "guilds_total_paid_wage": guilds_total_paid_wage, + "guilds_total_unpaid_wage": guilds_total_unpaid_wage, + + } + + dict1 = { + "general": values_list, + 'detail': values_list2, + 'union': values_union, + 'company': values_company, + 'guild': values_guild + } + return dict1 + + +class IranProvinceSerializer(serializers.ModelSerializer): + class Meta: + model = IranProvinces + fields = ['id', 'name'] + +class IranCitiesSerializer(serializers.ModelSerializer): + class Meta: + model = IranCities + fields = ['id', 'name'] + + +class AgeNotificationPoultrySerilizer(serializers.ModelSerializer): + class Meta: + model = AgeNotificationPoultry + fields = '__all__' + + +class CookieSamasatSerilizer(serializers.ModelSerializer): + class Meta: + model = CookieSamasat + fields = '__all__' diff --git a/panel/ReportingPanel/views.py b/panel/ReportingPanel/views.py new file mode 100644 index 0000000..40b7b4e --- /dev/null +++ b/panel/ReportingPanel/views.py @@ -0,0 +1,8959 @@ +import datetime +import hashlib +import random +import re +import difflib +from collections import defaultdict, Counter +from datetime import timedelta +from io import BytesIO +import xml.etree.ElementTree as ET + +import jdatetime +import openpyxl +import requests +from bs4 import BeautifulSoup +from dateutil.relativedelta import relativedelta +from django.contrib.auth.models import User, Group +from django.db.models import Q, F, Sum, Avg, Count, Min +from django.http import HttpResponse +from django.http import QueryDict, JsonResponse +from django.views.decorators.csrf import csrf_exempt +from oauth2_provider.contrib.rest_framework.permissions import TokenHasReadWriteScope +from oauth2_provider.models import AccessToken +from openpyxl import Workbook +from openpyxl.styles import Alignment +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.ssl_ import create_urllib3_context +from rest_framework import status +from rest_framework import viewsets +from rest_framework.decorators import api_view, permission_classes +from rest_framework.pagination import PageNumberPagination +from rest_framework.permissions import AllowAny +from rest_framework.response import Response +from url_filter.integrations.drf import DjangoFilterBackend +from LiveStock.helpers import build_query +from panel.ProvinceOperator.serializers import PoultryScienceReportSerializer +from panel.filterset import PoultryScienceReportFilterSet +from authentication.filterset import ( + SystemUserProfileFilteSet +) +from authentication.models import SystemUserProfile, Province, SystemAddress, City +from authentication.register import ARTA_REGISTER +from authentication.sahandsms.sms import USERNAME_SMS_FINANCIAL, PASSWORD_SMS_FINANCIAL, kill_house_price +from authentication.serializer.serializer import SystemUserProfileSerializer +from authentication.sms_management import send_sms_for_kill_house_not_add_to_inventory, send_sms_for_guild, \ + send_sms_for_guild_for_register, steward_allocation_sms, guild_register_password, guild_register_username, \ + send_sms_for_sale_bar_for_steward, send_sms_for_sale_bar, send_sms_request +from authentication.views import ARTA_URL_CHANGE_MOBILE_NUMBER + +ARTA_URL_CHECK_USER_EXISTS = "https://userbackend.rasadyar.com/api/check_user_exists/" +from general_urls import base_url_for_sms_report +from helper_eata import chat_id_mali, token +from panel.ProvinceOperator.serializers import \ + NewProvinceAutoAllocationSerializer, GuildsSerializer +from panel.ProvinceOperator.helpers import guild_steward_allocations_product_warehousing +from panel.KillHouse.helpers import kill_house_allocations_product_warehousing, kill_house_archive_warehousing +from panel.ReportingPanel.filterset import ( + PoultryRequestFilterSet, + KillHouseRequestFilterSet, + CityOperatorCheckFilterSet, + ProvinceOperatorCheckFilterSet, + VetOperatorCheckFilterSet, + PoultryHatchingFilterSet, PoultryFilterSet, UserProfileFilterSet +) +from panel.ReportingPanel.models import SearchFields +from panel.models import ( + PoultryRequest, + KillHouseRequest, + CityOperatorCheckRequest, + ProvinceCheckOperatorRequest, + VetCheckRequest, + Poultry, + PoultryHatching, ProvinceKillRequest, ProvinceFactorToKillHouse, KillHouseAssignmentInformation, + KillHouseFactorToProvince, PovinceInspector, CityOperator, ProvinceOperator, VetFarm, KillHouseVet, + ProvinceAutoAllocation, KillHouse, IranProvinces, IranCities, AgeNotificationPoultry, CookieSamasat, LastUpdate, + Wallet, KillHouseFreeSaleBarInformation, KillRequest, KillHouseFreeBarInformation, ChickenCommissionPrices, + RolesProducts, ColdHouse, StewardAllocation, ProductsTransactions, PosMachineTransactions, POSMachine, Guilds, + PosSegmentation, + PoultryRequestQuarantineCode, ChainAllocation, ManagementSendSms, StewardFreeSaleBarInformation, POSTransactions, + SmsRecipient, EvacuationHatchingDetail, HatchingLossManagement, ChickenAgeRange, PoultryScience, + PoultryScienceReport, WarehouseArchive +) +from ticket.helper import send_image_to_server_for_poultry_science +from panel.poultry.serializers import ( + PoultryRequestSerializer, + PoultrySerializer, + PoultryHatchingSerializer, PoultryRequestForGeneralCasestatusSerializer, + ChickenCommissionPricesForDashboardSerializer +) +from ticket.models import MessageSupport, TicketSupport +from .helper import ( + poultry_request_fields, + user_fields, + city_operator_fields, + province_operator_fields, + kill_house_operator_fields, + vet_operator_fields, + poultry_hatching_fields, poultry_filterset_fields, poultry_hatching_filterset_fields +) +from .serializer import SearchFieldsSerializer, DetailsGeneraWageSerializer, GenaeralWageSerailizer, \ + DashboardDetailsGeneraWageSerializer, NewDetailsGeneraWageSerializer, IranProvinceSerializer, IranCitiesSerializer, \ + AgeNotificationPoultrySerilizer, CookieSamasatSerilizer, HatchingLossManagementSerializer +from ..KillHouse.helpers import kill_house_allocations_product_warehousing, market_poultry_request_remain_quantity, \ + kill_house_cold_house_allocations, cold_house_warehousing, kill_house_free_buying_product_warehousing, \ + kill_house_free_sale_product_warehousing +from ..ProvinceOperator.helpers import guild_steward_allocations_product_warehousing, \ + guild_steward_free_sale_product_warehousing +from ..admin import PROJECT_API_KEY +from ..convert_date import convert_to_miladi +from ..helper_excel import percent_of_losses, create_value, create_header, create_header_freez, shamsi_date, \ + excel_description, to_locale_str, convert_str_to_date +from ..helper import check_mobile_number +from ..validate_headers import PosDeviceValidator + + +def check_quarantine_code(code): + session = requests.Session() + session.mount('https://', SSLAdapter()) + data = {'gid': str(code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + try: + table = context.find_all('table') + if table[5:6]: + row = context.find('div', align="right") + if row: + content = row.get_text(separator=" ", strip=True) + date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content) + if date_match: + for i in table[5:6]: + row = i.find_all('tr') + for r in row[1:2]: + quantity = r.find('td') + match = re.search(r'\d+', quantity.text) + if match: + return True + except: + return False + + +class CustomPagination(PageNumberPagination): + page_size = 10 + + +class ReportingAllPoultryRequests(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + city_queryset = CityOperatorCheckRequest.objects.all() + province_queryset = ProvinceCheckOperatorRequest.objects.all() + kill_house_queryset = KillHouseRequest.objects.all() + vet_queryset = VetCheckRequest.objects.all() + poultry_hatching_queryset = PoultryHatching.objects.all() + serializer_class = PoultryRequestSerializer + permission_classes = [AllowAny] + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryRequestFilterSet + kill_house_filter_class = KillHouseRequestFilterSet + city_operator_filter_class = CityOperatorCheckFilterSet + province_operator_filter_class = ProvinceOperatorCheckFilterSet + vet_operator_filter_class = VetOperatorCheckFilterSet + poultry_hatching_filter_class = PoultryHatchingFilterSet + filterset_fields = poultry_request_fields + user_filterset_fields = user_fields + city_operator_filter_fields = city_operator_fields + province_operator_filter_fields = province_operator_fields + kill_house_operator_filter_fields = kill_house_operator_fields + vet_operator_filter_fields = vet_operator_fields + poultry_hatching_filter_fields = poultry_hatching_fields + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + query_val = [] + city_operator_query_val = [] + province_operator_query_val = [] + kill_house_operator_query_val = [] + vet_operator_query_val = [] + poultry_hatching_query_val = [] + user_val = [] + poultry_query_li = [] + hatching_poultry_li = [] + limited_query = [] + city_limited_query = [] + province_limited_query = [] + kill_house_limited_query = [] + vet_limited_query = [] + poultry_hatching_limited_query = [] + limited_dict = {} + province_limited_dict = {} + city_limited_dict = {} + kill_house_limited_dict = {} + vet_limited_dict = {} + poultry_hatching_limited_dict = {} + user_query = [] + user_dict = {} + values_item = [] + total_tons = [] + if 'type' in request.GET: + if request.GET['value'] != "": + if request.GET['type'] == 'filter': + if 'value' in request.GET: + values = request.GET['value'].split(',') + for item in values: + if item != "": + values_item.append(item) + for val in values_item: + if not query_val: + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.filterset_class(data=query, queryset=self.queryset)).filter(): + ps = self.filterset_class(data=query, queryset=self.queryset) + filtered_city_operator = ps.filter() + if filtered_city_operator: + limited_query.append(query) + + if not city_operator_query_val: + for item in self.city_operator_filter_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if ( + self.city_operator_filter_class(data=query, + queryset=self.city_queryset)).filter(): + ps = self.city_operator_filter_class(data=query, queryset=self.city_queryset) + filtered_city_operator = ps.filter() + if filtered_city_operator: + city_limited_query.append(query) + + if not province_operator_query_val: + for item in self.province_operator_filter_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.city_operator_filter_class(data=query, + queryset=self.province_queryset)).filter(): + ps = self.city_operator_filter_class(data=query, + queryset=self.province_queryset) + filtered_city_operator = ps.filter() + if filtered_city_operator: + province_limited_query.append(query) + + if not kill_house_operator_query_val: + for item in self.kill_house_operator_filter_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.kill_house_filter_class(data=query, + queryset=self.kill_house_queryset)).filter(): + ps = self.kill_house_filter_class(data=query, queryset=self.kill_house_queryset) + filtered_city_operator = ps.filter() + if filtered_city_operator: + kill_house_limited_query.append(query) + + if not vet_operator_query_val: + for item in self.vet_operator_filter_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if ( + self.vet_operator_filter_class(data=query, + queryset=self.vet_queryset)).filter(): + ps = self.vet_operator_filter_class(data=query, queryset=self.vet_queryset) + filtered_city_operator = ps.filter() + if filtered_city_operator: + vet_limited_query.append(query) + + if not poultry_hatching_query_val: + for item in self.poultry_hatching_filter_fields: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.poultry_hatching_filter_class(data=query, + queryset=self.poultry_hatching_queryset)).filter(): + ps = self.poultry_hatching_filter_class(data=query, + queryset=self.poultry_hatching_queryset) + filtered_city_operator = ps.filter() + if filtered_city_operator: + poultry_hatching_limited_query.append(query) + + if not user_val: + for user_item in self.user_filterset_fields: + query = QueryDict('{0}__exact={1}'.format(user_item, val)) + if (SystemUserProfileFilteSet( + data=query, + queryset=SystemUserProfile.objects.all()) + ).filter(): + ps = SystemUserProfileFilteSet( + data=query, + queryset=SystemUserProfile.objects.all() + ) + filtered_poultry_user = ps.filter() + if filtered_poultry_user: + user_query.append(query) + + for i in limited_query: + for key, value in i.items(): + limited_dict[key] = value + if len(values_item) != len(limited_dict): + pass + else: + for i in PoultryRequest.objects.filter(**limited_dict): + query_val.append(i) + + for i in city_limited_query: + for key, value in i.items(): + city_limited_dict[key] = value + if len(values_item) != len(city_limited_dict): + pass + else: + for i in self.city_queryset.filter(**city_limited_dict): + query_val.append(i.poultry_request) + + for i in province_limited_query: + for key, value in i.items(): + province_limited_dict[key] = value + if len(values_item) != len(province_limited_dict): + pass + else: + for i in self.province_queryset.filter(**province_limited_dict): + query_val.append(i.city_request_Poultry.poultry_request) + + for i in kill_house_limited_query: + for key, value in i.items(): + kill_house_limited_dict[key] = value + if len(values_item) != len(kill_house_limited_dict): + pass + else: + for i in self.kill_house_queryset.filter(**kill_house_limited_dict): + query_val.append(i.province_request.city_request_Poultry.poultry_request) + + for i in vet_limited_query: + for key, value in i.items(): + vet_limited_dict[key] = value + if len(values_item) != len(vet_limited_dict): + pass + else: + for i in self.vet_queryset.filter(**vet_limited_dict): + query_val.append( + i.kill_house_request.province_request.city_request_Poultry.poultry_request) + + for i in poultry_hatching_limited_query: + for key, value in i.items(): + poultry_hatching_limited_dict[key] = value + if len(values_item) != len(poultry_hatching_limited_dict): + pass + else: + for i in self.poultry_hatching_queryset.filter(**poultry_hatching_limited_dict): + poultry_query_li.append(i.poultry) + hatching_poultry_li.append(i) + + for i in user_query: + for key, value in i.items(): + user_dict[key] = value + if len(values_item) != len(user_dict): + pass + else: + for i in SystemUserProfile.objects.filter(**user_dict): + user_val.append(i) + + if 'hatching_date' in request.GET: + date_li = [] + query_li = [] + if request.GET['hatching_date'] != "": + date = request.GET['hatching_date'].split(',') + date_split_1 = date[0].split('-') + date_split_2 = date[1].split('-') + main_date_1 = datetime.datetime( + int(date_split_1[0]), + int(date_split_1[1]), + int(date_split_1[2]) + ) + main_date_2 = datetime.datetime( + int(date_split_2[0]), + int(date_split_2[1]), + int(date_split_2[2]) + ) + date_li.append(main_date_1) + date_li.append(main_date_2) + for i in PoultryHatching.objects.all(): + if date_li[0] <= i.date <= date_li[1]: + if i.poultry not in poultry_query_li: + poultry_query_li.append(i.poultry) + + if 'hatching_info' in request.GET: + serializer = PoultryHatchingSerializer(hatching_poultry_li, many=True) + data = {'hatching_info': serializer.data} + return Response(data, status=status.HTTP_200_OK) + + if 'number_of_incubators' in request.GET: + if request.GET['number_of_incubators'] != "": + num = request.GET['number_of_incubators'].split(',') + for i in PoultryHatching.objects.all(): + if int(num[0]) <= int(i.quantity) <= int(num[1]): + if i.poultry not in poultry_query_li: + poultry_query_li.append(i.poultry) + + if 'number_of_requests' in request.GET: + if request.GET['number_of_requests'] != "": + num = request.GET['number_of_requests'].split(',') + for i in Poultry.objects.all(): + if int(num[0]) <= int(i.number_of_requests) <= int(num[1]): + if i not in poultry_query_li: + poultry_query_li.append(i) + + if 'total_capacity' in request.GET: + if request.GET['total_capacity'] != "": + num = request.GET['total_capacity'].split(',') + for i in Poultry.objects.all(): + if int(num[0]) <= int(i.total_capacity) <= int(num[1]): + if i not in poultry_query_li: + poultry_query_li.append(i) + + if 'tons_for_slaughter' in request.GET: + total = 0 + total_li = [] + if request.GET['tons_for_slaughter'] != "": + tons_date = request.GET['tons_for_slaughter'] + date_split = tons_date.split('-') + main_date = (jdatetime.datetime( + int(date_split[0]), int(date_split[1]), + int(date_split[2])).togregorian()) + for item in self.queryset: + if item.send_date.strftime("%Y-%m-%d") == main_date.strftime("%Y-%m-%d"): + total += item.quantity + total_li.append(item) + serializer = self.serializer_class(total_li, many=True) + return Response({'poultry_req': serializer.data, 'total_quantity': total}) + + if 'total_tons_in_date' in request.GET: + if request.GET['total_tons_in_date'] != "": + age_li = [] + total_tons_split = request.GET['total_tons_in_date'].split(',') + total = 0 + splited_date = total_tons_split[0].split('-') + date1 = jdatetime.date( + int(splited_date[0]), + int(splited_date[1]), + int(splited_date[2]) + ).togregorian() + for item in PoultryHatching.objects.all(): + if item.date != None: + date2 = datetime.date( + int(item.date.year), + int(item.date.month), + int(item.date.day), + ) + age = (date1 - date2) + if 48 >= age.days >= int(total_tons_split[1]): + total += item.quantity + total_tons.append(item.poultry) + age_li.append(age.days) + + if 'show' in request.GET: + if request.GET['show'] == 'active': + poultry_req = self.queryset.filter(final_state="pending") + serializer = self.serializer_class(poultry_req, many=True) + return Response({'poultry_req': serializer.data}, status=status.HTTP_200_OK) + if request.GET['show'] == "deactive": + poultry_req = self.queryset.filter(final_state="complete") + serializer = self.serializer_class(poultry_req, many=True) + return Response({'poultry_req': serializer.data}, status=status.HTTP_200_OK) + if request.GET['show'] == "all": + poultry_req = self.queryset + serializer = self.serializer_class(poultry_req, many=True) + return Response({'poultry_req': serializer.data}, status=status.HTTP_200_OK) + + serializer = self.serializer_class(query_val, many=True) + user_serializer = SystemUserProfileSerializer(user_val, many=True) + poultry_serializer = PoultrySerializer(poultry_query_li, many=True) + final_output_data = { + 'poultry_req': serializer.data, + 'poultry': poultry_serializer.data, + 'user_detail': user_serializer.data, + } + return Response(final_output_data, status=status.HTTP_200_OK) + + serializer = PoultryRequestSerializer( + self.queryset.filter(send_date=(datetime.datetime.now() - datetime.timedelta(days=1))), + many=True + ) + data = {'poultry_req': serializer.data} + return Response(data, status=status.HTTP_200_OK) + + +class SearchFieldsViewSet(viewsets.ModelViewSet): + queryset = SearchFields.objects.all() + serializer_class = SearchFieldsSerializer + permission_classes = [TokenHasReadWriteScope] + + +class NewReportingAllPoultryRequests(viewsets.ModelViewSet): + userprofile_queryset = SystemUserProfile.objects.all() + userprofile_serializer_class = SystemUserProfileSerializer + userprofile_filterset_class = UserProfileFilterSet + queryset = Poultry.objects.all() + serializer_class = PoultrySerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryFilterSet + poultry_filterset_f = poultry_filterset_fields + poultry_hatching_queryset = PoultryHatching.objects.all() + poultry_hatching_filter_class = PoultryHatchingFilterSet + poultry_hatching_filterset_f = poultry_hatching_filterset_fields + poultry_hatching_serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + query_val = [] + poultry_hatching_query_val = [] + limited_dict = {} + values_item = [] + limited_query = [] + poultry_hatching_limited_query = [] + poultry_hatching_limited_dict = {} + + if request.GET['type'] == 'filter': + if 'value' in request.GET and request.GET['value'] != "": + values = request.GET['value'].split(',') + for item in values: + if item != "": + values_item.append(item) + for val in values_item: + if not query_val: + for item in self.poultry_filterset_f: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.filterset_class(data=query, queryset=self.queryset)).filter(): + ps = self.filterset_class(data=query, queryset=self.queryset) + filtered_poultry = ps.filter() + if filtered_poultry: + limited_query.append(query) + + if not poultry_hatching_query_val: + for item in self.poultry_hatching_filterset_f: + query = QueryDict('{0}={1}'.format(item, val)) + if (self.poultry_hatching_filter_class(data=query, + queryset=self.poultry_hatching_queryset)).filter(): + ps = self.poultry_hatching_filter_class(data=query, + queryset=self.poultry_hatching_queryset) + filtered_city_operator = ps.filter() + if filtered_city_operator: + poultry_hatching_limited_query.append(query) + for i in limited_query: + for key, value in i.items(): + limited_dict[key] = value + # + # if len(values_item) != len(limited_dict): + # pass + # else: + + if len(limited_dict) > 0: + for i in Poultry.objects.filter(**limited_dict): + query_val.append(i) + for i in poultry_hatching_limited_query: + for key, value in i.items(): + poultry_hatching_limited_dict[key] = value + + # if len(values_item) == len(poultry_hatching_limited_dict): + # pass + # else: + for i in self.poultry_hatching_queryset.filter(**poultry_hatching_limited_dict): + if i.poultry in query_val: + pass + else: + if len(limited_dict) > 0: + pass + else: + query_val.append(i.poultry) + values_item_count = len(values_item) + if values_item_count != len(limited_dict): + if len(poultry_hatching_limited_dict) == 0: + query_val = [] + + if 'double_hatching_date' in request.GET: + date_li = [] + query_li = [] + if request.GET['double_hatching_date'] != "": + date = request.GET['double_hatching_date'].split(',') + date_split_1 = date[0].split('-') + date_split_2 = date[1].split('-') + main_date_1 = datetime.datetime( + int(date_split_1[0]), + int(date_split_1[1]), + int(date_split_1[2]) + ) + main_date_2 = datetime.datetime( + int(date_split_2[0]), + int(date_split_2[1]), + int(date_split_2[2]) + ) + date_li.append(main_date_1) + date_li.append(main_date_2) + for i in PoultryHatching.objects.all(): + if date_li[0].year <= i.date.year and date_li[0].month <= i.date.month and date_li[ + 0].day <= i.date.day and i.date.year <= date_li[1].year and i.date.month <= date_li[ + 1].month and i.date.day <= date_li[1].day: + if i.poultry not in query_val: + query_val.append(i.poultry) + if 'single_hatching_date' in request.GET: + date_li = [] + query_li = [] + if request.GET['single_hatching_date'] != "": + date = request.GET['single_hatching_date'] + date_split = date.split('-') + main_date = datetime.datetime( + int(date_split[0]), + int(date_split[1]), + int(date_split[2]) + ) + date_li.append(main_date) + for i in PoultryHatching.objects.all(): + if date_li[0].year == i.date.year and date_li[0].month == i.date.month and date_li[ + 0].day == i.date.day: + if i.poultry not in query_val: + query_val.append(i.poultry) + if 'double_age' in request.GET: + age = request.GET['double_age'].split(',') + age1 = int(age[0]) + age2 = int(age[1]) + hatching = PoultryHatching.objects.filter(state='pending') + if hatching.count() > 0: + for hatch in hatching: + chicken_age = (datetime.datetime.now() - hatch.date).days + 1 + if age1 <= chicken_age and chicken_age <= age2: + if hatch.poultry in query_val: + pass + else: + query_val.append(hatch.poultry) + if 'single_age' in request.GET: + age = int(request.GET['single_age']) + hatching = PoultryHatching.objects.filter(state='pending') + if hatching.count() > 0: + for hatch in hatching: + chicken_age = (datetime.datetime.now() - hatch.date).days + 1 + if age == chicken_age: + if hatch.poultry in query_val: + pass + else: + query_val.append(hatch.poultry) + + serializer = self.serializer_class(query_val, many=True) + + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ForcastViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + user = SystemUserProfile.objects.get(user=request.user) + from datetime import datetime, timedelta + date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d') + date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d') + d = request.GET['day'] + days_interval = (date2 - date1).days + hatching_dict = {} + quantity = 0 + poultry_list_id = [] + poultry_list = [] + interal_dict = {} + final_list = [] + hatchs = PoultryHatching.objects.filter(poultry__address__province=user.province, state='pending') + if hatchs.count() > 0: + for i in range(days_interval + 1): + first_date = date1 + timedelta(days=i) + second_date = first_date - timedelta(days=int(d)) + for hatch in hatchs: + if hatch.date.year == second_date.year and hatch.date.month == second_date.month and hatch.date.day == second_date.day: + quantity += hatch.quantity + if hatch.poultry in poultry_list: + pass + else: + poultry_list.append(hatch.poultry) + for p in poultry_list: + interal_dict = { + "name": p.user.fullname, + "mobile": p.user.mobile, + "unitname": p.unit_name, + "province": p.user.province.name, + "city": p.user.city.name, + } + poultry_list_id.append(interal_dict) + + hatching_dict.update({"date": str(first_date), "quantity": quantity, "poultry": poultry_list_id}) + quantity = 0 + final_list.append(hatching_dict) + hatching_dict = {} + poultry_list_id = [] + poultry_list = [] + + return Response(final_list, status=status.HTTP_200_OK) + + +class PoultryReporttViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + poultry_request_list = [] + dates = [] + hatching_list = [] + average_weight_chart_list = [] + quantity = 0 + losses = 0 + poultry_requests = PoultryRequest.objects.filter(poultry__user=user, trash=False).order_by('send_date') + if poultry_requests.count() > 0: + for poultry_request in poultry_requests: + total_amount = 0 + average_weight = 0 + average_fee = 0 + sales_price = 0 + paid_state = None + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, + state='accepted').exists(): + age = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + else: + age = (datetime.datetime.now() - poultry_request.hatching.date).days + 1 + poultry_request_dict = { + "hatching_period": poultry_request.hatching.period, + "date": poultry_request.send_date.date(), + "hatching_date": poultry_request.hatching.date, + "hatching_chicken_breed": poultry_request.hatching.chicken_breed, + "quantity": poultry_request.quantity, + "age": age, + "weight_of_suffering": 2.5, + "request_id": poultry_request.id, + + } + province_factors = ProvinceFactorToKillHouse.objects.filter( + province_check_req__poultry_request=poultry_request) + if province_factors.count() > 0: + factor_count = province_factors.count() + factor_counter = 0 + paid_state = 'pending' + for factor in province_factors: + if factor.poultry_factor != None: + total_amount += factor.poultry_factor.shares['poultryShareWithProfit'] + if factor.poultry_factor.paid_state == 'paid': + factor_counter += 1 + else: + total_amount += factor.shares['poultryShareWithProfit'] + if factor.paid_state == 'paid': + factor_counter += 1 + average_weight += factor.total_weight + sales_price += factor.factor_fee + average_fee = factor.province_check_req.fee + if factor_count == factor_counter: + paid_state = 'paid' + sales_price = sales_price / factor_count + average_weight = average_weight / factor_count + average_weight_dict = { + "date": poultry_request.send_date.date(), + "weight": average_weight, + } + average_weight_chart_list.append(average_weight_dict) + + poultry_request_dict.update({ + "total_amount": total_amount, + "average_weight": average_weight, + "average_fee": average_fee, + "sales_price": sales_price, + "paid_state": paid_state, + + }) + poultry_request_list.append(poultry_request_dict) + + poultry_hatchings = PoultryHatching.objects.filter(trash=False).order_by('date') + if poultry_hatchings.count() > 0: + for poultry_hatching in poultry_hatchings: + if poultry_hatching.date.date() in dates: + pass + else: + dates.append(poultry_hatching.date.date()) + for date in dates: + hatching = PoultryHatching.objects.filter(date__year=date.year, date__month=date.month, + date__day=date.day) + for hatch in hatching: + quantity += hatch.quantity + losses += hatch.losses + internal_hatching_dict = { + "date": date, + "quantity": quantity, + "losses": losses, + } + hatching_list.append(internal_hatching_dict) + + quantity = 0 + losses = 0 + + final_dict = { + "table": poultry_request_list, + "hatching_chart": hatching_list, + "weight_chart": average_weight_chart_list, + } + + return Response(final_dict, status=status.HTTP_200_OK) + + +# ویوست مربوط به نامه جهاد واستانداری +class PoultryRequestletterReportViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryRequestSerializer + + def list(self, request, *args, **kwargs): + province = Province.objects.get(id=2) + from datetime import datetime + # refresh(request.user.id) + if 'general_report' in request.GET: + date = datetime.strptime(request.GET['date'], '%Y-%m-%d') + poultry_requests_list = [] + poultry_requests_dict = {} + poultry_requests = PoultryRequest.objects.filter(poultry__address__province=province, + send_date__year=date.year, send_date__month=date.month, + send_date__day=date.day).order_by('send_date') + + if poultry_requests.count() > 0: + for poultry_request in poultry_requests: + poultry_requests_dict.update({ + 'poultry_name': poultry_request.poultry.unit_name, + 'quantity': poultry_request.previous_quantity, + 'weight': poultry_request.Index_weight, + 'age': (poultry_request.send_date.date() - poultry_request.hatching.date.date()).days + 1, + 'confirmed_quantity': poultry_request.quantity, + 'remain_quantity': poultry_request.hatching.left_over, + }) + + poultry_requests_list.append(poultry_requests_dict) + poultry_requests_dict = {} + return Response(poultry_requests_list, status=status.HTTP_200_OK) + + elif 'daily_report' in request.GET: + now = datetime.now().date() + date_list = [] + hatching_list = [] + poultry_request_detail_list = [] + poultry_requests = PoultryRequest.objects.filter(poultry__address__province=province).order_by('-send_date') + if poultry_requests.count() > 0: + for poultry_request in poultry_requests: + if poultry_request.send_date.date() in date_list: + pass + else: + date_list.append(poultry_request.send_date.date()) + for date in date_list: + quantity = 0 + remain_quantity = 0 + province_quantity = 0 + average_weight = 0 + total_poultry_request_quantity = 0 + accepted_request_quantity = 0 + poultry_requests_list = PoultryRequest.objects.filter(poultry__address__province=province, + send_date__year=date.year, + send_date__month=date.month, + send_date__day=date.day) + for internal_poultry_reqs in poultry_requests_list: + if internal_poultry_reqs.hatching in hatching_list: + pass + else: + hatching_list.append(internal_poultry_reqs.hatching) + remain_quantity += internal_poultry_reqs.hatching.left_over + + quantity += internal_poultry_reqs.previous_quantity + average_weight += internal_poultry_reqs.Index_weight + province_quantity += internal_poultry_reqs.quantity + total_poultry_request_quantity += internal_poultry_reqs.quantity + if internal_poultry_reqs.province_state == 'accepted': + accepted_request_quantity += internal_poultry_reqs.quantity + average_weight = round(average_weight / poultry_requests_list.count(), 2) + + poultry_request_detail_list.append({ + 'today': now, + 'date': date, + 'province': province.name, + 'previous_quantity': quantity, + 'index_weight': average_weight, + 'province_quantity': province_quantity, + 'remain_quantity': remain_quantity, + 'country_quantity': 0, + 'total_poultry_request_quantity': total_poultry_request_quantity, + 'accepted_request_quantity': accepted_request_quantity, + + }) + return Response(poultry_request_detail_list, status=status.HTTP_200_OK) + + +class CasestatusViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryRequestSerializer + + def list(self, request, *args, **kwargs): + poultry_request_list = [] + user = SystemUserProfile.objects.get(user=request.user) + date = datetime.datetime.strptime(str(request.GET['date']), '%Y-%m-%d') + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultry_requests = PoultryRequest.objects.filter(send_date__date=date, + poultry__city_operator=city_operator.unit_name, + trash=False).order_by('id') + elif request.GET['role'] in ['VetFarm', 'CityCommerce', 'CityJahad', 'CityPoultry']: + + poultry_requests = PoultryRequest.objects.filter(send_date__date=date, + poultry__address__city=user.city, + trash=False).order_by('id') + else: + poultry_requests = PoultryRequest.objects.filter(send_date__date=date, + poultry__address__province=user.province, + trash=False).order_by('id') + if poultry_requests: + for poultry_request in poultry_requests: + vet_farm = VetFarm.objects.filter(poultry=poultry_request.poultry, trash=False) + if vet_farm.count() > 0: + vet_farm = vet_farm.last() + vet_farm_name = vet_farm.vet.user.fullname + vet_farm_mobile = vet_farm.vet.user.mobile + else: + vet_farm_name = None + vet_farm_mobile = None + + poultry_request_dict = {} + poultry_request_dict.update({"poultry": { + "user_fullname": poultry_request.poultry.user.fullname, + "user_mobile": poultry_request.poultry.user.mobile, + "poultry_name": poultry_request.poultry.unit_name, + "poultry_city": poultry_request.poultry.address.city.name, + "poultry_province": poultry_request.poultry.address.province.name, + "poultry_request_quantity": poultry_request.quantity, + "poultry_request_remain_quantity": poultry_request.remain_quantity, + "freezing": poultry_request.freezing, + "chicken_breed": poultry_request.chicken_breed, + "send_date": poultry_request.send_date, + "index_weight": poultry_request.Index_weight, + "vet_farm_name": vet_farm_name, + "vet_farm_mobile": vet_farm_mobile, + + } + + }) + city_operator = CityOperator.objects.filter(key=poultry_request.city_operator.key, trash=False) + if city_operator: + city_operator = city_operator.last() + city_operator_name = city_operator.user.fullname + city_operator_mobile = city_operator.user.mobile + city_operator_province = city_operator.address.province.name + city_operator_city = city_operator.address.city.name + else: + + city_operator_name = None + city_operator_mobile = None + city_operator_province = None + city_operator_city = None + + city = CityOperatorCheckRequest.objects.filter(poultry_request=poultry_request, trash=False) + if city: + city = city.last() + poultry_request_dict['city_state'] = { + "operator_name": city_operator_name, + "operator_mobile": city_operator_mobile, + "operator_province": city_operator_province, + "operator_city": city_operator_city, + "state": city.state, + } + else: + poultry_request_dict['city_state'] = { + "operator_name": city_operator_name, + "operator_mobile": city_operator_mobile, + "operator_province": city_operator_province, + "operator_city": city_operator_city, + "state": 'pending', + } + role = Group.objects.get(name='ProvinceOperator') + province_operator = ProvinceOperator.objects.filter( + address__province__name=poultry_request.poultry.address.province.name, + user__role=role, trash=False) + if province_operator: + province_operator = province_operator.last() + province_operator_name = province_operator.user.fullname + province_operator_mobile = province_operator.user.mobile + province_operator_provinc = province_operator.address.province.name + province_operator_city = province_operator.address.city.name + + else: + province_operator_name = None + province_operator_mobile = None + province_operator_provinc = None + province_operator_city = None + + province = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request, + trash=False) + if province: + province = province.last() + poultry_request_dict['province_state'] = { + "province_operator_name": province_operator_name, + "province_operator_mobile": province_operator_mobile, + "province_operator_provinc": province_operator_provinc, + "province_operator_city": province_operator_city, + "state": province.state, + } + else: + + poultry_request_dict.update({"province_state": { + "province_operator_name": province_operator_name, + "province_operator_mobile": province_operator_mobile, + "province_operator_provinc": province_operator_provinc, + "province_operator_city": province_operator_city, + "state": 'pending', + }}) + + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request=poultry_request) + if province_kill_requests: + province_kill_request_list = [] + for province_kill_request in province_kill_requests: + province_kill_request_dict = {} + province_kill_request_dict = { + "state": province_kill_request.state, + "buyer_name": province_kill_request.kill_request.kill_house.name, + "buyer_mobile": province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": province_kill_request.main_quantity, + } + buyer_type = None + if province_kill_request.kill_request.kill_house.killer == False: + buyer_type = 'kill_house' + else: + buyer_type = 'killer' + province_kill_request_dict.update({ + "buyer_type": buyer_type, + }) + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_kill_request=province_kill_request) + if kill_house_requests: + kill_house_request_list = [] + for kill_house_request in kill_house_requests: + kill_house_vet = KillHouseVet.objects.filter( + kill_house=kill_house_request.kill_request.kill_house, trash=False) + if kill_house_vet.count() > 0: + kill_house_vet = kill_house_vet.last() + kill_house_vet_name = kill_house_vet.vet.user.fullname + kill_house_vet_mobile = kill_house_vet.vet.user.mobile + else: + kill_house_vet_name = None + kill_house_vet_mobile = None + + kill_house_request_dict = {} + kill_house_request_dict = { + "vet_state": kill_house_request.vet_state, + "kill_house_vet_name": kill_house_vet_name, + "kill_house_vet_mobile": kill_house_vet_mobile, + "driver_name": kill_house_request.add_car.driver.driver_name, + "driver_mobile": kill_house_request.add_car.driver.driver_mobile, + "pelak": kill_house_request.add_car.driver.pelak, + "health_code": kill_house_request.add_car.driver.health_code, + "quantity": kill_house_request.quantity, + "traffic_code": kill_house_request.traffic_code, + "clearance_code": kill_house_request.clearance_code, + "bar_code": kill_house_request.bar_code, + } + bar = KillHouseAssignmentInformation.objects.filter(trash=False, + kill_house_request=kill_house_request) + if bar: + bar = bar.last() + kill_house_request_dict.update({ + "bar": { + "car_weight_without_load": bar.car_weight_without_load, + "car_weight_without_load_image": bar.car_weight_without_load_image, + "car_weight_with_load": bar.car_weight_with_load, + "car_weight_with_load_image": bar.car_weight_with_load_image, + "net_weight": bar.net_weight, + "state": bar.state, + "real_quantity": bar.real_quantity, + "exploited_carcass": bar.exploited_carcass + } + }) + else: + kill_house_request_dict.update({ + "bar": None + }) + province_factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if province_factor: + province_factor = province_factor.last() + kill_house_request_dict.update({"province_factor": { + "total_weight": province_factor.total_weight, + "factor_fee": province_factor.factor_fee, + "total_price": province_factor.total_price, + "paid_state": province_factor.paid_state, + } + + }) + else: + kill_house_request_dict.update({"province_factor": None}) + + kill_house_factor = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if kill_house_factor: + kill_house_factor = kill_house_factor.last() + kill_house_request_dict.update({"kill_house_factor": { + "payment_code": kill_house_factor.payment_code, + "state": kill_house_factor.state, + "factor_image": kill_house_factor.factor_image, + "message": kill_house_factor.message, + } + + }) + else: + kill_house_request_dict.update({"kill_house_factor": None}) + kill_house_request_list.append(kill_house_request_dict) + province_kill_request_dict.update({"kill_house_requests": kill_house_request_list}) + + + else: + province_kill_request_dict.update({"kill_house_requests": None}) + + province_kill_request_list.append(province_kill_request_dict) + poultry_request_dict.update({"province_kill_requests": province_kill_request_list}) + + else: + poultry_request_dict.update({"province_kill_requests": None}) + + province_inspector = PovinceInspector.objects.filter(poultry_request=poultry_request, trash=False) + if province_inspector: + province_inspector = province_inspector.last() + poultry_request_dict.update({"province_inspector": { + "state": province_inspector.state + + }}) + else: + poultry_request_dict.update({"province_inspector": None}) + poultry_request_list.append(poultry_request_dict) + return Response(poultry_request_list, status=status.HTTP_200_OK) + + +class GeneralCasestatusViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryRequestSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryRequestFilterSet + filterset_fields = [ + 'poultry__unit_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'order_code', + ] + + def list(self, request, *args, **kwargs): + poultry_reqs = [] + poultry_requests = [] + user = SystemUserProfile.objects.get(user=request.user) + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + poultry_reqs = PoultryRequest.objects.filter( + poultry__address__province=user.province, + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False + ).order_by('id').select_related('poultry__user') + + elif request.GET['role'] == 'CityCommerce' or request.GET['role'] == 'VetFarm': + poultry_reqs = PoultryRequest.objects.filter( + poultry__address__province=user.province, + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False + ).order_by('id').select_related('poultry__user') + + else: + poultry_reqs = PoultryRequest.objects.filter( + poultry__address__province=user.province, + send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False).order_by('id').select_related('poultry__user') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=poultry_reqs + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=poultry_reqs) + poultry_requests = ps.filter() + poultry_reqs = [] if len(poultry_requests) == 0 else poultry_requests + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry_reqs) + if page is not None: + serializer = PoultryRequestForGeneralCasestatusSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = PoultryRequestForGeneralCasestatusSerializer(poultry_reqs, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class HatchingQueryViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching + serializer_class = PoultryHatchingSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + + hatchings = PoultryHatching.objects.filter(trash=False).order_by('-date') + if hatchings: + hatchings_list = [] + quantity = 0 + + for hatching in hatchings: + poultry_requests = PoultryRequest.objects.filter( + hatching=hatching, + trash=False, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted') + ) + + quantity_req = sum(poultry_req.quantity for poultry_req in poultry_requests) + quantity += hatching.quantity + + hatching_dict = { + "poultry_name": hatching.poultry.unit_name, + "quantity": hatching.quantity, + "breed": hatching.breed, + "left_over": hatching.left_over, + "date": hatching.date.date(), + "period": hatching.period, + "poultry_request": quantity_req + } + + hatchings_list.append(hatching_dict) + + return Response(hatchings_list) + + +class BuyerRemittance(viewsets.ModelViewSet): + queryset = ProvinceAutoAllocation.objects.all() + permission_classes = [AllowAny] + serializer_class = NewProvinceAutoAllocationSerializer + + def list(self, request, *args, **kwargs): + + if 'allocation_key' in request.GET: + serializer = NewProvinceAutoAllocationSerializer( + ProvinceAutoAllocation.objects.filter(key=request.GET['allocation_key'], trash=False, ).select_related( + 'poultry_request'), many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + elif 'poultry_request_key' in request.GET: + + poultry_request = PoultryRequest.objects.filter(key=request.GET['poultry_request_key']).prefetch_related( + 'poultry_request_auto_quantity_province', + ).last() + + province_auto_allocations = poultry_request.poultry_request_auto_quantity_province.all().select_related( + 'poultry_request', + 'province_kill_request', + 'daily_quota__kill_house__kill_house_operator__user', + 'daily_quota__killer_kill_house__kill_house_operator__user') + poultry_requests_list = [] + kill_house_list = [] + killer_list = [] + for a in province_auto_allocations: + if a.poultry_request not in poultry_requests_list: + poultry_requests_list.append(a.poultry_request) + num1 = 0 + for b in province_auto_allocations: + if b.daily_quota == a.daily_quota: + num1 += b.quantity * b.poultry_request.Index_weight + dict1 = { + "buyer_name": a.daily_quota.kill_house.name, + "weight": num1 + } + if dict1 not in killer_list: + killer_list.append(dict1) + if a.daily_quota.killer_kill_house == None: + for b in province_auto_allocations: + if b.daily_quota == a.daily_quota or b.daily_quota.killer_kill_house == a.daily_quota.kill_house: + num1 += b.quantity * b.poultry_request.Index_weight + dict2 = { + "kill_house_name": a.daily_quota.kill_house.name, + "weight": num1 + } + if dict2 not in kill_house_list: + kill_house_list.append(dict2) + + allocation_list = [] + for allocation in province_auto_allocations: + if allocation.daily_quota.killer_kill_house: + kill_house = allocation.daily_quota.killer_kill_house + else: + kill_house = allocation.daily_quota.kill_house + + allocation_dict = { + "buyer_fullname": allocation.daily_quota.kill_house.kill_house_operator.user.fullname, + "buyer_mobile": allocation.daily_quota.kill_house.kill_house_operator.user.mobile, + "quantity": allocation.quantity, + "kill_house": { + "kill_house_fullname": kill_house.kill_house_operator.user.fullname, + "kill_house_mobile": kill_house.kill_house_operator.user.mobile, + } + } + allocation_list.append(allocation_dict) + internal_poultry_req_dict = { + "poultry_fullname": poultry_request.poultry.user.fullname, + "base_order": poultry_request.poultry.user.base_order, + "poultry_mobile": poultry_request.poultry.user.mobile, + "poultry_quantity": poultry_request.quantity, + "index_weight": poultry_request.Index_weight, + "date": poultry_request.send_date, + "allocations": allocation_list, + } + final_dict = { + "poultry": internal_poultry_req_dict, + "buyer": killer_list, + "kill_house": kill_house_list + } + return Response(final_dict, status=status.HTTP_200_OK) + + elif 'auto_allocation' in request.GET: + + now = datetime.datetime.now().date() + date = datetime.datetime.strptime(str(request.GET['date']), + '%Y-%m-%d').date() if 'date' in request.GET else now + allocations = ProvinceAutoAllocation.objects.filter(trash=False, create_date__date=date).select_related( + 'poultry_request', + 'province_kill_request', + 'daily_quota__kill_house__kill_house_operator__user', + 'daily_quota__killer_kill_house__kill_house_operator__user' + ) + + poultry_requests_list = [] + final_poultry_requests_list = [] + kill_house_list = [] + killer_list = [] + + for a in allocations: + if a.poultry_request not in poultry_requests_list: + poultry_requests_list.append(a.poultry_request) + num1 = 0 + for b in allocations: + if b.daily_quota == a.daily_quota: + num1 += b.quantity * b.poultry_request.Index_weight + dict1 = { + "buyer_name": a.daily_quota.kill_house.name, + "weight": num1 + } + if dict1 not in killer_list: + killer_list.append(dict1) + if a.daily_quota.killer_kill_house == None: + for b in allocations: + if b.daily_quota == a.daily_quota or b.daily_quota.killer_kill_house == a.daily_quota.kill_house: + num1 += b.quantity * b.poultry_request.Index_weight + dict2 = { + "kill_house_name": a.daily_quota.kill_house.name, + "weight": num1 + } + if dict2 not in kill_house_list: + kill_house_list.append(dict2) + + allocation_list = [] + + for poultry_request in poultry_requests_list: + for allocation in allocations: + if allocation.poultry_request != poultry_request: + continue + + kill_house = allocation.daily_quota.killer_kill_house if allocation.daily_quota.killer_kill_house else allocation.daily_quota.kill_house + + allocation_dict = { + "buyer_fullname": allocation.daily_quota.kill_house.kill_house_operator.user.fullname, + "buyer_mobile": allocation.daily_quota.kill_house.kill_house_operator.user.mobile, + "quantity": allocation.quantity, + "kill_house": { + "kill_house_fullname": kill_house.kill_house_operator.user.fullname, + "kill_house_mobile": kill_house.kill_house_operator.user.mobile, + } + } + allocation_list.append(allocation_dict) + + internal_poultry_req_dict = { + "poultry_fullname": poultry_request.poultry.user.fullname, + "poultry_mobile": poultry_request.poultry.user.mobile, + "poultry_quantity": poultry_request.quantity, + "index_weight": poultry_request.Index_weight, + "date": poultry_request.send_date, + "allocations": allocation_list, + } + final_poultry_requests_list.append(internal_poultry_req_dict) + final_dict = { + "poultry": final_poultry_requests_list, + "buyer": killer_list, + "kill_house": kill_house_list, + } + + return Response(final_dict, status=status.HTTP_200_OK) + + elif 'poultry_remittance' in request.GET: + now = datetime.datetime.now().date() + date = datetime.datetime.strptime(str(request.GET['date']), + '%Y-%m-%d').date() if 'date' in request.GET else now + allocations = ProvinceAutoAllocation.objects.filter(trash=False, create_date__date=date).select_related( + 'poultry_request', + 'province_kill_request', + 'daily_quota__kill_house__kill_house_operator__user', + 'daily_quota__killer_kill_house__kill_house_operator__user' + ) + + poultry_requests_list = [] + final_poultry_requests_list = [] + allocation_list = [] + for a in allocations: + if a.poultry_request not in poultry_requests_list: + poultry_requests_list.append(a.poultry_request) + for poultry_request in poultry_requests_list: + for allocation in allocations: + if allocation.poultry_request != poultry_request: + continue + + kill_house = allocation.daily_quota.killer_kill_house if allocation.daily_quota.killer_kill_house else allocation.daily_quota.kill_house + + allocation_dict = { + "buyer_fullname": allocation.daily_quota.kill_house.kill_house_operator.user.fullname, + "buyer_mobile": allocation.daily_quota.kill_house.kill_house_operator.user.mobile, + "quantity": allocation.quantity, + "kill_house": { + "kill_house_fullname": kill_house.kill_house_operator.user.fullname, + "kill_house_mobile": kill_house.kill_house_operator.user.mobile, + } + } + allocation_list.append(allocation_dict) + + internal_poultry_req_dict = { + "poultry_fullname": poultry_request.poultry.user.fullname, + "poultry_mobile": poultry_request.poultry.user.mobile, + "poultry_quantity": poultry_request.quantity, + "date": poultry_request.send_date, + "allocations": allocation_list, + } + final_poultry_requests_list.append(internal_poultry_req_dict) + return Response(final_poultry_requests_list, status=status.HTTP_200_OK) + + elif 'factor_to_province' in request.GET: + factor = ProvinceFactorToKillHouse.objects.get( + key=request.GET['factor_to_province'], paid_state='pending') + # serializer = ProvinceFactorToKillHousePdfSerializer(factor) + # return Response(serializer.data,status=status.HTTP_200_OK) + + economic_code_kill_house = factor.province_check_info.kill_house_assignment.kill_house_request.killhouse_user.kill_house_operator.user.national_code if factor.province_check_info.kill_house_assignment.kill_house_request.killhouse_user.kill_house_operator.user.national_code else None + economic_code_poultry = factor.province_check_req.poultry_request.poultry.user.national_code if factor.province_check_req.poultry_request.poultry.user.national_code else None + dict1 = { + "buyer_name": factor.province_check_info.kill_house_assignment.kill_house_request.killhouse_user.name, + # "economic_code_kill_house":economic_code_kill_house, + # "national_id_kill_house":None, + "serial_number_kill_house": factor.province_check_req.poultry_request.poultry.user.base_order, + "adders_kill_house": factor.province_check_info.kill_house_assignment.kill_house_request.killhouse_user.kill_house_operator.address.address, + # "register_number_kill_house":None, + "postal_code_kill_house": factor.province_check_info.kill_house_assignment.kill_house_request.killhouse_user.kill_house_operator.address.postal_code, + "poultry_name": factor.province_check_req.poultry_request.poultry.unit_name + ' ' + factor.province_check_req.poultry_request.poultry.user.fullname, + # "economic_code_poultry":economic_code_poultry, + # "national_id_poultry":None, + "adders_poultry": factor.province_check_req.poultry_request.poultry.address.address, + # "register_number_poultry":None, + "postal_code_poultry": factor.province_check_req.poultry_request.poultry.address.postal_code, + "factor_bar_code": factor.factor_bar_code, + "amount": factor.total_weight, + "chicken_price": factor.factor_fee, + "total_price": factor.total_price, + + } + return Response(dict1, status=status.HTTP_200_OK) + + +class DetailsGeneralWageViewSet(viewsets.ModelViewSet): + permission_classes = [AllowAny] + serializer_class = GenaeralWageSerailizer + queryset = ProvinceKillRequest.objects.filter( + state__in=('pending', 'accepted'), trash=False, archive_wage=False, + first_car_allocated_quantity=0, + return_to_province=False).exclude(union_share=0, company_share=0, guilds_share=0) + + def list(self, request, *args, **kwargs): + ser_general = self.serializer_class(self.queryset).data + return Response(ser_general['general'], status=status.HTTP_200_OK) + + +class DetailsGeneralKillHoseWageViewSet(viewsets.ModelViewSet): + permission_classes = [AllowAny] + serializer_class = DetailsGeneraWageSerializer + # serializer_class = NewDetailsGeneraWageSerializer + queryset = KillHouse.objects.filter(trash=False).select_related('kill_house_operator__user', + 'kill_house_operator__user__city').exclude( + out_province=True) + + def list(self, request, *args, **kwargs): + ser_data = self.serializer_class(self.queryset, many=True, context={'request': request}).data + return Response(ser_data, status=status.HTTP_200_OK) + + +class NewDetailsGeneralKillHoseWageViewSet(viewsets.ModelViewSet): + permission_classes = [AllowAny] + serializer_class = NewDetailsGeneraWageSerializer + queryset = KillHouse.objects.filter(trash=False).select_related('kill_house_operator__user', + 'kill_house_operator__user__city').exclude( + out_province=True) + + def list(self, request, *args, **kwargs): + ser_data = self.serializer_class(self.queryset, many=True, context={'request': request}).data + return Response(ser_data, status=status.HTTP_200_OK) + + +class DashboardDetailsGeneralKillHoseWageViewSet(viewsets.ModelViewSet): + permission_classes = [AllowAny] + serializer_class = DashboardDetailsGeneraWageSerializer + queryset = KillHouse.objects.filter(trash=False).select_related('kill_house_operator__user', + 'kill_house_operator__user__city').exclude( + out_province=True) + + def list(self, request, *args, **kwargs): + ser_data = self.serializer_class(self.queryset, context={'request': request}).data + return Response(ser_data, status=status.HTTP_200_OK) + + +class DataReportPercentagesViewSet(viewsets.ModelViewSet): + permission_classes = [TokenHasReadWriteScope] + serializer_class = DetailsGeneraWageSerializer + queryset = KillHouseRequest.objects.filter(trash=False).order_by('kill_request__recive_date') + + def list(self, request, *args, **kwargs): + user = request.user + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user__user=user, trash=False) + kill_requests = self.queryset.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + else: + kill_requests = self.queryset + all_list = {} + if request.GET['type'] == 'year': + has_code_list = [] + quarantine_quantity_list = [] + assignment_state_archive_list = [] + accepted_assignment_real_weight_list = [] + hasnt_code_list = [] + difference_bar_list = [] + ware_house_confirmation_list = [] + ware_house_accepted_real_weight_list = [] + weight_year_list = [] + + now = datetime.datetime.now().date() + start_date = now - relativedelta(years=1) # محاسبه تاریخ یک سال پیش + + current_date = start_date + while current_date <= now: + kill_request = kill_requests.filter(kill_request__recive_date__date__month=current_date.month, + kill_request__recive_date__date__year=current_date.year) + has_code_year = len(kill_request.filter(clearance_code__isnull=False)) + quarantine_quantity_year = len(kill_request.filter(quarantine_quantity__isnull=False)) + assignment_state_archive_year = len(kill_request.filter(assignment_state_archive='True')) + accepted_assignment_real_weight = kill_request.aggregate( + total_quantity=Sum('accepted_assignment_real_weight')).get('total_quantity') or 0 + accepted_real_weight = kill_request.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + hasnt_code_year = len(kill_request.filter(clearance_code__isnull=True)) + difference_bar = len(kill_request.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + ware_house_confirmation_year = len(kill_request.filter(ware_house_confirmation=True)) + ware_house_accepted_real_weight = kill_request.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get('total_quantity') or 0 + + dict_has_code_year = { + 'date': current_date, + 'percent': round(has_code_year * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_quarantine_quantity_year = { + 'date': current_date, + 'percent': round(quarantine_quantity_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_assignment_state_archive_year = { + 'date': current_date, + 'percent': round(assignment_state_archive_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_accepted_assignment_real_weight_year = { + 'date': current_date, + 'percent': round(accepted_assignment_real_weight * 100 / accepted_real_weight, + 2) if accepted_real_weight > 0 else 0 + } + dict_hasnt_code_year = { + 'date': current_date, + 'percent': round(hasnt_code_year * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_difference_bar_year = { + 'date': current_date, + 'percent': round(difference_bar * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_ware_house_confirmation_year = { + 'date': current_date, + 'percent': round(ware_house_confirmation_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_ware_house_accepted_real_weight_year = { + 'date': current_date, + 'percent': round(ware_house_accepted_real_weight * 100 / accepted_real_weight, + 2) if accepted_real_weight > 0 else 0 + } + dict_weight_year = { + 'date': current_date, + 'percent': round(ware_house_accepted_real_weight * 100 / accepted_assignment_real_weight, + 2) if accepted_assignment_real_weight > 0 else 0 + } + + has_code_list.append(dict_has_code_year) + quarantine_quantity_list.append(dict_quarantine_quantity_year) + assignment_state_archive_list.append(dict_assignment_state_archive_year) + accepted_assignment_real_weight_list.append(dict_accepted_assignment_real_weight_year) + hasnt_code_list.append(dict_hasnt_code_year) + difference_bar_list.append(dict_difference_bar_year) + ware_house_confirmation_list.append(dict_ware_house_confirmation_year) + ware_house_accepted_real_weight_list.append(dict_ware_house_accepted_real_weight_year) + weight_year_list.append(dict_weight_year) + + current_date += relativedelta(months=1) + + all_list['hasCode'] = has_code_list + all_list['quarantineQuantity'] = quarantine_quantity_list + all_list['assignmentStateArchive'] = assignment_state_archive_list + all_list['acceptedAssignmentRealWeight'] = accepted_assignment_real_weight_list + all_list['hasntCode'] = hasnt_code_list + all_list['differenceBar'] = difference_bar_list + all_list['wareHouseConfirmation'] = ware_house_confirmation_list + all_list['wareHouseAcceptedRealWeight'] = ware_house_accepted_real_weight_list + all_list['weightYear'] = weight_year_list + elif request.GET['type'] == 'sixMonths': + has_code_list = [] + quarantine_quantity_list = [] + assignment_state_archive_list = [] + accepted_assignment_real_weight_list = [] + hasnt_code_list = [] + difference_bar_list = [] + ware_house_confirmation_list = [] + ware_house_accepted_real_weight_list = [] + weight_year_list = [] + + now = datetime.datetime.now().date() + start_date = now - relativedelta(months=5) # محاسبه تاریخ شش ماه پیش + + current_date = start_date + while current_date <= now: + kill_request = kill_requests.filter(kill_request__recive_date__date__month=current_date.month, + kill_request__recive_date__date__year=current_date.year) + has_code_year = len(kill_request.filter(clearance_code__isnull=False)) + quarantine_quantity_year = len(kill_request.filter(quarantine_quantity__isnull=False)) + assignment_state_archive_year = len(kill_request.filter(assignment_state_archive='True')) + accepted_assignment_real_weight = kill_request.aggregate( + total_quantity=Sum('accepted_assignment_real_weight')).get('total_quantity') or 0 + accepted_real_weight = kill_request.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + hasnt_code_year = len(kill_request.filter(clearance_code__isnull=True)) + difference_bar = len(kill_request.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + ware_house_confirmation_year = len(kill_request.filter(ware_house_confirmation=True)) + ware_house_accepted_real_weight = kill_request.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get('total_quantity') or 0 + + dict_has_code_year = { + 'date': current_date, + 'percent': round(has_code_year * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_quarantine_quantity_year = { + 'date': current_date, + 'percent': round(quarantine_quantity_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_assignment_state_archive_year = { + 'date': current_date, + 'percent': round(assignment_state_archive_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_accepted_assignment_real_weight_year = { + 'date': current_date, + 'percent': round(accepted_assignment_real_weight * 100 / accepted_real_weight, + 2) if accepted_real_weight > 0 else 0 + } + dict_hasnt_code_year = { + 'date': current_date, + 'percent': round(hasnt_code_year * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_difference_bar_year = { + 'date': current_date, + 'percent': round(difference_bar * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_ware_house_confirmation_year = { + 'date': current_date, + 'percent': round(ware_house_confirmation_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_ware_house_accepted_real_weight_year = { + 'date': current_date, + 'percent': round(ware_house_accepted_real_weight * 100 / accepted_real_weight, + 2) if accepted_real_weight > 0 else 0 + } + dict_weight_year = { + 'date': current_date, + 'percent': round(ware_house_accepted_real_weight * 100 / accepted_assignment_real_weight, + 2) if accepted_assignment_real_weight > 0 else 0 + } + + has_code_list.append(dict_has_code_year) + quarantine_quantity_list.append(dict_quarantine_quantity_year) + assignment_state_archive_list.append(dict_assignment_state_archive_year) + accepted_assignment_real_weight_list.append(dict_accepted_assignment_real_weight_year) + hasnt_code_list.append(dict_hasnt_code_year) + difference_bar_list.append(dict_difference_bar_year) + ware_house_confirmation_list.append(dict_ware_house_confirmation_year) + ware_house_accepted_real_weight_list.append(dict_ware_house_accepted_real_weight_year) + weight_year_list.append(dict_weight_year) + + current_date += relativedelta(months=1) + + all_list['hasCode'] = has_code_list + all_list['quarantineQuantity'] = quarantine_quantity_list + all_list['assignmentStateArchive'] = assignment_state_archive_list + all_list['acceptedAssignmentRealWeight'] = accepted_assignment_real_weight_list + all_list['hasntCode'] = hasnt_code_list + all_list['differenceBar'] = difference_bar_list + all_list['wareHouseConfirmation'] = ware_house_confirmation_list + all_list['wareHouseAcceptedRealWeight'] = ware_house_accepted_real_weight_list + all_list['weightYear'] = weight_year_list + elif request.GET['type'] == 'threeMonths': + has_code_list = [] + quarantine_quantity_list = [] + assignment_state_archive_list = [] + accepted_assignment_real_weight_list = [] + hasnt_code_list = [] + difference_bar_list = [] + ware_house_confirmation_list = [] + ware_house_accepted_real_weight_list = [] + weight_year_list = [] + + now = datetime.datetime.now().date() + start_date = now - relativedelta(months=2) # محاسبه تاریخ سه ماه پیش + + current_date = start_date + while current_date <= now: + kill_request = kill_requests.filter(kill_request__recive_date__date__month=current_date.month, + kill_request__recive_date__date__year=current_date.year) + has_code_year = len(kill_request.filter(clearance_code__isnull=False)) + quarantine_quantity_year = len(kill_request.filter(quarantine_quantity__isnull=False)) + assignment_state_archive_year = len(kill_request.filter(assignment_state_archive='True')) + accepted_assignment_real_weight = kill_request.aggregate( + total_quantity=Sum('accepted_assignment_real_weight')).get('total_quantity') or 0 + accepted_real_weight = kill_request.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + hasnt_code_year = len(kill_request.filter(clearance_code__isnull=True)) + difference_bar = len(kill_request.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + ware_house_confirmation_year = len(kill_request.filter(ware_house_confirmation=True)) + ware_house_accepted_real_weight = kill_request.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get('total_quantity') or 0 + + dict_has_code_year = { + 'date': current_date, + 'percent': round(has_code_year * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_quarantine_quantity_year = { + 'date': current_date, + 'percent': round(quarantine_quantity_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_assignment_state_archive_year = { + 'date': current_date, + 'percent': round(assignment_state_archive_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_accepted_assignment_real_weight_year = { + 'date': current_date, + 'percent': round(accepted_assignment_real_weight * 100 / accepted_real_weight, + 2) if accepted_real_weight > 0 else 0 + } + dict_hasnt_code_year = { + 'date': current_date, + 'percent': round(hasnt_code_year * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_difference_bar_year = { + 'date': current_date, + 'percent': round(difference_bar * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_ware_house_confirmation_year = { + 'date': current_date, + 'percent': round(ware_house_confirmation_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_ware_house_accepted_real_weight_year = { + 'date': current_date, + 'percent': round(ware_house_accepted_real_weight * 100 / accepted_real_weight, + 2) if accepted_real_weight > 0 else 0 + } + dict_weight_year = { + 'date': current_date, + 'percent': round(ware_house_accepted_real_weight * 100 / accepted_assignment_real_weight, + 2) if accepted_assignment_real_weight > 0 else 0 + } + + has_code_list.append(dict_has_code_year) + quarantine_quantity_list.append(dict_quarantine_quantity_year) + assignment_state_archive_list.append(dict_assignment_state_archive_year) + accepted_assignment_real_weight_list.append(dict_accepted_assignment_real_weight_year) + hasnt_code_list.append(dict_hasnt_code_year) + difference_bar_list.append(dict_difference_bar_year) + ware_house_confirmation_list.append(dict_ware_house_confirmation_year) + ware_house_accepted_real_weight_list.append(dict_ware_house_accepted_real_weight_year) + weight_year_list.append(dict_weight_year) + + current_date += relativedelta(months=1) + + all_list['hasCode'] = has_code_list + all_list['quarantineQuantity'] = quarantine_quantity_list + all_list['assignmentStateArchive'] = assignment_state_archive_list + all_list['acceptedAssignmentRealWeight'] = accepted_assignment_real_weight_list + all_list['hasntCode'] = hasnt_code_list + all_list['differenceBar'] = difference_bar_list + all_list['wareHouseConfirmation'] = ware_house_confirmation_list + all_list['wareHouseAcceptedRealWeight'] = ware_house_accepted_real_weight_list + all_list['weightYear'] = weight_year_list + else: + has_code_list = [] + quarantine_quantity_list = [] + assignment_state_archive_list = [] + accepted_assignment_real_weight_list = [] + hasnt_code_list = [] + difference_bar_list = [] + ware_house_confirmation_list = [] + ware_house_accepted_real_weight_list = [] + weight_year_list = [] + + now = datetime.datetime.now().date() + last_year = now - relativedelta(months=1) # محاسبه تاریخ یک ماه پیش + + current_date = last_year + while current_date <= now: + kill_request = kill_requests.filter(kill_request__recive_date__date=current_date) + has_code_year = len(kill_request.filter(clearance_code__isnull=False)) + quarantine_quantity_year = len(kill_request.filter(quarantine_quantity__isnull=False)) + assignment_state_archive_year = len(kill_request.filter(assignment_state_archive='True')) + accepted_assignment_real_weight = kill_request.aggregate( + total_quantity=Sum('accepted_assignment_real_weight')).get('total_quantity') or 0 + accepted_real_weight = kill_request.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + hasnt_code_year = len(kill_request.filter(clearance_code__isnull=True)) + difference_bar = len(kill_request.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + ware_house_confirmation_year = len(kill_request.filter(ware_house_confirmation=True)) + ware_house_accepted_real_weight = kill_request.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get('total_quantity') or 0 + + dict_has_code_year = { + 'date': current_date, + 'percent': round(has_code_year * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_quarantine_quantity_year = { + 'date': current_date, + 'percent': round(quarantine_quantity_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_assignment_state_archive_year = { + 'date': current_date, + 'percent': round(assignment_state_archive_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_accepted_assignment_real_weight_year = { + 'date': current_date, + 'percent': round(accepted_assignment_real_weight * 100 / accepted_real_weight, + 2) if accepted_real_weight > 0 else 0 + } + dict_hasnt_code_year = { + 'date': current_date, + 'percent': round(hasnt_code_year * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_difference_bar_year = { + 'date': current_date, + 'percent': round(difference_bar * 100 / len(kill_request), 2) if len(kill_request) > 0 else 0 + } + dict_ware_house_confirmation_year = { + 'date': current_date, + 'percent': round(ware_house_confirmation_year * 100 / len(kill_request), 2) if len( + kill_request) > 0 else 0 + } + dict_ware_house_accepted_real_weight_year = { + 'date': current_date, + 'percent': round(ware_house_accepted_real_weight * 100 / accepted_real_weight, + 2) if accepted_real_weight > 0 else 0 + } + dict_weight_year = { + 'date': current_date, + 'percent': round(ware_house_accepted_real_weight * 100 / accepted_assignment_real_weight, + 2) if accepted_assignment_real_weight > 0 else 0 + } + + has_code_list.append(dict_has_code_year) + quarantine_quantity_list.append(dict_quarantine_quantity_year) + assignment_state_archive_list.append(dict_assignment_state_archive_year) + accepted_assignment_real_weight_list.append(dict_accepted_assignment_real_weight_year) + hasnt_code_list.append(dict_hasnt_code_year) + difference_bar_list.append(dict_difference_bar_year) + ware_house_confirmation_list.append(dict_ware_house_confirmation_year) + ware_house_accepted_real_weight_list.append(dict_ware_house_accepted_real_weight_year) + weight_year_list.append(dict_weight_year) + + current_date += relativedelta(days=1) # به روز بعد بروید + + all_list['hasCode'] = has_code_list + all_list['quarantineQuantity'] = quarantine_quantity_list + all_list['assignmentStateArchive'] = assignment_state_archive_list + all_list['acceptedAssignmentRealWeight'] = accepted_assignment_real_weight_list + all_list['hasntCode'] = hasnt_code_list + all_list['differenceBar'] = difference_bar_list + all_list['wareHouseConfirmation'] = ware_house_confirmation_list + all_list['wareHouseAcceptedRealWeight'] = ware_house_accepted_real_weight_list + all_list['weightYear'] = weight_year_list + return Response(all_list) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def check_excel(request): + url = request.GET.get('url') + if not url: + return JsonResponse({'status': 'error', 'message': 'URL parameter is missing'}, status=400) + + try: + r = requests.head(f'https://{base_url_for_sms_report}backend.rasadyar.com/{url}') + return JsonResponse({'status': r.status_code}) + except requests.RequestException as e: + return JsonResponse({'status': 'error', 'message': str(e)}, status=500) + + +class SSLAdapter(HTTPAdapter): + def __init__(self, *args, **kwargs): + self.context = create_urllib3_context() + self.context.options |= 0x4 # OP_LEGACY_SERVER_CONNECT + super().__init__(*args, **kwargs) + + def init_poolmanager(self, *args, **kwargs): + kwargs['ssl_context'] = self.context + return super().init_poolmanager(*args, **kwargs) + + def build_response(self, req, resp): + resp = super().build_response(req, resp) + return resp + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def find_gid_code(request): + date = datetime.datetime.now().date() - datetime.timedelta(days=7) + kill_house_request = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date, trash=False, + quarantine_quantity__isnull=True).only( + 'quarantine_code_state', 'clearance_code', 'quarantine_quantity' + ).order_by('-id') + session = requests.Session() + session.mount('https://', SSLAdapter()) + + for kill in kill_house_request: + if kill.clearance_code is None: + kill.quarantine_code_state = 'noclearance' + else: + data = {'gid': str(kill.clearance_code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + text = context.body.get_text(strip=True) + if text == 'فرآورده هاي خام داميGo Backفهرستخروجتاییده راهداری دریافت نشد به بخش اعلام خاتمه صدور گواهی بهداشتی حمل درهمین سایت مراجعه کنید.': + kill.quarantine_code_state = 'notconfirmed' + if kill.quarantine_quantity is not None: + kill.quarantine_quantity = None + else: + table = context.find_all('table') + if table[5:6]: + for i in table[5:6]: + row = i.find_all('tr') + for r in row[1:2]: + quantity = r.find('td') + match = re.search(r'\d+', quantity.text) + if match: + number = match.group() + kill.quarantine_quantity = int(number) + if kill.quarantine_code_state is not None: + kill.quarantine_code_state = None + else: + for table in table: + p_tags = table.find_all('p') + for p in p_tags: + p_text = p.get_text(strip=True) + if p_text == 'شماره رهگيري وارد شده معتبر نيست.': + kill.quarantine_code_state = 'contradiction' + if kill.quarantine_quantity is not None: + kill.quarantine_quantity = None + kill.save() + return HttpResponse('ok') + + +def get_gid(clearance_code): + kill = KillHouseRequest.objects.filter(clearance_code=clearance_code, trash=False).order_by('id') + session = requests.Session() + session.mount('https://', SSLAdapter()) + if kill: + if len(kill) > 1: + for k in kill[1:]: + if k.quarantine_quantity is not None: + k.quarantine_quantity = None + k.quarantine_code_state = 'merge' + k.save() + kill = kill.first() + if kill.quarantine_code_state != 'merge': + data = {'gid': str(kill.clearance_code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + text = context.body.get_text(strip=True) + if text == 'فرآورده هاي خام داميGo Backفهرستخروجتاییده راهداری دریافت نشد به بخش اعلام خاتمه صدور گواهی بهداشتی حمل درهمین سایت مراجعه کنید.': + kill.quarantine_code_state = 'notconfirmed' + if kill.quarantine_quantity is not None: + kill.quarantine_quantity = None + else: + table = context.find_all('table') + if table[5:6]: + row = context.find('div', align="right") + if row: + content = row.get_text(separator=" ", strip=True) + date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content) + + if date_match: + jalali_date = date_match.group(1) + year, month, day = map(int, jalali_date.split('/')) + date = convert_to_miladi(year=year, month=month, day=day) + kill.inquiry_date = date.date() + send_date = kill.kill_request.recive_date.date() + + one_day = timedelta(days=1) + if abs(send_date - date.date()) <= one_day: + for i in table[5:6]: + row = i.find_all('tr') + for r in row[1:2]: + quantity = r.find('td') + match = re.search(r'\d+', quantity.text) + if match: + number = match.group() + kill.quarantine_quantity = int(number) + if kill.quarantine_code_state is not None: + kill.quarantine_code_state = None + for i in table[4:5]: + rows = i.find_all('tr') + + pelak_txt = rows[1].find('span', class_='dynamictxt', dir='ltr', + style='font-family:Tahoma').text.strip() + kill.inquiry_pelak = pelak_txt + td = rows[1].find_all('td')[1] + driver_txt = td.find('span', class_='dynamictxt').text.strip() + kill.inquiry_driver = driver_txt + + for r in rows: + tds = r.find_all('td', colspan="2") + if len(tds) >= 2: + origin_td = tds[0] + origin_text = origin_td.find('span', class_='dynamictxt').text.strip() + kill.inquiry_origin = origin_text + + destination_td = tds[1] + destination_text = destination_td.find('span', + class_='dynamictxt').text.strip() + kill.inquiry_destination = destination_text + else: + kill.quarantine_code_state = 'contradiction' + kill.quarantine_quantity = None + else: + for table in table: + p_tags = table.find_all('p') + for p in p_tags: + p_text = p.get_text(strip=True) + if p_text == 'شماره رهگيري وارد شده معتبر نيست.': + kill.quarantine_code_state = 'contradiction' + if kill.quarantine_quantity is not None: + kill.quarantine_quantity = None + kill.save() + + +def cron_find_gid_code(): + date = datetime.datetime.now().date() - datetime.timedelta(days=7) + kill_house_request = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date, trash=False, + quarantine_quantity__isnull=True, + clearance_code__isnull=False).only( + 'quarantine_code_state', 'clearance_code', 'quarantine_quantity' + ).order_by('-id') + session = requests.Session() + session.mount('https://', SSLAdapter()) + + for kill in kill_house_request: + if kill.quarantine_code_state != 'merge': + if kill.clearance_code is None: + kill.quarantine_code_state = 'noclearance' + else: + data = {'gid': str(kill.clearance_code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + text = context.body.get_text(strip=True) + if text == 'فرآورده هاي خام داميGo Backفهرستخروجتاییده راهداری دریافت نشد به بخش اعلام خاتمه صدور گواهی بهداشتی حمل درهمین سایت مراجعه کنید.': + kill.quarantine_code_state = 'notconfirmed' + if kill.quarantine_quantity is not None: + kill.quarantine_quantity = None + else: + table = context.find_all('table') + if table[5:6]: + row = context.find('div', align="right") + if row: + content = row.get_text(separator=" ", strip=True) + date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content) + + if date_match: + jalali_date = date_match.group(1) + year, month, day = map(int, jalali_date.split('/')) + date = convert_to_miladi(year=year, month=month, day=day) + kill.inquiry_date = date.date() + send_date = kill.kill_request.recive_date.date() + + one_day = timedelta(days=1) + if abs(send_date - date.date()) <= one_day: + for i in table[5:6]: + row = i.find_all('tr') + for r in row[1:2]: + quantity = r.find('td') + match = re.search(r'\d+', quantity.text) + if match: + number = match.group() + kill.quarantine_quantity = int(number) + if kill.quarantine_code_state is not None: + kill.quarantine_code_state = None + for i in table[4:5]: + rows = i.find_all('tr') + + pelak_txt = rows[1].find('span', class_='dynamictxt', dir='ltr', + style='font-family:Tahoma').text.strip() + kill.inquiry_pelak = pelak_txt + td = rows[1].find_all('td')[1] + driver_txt = td.find('span', class_='dynamictxt').text.strip() + kill.inquiry_driver = driver_txt + + for r in rows: + tds = r.find_all('td', colspan="2") + if len(tds) >= 2: + origin_td = tds[0] + origin_text = origin_td.find('span', class_='dynamictxt').text.strip() + kill.inquiry_origin = origin_text + + destination_td = tds[1] + destination_text = destination_td.find('span', + class_='dynamictxt').text.strip() + kill.inquiry_destination = destination_text + else: + kill.quarantine_code_state = 'contradiction' + kill.quarantine_quantity = None + + else: + for table in table: + p_tags = table.find_all('p') + for p in p_tags: + p_text = p.get_text(strip=True) + if p_text == 'شماره رهگيري وارد شده معتبر نيست.': + kill.quarantine_code_state = 'contradiction' + if kill.quarantine_quantity is not None: + kill.quarantine_quantity = None + kill.save() + + +class IranProvinceViewSet(viewsets.ModelViewSet): + queryset = IranProvinces.objects.all().order_by('id') + serializer_class = IranProvinceSerializer + permission_classes = [AllowAny] + + +class IranCityViewSet(viewsets.ModelViewSet): + queryset = IranCities.objects.all().order_by('id') + serializer_class = IranCitiesSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + query = self.queryset.filter(province_id__name=request.GET.get('name')) + ser_data = self.serializer_class(query, many=True).data + return Response(ser_data, status=status.HTTP_200_OK) + + +def fix_image_voilation_hatching(request): + hatchings = PoultryHatching.objects.filter(violation_image__isnull=False) + for h in hatchings: + h.violation_image1 = [h.violation_image] + h.save() + return HttpResponse('ok') + + +def fix_image_voilation_hatching_return(request): + hatchings = PoultryHatching.objects.filter(violation_image1__isnull=False) + for h in hatchings: + h.violation_image = h.violation_image1 + h.save() + return HttpResponse('ok') + + +class AgeNotificationPoultryViewSet(viewsets.ModelViewSet): + queryset = AgeNotificationPoultry.objects.all() + serializer_class = AgeNotificationPoultrySerilizer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + query = self.queryset.filter(trash=False) + ser_data = self.serializer_class(query, many=True).data + return Response(ser_data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + query = self.queryset.get(key=request.data['notif_key']) + request.data.pop('notif_key') + ser_data = self.serializer_class(query) + ser_data.update(instance=query, validated_data=request.data) + return Response(ser_data.data, status=status.HTTP_200_OK) + + def destroy(self, request, *args, **kwargs): + query = self.queryset.get(key=request.GET['notif_key']) + query.trash = True + query.save() + return Response({'result': 'با موفقیت حذف شد.'}, status=status.HTTP_200_OK) + + +def send_sms_for_poultry_from_age_notification(): + notif_poultry = AgeNotificationPoultry.objects.filter(trash=False) + if notif_poultry: + for n in notif_poultry: + poultry_hatchings = PoultryHatching.objects.filter( + archive=False, + allow_hatching='pending', + trash=False, + left_over__gt=(F('quantity') * n.losses_percent) / 100, + chicken_age=n.poultry_age + ).values_list('poultry__user__mobile', flat=True).distinct() + + mobile_numbers = ','.join(poultry_hatchings) + if len(mobile_numbers) > 0: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={mobile_numbers}&message={n.message}") + + +def remove_access_token(): + ARTA_remove_access_token = "https://userbackend.rasadyar.com/api/remove_access_token/" + requests.get( + url=ARTA_remove_access_token, + verify=False + ) + now = datetime.datetime.now() + accesses = AccessToken.objects.filter(created__date__gte=now.date() - timedelta(days=3)) + for access in accesses: + access.expires = now - timedelta(days=2) + access.save() + + +def kill_house_not_add_to_inventory(): + now = datetime.datetime.now().date() - timedelta(days=2) + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).select_related('kill_house_operator__user') + for kill_house in kill_houses: + kill_request = len(KillHouseRequest.objects.filter(Q(killhouse_user=kill_house) | Q(killer=kill_house), + trash=False, ware_house_confirmation=False, + calculate_status=True, + kill_request__recive_date__date__lte=now)) + if kill_request > 0: + send_sms_for_kill_house_not_add_to_inventory(kill_house.kill_house_operator.user.mobile, kill_request) + + +class CookieSamasatViewSet(viewsets.ModelViewSet): + permission_classes = [AllowAny] + queryset = CookieSamasat.objects.first() + serializer_class = CookieSamasatSerilizer + + def list(self, request, *args, **kwargs): + cookie = CookieSamasat.objects.all().first() + if not cookie: + cookie = CookieSamasat( + cookie='-', + table_name='-' + ) + cookie.save() + ser_data = self.serializer_class(cookie).data + return Response(ser_data, status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + query = CookieSamasat.objects.first() + + if base_url_for_sms_report == 'test': + province_list = ['bu', 'ma', 'ha'] + for name in province_list: + requests.put(f"https://{name}backend.rasadyar.com/cookie-samasat/0/", data=request.data) + + serializer = self.serializer_class(query, data=request.data, partial=True) + if serializer.is_valid(): + serializer.save() + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +# def create_poultry(phone_number,full_name,city,province): +# group = Group.objects.get(name__exact="Poultry") +# hashed_password=None +# password=None +# user = User(username=phone_number, first_name=first_name, last_name=last_name, password=hashed_password) +# user.save() +# base_id = SystemUserProfile.objects.all() +# if base_id.count() > 0: +# base_id = int(base_id.last().base_order) + 1 +# else: +# base_id = 1000 +# system_profile = SystemUserProfile( +# mobile=phone_number, +# first_name=first_name, +# last_name=last_name, +# fullname=first_name + '' + last_name, +# user=user, +# base_order=base_id, +# password=password, +# birthday=str(datetime.datetime.now().date()), +# city=city, +# province=province +# ) +# system_profile.save() +# system_profile.role.add(group) +# wallet = Wallet() +# wallet.save() + +# درست نیست +@api_view(["PUT"]) +@permission_classes([AllowAny]) +@csrf_exempt +def api_update_poultry_hatching(request): + not_find_list = [] + + for data in request.data['Data']: + breeding_uniq_id = data['PartIdCode'] + licence_number = data['RequestCode'] + hatching_quantity = data['BaseHatchingCount'] + poultry_name = data['UnitName'] + losses = data['EvacuationCount'] + health_certificate = data['DesCertId'] + evacuation_details = data.get('EvacuationDetail') or [] + if isinstance(evacuation_details, dict): + evacuation_details = [evacuation_details] + report_type_field_map = { + 'تلفات ناشی از بیماری': 'total_disease_losses', + 'معدوم سازی گله': 'total_flock_destruction', + 'تلفات عادی گله': 'total_normal_flock_losses', + 'تلفات ناشی از عوامل قهری و طبیعی': 'total_force_majeure_losses', + 'تلفات ناشی از آتش سوزی': 'total_fire_losses', + } + evacuation_losses = {} + evacuation_fields = set() + for detail in evacuation_details: + if not isinstance(detail, dict): + continue + report_type = (detail.get('ReportTypeString') or '').strip() + field_name = report_type_field_map.get(report_type) + if not field_name: + continue + try: + good_count = int(detail.get('GoodCount') or 0) + except (TypeError, ValueError): + continue + evacuation_losses[field_name] = evacuation_losses.get(field_name, 0) + good_count + evacuation_fields.add(field_name) + + def apply_evacuation_losses(instance): + for field in evacuation_fields: + setattr(instance, field, evacuation_losses.get(field, 0)) + + poultry = Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id).first() + + if not poultry: + not_find_list.append(breeding_uniq_id) + continue + poultry.unit_name = poultry_name + poultry.save() + hatch = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id') + if hatch: + period = hatch.last().period + 1 + else: + period = 1 + + hatching_date = data['HatchingDatePersian'].split('/') + date = convert_to_miladi( + year=int(hatching_date[0]), + month=int(hatching_date[1]), + day=int(hatching_date[2]) + ) + + poultry_hatching = hatch.filter(trash=False, archive=False, state='pending', + allow_hatching='pending').order_by('id') + + if not poultry_hatching.exists(): + if not hatch.filter(archive=True, state='complete', + allow_hatching="True", licence_number=licence_number).exists(): + hatching = PoultryHatching( + poultry=poultry, + date=date, + quantity=hatching_quantity, + breed=[ + {"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}], + period=period, + chicken_breed='*ترکیبی', + hall=1, + left_over=hatching_quantity, + latest_hatching_change={ + "role": "UnitWindow", + "date": str(datetime.datetime.now().date()), + "full_name": "" + }, + licence_number=licence_number, + breeding_unique_id=breeding_uniq_id, + losses=losses, + health_certificate=health_certificate + + ) + apply_evacuation_losses(hatching) + hatching.save() + + else: + previouse_hatching = poultry_hatching.last() + + hatchings = poultry_hatching.filter(licence_number=licence_number) + if not hatchings: + if previouse_hatching.left_over > (previouse_hatching.quantity * percent_of_losses): + previouse_hatching.violation = True + previouse_hatching.save() + + hatching = PoultryHatching( + poultry=poultry, + date=date, + quantity=hatching_quantity, + breed=[ + {"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}], + period=period, + chicken_breed='*ترکیبی', + hall=1, + left_over=hatching_quantity, + latest_hatching_change={ + "role": "UnitWindow", + "date": str(datetime.datetime.now().date()), + "full_name": "" + }, + licence_number=licence_number, + breeding_unique_id=breeding_uniq_id, + losses=losses, + health_certificate=health_certificate + + ) + apply_evacuation_losses(hatching) + hatching.save() + else: + last_hatchings = hatchings.first() + if last_hatchings.health_certificate is None: + last_hatchings.health_certificate = health_certificate + last_hatchings.date = date + last_hatchings.quantity = hatching_quantity + last_hatchings.losses = losses + apply_evacuation_losses(last_hatchings) + last_hatchings.save() + + update = LastUpdate.objects.first() + update.update_date = datetime.datetime.now() + update.save() + return Response(not_find_list, status=status.HTTP_201_CREATED) + + +@api_view(["PUT"]) +@permission_classes([AllowAny]) +@csrf_exempt +def api_update_chicken_breed(request): + for data in request.data['Data']: + breeding_uniq_id = data['PartIdCode'] + breed = data['PedigreeName'] + health_certificate = data['CertId'] + poultry_hatching = PoultryHatching.objects.filter(Q(poultry__breeding_unique_id=breeding_uniq_id, + health_certificate__isnull=True) | Q( + poultry__breeding_unique_id=breeding_uniq_id, health_certificate__isnull=False, + health_certificate=health_certificate) + , violation=False, trash=False, allow_hatching='pending', + state='pending', + ).order_by( + 'id').last() + + if poultry_hatching: + if poultry_hatching.chicken_breed == '*ترکیبی': + poultry_hatching.chicken_breed = breed + elif poultry_hatching.chicken_breed != breed and poultry_hatching.chicken_breed != '*ترکیبی': + poultry_hatching.chicken_breed = 'ترکیبی' + else: + continue + + poultry_hatching.save() + + return Response({"result": "انجام شد."}, status=status.HTTP_201_CREATED) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def api_update_poultry_hatching_from_rsi(request): + not_find_list = [] + r = requests.get(f'https://rsibackend.rasadyar.com/app/update_hatching/?province={base_url_for_sms_report}') + + for data in r.json(): + breeding_uniq_id = data['PartIdCode'] + licence_number = data['RequestCode'] + hatching_quantity = data['ChickCountSum'] + CertId = data['CertId'] + poultry_name = data.get('UnitName', None) + losses = data.get('Evacuation', 0) + province = data['ProvinceName'] + city = data['CityName'] + PersonTypeName = data['PersonTypeName'] + InteractTypeName = data['InteractTypeName'] + UnionTypeName = data['UnionTypeName'] + date = convert_str_to_date(str(data['Date']), with_datetime=True) + samasat_discharge_percentage = data['samasat_discharge_percentage'] + evacuation_details = data.get('EvacuationDetail') or [] + if isinstance(evacuation_details, dict): + evacuation_details = [evacuation_details] + report_type_field_map = { + 'تلفات ناشی از بیماری': 'total_disease_losses', + 'معدوم سازی گله': 'total_flock_destruction', + 'تلفات عادی گله': 'total_normal_flock_losses', + 'تلفات ناشی از عوامل قهری و طبیعی': 'total_force_majeure_losses', + 'تلفات ناشی از آتش سوزی': 'total_fire_losses', + } + evacuation_detail_fields = [ + 'PartIdCode', + 'RequestId', + 'MoReportId', + 'ReportType', + 'ReportTypeString', + 'ReportDate', + 'ReportDateShamsi', + 'MoReason', + 'MoDate', + 'MoDateShamsi', + 'MoStartDay', + 'MoEndDay', + 'MoReportSubId', + 'ReportStatus', + 'GoodCount', + 'Message', + 'ErrorCode', + 'IsDeleted', + 'RegDate', + 'RegDateShamsi', + 'RegDateShamsiWithTime', + 'RegDateShamsiOnlyTime', + 'ExternalId', + 'StringId', + 'IsPersisted', + 'AllowInsert', + 'AllowUpdate', + 'ModalCss', + 'GridContainerParametersModel', + 'MenuUserAccess', + 'MenuUserAccessId', + 'LogTableName', + 'LogTableAlias', + 'PageTitle', + ] + report_type_fields = set(report_type_field_map.values()) + report_type_field_list = list(report_type_fields) + + def build_unique_key(detail_payload): + external_id = detail_payload.get('ExternalId') + if external_id: + return f"external:{external_id}" + string_id = detail_payload.get('StringId') + if string_id: + return f"string:{string_id}" + return "fallback:" + "|".join( + str(detail_payload.get(key) or '') for key in ('PartIdCode', 'MoReportId', 'ReportType', 'ReportDate')) + + def sync_evacuation_detail_records(hatching_instance): + if not hatching_instance.pk: + return + + def normalize_good_count(value): + if value in (None, ''): + return None + try: + return int(value) + except (TypeError, ValueError): + try: + return int(float(value)) + except (TypeError, ValueError): + return None + + retained_ids = set() + seen_unique_keys = set() + + for detail in evacuation_details: + if not isinstance(detail, dict): + continue + detail_payload = {field: detail.get(field) for field in evacuation_detail_fields} + detail_payload['GoodCount'] = normalize_good_count(detail_payload.get('GoodCount')) + if not any(value not in (None, '') for value in detail_payload.values()): + continue + + unique_key = build_unique_key(detail_payload) + if unique_key in seen_unique_keys: + continue + seen_unique_keys.add(unique_key) + + external_id = detail_payload.get('ExternalId') + string_id = detail_payload.get('StringId') + lookup_kwargs = {'hatching': hatching_instance} + if external_id: + lookup_kwargs['ExternalId'] = external_id + elif string_id: + lookup_kwargs['StringId'] = string_id + else: + lookup_key_fields = ('PartIdCode', 'MoReportId', 'ReportType', 'ReportDate') + lookup_kwargs.update({field: detail_payload.get(field) for field in lookup_key_fields}) + + defaults = detail_payload.copy() + defaults['hatching'] = hatching_instance + + try: + detail_instance, _ = EvacuationHatchingDetail.objects.update_or_create( + defaults=defaults, + **lookup_kwargs + ) + except EvacuationHatchingDetail.MultipleObjectsReturned: + EvacuationHatchingDetail.objects.filter(**lookup_kwargs).delete() + detail_instance, _ = EvacuationHatchingDetail.objects.update_or_create( + defaults=defaults, + **lookup_kwargs + ) + + retained_ids.add(detail_instance.pk) + + if retained_ids: + hatching_instance.evacuation_details.exclude(pk__in=retained_ids).delete() + else: + hatching_instance.evacuation_details.all().delete() + + def apply_evacuation_losses(instance): + totals = {field: 0 for field in report_type_fields} + detail_qs = instance.evacuation_details.filter(trash=False, IsDeleted=False) + for detail in detail_qs: + report_type = (detail.ReportTypeString or '').strip() + field_name = report_type_field_map.get(report_type) + if not field_name: + continue + totals[field_name] += detail.GoodCount or 0 + for field, value in totals.items(): + setattr(instance, field, value) + + hatch = PoultryHatching.objects.filter(trash=False, licence_number=licence_number).order_by('id') + + try: + if not hatch: + poultry = Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id).first() + if not poultry: + first_name = data['poultry']['FirstName'] + last_name = data['poultry']['LastName'] + mobile = data['poultry']['Mobile'] + system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).first() + province = Province.objects.filter(trash=False, name__exact=province).first() + city = City.objects.filter(trash=False, name__exact=city).first() + if not system_profile: + + data = { + "username": mobile, + "first_name": first_name, + "last_name": last_name, + "password": '123456', + "national_code": '0', + "role": "Poultry", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + hashed_password = hashlib.sha256(str('123456').encode()).hexdigest() + user = User.objects.filter(username=mobile).first() + if not user: + user = User(username=mobile, first_name=first_name, last_name=last_name, + password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=mobile, + first_name=str(first_name), + last_name=str(last_name), + fullname=str(first_name) + ' ' + str(last_name), + user=user, + base_order=base_id, + password='123456', + birthday=str(datetime.datetime.now().date()), + city=city, + province=province, + ) + system_profile.save() + + else: + not_find_list.append(breeding_uniq_id) + + group = Group.objects.get(name__exact="Poultry") + if not system_profile.role.filter(name="Poultry"): + system_profile.role.add(group) + + wallet = Wallet() + wallet.save() + poultry = Poultry( + user=system_profile, + unit_name=poultry_name, + system_code=data.get('poultry', {}).get('SystemCode', None), + epidemiological_code=data.get('poultry', {}).get('EpidemiologicCode', None), + breeding_unique_id=breeding_uniq_id, + ) + + address = SystemAddress( + province=province, + city=city, + address=city + ) + address.save() + poultry.address = address + poultry.user = system_profile + poultry.wallet = wallet + poultry.save() + + poultry.unit_name = poultry_name + poultry.save() + + hatch = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id') + if hatch: + period = hatch.last().period + 1 + else: + period = 1 + hatching = PoultryHatching( + poultry=poultry, + date=date, + quantity=hatching_quantity, + breed=[ + {"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}], + period=period, + chicken_breed=data["PedigreeName"], + hall=1, + left_over=hatching_quantity, + latest_hatching_change={ + "role": "UnitWindow", + "date": str(datetime.datetime.now().date()), + "full_name": "" + }, + licence_number=licence_number, + breeding_unique_id=breeding_uniq_id, + losses=losses, + PersonTypeName=PersonTypeName, + InteractTypeName=InteractTypeName, + UnionTypeName=UnionTypeName, + samasat_discharge_percentage=samasat_discharge_percentage, + CertId=CertId, + predicate_date=date + timedelta( + days=poultry.killing_ave_age) if poultry.killing_ave_age > 1 else None, + + ) + hatching.chicken_age = (datetime.datetime.now().date() - hatching.date.date()).days + 1 + hatching.save() + sync_evacuation_detail_records(hatching) + apply_evacuation_losses(hatching) + if report_type_field_list: + hatching.save(update_fields=report_type_field_list) + else: + hatching.save() + else: + last_hatchings = hatch.first() + last_hatchings.date = date + last_hatchings.quantity = hatching_quantity + last_hatchings.losses = losses + last_hatchings.PersonTypeName = PersonTypeName + last_hatchings.InteractTypeName = InteractTypeName + last_hatchings.UnionTypeName = UnionTypeName + last_hatchings.chicken_age = (datetime.datetime.now().date() - last_hatchings.date.date()).days + 1 + last_hatchings.samasat_discharge_percentage = samasat_discharge_percentage + last_hatchings.predicate_date = date + timedelta( + days=last_hatchings.poultry.killing_ave_age) if last_hatchings.poultry.killing_ave_age > 1 else None + sync_evacuation_detail_records(last_hatchings) + apply_evacuation_losses(last_hatchings) + update_fields = [ + 'date', + 'quantity', + 'losses', + 'PersonTypeName', + 'InteractTypeName', + 'UnionTypeName', + 'chicken_age', + 'samasat_discharge_percentage', + 'predicate_date', + ] + report_type_field_list + last_hatchings.save(update_fields=update_fields) + update = LastUpdate.objects.first() + update.update_date = datetime.datetime.now() + update.save() + except: + not_find_list.append(breeding_uniq_id) + + if not_find_list: + token = "bot291669:9298e675-8b3c-4b8f-a69d-5c89a3f0bdde" + chat_id = '10046800' + url = f'https://eitaayar.ir/api/{token}/sendMessage' + base_message = f'{base_url_for_sms_report}' \ + '\n' + messages = [] + current_message = base_message + new_message_part = ','.join(not_find_list) + if len(current_message) + len(new_message_part) > 4000: # محدودیت تعداد کاراکترها + messages.append(current_message) + current_message = base_message # شروع یک پیام جدید + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + for message in messages: + data = { + 'chat_id': chat_id, + 'text': message, + } + r = requests.post(url, data=data, verify=False) + + return Response(not_find_list, status=status.HTTP_201_CREATED) + + +class HatchingLossManagementViewSet(viewsets.ModelViewSet): + permission_classes = [AllowAny] + serializer_class = HatchingLossManagementSerializer + + def get_queryset(self): + queryset = HatchingLossManagement.objects.filter(trash=False) + if not queryset.exists(): + queryset = HatchingLossManagement.objects.filter( + pk=HatchingLossManagement.objects.create().pk + ) + return queryset + + def get_object(self): + return self.get_queryset().first() + + def list(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance) + return Response( + serializer.data, + status=status.HTTP_200_OK, + ) + + def create(self, request, *args, **kwargs): + return self._update_instance(request, partial=False) + + def update(self, request, *args, **kwargs): + return self._update_instance(request, partial=False) + + def _update_instance(self, request, partial): + instance = self.get_object() + serializer = self.get_serializer(instance, data=request.data, partial=partial) + serializer.is_valid(raise_exception=True) + instance = serializer.save() + self._recalculate_hatchings() + return Response(self.get_serializer(instance).data, status=status.HTTP_200_OK) + + def _recalculate_hatchings(self): + count = 0 + hatchings = PoultryHatching.objects.filter(trash=False, archive=False, allow_hatching='pending') + for hatching in hatchings.iterator(): + hatching.save() + count += 1 + return count + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def update_hatching(request): + r = requests.get(f'https://rsibackend.rasadyar.com/app/update_hatching/?province={base_url_for_sms_report}') + for data in r.json(): + print(data['PartIdCode']) + return Response(r.json()) + + +def cron_update_poultry_hatching_from_rsi(): + not_find_list = [] + r = requests.get(f'https://rsibackend.rasadyar.com/app/update_hatching/?province={base_url_for_sms_report}') + + for data in r.json(): + breeding_uniq_id = data['PartIdCode'] + licence_number = data['RequestCode'] + hatching_quantity = data['ChickCountSum'] + CertId = data['CertId'] + poultry_name = data.get('UnitName', None) + losses = data.get('Evacuation', 0) + province = data['ProvinceName'] + city = data['CityName'] + PersonTypeName = data['PersonTypeName'] + InteractTypeName = data['InteractTypeName'] + UnionTypeName = data['UnionTypeName'] + date = datetime.datetime.strptime(data['Date'], "%Y-%m-%dT%H:%M:%SZ") + samasat_discharge_percentage = data['samasat_discharge_percentage'] + + hatch = PoultryHatching.objects.filter(trash=False, licence_number=licence_number).order_by('id') + + try: + if not hatch: + poultry = Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id).first() + if not poultry: + first_name = data['poultry']['FirstName'] + last_name = data['poultry']['LastName'] + mobile = data['poultry']['Mobile'] + system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).first() + if not system_profile: + + data = { + "username": mobile, + "first_name": first_name, + "last_name": last_name, + "password": '123456', + "national_code": '0', + "role": "Poultry", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + hashed_password = hashlib.sha256(str('123456').encode()).hexdigest() + user = User.objects.filter(username=mobile).first() + if not user: + user = User(username=mobile, first_name=first_name, last_name=last_name, + password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=mobile, + first_name=str(first_name), + last_name=str(last_name), + fullname=str(first_name) + ' ' + str(last_name), + user=user, + base_order=base_id, + password='123456', + birthday=str(datetime.datetime.now().date()), + ) + system_profile.save() + + else: + not_find_list.append(breeding_uniq_id) + + group = Group.objects.get(name__exact="Poultry") + if not system_profile.role.filter(name="Poultry"): + system_profile.role.add(group) + + wallet = Wallet() + wallet.save() + poultry = Poultry( + user=system_profile, + unit_name=poultry_name, + system_code=data.get('poultry', {}).get('SystemCode', None), + epidemiological_code=data.get('poultry', {}).get('EpidemiologicCode', None), + breeding_unique_id=breeding_uniq_id, + ) + province = Province.objects.filter(trash=False, name__exact=province).first() + city = City.objects.filter(trash=False, name__exact=city).first() + address = SystemAddress( + province=province, + city=city, + address=city + ) + address.save() + poultry.address = address + poultry.user = system_profile + poultry.wallet = wallet + poultry.save() + + poultry.unit_name = poultry_name + poultry.save() + + hatch = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id') + if hatch: + period = hatch.last().period + 1 + else: + period = 1 + hatching = PoultryHatching( + poultry=poultry, + date=date, + quantity=hatching_quantity, + breed=[ + {"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}], + period=period, + chicken_breed=data["PedigreeName"], + hall=1, + left_over=hatching_quantity, + latest_hatching_change={ + "role": "UnitWindow", + "date": str(datetime.datetime.now().date()), + "full_name": "" + }, + licence_number=licence_number, + breeding_unique_id=breeding_uniq_id, + losses=losses, + PersonTypeName=PersonTypeName, + InteractTypeName=InteractTypeName, + UnionTypeName=UnionTypeName, + samasat_discharge_percentage=samasat_discharge_percentage, + CertId=CertId, + predicate_date=date + timedelta( + days=poultry.killing_ave_age) if poultry.killing_ave_age > 1 else None, + + ) + hatching.chicken_age = (datetime.datetime.now().date() - hatching.date.date()).days + 1 + hatching.save() + else: + last_hatchings = hatch.first() + last_hatchings.date = date + last_hatchings.quantity = hatching_quantity + last_hatchings.losses = losses + last_hatchings.PersonTypeName = PersonTypeName + last_hatchings.InteractTypeName = InteractTypeName + last_hatchings.UnionTypeName = UnionTypeName + last_hatchings.chicken_age = (datetime.datetime.now().date() - last_hatchings.date.date()).days + 1 + last_hatchings.samasat_discharge_percentage = samasat_discharge_percentage + last_hatchings.predicate_date = date + timedelta( + days=last_hatchings.poultry.killing_ave_age) if last_hatchings.poultry.killing_ave_age > 1 else None + last_hatchings.save() + update = LastUpdate.objects.first() + update.update_date = datetime.datetime.now() + update.save() + except: + not_find_list.append(breeding_uniq_id) + + # poultry = Poultry.objects.filter(breeding_unique_id=breeding_uniq_id).first() + # try: + # if not poultry: + # first_name = data['poultry']['FirstName'] + # last_name = data['poultry']['LastName'] + # mobile = data['poultry']['Mobile'] + # system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).first() + # if not system_profile: + # + # data = { + # "username": mobile, + # "first_name": first_name, + # "last_name": last_name, + # "password": '123456', + # "national_code": '0', + # "role": "Poultry", + # "api_key": PROJECT_API_KEY + # } + # req = requests.post( + # url=ARTA_REGISTER, + # data=data, + # verify=False + # ) + # + # if req.status_code == 200: + # hashed_password = hashlib.sha256(str('123456').encode()).hexdigest() + # user = User.objects.filter(username=mobile).first() + # if not user: + # user = User(username=mobile, first_name=first_name, last_name=last_name, + # password=hashed_password) + # user.save() + # base_id = SystemUserProfile.objects.all() + # if base_id.count() > 0: + # base_id = int(base_id.last().base_order) + 1 + # else: + # base_id = 1000 + # system_profile = SystemUserProfile( + # mobile=mobile, + # first_name=str(first_name), + # last_name=str(last_name), + # fullname=str(first_name) + ' ' + str(last_name), + # user=user, + # base_order=base_id, + # password='123456', + # birthday=str(datetime.datetime.now().date()), + # ) + # system_profile.save() + # + # else: + # continue + # + # group = Group.objects.get(name__exact="Poultry") + # if not system_profile.role.filter(name="Poultry"): + # system_profile.role.add(group) + # + # wallet = Wallet() + # wallet.save() + # poultry = Poultry( + # user=system_profile, + # unit_name=poultry_name, + # system_code=data.get('poultry', {}).get('SystemCode',None), + # epidemiological_code=data.get('poultry', {}).get('EpidemiologicCode',None), + # breeding_unique_id=breeding_uniq_id, + # ) + # province=Province.objects.filter(trash=False,name__exact=province).first() + # city=City.objects.filter(trash=False,name__exact=city).first() + # address = SystemAddress( + # province=province, + # city=city, + # address=city + # ) + # address.save() + # poultry.address = address + # poultry.user = system_profile + # poultry.wallet = wallet + # poultry.save() + # + # poultry.unit_name = poultry_name + # poultry.save() + # hatch = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id') + # if hatch: + # period = hatch.last().period + 1 + # else: + # period = 1 + # + # # hatching_date = data['HatchingDatePersian'].split('/') + # date = data['Date'] + # + # poultry_hatching = hatch.filter(trash=False,archive=False, state='pending', + # allow_hatching='pending').order_by('id') + # + # if not poultry_hatching.exists(): + # if not hatch.filter(archive=True, state='complete', + # allow_hatching="True",licence_number=licence_number).exists(): + # hatching = PoultryHatching( + # poultry=poultry, + # date=date, + # quantity=hatching_quantity, + # breed=[ + # {"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}], + # period=period, + # chicken_breed=data["PedigreeName"], + # hall=1, + # left_over=hatching_quantity, + # latest_hatching_change={ + # "role": "UnitWindow", + # "date": str(datetime.datetime.now().date()), + # "full_name": "" + # }, + # licence_number=licence_number, + # breeding_unique_id=breeding_uniq_id, + # losses=losses, + # + # ) + # hatching.save() + # + # else: + # previouse_hatching = poultry_hatching.last() + # + # hatchings = poultry_hatching.filter(licence_number=licence_number) + # if not hatchings: + # if previouse_hatching.left_over > (previouse_hatching.quantity * percent_of_losses): + # previouse_hatching.violation = True + # previouse_hatching.save() + # + # hatching = PoultryHatching( + # poultry=poultry, + # date=date, + # quantity=hatching_quantity, + # breed=[ + # {"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}], + # period=period, + # chicken_breed=data["PedigreeName"], + # hall=1, + # left_over=hatching_quantity, + # latest_hatching_change={ + # "role": "UnitWindow", + # "date": str(datetime.datetime.now().date()), + # "full_name": "" + # }, + # licence_number=licence_number, + # breeding_unique_id=breeding_uniq_id, + # losses=losses, + # + # ) + # hatching.save() + # else: + # last_hatchings=hatchings.first() + # # if last_hatchings.health_certificate is None: + # # last_hatchings.health_certificate=health_certificate + # last_hatchings.date = date + # last_hatchings.quantity = hatching_quantity + # last_hatchings.losses = losses + # last_hatchings.save() + # + # update = LastUpdate.objects.first() + # update.update_date = datetime.datetime.now() + # update.save() + # except: + # not_find_list.append(breeding_uniq_id) + if not_find_list: + token = "bot291669:9298e675-8b3c-4b8f-a69d-5c89a3f0bdde" + chat_id = '10046800' + url = f'https://eitaayar.ir/api/{token}/sendMessage' + base_message = f'{base_url_for_sms_report}' \ + '\n' + messages = [] + current_message = base_message + new_message_part = ','.join(not_find_list) + if len(current_message) + len(new_message_part) > 4000: # محدودیت تعداد کاراکترها + messages.append(current_message) + current_message = base_message # شروع یک پیام جدید + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + for message in messages: + data = { + 'chat_id': chat_id, + 'text': message, + } + r = requests.post(url, data=data, verify=False) + + +def fix_bar_without_quarantine(request): + kill_request = KillHouseRequest.objects.filter(trash=False, clearance_code__isnull=False, + quarantine_code_state__isnull=False).only('clearance_code') + print(len(kill_request)) + for kill in kill_request: + get_gid(kill.clearance_code) + return HttpResponse('ok') + + +def get_gid_out_province(id): + kill = KillHouseFreeSaleBarInformation.objects.get(id=id, trash=False) + session = requests.Session() + session.mount('https://', SSLAdapter()) + if kill: + data = {'gid': str(kill.clearance_code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + text = context.body.get_text(strip=True) + if text == 'فرآورده هاي خام داميGo Backفهرستخروجتاییده راهداری دریافت نشد به بخش اعلام خاتمه صدور گواهی بهداشتی حمل درهمین سایت مراجعه کنید.': + # kill.quarantine_code_state = 'notconfirmed' + # if kill.quarantine_quantity is not None: + # kill.quarantine_weight_of_carcasses = None + pass + else: + table = context.find_all('table') + if table[5:6]: + row = context.find('div', align="right") + if row: + content = row.get_text(separator=" ", strip=True) + date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content) + + if date_match: + jalali_date = date_match.group(1) + year, month, day = map(int, jalali_date.split('/')) + date = convert_to_miladi(year=year, month=month, day=day) + send_date = kill.date.date() + + one_day = timedelta(days=1) + if abs(send_date - date.date()) <= one_day: + # kill.inquiry_date = date.date() + for i in table[5:6]: + row = i.find_all('tr') + for r in row[0:1]: + + quantity = r.find_all('td')[1] + match = re.search(r'\d+', quantity.text) + + if match: + number = match.group() + kill.quarantine_weight_of_carcasses = int(number) + # if kill.quarantine_code_state is not None: + # kill.quarantine_code_state=None + else: + kill.quarantine_weight_of_carcasses = 0 + # for i in table[4:5]: + # rows = i.find_all('tr') + # + # pelak_txt = rows[1].find('span', class_='dynamictxt', dir='ltr', + # style='font-family:Tahoma').text.strip() + # kill.inquiry_pelak=pelak_txt + # td=rows[1].find_all('td')[1] + # driver_txt = td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_driver=driver_txt + # + # for r in rows: + # tds = r.find_all('td', colspan="2") + # if len(tds) >= 2: + # origin_td = tds[0] + # origin_text = origin_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_origin=origin_text + # + # destination_td = tds[1] + # destination_text = destination_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_destination=destination_text + + else: + for table in table: + p_tags = table.find_all('p') + for p in p_tags: + p_text = p.get_text(strip=True) + if p_text == 'شماره رهگيري وارد شده معتبر نيست.': + # kill.quarantine_code_state = 'contradiction' + if kill.quarantine_weight_of_carcasses > 0: + kill.quarantine_weight_of_carcasses = 0 + kill.save() + + +def get_gid_out_province_cron_job(): + kills = KillHouseFreeSaleBarInformation.objects.filter(quarantine_weight_of_carcasses=0, + clearance_code__isnull=False, trash=False) + session = requests.Session() + session.mount('https://', SSLAdapter()) + if kills: + for kill in kills: + data = {'gid': str(kill.clearance_code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + text = context.body.get_text(strip=True) + if text == 'فرآورده هاي خام داميGo Backفهرستخروجتاییده راهداری دریافت نشد به بخش اعلام خاتمه صدور گواهی بهداشتی حمل درهمین سایت مراجعه کنید.': + # kill.quarantine_code_state = 'notconfirmed' + # if kill.quarantine_quantity is not None: + # kill.quarantine_weight_of_carcasses = None + pass + else: + table = context.find_all('table') + if table[5:6]: + row = context.find('div', align="right") + if row: + + content = row.get_text(separator=" ", strip=True) + date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content) + + if date_match: + jalali_date = date_match.group(1) + year, month, day = map(int, jalali_date.split('/')) + date = convert_to_miladi(year=year, month=month, day=day) + # kill.inquiry_date = date.date() + send_date = kill.date.date() + + one_day = timedelta(days=1) + if abs(send_date - date.date()) <= one_day: + for i in table[5:6]: + row = i.find_all('tr') + for r in row[0:1]: + + quantity = r.find_all('td')[1] + match = re.search(r'\d+', quantity.text) + + if match: + number = match.group() + kill.quarantine_weight_of_carcasses = int(number) + # if kill.quarantine_code_state is not None: + # kill.quarantine_code_state=None + else: + kill.quarantine_weight_of_carcasses = 0 + # for i in table[4:5]: + # rows = i.find_all('tr') + # + # pelak_txt = rows[1].find('span', class_='dynamictxt', dir='ltr', + # style='font-family:Tahoma').text.strip() + # kill.inquiry_pelak=pelak_txt + # td=rows[1].find_all('td')[1] + # driver_txt = td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_driver=driver_txt + # + # for r in rows: + # tds = r.find_all('td', colspan="2") + # if len(tds) >= 2: + # origin_td = tds[0] + # origin_text = origin_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_origin=origin_text + # + # destination_td = tds[1] + # destination_text = destination_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_destination=destination_text + + # else: + # for table in table: + # p_tags = table.find_all('p') + # for p in p_tags: + # p_text = p.get_text(strip=True) + # if p_text == 'شماره رهگيري وارد شده معتبر نيست.': + # kill.quarantine_code_state = 'contradiction' + # if kill.quarantine_quantity is not None: + # kill.quarantine_quantity = None + kill.save() + + +def get_gid_out_province_manual(request): + kills = KillHouseFreeSaleBarInformation.objects.filter(quarantine_weight_of_carcasses=0, + clearance_code__isnull=False, trash=False) + session = requests.Session() + session.mount('https://', SSLAdapter()) + if kills: + for kill in kills: + data = {'gid': str(kill.clearance_code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + text = context.body.get_text(strip=True) + if text == 'فرآورده هاي خام داميGo Backفهرستخروجتاییده راهداری دریافت نشد به بخش اعلام خاتمه صدور گواهی بهداشتی حمل درهمین سایت مراجعه کنید.': + # kill.quarantine_code_state = 'notconfirmed' + # if kill.quarantine_quantity is not None: + # kill.quarantine_weight_of_carcasses = None + pass + else: + table = context.find_all('table') + if table[5:6]: + row = context.find('div', align="right") + if row: + content = row.get_text(separator=" ", strip=True) + date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content) + + if date_match: + jalali_date = date_match.group(1) + year, month, day = map(int, jalali_date.split('/')) + date = convert_to_miladi(year=year, month=month, day=day) + # kill.inquiry_date = date.date() + send_date = kill.date.date() + + one_day = timedelta(days=1) + if abs(send_date - date.date()) <= one_day: + for i in table[5:6]: + row = i.find_all('tr') + for r in row[0:1]: + + quantity = r.find_all('td')[1] + match = re.search(r'\d+', quantity.text) + + if match: + number = match.group() + kill.quarantine_weight_of_carcasses = int(number) + # if kill.quarantine_code_state is not None: + # kill.quarantine_code_state=None + else: + kill.quarantine_weight_of_carcasses = 0 + # for i in table[4:5]: + # rows = i.find_all('tr') + # + # pelak_txt = rows[1].find('span', class_='dynamictxt', dir='ltr', + # style='font-family:Tahoma').text.strip() + # kill.inquiry_pelak=pelak_txt + # td=rows[1].find_all('td')[1] + # driver_txt = td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_driver=driver_txt + # + # for r in rows: + # tds = r.find_all('td', colspan="2") + # if len(tds) >= 2: + # origin_td = tds[0] + # origin_text = origin_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_origin=origin_text + # + # destination_td = tds[1] + # destination_text = destination_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_destination=destination_text + + # else: + # for table in table: + # p_tags = table.find_all('p') + # for p in p_tags: + # p_text = p.get_text(strip=True) + # if p_text == 'شماره رهگيري وارد شده معتبر نيست.': + # kill.quarantine_code_state = 'contradiction' + # if kill.quarantine_quantity is not None: + # kill.quarantine_quantity = None + kill.save() + return HttpResponse(f'تعداد بار :{len(kills)}') + + +def get_gid_poultry_request(poultry_id): + kill = PoultryRequest.objects.filter(id=poultry_id, trash=False).first() + + session = requests.Session() + session.mount('https://', SSLAdapter()) + if kill: + # if kill.quarantine_code_state!='merge': + data = {'gid': str(kill.quarantine_code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + text = context.body.get_text(strip=True) + + if text == 'فرآورده هاي خام داميGo Backفهرستخروجتاییده راهداری دریافت نشد به بخش اعلام خاتمه صدور گواهی بهداشتی حمل درهمین سایت مراجعه کنید.': + kill.quarantine_code_state = 'notconfirmed' + if kill.quarantine_quantity is not None: + kill.quarantine_quantity = None + else: + table = context.find_all('table') + if table[5:6]: + row = context.find('div', align="right") + if row: + content = row.get_text(separator=" ", strip=True) + date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content) + + if date_match: + jalali_date = date_match.group(1) + year, month, day = map(int, jalali_date.split('/')) + date = convert_to_miladi(year=year, month=month, day=day) + # kill.inquiry_date = date.date() + send_date = kill.send_date.date() + + one_day = timedelta(days=1) + if abs(send_date - date.date()) <= one_day: + for i in table[5:6]: + row = i.find_all('tr') + for r in row[1:2]: + quantity = r.find('td') + match = re.search(r'\d+', quantity.text) + if match: + number = match.group() + kill.quarantine_quantity = int(number) + # if kill.quarantine_code_state is not None: + # kill.quarantine_code_state=None + # for i in table[4:5]: + # rows = i.find_all('tr') + # + # pelak_txt = rows[1].find('span', class_='dynamictxt', dir='ltr', + # style='font-family:Tahoma').text.strip() + # kill.inquiry_pelak=pelak_txt + # td=rows[1].find_all('td')[1] + # driver_txt = td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_driver=driver_txt + # + # for r in rows: + # tds = r.find_all('td', colspan="2") + # if len(tds) >= 2: + # origin_td = tds[0] + # origin_text = origin_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_origin=origin_text + # + # destination_td = tds[1] + # destination_text = destination_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_destination=destination_text + else: + kill.quarantine_quantity = 0 + + else: + for table in table: + p_tags = table.find_all('p') + for p in p_tags: + p_text = p.get_text(strip=True) + if p_text == 'شماره رهگيري وارد شده معتبر نيست.': + # kill.quarantine_code_state = 'contradiction' + if kill.quarantine_quantity > 0: + kill.quarantine_quantity = 0 + kill.save() + + +def get_gid_poultry_request_quarantine_code(poultry_id): + kill = PoultryRequestQuarantineCode.objects.filter(id=poultry_id, trash=False).first() + + session = requests.Session() + session.mount('https://', SSLAdapter()) + if kill: + # if kill.quarantine_code_state!='merge': + data = {'gid': str(kill.quarantine_code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + text = context.body.get_text(strip=True) + + if text == 'فرآورده هاي خام داميGo Backفهرستخروجتاییده راهداری دریافت نشد به بخش اعلام خاتمه صدور گواهی بهداشتی حمل درهمین سایت مراجعه کنید.': + # kill.quarantine_code_state = 'notconfirmed' + # if kill.quarantine_quantity is not None: + # kill.quarantine_quantity = None + if kill.system_quarantine_quantity > 0: + kill.system_quarantine_quantity = 0 + else: + table = context.find_all('table') + if table[5:6]: + row = context.find('div', align="right") + if row: + content = row.get_text(separator=" ", strip=True) + date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content) + + if date_match: + jalali_date = date_match.group(1) + year, month, day = map(int, jalali_date.split('/')) + date = convert_to_miladi(year=year, month=month, day=day) + # kill.inquiry_date = date.date() + send_date = kill.poultry_request.send_date.date() + + one_day = timedelta(days=1) + if abs(send_date - date.date()) <= one_day: + for i in table[5:6]: + row = i.find_all('tr') + for r in row[1:2]: + quantity = r.find('td') + match = re.search(r'\d+', quantity.text) + if match: + number = match.group() + kill.system_quarantine_quantity = int(number) + # if kill.quarantine_code_state is not None: + # kill.quarantine_code_state=None + # for i in table[4:5]: + # rows = i.find_all('tr') + # + # pelak_txt = rows[1].find('span', class_='dynamictxt', dir='ltr', + # style='font-family:Tahoma').text.strip() + # kill.inquiry_pelak=pelak_txt + # td=rows[1].find_all('td')[1] + # driver_txt = td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_driver=driver_txt + # + # for r in rows: + # tds = r.find_all('td', colspan="2") + # if len(tds) >= 2: + # origin_td = tds[0] + # origin_text = origin_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_origin=origin_text + # + # destination_td = tds[1] + # destination_text = destination_td.find('span', class_='dynamictxt').text.strip() + # kill.inquiry_destination=destination_text + else: + kill.system_quarantine_quantity = 0 + + else: + for table in table: + p_tags = table.find_all('p') + for p in p_tags: + p_text = p.get_text(strip=True) + if p_text == 'شماره رهگيري وارد شده معتبر نيست.': + # kill.quarantine_code_state = 'contradiction' + if kill.system_quarantine_quantity > 0: + kill.system_quarantine_quantity = 0 + kill.save() + + +@api_view(["GET"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def dashboard_monitoring_view(request): + now = datetime.datetime.now().date() + yesterday = now - timedelta(days=1) + hatching = PoultryHatching.objects.filter( + state='pending', + archive=False, + allow_hatching='pending', + trash=False + ).only( + 'quantity', + 'killed_quantity', + 'left_over', + 'chicken_age', + 'poultry' + ).select_related('poultry') + + hatching_aggregates = hatching.aggregate( + total_quantity=Sum('quantity'), + total_killed_quantity=Sum('killed_quantity'), + total_left_over=Sum('left_over'), + total_left_over_between_40_75=Sum( + 'left_over', + filter=Q(chicken_age__range=(40, 75)) + ), + + # + total_left_over_lt_35=Sum( + 'left_over', + filter=Q(chicken_age__lt=35) + ), + total_left_over_between_35_40=Sum( + 'left_over', + filter=Q(chicken_age__range=(35, 39)) + ), + total_left_over_between_40_45=Sum( + 'left_over', + filter=Q(chicken_age__range=(40, 44)) + ), + total_left_over_between_45_50=Sum( + 'left_over', + filter=Q(chicken_age__range=(45, 49)) + ), + total_left_over_between_50_55=Sum( + 'left_over', + filter=Q(chicken_age__range=(50, 54)) + ), + total_left_over_between_55_60=Sum( + 'left_over', + filter=Q(chicken_age__range=(55, 59)) + ), + total_left_over_between_60_65=Sum( + 'left_over', + filter=Q(chicken_age__range=(60, 64)) + ), + total_left_over_between_65_70=Sum( + 'left_over', + filter=Q(chicken_age__range=(65, 70)) + ), + total_left_over_gt_70=Sum( + 'left_over', + filter=Q(chicken_age__gt=70) + ), + # + total_killing_ave_age=Avg('poultry__killing_ave_age') + ) + + kill_house_free_bar = KillHouseFreeBarInformation.objects.filter( + trash=False, + archive_wage=False, + date__date__gte=yesterday + ).only( + 'quantity', + 'live_weight', + 'number_of_carcasses', + 'weight_of_carcasses', + 'send_date', + 'type', + 'out' + ) + + kill_house_free_bar_aggregates = kill_house_free_bar.aggregate( + total_quantity_yesterday_live=Sum('quantity', filter=Q(create_date__date=yesterday, buy_type='live')), + total_weight_yesterday_live=Sum('live_weight', filter=Q(create_date__date=yesterday, buy_type='live')), + total_quantity_yesterday_carcass=Sum('number_of_carcasses', + filter=Q(date__date=yesterday, buy_type='carcass')), + total_weight_yesterday_carcass=Sum('weight_of_carcasses', filter=Q(date__date=yesterday, buy_type='carcass')), + + total_quantity_live=Sum('quantity', filter=Q(create_date__date=now, buy_type='live')), + total_weight_live=Sum('live_weight', filter=Q(create_date__date=now, buy_type='live')), + total_quantity_carcass=Sum('number_of_carcasses', + filter=Q(date__date=now, buy_type='carcass')), + total_weight_carcass=Sum('weight_of_carcasses', filter=Q(date__date=now, buy_type='carcass')), + warehouse_total_weight_carcass=Sum('weight_of_carcasses', filter=Q(date__date=now)), + # yesterday + total_quantity_live_yesterday=Sum('quantity', filter=Q(create_date__date=yesterday, buy_type='live')), + total_weight_live_yesterday=Sum('live_weight', filter=Q(create_date__date=yesterday, buy_type='live')), + total_quantity_carcass_yesterday=Sum('number_of_carcasses', + filter=Q(date__date=yesterday, buy_type='carcass')), + total_weight_carcass_yesterday=Sum('weight_of_carcasses', filter=Q(date__date=yesterday, buy_type='carcass')), + + ) + + poultry_request = PoultryRequest.objects.filter( + trash=False, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + out_province_request_cancel=False, + temporary_trash=False, + temporary_deleted=False, + send_date__date__gte=yesterday + ).only( + 'quantity', + 'Index_weight', + 'send_date' + ) + + poultry_request_aggregates = poultry_request.aggregate( + total_quantity=Sum('quantity', filter=Q(send_date__date=now, direct_buying=False, out=False)), + total_weight=Sum(F('quantity') * F('Index_weight'), + filter=Q(send_date__date=now, direct_buying=False, out=False)), + total_direct_buying_quantity=Sum('quantity', filter=Q(send_date__date=now, direct_buying=True)), + total_direct_buying_weight=Sum(F('quantity') * F('Index_weight'), + filter=Q(send_date__date=now, direct_buying=True)), + total_quantity_out_yesterday=Sum('quantity', filter=Q(out=True, send_date__date=yesterday)), + poultry_out_province_quantity=Sum('quantity', filter=Q(out=True, send_date__date=now)), + poultry_out_province_weight=Sum(F('quantity') * F('Index_weight'), filter=Q(out=True, send_date__date=now)), + total_killing_ave_weight=Avg('Index_weight', filter=Q(send_date__date=now)), + # yesterday + total_quantity_yesterday=Sum('quantity', filter=Q(send_date__date=yesterday, direct_buying=False, out=False)), + total_weight_yesterday=Sum(F('quantity') * F('Index_weight'), + filter=Q(send_date__date=yesterday, direct_buying=False, out=False)), + total_direct_buying_quantity_yesterday=Sum('quantity', filter=Q(send_date__date=yesterday, direct_buying=True)), + total_direct_buying_weight_yesterday=Sum(F('quantity') * F('Index_weight'), + filter=Q(send_date__date=yesterday, direct_buying=True)), + poultry_out_province_quantity_yesterday=Sum('quantity', filter=Q(out=True, send_date__date=yesterday)), + poultry_out_province_weight_yesterday=Sum(F('quantity') * F('Index_weight'), + filter=Q(out=True, send_date__date=yesterday)), + total_killing_ave_weight_yesterday=Avg('Index_weight', filter=Q(send_date__date=now)) + ) + + province_kill_request = ProvinceKillRequest.objects.filter( + trash=False, + archive_wage=False, + return_to_province=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date__gte=yesterday + ).only( + 'total_killed_quantity', + 'total_killed_weight', + 'kill_request__recive_date' + ) + + province_kill_request_aggregates = province_kill_request.aggregate( + total_quantity_yesterday=Sum('total_killed_quantity', filter=Q(kill_request__recive_date__date=yesterday)), + total_weight_yesterday=Sum('total_killed_weight', filter=Q(kill_request__recive_date__date=yesterday)), + total_quantity=Sum('total_killed_quantity', filter=Q(kill_request__recive_date__date=now)), + total_weight_carcass=Sum('total_killed_weight', filter=Q(kill_request__recive_date__date=now)) * 0.75, + province_kill_request_total_weight=Sum('total_killed_weight', filter=Q(kill_request__recive_date__date=now)), + province_kill_request_total_weight_yesterday=Sum('total_killed_weight', + filter=Q(kill_request__recive_date__date=yesterday)) + ) + + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=yesterday, + temporary_trash=False, + temporary_deleted=False + ).select_related('kill_request').only( + 'ware_house_accepted_real_weight', + 'weight_loss', + 'ware_house_confirmation', + 'kill_request__recive_date' + ) + + kill_house_request_aggregates = kill_house_request.aggregate( + total_real_weight=Sum( + 'ware_house_accepted_real_weight', + filter=Q( + kill_request__recive_date__date=yesterday, + ware_house_confirmation=True + ) + ), + total_weight_loss=Avg( + 'weight_loss', + filter=Q(kill_request__recive_date__date=yesterday) + ), + total_quantity=Sum( + 'accepted_real_quantity', + filter=Q(kill_request__recive_date__date=now) + ), + total_quantity_yesterday=Sum( + 'accepted_real_quantity', + filter=Q(kill_request__recive_date__date=yesterday) + ), + total_weight_yesterday=Sum( + 'accepted_real_weight', + filter=Q(kill_request__recive_date__date=yesterday) + ), + total_weight=Sum( + 'accepted_real_weight', + filter=Q(kill_request__recive_date__date=now) + ), + total_real_weight_yesterday=Sum( + 'ware_house_accepted_real_weight', + filter=Q( + kill_request__recive_date__date=yesterday, + ware_house_confirmation=True + ) + ) + ) + + kill_request = KillRequest.objects.filter( + recive_date__date=now, + trash=False, + poultry__isnull=True, + province_state='accepted' + ).only( + 'kill_capacity', + 'recive_date', + 'province_state' + ) + + kill_request_aggregates = kill_request.aggregate( + total_quantity=Sum('kill_capacity'), + ) + + if hatching_aggregates['total_left_over_between_40_75'] and poultry_request_aggregates['total_killing_ave_weight']: + weight_between_forty_seventy_five = int(hatching_aggregates['total_left_over_between_40_75'] * + poultry_request_aggregates['total_killing_ave_weight']) + else: + weight_between_forty_seventy_five = 0 + + enter_warehouse_weight = (kill_house_free_bar_aggregates['warehouse_total_weight_carcass'] or 0) + ( + kill_house_request_aggregates['total_real_weight_yesterday'] or 0) + roles_product = RolesProducts.objects.filter(trash=False) + + roles_product_aggregates = roles_product.aggregate( + total_remain_weight=Sum('total_remain_weight'), + total_out_province_allocated_weight=Sum('out_province_allocated_weight'), + ) + + cold_house = ColdHouse.objects.filter(trash=False).only( + 'total_remain_weight' + ) + + cold_house_aggregates = cold_house.aggregate( + total_freezing_weight=Sum('total_remain_weight') + ) + kill_house_free_sale_bar_aggregates = KillHouseFreeSaleBarInformation.objects.filter( + trash=False + ).aggregate( + total_real_weight_of_carcasses=Sum('real_weight_of_carcasses'), + total_real_weight_of_carcasses_now=Sum('real_weight_of_carcasses', filter=Q(date__date=now)) + ) + steward_allocation = StewardAllocation.objects.filter( + trash=False, + calculate_status=True, + temporary_trash=False, + temporary_deleted=False, + receiver_state__in=('accepted', 'pending') + ).exclude( + seller_type='ColdHouse' + ).only( + 'real_weight_of_carcasses', + 'date' + ) + + steward_allocation_aggregates = steward_allocation.aggregate( + total_real_weight_of_carcasses=Sum('real_weight_of_carcasses'), + total_real_weight_of_carcasses_now=Sum( + 'real_weight_of_carcasses', + filter=Q(date__date=now) + ), + ) + + chicken_price = ChickenCommissionPrices.objects.filter(trash=False, date__date__gte=now - timedelta(7)).order_by( + 'date') + ser_data = ChickenCommissionPricesForDashboardSerializer(chicken_price, many=True) + province_kill_request_weight = province_kill_request_aggregates['province_kill_request_total_weight'] or 0 + province_kill_request_total_weight_yesterday = province_kill_request_aggregates[ + 'province_kill_request_total_weight_yesterday'] or 0 + province_kill_request_weight_yesterday = province_kill_request_aggregates['total_weight_yesterday'] or 0 + bars_live_weight = kill_house_free_bar_aggregates['total_weight_live'] or 0 + total_weight_live_yesterday = kill_house_free_bar_aggregates['total_weight_live_yesterday'] or 0 + bars_carcasses_weight = kill_house_free_bar_aggregates['total_weight_carcass'] or 0 + total_weight_carcass_yesterday = kill_house_free_bar_aggregates['total_weight_carcass_yesterday'] or 0 + bars_yesterday_carcasses_weight = kill_house_free_bar_aggregates['total_weight_yesterday_carcass'] or 0 + bars_yesterday_live_weight = kill_house_free_bar_aggregates['total_weight_yesterday_live'] or 0 + total_loss_weight = int(((province_kill_request_weight + bars_live_weight) * 0.75) + bars_carcasses_weight) + total_loss_weight_yesterday = int(((province_kill_request_total_weight_yesterday + + total_weight_live_yesterday) * 0.75) + total_weight_carcass_yesterday) + total_yesterday_loss_weight = int(((province_kill_request_weight_yesterday + bars_yesterday_live_weight) + * 0.75) + bars_yesterday_carcasses_weight) + + result = { + 'hatching': { + 'quantity': hatching_aggregates['total_quantity'] or 0, + 'killedQuantity': hatching_aggregates['total_killed_quantity'] or 0, + 'leftOver': hatching_aggregates['total_left_over'] or 0, + 'leftOverBetweenFortySeventyFive': hatching_aggregates['total_left_over_between_40_75'] or 0, + 'killingAveAge': int(hatching_aggregates['total_killing_ave_age'] or 0), + 'total_left_over_lt_35': int(hatching_aggregates['total_left_over_lt_35'] or 0), + 'total_left_over_between_35_40': int(hatching_aggregates['total_left_over_between_35_40'] or 0), + 'total_left_over_between_40_45': int(hatching_aggregates['total_left_over_between_40_45'] or 0), + 'total_left_over_between_45_50': int(hatching_aggregates['total_left_over_between_45_50'] or 0), + 'total_left_over_between_50_55': int(hatching_aggregates['total_left_over_between_50_55'] or 0), + 'total_left_over_between_55_60': int(hatching_aggregates['total_left_over_between_55_60'] or 0), + 'total_left_over_between_60_65': int(hatching_aggregates['total_left_over_between_60_65'] or 0), + 'total_left_over_between_65_70': int(hatching_aggregates['total_left_over_between_65_70'] or 0), + 'total_left_over_gt_70': int(hatching_aggregates['total_left_over_gt_70'] or 0), + }, + 'yesterdayKilling': { + 'quantityKillHouseFreeBarLive': kill_house_free_bar_aggregates['total_quantity_yesterday_live'] or 0, + 'weightKillHouseFreeBarLive': kill_house_free_bar_aggregates['total_weight_yesterday_live'] or 0, + 'quantityKillHouseFreeBarCarcass': kill_house_free_bar_aggregates['total_quantity_yesterday_carcass'] or 0, + 'weightKillHouseFreeBarCarcass': kill_house_free_bar_aggregates['total_weight_yesterday_carcass'] or 0, + 'provinceKillRequestQuantity': province_kill_request_aggregates['total_quantity_yesterday'] or 0, + 'provinceKillRequestWeight': province_kill_request_aggregates['total_weight_yesterday'] or 0, + 'outQuantity': poultry_request_aggregates['total_quantity_out_yesterday'] or 0, + # 'weightOfCarcass': kill_house_request_aggregates['total_real_weight'] or 0, + # 'losses': round((kill_house_request_aggregates['total_weight_loss'] or 0),1), + 'weightOfCarcass': total_yesterday_loss_weight, + 'losses': 25, + + }, + 'killing': { + 'quantity': poultry_request_aggregates['total_quantity'] or 0, + 'total_weight': poultry_request_aggregates['total_weight'] or 0, + 'killRequestQuantity': poultry_request_aggregates['total_direct_buying_quantity'] or 0, + 'killRequestWeight': poultry_request_aggregates['total_direct_buying_weight'] or 0, + # 'killRequestQuantity': kill_request_aggregates['total_quantity'] or 0, + 'poultry_out_province_quantity': poultry_request_aggregates['poultry_out_province_quantity'] or 0, + 'poultry_out_province_weight': poultry_request_aggregates['poultry_out_province_weight'] or 0, + 'quantityKillHouseFreeBarLive': kill_house_free_bar_aggregates['total_quantity_live'] or 0, + 'WeightKillHouseFreeBarLive': kill_house_free_bar_aggregates['total_weight_live'] or 0, + 'quantityKillHouseFreeBarCarcass': kill_house_free_bar_aggregates['total_quantity_carcass'] or 0, + 'WeightKillHouseFreeBarCarcass': kill_house_free_bar_aggregates['total_weight_carcass'] or 0, + 'provinceKillRequestQuantity': province_kill_request_aggregates['total_quantity'] or 0, + 'provinceKillRequestWeightCarcass': int( + province_kill_request_aggregates['province_kill_request_total_weight'] or 0), + 'KillHouseRequestQuantity': kill_house_request_aggregates['total_quantity'] or 0, + 'KillHouseRequestWeight': kill_house_request_aggregates['total_weight'] or 0, + 'total_loss_weight': int(total_loss_weight), + + }, + 'killingYesterday': { + 'quantityYesterday': poultry_request_aggregates['total_quantity_yesterday'] or 0, + 'total_weightYesterday': poultry_request_aggregates['total_weight_yesterday'] or 0, + 'killRequestQuantityYesterday': poultry_request_aggregates['total_direct_buying_quantity_yesterday'] or 0, + 'killRequestWeightYesterday': poultry_request_aggregates['total_direct_buying_weight_yesterday'] or 0, + # 'killRequestQuantity': kill_request_aggregates['total_quantity'] or 0, + 'poultry_out_province_quantityYesterday': poultry_request_aggregates[ + 'poultry_out_province_quantity_yesterday'] or 0, + 'poultry_out_province_weightYesterday': poultry_request_aggregates[ + 'poultry_out_province_weight_yesterday'] or 0, + 'quantityKillHouseFreeBarLiveYesterday': kill_house_free_bar_aggregates[ + 'total_quantity_live_yesterday'] or 0, + 'WeightKillHouseFreeBarLiveYesterday': kill_house_free_bar_aggregates['total_weight_live_yesterday'] or 0, + 'quantityKillHouseFreeBarCarcassYesterday': kill_house_free_bar_aggregates[ + 'total_quantity_carcass_yesterday'] or 0, + 'WeightKillHouseFreeBarCarcassYesterday': kill_house_free_bar_aggregates[ + 'total_weight_carcass_yesterday'] or 0, + 'provinceKillRequestQuantityYesterday': province_kill_request_aggregates['total_quantity_yesterday'] or 0, + 'provinceKillRequestWeightCarcassYesterday': int( + province_kill_request_aggregates['province_kill_request_total_weight_yesterday'] or 0), + 'KillHouseRequestQuantityYesterday': kill_house_request_aggregates['total_quantity_yesterday'] or 0, + 'KillHouseRequestWeightYesterday': kill_house_request_aggregates['total_weight_yesterday'] or 0, + 'total_loss_weightYesterday': int(total_loss_weight_yesterday), + + }, + 'inventory': { + 'leftOverBetweenFortySeventyFive': hatching_aggregates['total_left_over_between_40_75'] or 0, + 'weightBetweenFortySeventyFive': weight_between_forty_seventy_five, + 'aveWeight': round((poultry_request_aggregates['total_killing_ave_weight'] or 0), 1), + 'carcassWeight': int(weight_between_forty_seventy_five * 0.75), + + }, + 'warehouseKillHouse': { + 'remainingChickenStock': roles_product_aggregates['total_remain_weight'] or 0, + 'remainingFreezingWeight': cold_house_aggregates['total_freezing_weight'] or 0, + 'outProvinceAllocatedWeight': kill_house_free_sale_bar_aggregates['total_real_weight_of_carcasses'] or 0, + 'allocationWeight': steward_allocation_aggregates['total_real_weight_of_carcasses'] or 0, + + }, + 'warehouseInformation': { + 'enterWarehouseWeight': enter_warehouse_weight, + 'outSellWeight': kill_house_free_sale_bar_aggregates['total_real_weight_of_carcasses_now'] or 0, + 'allocationWeight': steward_allocation_aggregates['total_real_weight_of_carcasses_now'] or 0, + 'leftOverWarehouseWeight': roles_product_aggregates['total_remain_weight'] or 0, + + }, + 'chickenPrice': ser_data.data + } + return Response(result, status=status.HTTP_200_OK) + + +def remove_access_token_manual(request): + ARTA_remove_access_token = "https://userbackend.rasadyar.com/api/remove_access_token/" + requests.get( + url=ARTA_remove_access_token, + verify=False + ) + now = datetime.datetime.now() + accesses = AccessToken.objects.filter(created__date__gte=now.date() - timedelta(days=3)) + for access in accesses: + access.expires = now - timedelta(days=2) + access.save() + return HttpResponse('ok') + + +def find_gid_code_manual(request): + kill_house_request = KillHouseRequest.objects.filter(trash=False, clearance_code__isnull=False, + quarantine_quantity__isnull=True).only( + 'quarantine_code_state', 'clearance_code', 'quarantine_quantity' + ).order_by('-id') + session = requests.Session() + session.mount('https://', SSLAdapter()) + + for kill in kill_house_request: + if kill.quarantine_code_state != 'merge': + if kill.clearance_code is None: + kill.quarantine_code_state = 'noclearance' + else: + data = {'gid': str(kill.clearance_code)} + m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}) + context = BeautifulSoup(m.text, 'html.parser') + text = context.body.get_text(strip=True) + if text == 'فرآورده هاي خام داميGo Backفهرستخروجتاییده راهداری دریافت نشد به بخش اعلام خاتمه صدور گواهی بهداشتی حمل درهمین سایت مراجعه کنید.': + kill.quarantine_code_state = 'notconfirmed' + if kill.quarantine_quantity is not None: + kill.quarantine_quantity = None + else: + table = context.find_all('table') + if table[5:6]: + row = context.find('div', align="right") + if row: + content = row.get_text(separator=" ", strip=True) + date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content) + + if date_match: + jalali_date = date_match.group(1) + year, month, day = map(int, jalali_date.split('/')) + date = convert_to_miladi(year=year, month=month, day=day) + kill.inquiry_date = date.date() + send_date = kill.kill_request.recive_date.date() + + one_day = timedelta(days=1) + if abs(send_date - date.date()) <= one_day: + for i in table[5:6]: + row = i.find_all('tr') + for r in row[1:2]: + quantity = r.find('td') + match = re.search(r'\d+', quantity.text) + if match: + number = match.group() + kill.quarantine_quantity = int(number) + if kill.quarantine_code_state is not None: + kill.quarantine_code_state = None + for i in table[4:5]: + rows = i.find_all('tr') + + pelak_txt = rows[1].find('span', class_='dynamictxt', dir='ltr', + style='font-family:Tahoma').text.strip() + kill.inquiry_pelak = pelak_txt + td = rows[1].find_all('td')[1] + driver_txt = td.find('span', class_='dynamictxt').text.strip() + kill.inquiry_driver = driver_txt + + for r in rows: + tds = r.find_all('td', colspan="2") + if len(tds) >= 2: + origin_td = tds[0] + origin_text = origin_td.find('span', class_='dynamictxt').text.strip() + kill.inquiry_origin = origin_text + + destination_td = tds[1] + destination_text = destination_td.find('span', + class_='dynamictxt').text.strip() + kill.inquiry_destination = destination_text + else: + kill.quarantine_code_state = 'contradiction' + kill.quarantine_quantity = None + + else: + for table in table: + p_tags = table.find_all('p') + for p in p_tags: + p_text = p.get_text(strip=True) + if p_text == 'شماره رهگيري وارد شده معتبر نيست.': + kill.quarantine_code_state = 'contradiction' + if kill.quarantine_quantity is not None: + kill.quarantine_quantity = None + kill.save() + return HttpResponse('ok') + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_all_pos_transaction(request): + filters = {} + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + price_type = request.GET.get('price_type') + paid = request.GET.get('paid') + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا مجدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + + pos = POSMachine.objects.get(pos_id=validation_device) + filters['trash'] = False + filters['pos'] = pos + + if date1 and date2: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filters['date__date__gte'] = date1 + filters['date__date__lte'] = date2 + + if price_type: + filters['price_type__in'] = price_type.split(',') + + if paid: + filters['paid'] = True if paid == 'true' else False + + transactions = PosMachineTransactions.objects.filter(**filters).only('price', 'price_type').order_by('-date') + product_transactions = ProductsTransactions.objects.filter(trash=False, transaction__in=transactions).only \ + ('price', 'cur_weight', 'targetunit', 'image') + + transactions_aggregate = transactions.aggregate( + total_price=Sum('price'), + total_price_cash=Sum('price', filter=Q(price_type='cash')), + total_price_credit=Sum('price', filter=Q(price_type='credit')), + total_price_card=Sum('price', filter=Q(price_type='card')), + ) + + product_groups = defaultdict(lambda: {'price': 0, 'weight': 0, 'targetunit': None, 'image': None}) + + for pt in product_transactions: + product_groups[pt.name]['price'] += pt.price + product_groups[pt.name]['weight'] += pt.cur_weight + if not product_groups[pt.name]['targetunit']: + product_groups[pt.name]['targetunit'] = pt.targetunit + if not product_groups[pt.name]['image']: + product_groups[pt.name]['image'] = pt.image + + unique_products = [{ + 'name': name, + 'price': data['price'], + 'weight': data['weight'], + 'targetunit': data['targetunit'], + 'image': data['image'] + } for name, data in product_groups.items()] + + result_dict = { + 'count': transactions.count(), + 'total_price': transactions_aggregate['total_price'] or 0, + 'total_price_cash': transactions_aggregate['total_price_cash'] or 0, + 'total_price_credit': transactions_aggregate['total_price_credit'] or 0, + 'total_price_card': transactions_aggregate['total_price_card'] or 0, + 'products': unique_products + } + + return Response(result_dict) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def send_clearance_code_to_rsi(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else None + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + temporary_trash=False, + temporary_deleted=False, + clearance_code__isnull=False + ).values_list('clearance_code', flat=True).distinct() + + kill_house_free_sale = PoultryRequest.objects.filter(trash=False, quarantine_code__isnull=False, out=True) \ + .values_list('quarantine_code', flat=True).distinct() + + result = list(kill_house_request) + list(kill_house_free_sale) + + response = requests.post( + f'https://rsibackend.rasadyar.com/app/send_different_bar/?province={base_url_for_sms_report}' + f'&date1={date1}&date2={date2}', + json=result, + headers={'Content-Type': 'application/json'} + ) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + sheet_list = [ + 'بار های داخل استان', + 'بار های خارج استان' + ] + + for sheet_name in sheet_list: + + worksheet = workbook.create_sheet(sheet_name) + if sheet_name == 'بار های داخل استان': + + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد مرغداران', + 'تعداد کشتارگاه ها', + 'حجم کشتار', + + ] + create_header(worksheet, header_list, 4, 2, height=25, width=25, border_style='thin', color='C00000') + + value_header_list = [ + + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + + excel_options = [ + 'ردیف', + 'تاریخ کشتار', + 'مرغدار', + 'شناسه یکتا مرغدار', + 'شماره مجوز جوجه ریزی', + 'شماره موبایل مرغدار', + 'شهر مرغدار', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد قرنطینه', + 'کشتارگاه', + 'شناسه یکتا کشتارگاه', + 'استان', + 'شهر', + 'حجم کشتار', + 'سن کشتار', + + ] + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + unique_poultry_out_false = set() + unique_slaughterhouses_out_false = set() + total_slaughter_out_false = 0 + excel_description(worksheet, 'A1', f'بارهای داخل استان', color='red', + row2='B1') + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + from_date2 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ {from_date1} تا {from_date2}', color='red', row2='C3') + for data in response.json(): + if data['Out'] == False: + vet_farm_mobile = '' + vet_farm_name = '' + vet_farm = VetFarm.objects.filter(trash=False, + poultry__breeding_unique_id=data['hatching']['poultry'][ + 'PartIdCode']).first() + if vet_farm: + vet_farm_mobile = vet_farm.vet.user.mobile + vet_farm_name = vet_farm.vet.user.fullname + unique_poultry_out_false.add(data['hatching']['poultry']['UnitName']) + unique_slaughterhouses_out_false.add(data['DesUnitName']) + total_slaughter_out_false += data['GoodAmount'] + date_str = str(data['Date']).split('T')[0] # جدا کردن بخش تاریخ + date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date() + list1 = [ + m, + str(shamsi_date(date, in_value=True)), + data['hatching']['poultry']['UnitName'], + data['hatching']['poultry']['PartIdCode'], + data['hatching']['RequestCode'], + data['hatching']['poultry']['Mobile'], + data['hatching']['poultry']['City'], + vet_farm_name, + vet_farm_mobile, + data['TrackingCode'], + data['DesUnitName'], + data['DesPartIdCode'], + data['Province'], + data['City'], + data['GoodAmount'], + data['Age'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + value_header_list = [ + len(unique_poultry_out_false), + len(unique_slaughterhouses_out_false), + total_slaughter_out_false + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + quantity = sum( + data['GoodAmount'] for data in response.json() if data['Out'] == False) or 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + quantity, + '', + + ] + + create_value(worksheet, list2, l + 1, 1, color='green') + else: + unique_poultry_out_false = set() + unique_slaughterhouses_out_false = set() + total_slaughter_out_false = 0 + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد مرغداران', + 'تعداد کشتارگاه ها', + 'حجم کشتار', + + ] + create_header(worksheet, header_list, 4, 2, height=25, width=25, border_style='thin', color='C00000') + + excel_options = [ + 'ردیف', + 'تاریخ کشتار', + 'مرغدار', + 'شناسه یکتا مرغدار', + 'شماره مجوز جوجه ریزی', + 'شماره موبایل مرغدار', + 'شهر مرغدار', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد قرنطینه', + 'کشتارگاه', + 'شناسه یکتا کشتارگاه', + 'استان', + 'شهر', + 'حجم کشتار', + 'سن کشتار', + + ] + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + unique_poultry = set() + unique_slaughterhouses = set() + total_slaughter = 0 + excel_description(worksheet, 'A1', f'بارهای خارج استان', color='red', + row2='B1') + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + from_date2 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ {from_date1} تا {from_date2}', color='red', row2='C3') + for data in response.json(): + if data['Out'] == True: + vet_farm_mobile = '' + vet_farm_name = '' + vet_farm = VetFarm.objects.filter(trash=False, + poultry__breeding_unique_id=data['hatching']['poultry'][ + 'PartIdCode']).first() + if vet_farm: + vet_farm_mobile = vet_farm.vet.user.mobile + vet_farm_name = vet_farm.vet.user.fullname + + unique_poultry_out_false.add(data['hatching']['poultry']['UnitName']) + unique_slaughterhouses_out_false.add(data['DesUnitName']) + total_slaughter_out_false += data['GoodAmount'] + date_str = str(data['Date']).split('T')[0] # جدا کردن بخش تاریخ + date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date() + list1 = [ + m, + str(shamsi_date(date, in_value=True)), + data['hatching']['poultry']['UnitName'], + data['hatching']['poultry']['PartIdCode'], + data['hatching']['RequestCode'], + data['hatching']['poultry']['Mobile'], + data['hatching']['poultry']['City'], + vet_farm_mobile, + vet_farm_name, + data['TrackingCode'], + data['DesUnitName'], + data['DesPartIdCode'], + data['Province'], + data['City'], + data['GoodAmount'], + data['Age'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + value_header_list = [ + len(unique_poultry_out_false), + len(unique_slaughterhouses_out_false), + total_slaughter_out_false + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + quantity = sum( + data['GoodAmount'] for data in response.json() if data['Out'] == False) or 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + quantity, + '', + + ] + + create_value(worksheet, list2, l + 1, 1, color='green') + 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 + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def api_send_clearance_code_to_rsi(request): + page = '' + search_filter = '' + province = f'province={base_url_for_sms_report}' + search = request.GET.get('search') + value = request.GET.get('value') + if search: + if search != 'undefined' and value.strip(): + search_filter = f'&search={search}&value={value}' + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else None + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + temporary_trash=False, + temporary_deleted=False, + clearance_code__isnull=False + ).values_list('clearance_code', flat=True).distinct() + + kill_house_free_sale = PoultryRequest.objects.filter(trash=False, quarantine_code__isnull=False, out=True) \ + .values_list('quarantine_code', flat=True).distinct() + + result = list(kill_house_request) + list(kill_house_free_sale) + if 'page' in request.GET: + page = f'&page={request.GET["page"]}&page_size={request.GET["page_size"]}' + + response = requests.get( + f'https://rsibackend.rasadyar.com/app/api_send_different_bar/?{province}{page}' + f'{search_filter}' + f'&date1={date1}&date2={date2}', + json=result, + headers={'Content-Type': 'application/json'} + ) + + return Response(response.json(), status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def create_steward_allocation_from_excel(request): + file = request.FILES['file'].read() + read = openpyxl.load_workbook(BytesIO(file), data_only=True) + sheet = read.active + result_list = [] + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i <= 1: + continue + + mobile = row[3] + kill_house_name = row[4] + allocation_type = row[5] + date = row[6] + sell_type = row[7] + seller_type = 'KillHouse' + type = 'manual' + weight_of_carcasses = row[8] + amount = row[9] + + buyer_type = 'Steward' if allocation_type == 'مباشر' else 'Guild' + try: + miladi_date = date.split('/') + new_date = convert_to_miladi( + year=int(miladi_date[0]), + month=int(miladi_date[1]), + day=int(miladi_date[2]) + ) + kill_house = KillHouse.objects.filter(name=kill_house_name, trash=False).first() + user = SystemUserProfile.objects.filter(trash=False, mobile=mobile).first() + if user: + to_steward = None + to_guild = None + if buyer_type == 'Steward': + to_steward = Guilds.objects.get(user=user, trash=False) + else: + to_guild = Guilds.objects.get(user=user, trash=False) + product = RolesProducts.objects.get(kill_house=kill_house) + steward_allocation = StewardAllocation( + date=new_date, + real_weight_of_carcasses=weight_of_carcasses, + weight_of_carcasses=weight_of_carcasses, + product=product, + kill_house=kill_house, + seller_type=seller_type, + allocation_type='killhouse_guild' if allocation_type == 'صنف' else 'killhouse_steward', + sell_type='exclusive' if sell_type == 'اختصاصی' else 'free', + type=type, + amount=amount, + total_amount=int(amount * weight_of_carcasses), + ) + if buyer_type == 'Steward': + steward_allocation.to_steward = to_steward + else: + steward_allocation.to_guilds = to_guild + steward_allocation.save() + kill_house_allocations_product_warehousing(product) + except: + result_list.append(mobile) + return Response(result_list) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def send_bar_info_from_ticket(request): + user = SystemUserProfile.objects.get(trash=False, key=request.GET['key']) + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).order_by('id') + kill_house_request = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, temporary_deleted=False) + if kill_house_request: + message = 'با سلام و احترام' \ + '***' \ + 'بدینوسیله گزارش اسناد بارهای کشتارگاه ها از مورخه {0} تا {1} به شرح زیر بحضور ایفاد میگردد:' \ + '***' \ + '***'.format(shamsi_date(date1), shamsi_date(date2)) + else: + message = 'با سلام و احترام' \ + '***' \ + ' از مورخه {0} تا {1} باری وجود ندارد.' \ + '***' \ + '***'.format(shamsi_date(date1), shamsi_date(date2)) + m = 1 + for kill_house in kill_houses: + kill_house_request1 = kill_house_request.filter(trash=False, killhouse_user=kill_house, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, temporary_deleted=False) + bar_count = kill_house_request1.count() + bar_assigment_pending_count = kill_house_request1.filter(assignment_state_archive='pending').count() + bar_assigment_true_count = kill_house_request1.filter(assignment_state_archive='True').count() + bar_document_status = kill_house_request1.filter(bar_document_status__isnull=False).count() + bar_document_status_titles = kill_house_request1.values_list('bar_document_status__title', flat=True) + bars_info = [] + if (None not in bar_document_status_titles and bar_document_status_titles) or (bar_assigment_pending_count != 0) \ + or (bar_assigment_true_count > 0): + message += '{0}) {1} :' \ + 'تعداد {2} بار ایجاد شده است.***'.format(m, kill_house.name, to_locale_str(bar_count)) + if bar_assigment_pending_count > 0 or bar_assigment_true_count > 0: + message += '📑 {1} بار دارای سند(بارنامه) و تعداد {0} بار فاقد سند(بارنامه) میباشد.*** '. \ + format(to_locale_str(bar_assigment_pending_count), to_locale_str(bar_assigment_true_count)) + if bar_document_status > 0: + message += '🌐 از بارهای دارای سند تعداد {0} بار توسط ربات هوش مصنوعی سامانه مورد بررسی قرار گرفت که به شرح زیر میباشد: '. \ + format(to_locale_str(bar_document_status)) + status_counts = Counter(bar_document_status_titles) + for title, count in status_counts.items(): + if title: + bars_info.append( + '***' \ + '🚛 {0} بار شامل سند ({1})'.format(to_locale_str(count), title)) + + if bars_info: + message += '.'.join(bars_info) + + message += '***' \ + '-------------------------------------------------------' \ + '***' \ + '***' + m += 1 + + new_ticket = TicketSupport( + user=user, + title="استعلام اسناد بارها از مورخه {0} تا {1}".format(shamsi_date(date1), shamsi_date(date2)), + status='open', + read_only=True, + type_ticket='single', + parent=None, + last_message='Admin', + ) + new_ticket.save() + new_ticket.to_user.add(user) + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + return Response({'result': 'با موفقیت انجام شد.'}, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def all_clearance_code_to_rsi(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else None + # kill_house_request = KillHouseRequest.objects.filter( + # trash=False, + # temporary_trash=False, + # temporary_deleted=False, + # clearance_code__isnull=False + # ).values_list('clearance_code', flat=True).distinct() + # + # kill_house_free_sale = PoultryRequest.objects.filter(trash=False, quarantine_code__isnull=False, out=True) \ + # .values_list('quarantine_code', flat=True).distinct() + + result = [] + + response = requests.post( + f'https://rsibackend.rasadyar.com/app/send_different_bar/?province={base_url_for_sms_report}' + f'&date1={date1}&date2={date2}', + json=result, + headers={'Content-Type': 'application/json'} + ) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + sheet_list = [ + 'بار های داخل استان', + 'بار های خارج استان' + ] + + for sheet_name in sheet_list: + + worksheet = workbook.create_sheet(sheet_name) + if sheet_name == 'بار های داخل استان': + + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد مرغداران', + 'تعداد کشتارگاه ها', + 'حجم کشتار', + + ] + create_header(worksheet, header_list, 4, 2, height=25, width=25, border_style='thin', color='C00000') + + value_header_list = [ + + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + + excel_options = [ + 'ردیف', + 'تاریخ کشتار', + 'مرغدار', + 'شناسه یکتا مرغدار', + 'شماره مجوز جوجه ریزی', + 'شماره موبایل مرغدار', + 'شهر مرغدار', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد قرنطینه', + 'وضعیت بار', + 'کشتارگاه', + 'شناسه یکتا کشتارگاه', + 'استان', + 'شهر', + 'حجم کشتار', + 'سن کشتار', + + ] + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + unique_poultry_out_false = set() + unique_slaughterhouses_out_false = set() + total_slaughter_out_false = 0 + excel_description(worksheet, 'A1', f'بارهای داخل استان', color='red', + row2='B1') + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + from_date2 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ {from_date1} تا {from_date2}', color='red', row2='C3') + for data in response.json(): + if data['Out'] == False: + vet_farm_mobile = '' + vet_farm_name = '' + vet_farm = VetFarm.objects.filter(trash=False, + poultry__breeding_unique_id=data['hatching']['poultry'][ + 'PartIdCode']).first() + if vet_farm: + vet_farm_mobile = vet_farm.vet.user.mobile + vet_farm_name = vet_farm.vet.user.fullname + unique_poultry_out_false.add(data['hatching']['poultry']['UnitName']) + unique_slaughterhouses_out_false.add(data['DesUnitName']) + total_slaughter_out_false += data['GoodAmount'] + date_str = str(data['Date']).split('T')[0] # جدا کردن بخش تاریخ + date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date() + list1 = [ + m, + str(shamsi_date(date, in_value=True)), + data['hatching']['poultry']['UnitName'], + data['hatching']['poultry']['PartIdCode'], + data['hatching']['RequestCode'], + data['hatching']['poultry']['Mobile'], + data['hatching']['poultry']['City'], + vet_farm_name, + vet_farm_mobile, + data['TrackingCode'], + data['TrackingStatusDescription'], + data['DesUnitName'], + data['DesPartIdCode'], + data['Province'], + data['City'], + data['GoodAmount'], + data['Age'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + value_header_list = [ + len(unique_poultry_out_false), + len(unique_slaughterhouses_out_false), + total_slaughter_out_false + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + quantity = sum( + data['GoodAmount'] for data in response.json() if data['Out'] == False) or 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + quantity, + '', + + ] + + create_value(worksheet, list2, l + 1, 1, color='green') + else: + unique_poultry_out_false = set() + unique_slaughterhouses_out_false = set() + total_slaughter_out_false = 0 + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد مرغداران', + 'تعداد کشتارگاه ها', + 'حجم کشتار', + + ] + create_header(worksheet, header_list, 4, 2, height=25, width=25, border_style='thin', color='C00000') + + excel_options = [ + 'ردیف', + 'تاریخ کشتار', + 'مرغدار', + 'شناسه یکتا مرغدار', + 'شماره مجوز جوجه ریزی', + 'شماره موبایل مرغدار', + 'شهر مرغدار', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد قرنطینه', + 'وضعیت بار', + 'کشتارگاه', + 'شناسه یکتا کشتارگاه', + 'استان', + 'شهر', + 'حجم کشتار', + 'سن کشتار', + + ] + + m = 1 + + create_header_freez(worksheet, excel_options, 1, 6, 7, 20) + + l = 7 + unique_poultry = set() + unique_slaughterhouses = set() + total_slaughter = 0 + excel_description(worksheet, 'A1', f'بارهای خارج استان', color='red', + row2='B1') + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() + from_date1 = shamsi_date(date1) + from_date2 = shamsi_date(date2) + excel_description(worksheet, 'A3', f'از تاریخ {from_date1} تا {from_date2}', color='red', row2='C3') + for data in response.json(): + if data['Out'] == True: + vet_farm_mobile = '' + vet_farm_name = '' + vet_farm = VetFarm.objects.filter(trash=False, + poultry__breeding_unique_id=data['hatching']['poultry'][ + 'PartIdCode']).first() + if vet_farm: + vet_farm_mobile = vet_farm.vet.user.mobile + vet_farm_name = vet_farm.vet.user.fullname + + unique_poultry_out_false.add(data['hatching']['poultry']['UnitName']) + unique_slaughterhouses_out_false.add(data['DesUnitName']) + total_slaughter_out_false += data['GoodAmount'] + date_str = str(data['Date']).split('T')[0] # جدا کردن بخش تاریخ + date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date() + list1 = [ + m, + str(shamsi_date(date, in_value=True)), + data['hatching']['poultry']['UnitName'], + data['hatching']['poultry']['PartIdCode'], + data['hatching']['RequestCode'], + data['hatching']['poultry']['Mobile'], + data['hatching']['poultry']['City'], + vet_farm_mobile, + vet_farm_name, + data['TrackingCode'], + data['TrackingStatusDescription'], + data['DesUnitName'], + data['DesPartIdCode'], + data['Province'], + data['City'], + data['GoodAmount'], + data['Age'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin', height=35) + + l += 1 + m += 1 + value_header_list = [ + len(unique_poultry_out_false), + len(unique_slaughterhouses_out_false), + total_slaughter_out_false + ] + create_value(worksheet, value_header_list, 3, 4, border_style='thin') + quantity = sum( + data['GoodAmount'] for data in response.json() if data['Out'] == False) or 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + quantity, + '', + + ] + + create_value(worksheet, list2, l + 1, 1, color='green') + 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 + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def ticket_different_clearance_code_from_rsi(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else None + poultry_hatchings_licence_numbers = PoultryHatching.objects.filter(trash=False, + licence_number=request.GET.get('licence_number')) + + for poultry_hatching in poultry_hatchings_licence_numbers: + poultry_hatching_licence_number = poultry_hatching.licence_number + response = requests.post( + f'https://rsibackend.rasadyar.com/app/send_different_bar_with_licence_number/?' + f'licence_number={poultry_hatching_licence_number}' + f'&date1={date1}&date2={date2}', + headers={'Content-Type': 'application/json'} + ) + kill_house_request = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__licence_number + =poultry_hatching_licence_number, + temporary_trash=False, + temporary_deleted=False).order_by( + '-kill_request__recive_date') + if date1: + kill_house_request.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2) + vet_farm = VetFarm.objects.filter(trash=False, poultry=poultry_hatching.poultry).first() + code_rasadyar = [] + + all_quantity_in_rsi = 0 + for i in response.json(): + all_quantity_in_rsi += i['GoodAmount'] + bars_info = [] + for kill_req in kill_house_request: + if kill_req.clearance_code: + quarantine_code = kill_req.clearance_code + code_rasadyar.append(quarantine_code) + + else: + quarantine_code = 'ندارد' + bars_info.append( + 'کد قرنطینه: {0} - حجم: {1} قطعه - مقصد بار: {2} - تاریخ بار: ({3})'.format( + quarantine_code, + to_locale_str(int(kill_req.accepted_real_quantity)), + kill_req.killhouse_user.name, + shamsi_date(kill_req.kill_request.recive_date) + )) + poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + out_province_request_cancel=False, + hatching=poultry_hatching).order_by( + '-send_date' + ) + # code_rsi=[data['TrackingCode'] for data in response.json()] + bars_info_rsi = [] + rsi_quantity = 0 + for poultry_request in poultry_requests: + if poultry_request.quarantine_code: + quarantine_code = poultry_request.quarantine_code + code_rasadyar.append(quarantine_code) + + else: + quarantine_code = 'ندارد' + bars_info.append( + 'کد قرنطینه: {0} - حجم: {1} قطعه - مقصد بار: {2} - تاریخ بار: ({3})'.format( + quarantine_code, + to_locale_str(int(poultry_request.quantity)), + poultry_request.buyer_fullname, + shamsi_date(poultry_request.send_date), + )) + chain_allocations = ChainAllocation.objects.filter(trash=False, poultry_hatching=poultry_hatching).order_by( + '-date') + for poultry_request in chain_allocations: + if poultry_request.quarantine_code: + quarantine_code = poultry_request.quarantine_code + code_rasadyar.append(quarantine_code) + else: + quarantine_code = 'ندارد' + bars_info.append( + 'کد قرنطینه: {0} - حجم: {1} قطعه - مقصد بار: {2} - تاریخ بار: ({3})'.format( + quarantine_code, + to_locale_str(int(poultry_request.quantity)), + poultry_request.buyer_name, + shamsi_date(poultry_request.date), + )) + for bar in response.json(): + rsi_quantity += bar['GoodAmount'] + date_str = str(bar['Date']).split('T')[0] + date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date() + state = '✅' if bar['TrackingCode'] in code_rasadyar else '❌' + bars_info_rsi.append( + 'کد قرنطینه: {0} - حجم: {1} قطعه - مقصد بار: {2} - تاریخ بار: ({3}){4}'.format( + bar['TrackingCode'], + to_locale_str(int(bar['GoodAmount'])), + bar['DesUnitName'], + shamsi_date(date), + state + )) + + bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)]) + bars_details_rsi = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info_rsi)]) + accepted_real_quantity = 0 + accepted_real_quantity += kill_house_request.aggregate( + total_quantity=Sum('accepted_real_quantity')).get('total_quantity') or 0 + accepted_real_quantity += chain_allocations.aggregate( + total_quantity=Sum('quantity')).get('total_quantity') or 0 + accepted_real_quantity += poultry_requests.aggregate( + total_quantity=Sum('quantity')).get('total_quantity') or 0 + if rsi_quantity - accepted_real_quantity > 0: + new_message = 'در مجموع شما {0} قطعه بدون مجوز کشتار در سامانه قرنطینه ثبت کرده اید.' \ + '***' \ + 'در صورت تکرار و عدم رعایت موضوع و ضوابط اجرایی در استان،مراتب و گزارش تخلف به مراجع مسئول ارجاع میگردد.' \ + '***' \ + '***' \ + .format(to_locale_str(int(rsi_quantity - accepted_real_quantity))) + new_message1 = 'خارج از سامانه مجوز حمل' + else: + new_message = '' + new_message1 = 'اطلاعات زیر' + message = " دامپزشک محترم فارم {0}({9})" \ + "***" \ + "با سلام" \ + "***" \ + "با توجه بررسی های انجام شده" \ + " و استعلامات از پایش کشوری سامانه" \ + " رصد یار برای فارم {1} با شناسه یکتا {10} و شماره مجوز جوجه ریزی {11} {12} صادر گردیده است." \ + "***" \ + "***" \ + "اطلاعات مجوز صادر شده در قرنطینه:" \ + "***" \ + "{2}" \ + "***" \ + "جمعا {3} بار با مجموع {4} قطعه" \ + "***" \ + "***" \ + "اطلاعات مجوز صادر شده در رصدیار : " \ + "***" \ + "{5}" \ + "***" \ + "جمعا {6} بار با مجموع {7} قطعه" \ + "***" \ + "***" \ + "{8}" \ + "ربات هوشمند سامانه رصدیار" \ + "".format(vet_farm.vet.user.fullname, poultry_hatching.poultry.unit_name, bars_details_rsi, + len(response.json()), + to_locale_str(int(rsi_quantity)), + bars_details, + len(kill_house_request), to_locale_str(int(accepted_real_quantity)), + new_message, vet_farm.vet.user.mobile, + poultry_hatching.poultry.breeding_unique_id, poultry_hatching.licence_number, new_message1) + + user = SystemUserProfile.objects.filter(trash=False, mobile=request.GET['mobile']).last() + 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(user) + msg = MessageSupport( + ticket=new_ticket, + message=message, + created_by=user, + sender='Admin' + ) + msg.save() + return Response('ok', status=status.HTTP_200_OK) + + +def delete_kill_req_cron(): + current_time = datetime.datetime.now() + kill_requests = KillRequest.objects.filter(Q(market_final_accept=True, market_code_status=True, + input_market_code__isnull=True) | Q(market_final_accept=False), + trash=False, + market=True, + market_state='pending', + market_expire_date_time__lt=current_time + ).select_related('poultry_request') + for kill_request in kill_requests: + kill_request.trash = True + kill_request.market_state_message = { + "fullname": "سیستمی", + "mobile": "سیستمی", + "date": str(datetime.datetime.now()) + } + kill_request.market_state = 'deleted' + kill_request.save() + market_poultry_request_remain_quantity(kill_request.poultry_request) + + +def delete_steward_allocation_cron(): + current_time = datetime.datetime.now().date() + # allow=AllowRegisterCodeForStewardAllocation.objects.filter(trash=False,active=True).first() + # if allow: + steward_allocation = StewardAllocation.objects.filter(trash=False, + date__date=current_time, + receiver_state='pending', + active_expire_date_time=True, + logged_registration_code__isnull=True, + kill_house__isnull=False, + return_trash=False).order_by('id') + for allocation in steward_allocation: + product = allocation.product + seller_type = allocation.seller_type + to_cold_house = allocation.to_cold_house + other_cold_house = allocation.other_cold_house if allocation.other_cold_house else None + allocation.trash = True + allocation.save() + if seller_type == 'KillHouse': + kill_house_allocations_product_warehousing(product) + if to_cold_house and to_cold_house.kill_house == product.kill_house: + kill_house_cold_house_allocations(to_cold_house) + + elif seller_type == 'ColdHouse': + cold_house_warehousing(to_cold_house) + if other_cold_house: + cold_house_warehousing(other_cold_house) + + else: + guild_steward_allocations_product_warehousing(product) + + +def archive_kill_house_remain_limitation_weight_cron(): + production_date = (datetime.datetime.now() - datetime.timedelta(days=3)).date() + archive_date = (datetime.datetime.now() - datetime.timedelta(days=3)) + kill_houses = KillHouse.objects.filter(trash=False, out_province=False) + for kill_house in kill_houses: + 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: + if kill_house.ware_house_remaining_weight_archive_percent > 0: + percent_limitation_weight = total_input * (kill_house.ware_house_remaining_weight_archive_percent / 100) + if percent_limitation_weight >= total_remain: + archive = WarehouseArchive( + kill_house=kill_house, + date=archive_date, + quota='governmental', + weight=total_remain, + registerer='سیستم', + registerer_mobile='سیستم', + registerer_role='سیستم', + description='مانده کمتر از استاندارد تعیین شده', + ) + archive.save() + kill_house_archive_warehousing(archive.kill_house) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def hatching_unknown(request): + age_range = ChickenAgeRange.objects.filter(active=True, trash=False).first() + if age_range: + hatchings = PoultryHatching.objects.filter( + state='pending', + archive=False, + allow_hatching='pending', + trash=False, + unknown=False, + chicken_age__gt=age_range.maximum + ) + poultries = Poultry.objects.filter(id__in=hatchings.values_list('poultry__id', flat=True)).update( + order_limit=True) + hatchings.update(unknown=True) + + return Response("done!") + + +def hatching_unknown_cron(): + age_range = ChickenAgeRange.objects.filter(active=True, trash=False).first() + if age_range: + hatchings = PoultryHatching.objects.filter( + state='pending', + archive=False, + allow_hatching='pending', + trash=False, + unknown=False, + chicken_age__gt=age_range.maximum + ) + poultries = Poultry.objects.filter(id__in=hatchings.values_list('poultry__id', flat=True)).update( + order_limit=True) + hatchings.update(unknown=True) + + +@api_view(["GET"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def management_kill_house_dashboard(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + poultry_hatching = PoultryHatching.objects.filter(Q(date__date__gte=date1, date__date__lte=date2) | + Q(date__date__lte=date1, + archive_date__isnull=True) | Q(date__date__lte=date1, + archive_date__gte=date1, + archive_date__isnull=False), + trash=False).select_related('poultry', 'poultry__user__city') + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False + ).select_related('killhouse_user') + aggregate_kill_house_request = kill_house_request.aggregate( + total_id=Count('id'), + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity_has_quarantine=Sum('accepted_real_quantity', filter=Q(quarantine_quantity__gt=0)), + total_count_has_quarantine=Count('id', filter=Q(quarantine_quantity__gt=0)), + total_quarantine_quantity=Sum('quarantine_quantity', filter=Q(quarantine_quantity__gt=0)), + + total_id_hasnt_code=Count('id', filter=Q(clearance_code__isnull=True)), + total_quantity_hasnt_code=Sum('accepted_real_quantity', filter=Q(clearance_code__isnull=True)), + total_weight_hasnt_code=Sum('accepted_real_weight', filter=Q(clearance_code__isnull=True)), + total_id_hasnt_warehouse=Count('id', filter=Q(ware_house_confirmation=False)), + total_quantity_hasnt_warehouse=Sum('accepted_real_quantity', filter=Q(ware_house_confirmation=False)), + total_weight_hasnt_warehouse=Sum('accepted_real_weight', filter=Q(ware_house_confirmation=False)), + total_id_hasnt_assignment_state_archive=Count('id', filter=Q(assignment_state_archive='pending')), + total_quantity_hasnt_assignment_state_archive=Sum('accepted_real_quantity', + filter=Q(assignment_state_archive='pending')), + total_weight_hasnt_assignment_state_archive=Sum('accepted_real_weight', + filter=Q(assignment_state_archive='pending')), + total_id_hasnt_killing_age=Count('id', filter=Q(province_request__poultry_request__killing_age__gte=60)), + total_quantity_hasnt_killing_age=Sum('accepted_real_quantity', + filter=Q(province_request__poultry_request__killing_age__gte=60)), + total_weight_hasnt_killing_age=Sum('accepted_real_weight', + filter=Q(province_request__poultry_request__killing_age__gte=60)), + + ) + kill_house_req_stats = kill_house_request.values('killhouse_user__name').annotate( + total_quantity=Sum('accepted_real_quantity'), + transaction_count=Count('id') + ).order_by('-total_quantity') + top_kill_house_req = kill_house_req_stats.first() if kill_house_req_stats else None + kill_house_name_req = "-" + total_quantity_top_inner = 0 + if top_kill_house_req: + kill_house_name_req = top_kill_house_req['killhouse_user__name'] + total_quantity_top_inner = top_kill_house_req['total_quantity'] + + poultry_req_stats = kill_house_request.values( + 'province_request__poultry_request__hatching__poultry__unit_name', + 'province_request__poultry_request__hatching__poultry__user__city__name') \ + .annotate(total_quantity=Sum('accepted_real_quantity'), + ).order_by('-total_quantity') + top_poultry_req_stats = poultry_req_stats.first() if poultry_req_stats else None + top_poultry_req_stats_total_quantity = 0 + poultry_req_name_req = "-" + poultry_city_req_name_req = "-" + if top_poultry_req_stats: + poultry_req_name_req = top_poultry_req_stats['province_request__poultry_request__hatching__poultry__unit_name'] + poultry_city_req_name_req = top_poultry_req_stats[ + 'province_request__poultry_request__hatching__poultry__user__city__name'] + top_poultry_req_stats_total_quantity = to_locale_str(top_poultry_req_stats['total_quantity'] or 0) + + aggregate_hatching = poultry_hatching.aggregate( + total_quantity=Sum('quantity'), + total_losses_vet=Sum('losses'), + total_losses_union=Sum('direct_losses'), + total_losses=Sum('total_losses'), + killed_quantity=Sum('killed_quantity'), + total_killed_weight=Sum('total_killed_weight'), + left_over=Sum('left_over'), + total_killing_ave_age=Avg('poultry__killing_ave_age') + ) + top_total_killed_weight = poultry_hatching.values('id').annotate( + total_killed_weight=Sum('total_killed_weight'), + ).order_by('-total_killed_weight') + top_total_killed_weight_first = top_total_killed_weight.first() if top_total_killed_weight else None + + free_bars = KillHouseFreeBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, + trash=False, buy_type='live').select_related('kill_house') + kill_house_stats = free_bars.values('kill_house__name').annotate( + total_quantity=Sum('quantity'), + total_live_weight=Sum('live_weight'), + transaction_count=Count('id') + ).order_by('-total_quantity') + + top_kill_house = kill_house_stats.first() if kill_house_stats else None + kill_house_name = "-" + total_quantity_top_out = 0 + transaction_count = "-" + if top_kill_house: + kill_house_name = top_kill_house['kill_house__name'] + transaction_count = to_locale_str(top_kill_house['transaction_count'] or 0) + total_quantity_top_out = to_locale_str(top_kill_house['total_quantity'] or 0) + # + out_poultry_req_stats = free_bars.values('poultry_name', 'province', 'city').annotate( + total_quantity=Sum('quantity'), + ).order_by('-total_quantity') + top_out_poultry_req_stats = out_poultry_req_stats.first() if out_poultry_req_stats else None + out_top_poultry_req_stats_total_quantity = 0 + out_poultry_req_name_req = "-" + out_poultry_city_req_name_req = "-" + out_poultry_province_req_name_req = "-" + if top_out_poultry_req_stats: + out_poultry_req_name_req = top_out_poultry_req_stats['poultry_name'] + out_poultry_city_req_name_req = top_out_poultry_req_stats['city'] + out_poultry_province_req_name_req = top_out_poultry_req_stats['province'] + out_top_poultry_req_stats_total_quantity = to_locale_str(top_out_poultry_req_stats['total_quantity'] or 0) + + # + aggregate_free_bars = free_bars.aggregate( + id=Count('id'), + quantity=Sum('quantity'), + live_weight=Sum('live_weight'), + ) + + max_kill_day = free_bars.values('date__date').annotate( + daily_quantity=Sum('quantity') + ).order_by('-daily_quantity').first() + persian_date = '-' + daily_quantity = '-' + if max_kill_day: + persian_date = shamsi_date(max_kill_day['date__date']) + daily_quantity = to_locale_str(max_kill_day['daily_quantity']) + + max_kill_day_req = kill_house_request.values('kill_request__recive_date__date').annotate( + daily_quantity=Sum('accepted_real_quantity') + ).order_by('-daily_quantity').first() + persian_date_req = '-' + daily_quantity_req = '-' + if max_kill_day_req: + persian_date_req = shamsi_date(max_kill_day_req['kill_request__recive_date__date']) + daily_quantity_req = to_locale_str(max_kill_day_req['daily_quantity']) + + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).order_by('name') + kill_house_data = [] + duc_kill_house_data = [] + + for kh in kill_houses: + new_steward_allocations = StewardAllocation.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + kill_house=kh + ) + in_province_data = kill_house_request.filter( + killhouse_user=kh + ).aggregate( + load_count=Count('id'), + quantity=Sum('accepted_real_quantity'), + weight=Sum('accepted_real_weight') + ) + + out_province_data = free_bars.filter( + kill_house=kh + ).aggregate( + load_count=Count('id'), + quantity=Sum('quantity'), + live_weight=Sum('live_weight'), + ) + + in_qty = in_province_data.get('quantity', 0) or 0 + in_weight = in_province_data.get('weight', 0) or 0 + out_qty = out_province_data.get('quantity', 0) or 0 + out_weight = out_province_data.get('live_weight', 0) or 0 + total_quantity = in_qty + out_qty + total_weight = in_weight + out_weight + wight_of_steward = new_steward_allocations.filter(to_steward__isnull=False).aggregate( + total_quantity=Sum('real_weight_of_carcasses') + ) + len_of_steward = new_steward_allocations.filter(to_steward__isnull=False).count() + len_of_guild = new_steward_allocations.filter(to_guilds__isnull=False).count() + wight_of_guild = new_steward_allocations.filter(to_guilds__isnull=False).aggregate( + total_quantity=Sum('real_weight_of_carcasses') + ) + + in_loads = in_province_data.get('load_count', 0) or 0 + out_loads = out_province_data.get('load_count', 0) or 0 + total_loads = in_loads + out_loads + + # if in_qty > 0 or out_qty > 0 or in_loads > 0 or out_loads > 0: + kill_house_data.append({ + 'name': kh.name, + 'load_count': to_locale_str(total_loads or 0), + 'in_province_quantity': to_locale_str(in_qty or 0), + 'in_province_wight': to_locale_str(in_weight or 0), + 'out_province_quantity': to_locale_str(out_qty or 0), + 'out_province_weight': to_locale_str(out_weight or 0), + 'total_quantity': to_locale_str(total_quantity or 0), + 'total_weight': to_locale_str(total_weight or 0), + + 'wight_of_steward': to_locale_str(wight_of_steward['total_quantity'] or 0), + 'wight_of_guild': to_locale_str(wight_of_guild['total_quantity'] or 0), + 'len_of_steward': to_locale_str(len_of_steward), + 'len_of_guild': to_locale_str(len_of_guild), + }) + free_bars = KillHouseFreeSaleBarInformation.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + kill_house__in=kill_houses + ).values('kill_house_id', 'kill_house__name').annotate( + total_quantity=Sum('weight_of_carcasses') + ).order_by('-total_quantity') + + bar_assigment_pending_count1 = kill_house_request.filter(assignment_state_archive='True') \ + .exclude(bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + steward_allocations = StewardAllocation.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + kill_house__in=kill_houses + ).values('kill_house_id').annotate( + total_quantity=Sum('real_weight_of_carcasses') + ) + in_province_data = kill_house_request.filter( + killhouse_user__in=kill_houses + ).values('killhouse_user_id').annotate( + total_quantity=Sum('accepted_real_weight') + ) + + in_warehouse_data = kill_house_request.filter( + killhouse_user__in=kill_houses, + ware_house_confirmation=True + ).values('killhouse_user_id').annotate( + total_quantity=Sum('ware_house_accepted_real_weight') + ) + + products = RolesProducts.objects.filter( + trash=False, + kill_house__in=kill_houses + ).values('kill_house_id', 'total_remain_weight') + + steward_dict = {item['kill_house_id']: item['total_quantity'] for item in steward_allocations} + free_bar_dict = {item['kill_house_id']: item['total_quantity'] for item in free_bars} + in_province_dict = {item['killhouse_user_id']: item['total_quantity'] for item in in_province_data} + in_warehouse_dict = {item['killhouse_user_id']: item['total_quantity'] for item in in_warehouse_data} + product_dict = {item['kill_house_id']: item['total_remain_weight'] for item in products} + + management_kill_house_data = [] + for kh in kill_houses: + kh_id = kh.id + + steward_qty = steward_dict.get(kh_id, 0) or 0 + free_bar_qty = free_bar_dict.get(kh_id, 0) or 0 + in_province_qty = in_province_dict.get(kh_id, 0) or 0 + in_warehouse_qty = in_warehouse_dict.get(kh_id, 0) or 0 + product_weight = product_dict.get(kh_id, 0) or 0 + + # if any([in_province_qty, in_warehouse_qty, steward_qty, free_bar_qty]): + total = free_bar_qty + steward_qty + percent = round(total * 100 / in_province_qty, 1) if in_province_qty else 0 + + management_kill_house_data.append({ + 'name': kh.name, + 'in_province_quantity': to_locale_str(in_province_qty), + 'in_ware_house_quantity': to_locale_str(in_warehouse_qty), + 'steward_allocation_quantity': to_locale_str(steward_qty), + 'kill_house_free_bar_quantity': to_locale_str(free_bar_qty), + 'all_quantity': to_locale_str(total), + 'product': to_locale_str(product_weight), + 'percent': percent + }) + n_steward_allocations_n = StewardAllocation.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + kill_house__in=kill_houses + ) + n_steward_allocations = n_steward_allocations_n.aggregate( + total_quantity=Sum('real_weight_of_carcasses') + ) + n_steward_allocations_to_steward = n_steward_allocations_n.filter(to_steward__isnull=False) + aggregate_n_steward_allocations_to_steward = n_steward_allocations_to_steward.aggregate( + total_quantity=Sum('real_weight_of_carcasses') + ) + + n_steward_allocations_to_guild = n_steward_allocations_n.filter(to_guilds__isnull=False) + aggregate_n_steward_allocations_to_guild = n_steward_allocations_to_guild.aggregate( + total_quantity=Sum('real_weight_of_carcasses') + ) + steward_and_guild = { + 'len_of_steward': n_steward_allocations_to_steward.count(), + 'wight_of_steward': aggregate_n_steward_allocations_to_steward['total_quantity'] or 0, + 'len_of_guild': n_steward_allocations_to_guild.count(), + 'wight_of_guild': aggregate_n_steward_allocations_to_guild['total_quantity'] or 0, + 'total_weight': n_steward_allocations['total_quantity'] or 0, + } + n_free_bars = KillHouseFreeSaleBarInformation.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + kill_house__in=kill_houses + ).aggregate( + total_quantity=Sum('weight_of_carcasses') + ) + + n_in_province_data = kill_house_request.filter( + killhouse_user__in=kill_houses + ).aggregate( + total_quantity=Sum('accepted_real_weight') + ) + + n_in_warehouse_data = kill_house_request.filter( + killhouse_user__in=kill_houses, + ware_house_confirmation=True + ).aggregate( + total_quantity=Sum('ware_house_accepted_real_weight') + ) + + n_products = RolesProducts.objects.filter( + trash=False, + kill_house__in=kill_houses + ).aggregate( + total_quantity=Sum('total_remain_weight') + ) + all_management_kill_house_data = { + 'in_province': n_in_province_data['total_quantity'] or 0, + 'in_warehouse': n_in_warehouse_data['total_quantity'] or 0, + 'steward_allocations': n_steward_allocations['total_quantity'] or 0, + 'free_bars': n_free_bars['total_quantity'] or 0, + 'total': (n_free_bars['total_quantity'] or 0) + (n_steward_allocations['total_quantity'] or 0), + 'products': n_products['total_quantity'] or 0, + } + + for kh in kill_houses: + kill_house_request1 = kill_house_request.filter( + killhouse_user=kh + ) + + bar_assigment_true_count = kill_house_request1.filter(assignment_state_archive='True') + bar_assigment_pending_count = kill_house_request1.filter(assignment_state_archive='pending').count() + bar_document_status_accepted = bar_assigment_true_count.filter( + bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + bar_document_status_rejected = bar_assigment_true_count.exclude( + bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + + # if bar_assigment_true_count.count() > 0 or bar_assigment_pending_count > 0: + duc_kill_house_data.append({ + 'name': kh.name, + 'kill_house_request1_count': kill_house_request1.count(), + "bar_assigment_true_count": bar_assigment_true_count.count(), + "bar_assigment_pending_count": bar_assigment_pending_count, + "bar_document_status_accepted": bar_document_status_accepted, + "percent_bar_document_status_accepted": int((bar_document_status_accepted / + bar_assigment_true_count.count()) * 100) if + bar_assigment_true_count.count() > 0 else 0, + "bar_document_status_rejected": bar_document_status_rejected, + "percent_bar_document_status_rejected": int((bar_document_status_rejected / + bar_assigment_true_count.count()) * 100) if + bar_assigment_true_count.count() > 0 else 0, + + }) + + different_bar = (aggregate_kill_house_request['total_quantity_has_quarantine'] or 0) \ + - (aggregate_kill_house_request['total_quarantine_quantity'] or 0) + different_bar_percent = int(different_bar / (aggregate_kill_house_request['total_quarantine_quantity'] or 0) * 100) \ + if (aggregate_kill_house_request['total_quarantine_quantity'] or 0) > 0 else 0 + + result = { + 'all_management_kill_house_data': all_management_kill_house_data, + 'management_kill_house_data': management_kill_house_data, + + "poultry_hatching_total_killed_weight": aggregate_hatching['total_killed_weight'] or 0, + "total_weight_hasnt_warehouse": aggregate_kill_house_request['total_weight_hasnt_warehouse'] or 0, + 'kill_houses_data': kill_house_data, + + # + "kill_house_request_count": to_locale_str(aggregate_kill_house_request['total_id'] or 0), + "kill_house_request_quantity": to_locale_str(aggregate_kill_house_request['total_accepted_real_quantity'] or 0), + "kill_house_request_weight": to_locale_str(aggregate_kill_house_request['total_accepted_real_weight'] or 0), + "kill_house_request_average_weight": round( + aggregate_kill_house_request['total_accepted_real_weight'] / aggregate_kill_house_request[ + 'total_accepted_real_quantity'], 1) + if (aggregate_kill_house_request['total_accepted_real_quantity'] or 0) > 0 else 0, + "free_bars_count": to_locale_str(aggregate_free_bars['id'] or 0), + "free_bars_quantity": to_locale_str(aggregate_free_bars['quantity'] or 0), + "free_bars_live_weight": to_locale_str(aggregate_free_bars['live_weight'] or 0), + "kill_house_name": kill_house_name, + "transaction_count": transaction_count, + "persian_date": persian_date, + "daily_quantity": daily_quantity, + "persian_date_req": persian_date_req, + "daily_quantity_req": daily_quantity_req, + 'kill_house_name_req': kill_house_name_req, + 'poultry_req_name_req': poultry_req_name_req, + 'top_poultry_req_stats_total_quantity': top_poultry_req_stats_total_quantity, + 'poultry_city_req_name_req': poultry_city_req_name_req, + 'out_poultry_req_name_req': out_poultry_req_name_req, + 'out_poultry_city_req_name_req': out_poultry_city_req_name_req, + 'out_poultry_province_req_name_req': out_poultry_province_req_name_req, + 'out_top_poultry_req_stats_total_quantity': out_top_poultry_req_stats_total_quantity, + 'duc_kill_house_data': duc_kill_house_data, + 'avg_losses': to_locale_str(int((aggregate_hatching['total_losses'] or 0) / poultry_hatching.count())), + 'avg_total_killed_weight': round( + (aggregate_hatching['total_killed_weight'] or 0) / (aggregate_hatching['killed_quantity'] or 0), 1), + 'total_killing_ave_age': int(aggregate_hatching['total_killing_ave_age'] or 0), + 'top_total_killed_weight': to_locale_str(top_total_killed_weight_first['total_killed_weight'] or 0), + 'total_quantity_top_inner': to_locale_str(total_quantity_top_inner), + 'total_quantity_top_out': total_quantity_top_out, + 'bar_assigment_pending_count1': to_locale_str(bar_assigment_pending_count1 or 0), + 'base_url': base_url_for_sms_report, + "total_quarantine_quantity": to_locale_str(aggregate_kill_house_request['total_quarantine_quantity'] or 0), + "total_count_has_quarantine": to_locale_str(aggregate_kill_house_request['total_count_has_quarantine'] or 0), + "total_quantity_has_quarantine": to_locale_str( + aggregate_kill_house_request['total_quantity_has_quarantine'] or 0), + "different": to_locale_str(different_bar or 0), + "total_weight_hasnt_code": to_locale_str(aggregate_kill_house_request['total_weight_hasnt_code'] or 0), + "total_quantity_hasnt_code": to_locale_str(aggregate_kill_house_request['total_quantity_hasnt_code'] or 0), + "total_id_hasnt_code": to_locale_str(aggregate_kill_house_request['total_id_hasnt_code'] or 0), + + "total_quantity_hasnt_warehouse": to_locale_str( + aggregate_kill_house_request['total_quantity_hasnt_warehouse'] or 0), + "total_id_hasnt_warehouse": to_locale_str(aggregate_kill_house_request['total_id_hasnt_warehouse'] or 0), + "total_weight_hasnt_assignment_state_archive": to_locale_str( + aggregate_kill_house_request['total_weight_hasnt_assignment_state_archive'] or 0), + "total_quantity_hasnt_assignment_state_archive": to_locale_str( + aggregate_kill_house_request['total_quantity_hasnt_assignment_state_archive'] or 0), + "total_id_hasnt_assignment_state_archive": to_locale_str( + aggregate_kill_house_request['total_id_hasnt_assignment_state_archive'] or 0), + "total_weight_hasnt_killing_age": to_locale_str( + aggregate_kill_house_request['total_weight_hasnt_killing_age'] or 0), + "total_quantity_hasnt_killing_age": to_locale_str( + aggregate_kill_house_request['total_quantity_hasnt_killing_age'] or 0), + "total_id_hasnt_killing_age": to_locale_str(aggregate_kill_house_request['total_id_hasnt_killing_age'] or 0), + 'different_bar_percent': different_bar_percent, + "steward_and_guild": steward_and_guild + + } + return Response(result) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def periodic_performance_report_dashboard(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + poultry_hatching = PoultryHatching.objects.filter(Q(date__date__gte=date1, date__date__lte=date2) | + Q(date__date__lte=date1, + archive_date__isnull=True) | Q(date__date__lte=date1, + archive_date__gte=date1, + archive_date__isnull=False), + trash=False).select_related('poultry', 'poultry__user__city') + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False + ).select_related('killhouse_user') + aggregate_kill_house_request = kill_house_request.aggregate( + total_id=Count('id'), + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity_has_quarantine=Sum('accepted_real_quantity', filter=Q(quarantine_quantity__gt=0)), + total_count_has_quarantine=Count('id', filter=Q(quarantine_quantity__gt=0)), + total_quarantine_quantity=Sum('quarantine_quantity', filter=Q(quarantine_quantity__gt=0)), + + total_id_hasnt_code=Count('id', filter=Q(clearance_code__isnull=True)), + total_quantity_hasnt_code=Sum('accepted_real_quantity', filter=Q(clearance_code__isnull=True)), + total_weight_hasnt_code=Sum('accepted_real_weight', filter=Q(clearance_code__isnull=True)), + total_id_hasnt_warehouse=Count('id', filter=Q(ware_house_confirmation=False)), + total_quantity_hasnt_warehouse=Sum('accepted_real_quantity', filter=Q(ware_house_confirmation=False)), + total_weight_hasnt_warehouse=Sum('accepted_real_weight', filter=Q(ware_house_confirmation=False)), + total_id_hasnt_assignment_state_archive=Count('id', filter=Q(assignment_state_archive='pending')), + total_quantity_hasnt_assignment_state_archive=Sum('accepted_real_quantity', + filter=Q(assignment_state_archive='pending')), + total_weight_hasnt_assignment_state_archive=Sum('accepted_real_weight', + filter=Q(assignment_state_archive='pending')), + total_id_hasnt_killing_age=Count('id', filter=Q(province_request__poultry_request__killing_age__gte=60)), + total_quantity_hasnt_killing_age=Sum('accepted_real_quantity', + filter=Q(province_request__poultry_request__killing_age__gte=60)), + total_weight_hasnt_killing_age=Sum('accepted_real_weight', + filter=Q(province_request__poultry_request__killing_age__gte=60)), + + ) + kill_house_req_stats = kill_house_request.values('killhouse_user__name').annotate( + total_quantity=Sum('accepted_real_quantity'), + transaction_count=Count('id') + ).order_by('-total_quantity') + top_kill_house_req = kill_house_req_stats.first() if kill_house_req_stats else None + kill_house_name_req = "-" + total_quantity_top_inner = 0 + if top_kill_house_req: + kill_house_name_req = top_kill_house_req['killhouse_user__name'] + total_quantity_top_inner = top_kill_house_req['total_quantity'] + + poultry_req_stats = kill_house_request.values( + 'province_request__poultry_request__hatching__poultry__unit_name', + 'province_request__poultry_request__hatching__poultry__user__city__name') \ + .annotate(total_quantity=Sum('accepted_real_quantity'), + ).order_by('-total_quantity') + top_poultry_req_stats = poultry_req_stats.first() if poultry_req_stats else None + top_poultry_req_stats_total_quantity = 0 + poultry_req_name_req = "-" + poultry_city_req_name_req = "-" + if top_poultry_req_stats: + poultry_req_name_req = top_poultry_req_stats['province_request__poultry_request__hatching__poultry__unit_name'] + poultry_city_req_name_req = top_poultry_req_stats[ + 'province_request__poultry_request__hatching__poultry__user__city__name'] + top_poultry_req_stats_total_quantity = to_locale_str(top_poultry_req_stats['total_quantity'] or 0) + + poultry_hatching_gt_60 = poultry_hatching.filter(chicken_age__gt=60) + poultry_hatching_has_killed = PoultryRequest.objects.filter(state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, hatching__in=poultry_hatching) + if poultry_hatching_has_killed: + max_age_poultry = poultry_hatching_has_killed.order_by('-killing_age').first() + min_age_poultry = poultry_hatching_has_killed.order_by('killing_age').first() + max_and_min_dict = {"max_age_poultry": max_age_poultry.killing_age or 0, + "max_age_poultry_name": max_age_poultry.hatching.poultry.unit_name or '-', + "max_age_poultry_city": max_age_poultry.hatching.poultry.user.city.name if max_age_poultry.hatching.poultry.user.city else '-', + "max_age_poultry_quantity": max_age_poultry.hatching.quantity or 0, + "max_age_poultry_killed_quantity": max_age_poultry.hatching.killed_quantity or 0, + "max_age_poultry_left_over": max_age_poultry.hatching.left_over or 0, + "min_age_poultry": min_age_poultry.killing_age or 0, + "min_age_poultry_name": min_age_poultry.hatching.poultry.unit_name or '-', + "min_age_poultry_city": min_age_poultry.hatching.poultry.user.city.name if min_age_poultry.hatching.poultry.user.city else '-', + "min_age_poultry_quantity": min_age_poultry.hatching.quantity or 0, + "min_age_poultry_killed_quantity": min_age_poultry.hatching.killed_quantity or 0, + "min_age_poultry_left_over": min_age_poultry.hatching.left_over or 0} + else: + max_and_min_dict = {"max_age_poultry": 0, + "max_age_poultry_name": '-', + "max_age_poultry_city": '-', + "max_age_poultry_quantity": 0, + "max_age_poultry_killed_quantity": 0, + "max_age_poultry_left_over": 0, + "min_age_poultry": 0, + "min_age_poultry_name": '-', + "min_age_poultry_city": '-', + "min_age_poultry_quantity": 0, + "min_age_poultry_killed_quantity": 0, + "min_age_poultry_left_over": 0} + + aggregate_poultry_hatching_gt_60 = poultry_hatching_gt_60.aggregate( + total_quantity=Sum('quantity'), + left_over=Sum('left_over'), + ) + aggregate_hatching = poultry_hatching.aggregate( + total_quantity=Sum('quantity'), + total_losses_vet=Sum('losses'), + total_losses_union=Sum('direct_losses'), + total_losses=Sum('total_losses'), + killed_quantity=Sum('killed_quantity'), + total_killed_weight=Sum('total_killed_weight'), + left_over=Sum('left_over'), + total_killing_ave_age=Avg('poultry__killing_ave_age') + ) + top_total_killed_weight = poultry_hatching.values('id').annotate( + total_killed_weight=Sum('total_killed_weight'), + ).order_by('-total_killed_weight') + top_total_killed_weight_first = top_total_killed_weight.first() if top_total_killed_weight else None + + free_bars = KillHouseFreeBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, + trash=False, buy_type='live').select_related('kill_house') + kill_house_stats = free_bars.values('kill_house__name').annotate( + total_quantity=Sum('quantity'), + total_live_weight=Sum('live_weight'), + transaction_count=Count('id') + ).order_by('-total_quantity') + + top_kill_house = kill_house_stats.first() if kill_house_stats else None + kill_house_name = "-" + total_quantity_top_out = 0 + transaction_count = "-" + if top_kill_house: + kill_house_name = top_kill_house['kill_house__name'] + transaction_count = to_locale_str(top_kill_house['transaction_count'] or 0) + total_quantity_top_out = to_locale_str(top_kill_house['total_quantity'] or 0) + # + out_poultry_req_stats = free_bars.values('poultry_name', 'province', 'city').annotate( + total_quantity=Sum('quantity'), + ).order_by('-total_quantity') + top_out_poultry_req_stats = out_poultry_req_stats.first() if out_poultry_req_stats else None + out_top_poultry_req_stats_total_quantity = 0 + out_poultry_req_name_req = "-" + out_poultry_city_req_name_req = "-" + out_poultry_province_req_name_req = "-" + if top_out_poultry_req_stats: + out_poultry_req_name_req = top_out_poultry_req_stats['poultry_name'] + out_poultry_city_req_name_req = top_out_poultry_req_stats['city'] + out_poultry_province_req_name_req = top_out_poultry_req_stats['province'] + out_top_poultry_req_stats_total_quantity = to_locale_str(top_out_poultry_req_stats['total_quantity'] or 0) + + # + aggregate_free_bars = free_bars.aggregate( + id=Count('id'), + quantity=Sum('quantity'), + live_weight=Sum('live_weight'), + ) + + max_kill_day = free_bars.values('date__date').annotate( + daily_quantity=Sum('quantity') + ).order_by('-daily_quantity').first() + persian_date = '-' + daily_quantity = '-' + if max_kill_day: + persian_date = shamsi_date(max_kill_day['date__date']) + daily_quantity = to_locale_str(max_kill_day['daily_quantity']) + + max_kill_day_req = kill_house_request.values('kill_request__recive_date__date').annotate( + daily_quantity=Sum('accepted_real_quantity') + ).order_by('-daily_quantity').first() + persian_date_req = '-' + daily_quantity_req = '-' + if max_kill_day_req: + persian_date_req = shamsi_date(max_kill_day_req['kill_request__recive_date__date']) + daily_quantity_req = to_locale_str(max_kill_day_req['daily_quantity']) + + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).order_by('-name') + kill_house_data = [] + duc_kill_house_data = [] + + for kh in kill_houses: + in_province_data = kill_house_request.filter( + killhouse_user=kh + ).aggregate( + load_count=Count('id'), + quantity=Sum('accepted_real_quantity'), + weight=Sum('accepted_real_weight') + ) + + out_province_data = free_bars.filter( + kill_house=kh + ).aggregate( + load_count=Count('id'), + quantity=Sum('quantity'), + live_weight=Sum('live_weight'), + ) + + in_qty = in_province_data.get('quantity', 0) or 0 + in_weight = in_province_data.get('weight', 0) or 0 + out_qty = out_province_data.get('quantity', 0) or 0 + out_weight = out_province_data.get('live_weight', 0) or 0 + total_quantity = in_qty + out_qty + total_weight = in_weight + out_weight + + in_loads = in_province_data.get('load_count', 0) or 0 + out_loads = out_province_data.get('load_count', 0) or 0 + total_loads = in_loads + out_loads + + if in_qty > 0 or out_qty > 0 or in_loads > 0 or out_loads > 0: + kill_house_data.append({ + 'name': kh.name, + 'load_count': to_locale_str(total_loads or 0), + 'load_count_in_province': to_locale_str(in_loads or 0), + 'load_count_out_province': to_locale_str(out_loads or 0), + 'in_province_quantity': to_locale_str(in_qty or 0), + 'in_province_wight': to_locale_str(in_weight or 0), + 'out_province_quantity': to_locale_str(out_qty or 0), + 'out_province_weight': to_locale_str(out_weight or 0), + 'total_quantity': to_locale_str(total_quantity or 0), + 'total_weight': to_locale_str(total_weight or 0), + }) + bar_assigment_pending_count1 = kill_house_request.filter(assignment_state_archive='True') \ + .exclude(bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + tomorrow_of_date1 = date1 + datetime.timedelta(days=1) + tomorrow_of_date2 = date2 + datetime.timedelta(days=1) + steward_allocations = StewardAllocation.objects.filter( + trash=False, + date__date__gte=tomorrow_of_date1, + date__date__lte=tomorrow_of_date2, + kill_house__in=kill_houses + ).values('kill_house_id').annotate( + total_quantity=Sum('real_weight_of_carcasses') + ) + + free_bars = KillHouseFreeSaleBarInformation.objects.filter( + trash=False, + date__date__gte=tomorrow_of_date1, + date__date__lte=tomorrow_of_date2, + kill_house__in=kill_houses + ).values('kill_house_id').annotate( + total_quantity=Sum('weight_of_carcasses') + ) + + in_province_data = kill_house_request.filter( + killhouse_user__in=kill_houses + ).values('killhouse_user_id').annotate( + total_quantity=Sum('accepted_real_weight') + ) + + in_warehouse_data = kill_house_request.filter( + killhouse_user__in=kill_houses, + ware_house_confirmation=True + ).values('killhouse_user_id').annotate( + total_quantity=Sum('ware_house_accepted_real_weight') + ) + + products = RolesProducts.objects.filter( + trash=False, + kill_house__in=kill_houses + ).values('kill_house_id', 'total_remain_weight') + + steward_dict = {item['kill_house_id']: item['total_quantity'] for item in steward_allocations} + free_bar_dict = {item['kill_house_id']: item['total_quantity'] for item in free_bars} + in_province_dict = {item['killhouse_user_id']: item['total_quantity'] for item in in_province_data} + in_warehouse_dict = {item['killhouse_user_id']: item['total_quantity'] for item in in_warehouse_data} + product_dict = {item['kill_house_id']: item['total_remain_weight'] for item in products} + + management_kill_house_data = [] + management_kill_house_dict = { + 'max_percent': '-', + 'max_in_province': '-', + 'min_in_province': '-', + 'max_out_province': '-', + 'min_out_province': '-', + 'max_product': '-', + } + + # نگه داشتن مقادیر بیشترین/کمترین + max_percent_val = -1 + + max_in_province_val = -1 + min_in_province_val = float("inf") + + max_out_province_val = -1 + min_out_province_val = float("inf") + + max_product_val = -1 + + for kh in kill_houses: + kh_id = kh.id + + steward_qty = steward_dict.get(kh_id, 0) or 0 + free_bar_qty = free_bar_dict.get(kh_id, 0) or 0 + in_province_qty = in_province_dict.get(kh_id, 0) or 0 + in_warehouse_qty = in_warehouse_dict.get(kh_id, 0) or 0 + product_weight = product_dict.get(kh_id, 0) or 0 + + if any([in_province_qty, in_warehouse_qty, steward_qty, free_bar_qty]): + total = free_bar_qty + steward_qty + percent = round(total * 100 / in_province_qty, 1) if in_province_qty else 0 + + # ==== بیشترین‌ها ==== + if percent > max_percent_val: + max_percent_val = percent + management_kill_house_dict['max_percent'] = kh.name + + if steward_qty > max_in_province_val: + max_in_province_val = steward_qty + management_kill_house_dict['max_in_province'] = kh.name + + if free_bar_qty > max_out_province_val: + max_out_province_val = free_bar_qty + management_kill_house_dict['max_out_province'] = kh.name + + if product_weight > max_product_val: + max_product_val = product_weight + management_kill_house_dict['max_product'] = kh.name + + # ==== کمترین‌ها ==== + if steward_qty < min_in_province_val: + min_in_province_val = steward_qty + management_kill_house_dict['min_in_province'] = kh.name + + if free_bar_qty < min_out_province_val: + min_out_province_val = free_bar_qty + management_kill_house_dict['min_out_province'] = kh.name + + management_kill_house_data.append({ + 'name': kh.name, + 'in_province_quantity': to_locale_str(in_province_qty), + 'in_ware_house_quantity': to_locale_str(in_warehouse_qty), + 'steward_allocation_quantity': to_locale_str(steward_qty), + 'kill_house_free_bar_quantity': to_locale_str(free_bar_qty), + 'all_quantity': to_locale_str(total), + 'product': to_locale_str(product_weight), + 'percent': percent + }) + max_and_min_assigment = { + "max_duc_name": '-', + "max_duc_accepted_name": '-', + "max_duc_rejected_name": '-', + "min_duc_name": '-', + "min_duc_accepted_name": '-', + "min_duc_rejected_name": '-', + } + + # نگه داشتن مقادیر بیشترین/کمترین + max_request_count = -1 + min_request_count = float("inf") + + max_true_count = -1 + min_true_count = float("inf") + + max_rejected_count = -1 + min_rejected_count = float("inf") + + for kh in kill_houses: + kill_house_request1 = kill_house_request.filter( + killhouse_user=kh + ) + + bar_assigment_true_count = kill_house_request1.filter(assignment_state_archive='True') + bar_assigment_pending_count = kill_house_request1.filter(assignment_state_archive='pending').count() + bar_document_status_accepted = bar_assigment_true_count.filter( + bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد') + ).count() + bar_document_status_rejected = bar_assigment_true_count.exclude( + bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد') + ).count() + + if bar_assigment_true_count.count() > 0 or bar_assigment_pending_count > 0: + req_count = kill_house_request1.count() + true_count = bar_assigment_true_count.count() + rejected_count = bar_document_status_rejected + + # === بیشترین‌ها === + if req_count > max_request_count: + max_request_count = req_count + max_and_min_assigment["max_duc_name"] = kh.name + + if true_count > max_true_count: + max_true_count = true_count + max_and_min_assigment["max_duc_accepted_name"] = kh.name + + if rejected_count > max_rejected_count: + max_rejected_count = rejected_count + max_and_min_assigment["max_duc_rejected_name"] = kh.name + + # === کمترین‌ها === + if req_count < min_request_count: + min_request_count = req_count + max_and_min_assigment["min_duc_name"] = kh.name + + if true_count < min_true_count: + min_true_count = true_count + max_and_min_assigment["min_duc_accepted_name"] = kh.name + + if rejected_count < min_rejected_count: + min_rejected_count = rejected_count + max_and_min_assigment["min_duc_rejected_name"] = kh.name + + duc_kill_house_data.append({ + 'name': kh.name, + 'kill_house_request1_count': req_count, + "bar_assigment_true_count": true_count, + "bar_assigment_pending_count": bar_assigment_pending_count, + "bar_document_status_accepted": bar_document_status_accepted, + "percent_bar_document_status_accepted": int( + (bar_document_status_accepted / true_count) * 100) if true_count > 0 else 0, + "bar_document_status_rejected": rejected_count, + "percent_bar_document_status_rejected": int( + (rejected_count / true_count) * 100) if true_count > 0 else 0, + }) + + different_bar = (aggregate_kill_house_request['total_quantity_has_quarantine'] or 0) \ + - (aggregate_kill_house_request['total_quarantine_quantity'] or 0) + different_bar_percent = int(different_bar / (aggregate_kill_house_request['total_quarantine_quantity'] or 0) * 100) \ + if (aggregate_kill_house_request['total_quarantine_quantity'] or 0) > 0 else 0 + + result = { # noqa + + "poultry_count": len(poultry_hatching.values_list('poultry', flat=True).distinct()), + "chain_count": len( + poultry_hatching.filter(Q(UnionTypeName='زنجیره') | + Q(chain_company__isnull=False)).values_list('poultry', flat=True).distinct()), + "poultry_hatching_quantity": aggregate_hatching['total_quantity'] or 0, + "poultry_hatching_losses_vet": aggregate_hatching['total_losses_vet'] or 0, + "poultry_hatching_losses_union": aggregate_hatching['total_losses_union'] or 0, + "poultry_hatching_total_losses": aggregate_hatching['total_losses'] or 0, + "poultry_hatching_killed_quantity": aggregate_hatching['killed_quantity'] or 0, + "poultry_hatching_total_killed_weight": int(aggregate_hatching['total_killed_weight'] or 0), + "poultry_hatching_left_over": aggregate_hatching['left_over'] or 0, + "poultry_hatching_gt_60": len(poultry_hatching_gt_60.values_list('poultry', flat=True).distinct()), + "poultry_hatching_gt_60_quantity": aggregate_poultry_hatching_gt_60['total_quantity'] or 0, + "poultry_hatching_gt_60_left_over": aggregate_poultry_hatching_gt_60['left_over'] or 0, + **max_and_min_dict, + "kill_house_request_count": aggregate_kill_house_request['total_id'] or 0, + "kill_house_request_quantity": aggregate_kill_house_request['total_accepted_real_quantity'] or 0, + "kill_house_request_weight": int(aggregate_kill_house_request['total_accepted_real_weight'] or 0), + "kill_house_request_average_weight": round( + aggregate_kill_house_request['total_accepted_real_weight'] / aggregate_kill_house_request[ + 'total_accepted_real_quantity'], 1) + if (aggregate_kill_house_request['total_accepted_real_quantity'] or 0) > 0 else 0, + "free_bars_count": aggregate_free_bars['id'] or 0, + "free_bars_quantity": aggregate_free_bars['quantity'] or 0, + "free_bars_live_weight": aggregate_free_bars['live_weight'] or 0, + "kill_house_name": kill_house_name, + "transaction_count": transaction_count, + "persian_date": persian_date, + "daily_quantity": daily_quantity, + "persian_date_req": persian_date_req, + "daily_quantity_req": daily_quantity_req, + 'kill_houses_data': kill_house_data, + 'kill_house_name_req': kill_house_name_req, + 'poultry_req_name_req': poultry_req_name_req, + 'top_poultry_req_stats_total_quantity': top_poultry_req_stats_total_quantity, + 'poultry_city_req_name_req': poultry_city_req_name_req, + 'out_poultry_req_name_req': out_poultry_req_name_req, + 'out_poultry_city_req_name_req': out_poultry_city_req_name_req, + 'out_poultry_province_req_name_req': out_poultry_province_req_name_req, + 'out_top_poultry_req_stats_total_quantity': out_top_poultry_req_stats_total_quantity, + 'management_kill_house_data': management_kill_house_data, + 'duc_kill_house_data': duc_kill_house_data, + 'avg_losses': int((aggregate_hatching['total_losses'] or 0) / poultry_hatching.count()), + 'avg_total_killed_weight': round( + (aggregate_hatching['total_killed_weight'] or 0) / (aggregate_hatching['killed_quantity'] or 0), 1), + 'total_killing_ave_age': int(aggregate_hatching['total_killing_ave_age'] or 0), + 'top_total_killed_weight': top_total_killed_weight_first['total_killed_weight'] or 0, + 'total_quantity_top_inner': total_quantity_top_inner, + 'total_quantity_top_out': total_quantity_top_out, + 'bar_assigment_pending_count1': bar_assigment_pending_count1 or 0, + 'base_url': base_url_for_sms_report, + "total_quarantine_quantity": aggregate_kill_house_request['total_quarantine_quantity'] or 0, + "total_count_has_quarantine": aggregate_kill_house_request['total_count_has_quarantine'] or 0, + "total_quantity_has_quarantine": + aggregate_kill_house_request['total_quantity_has_quarantine'] or 0, + "different": different_bar or 0, + "total_weight_hasnt_code": aggregate_kill_house_request['total_weight_hasnt_code'] or 0, + "total_quantity_hasnt_code": aggregate_kill_house_request['total_quantity_hasnt_code'] or 0, + "total_id_hasnt_code": aggregate_kill_house_request['total_id_hasnt_code'] or 0, + "total_weight_hasnt_warehouse": + aggregate_kill_house_request['total_weight_hasnt_warehouse'] or 0, + "total_quantity_hasnt_warehouse": + aggregate_kill_house_request['total_quantity_hasnt_warehouse'] or 0, + "total_id_hasnt_warehouse": aggregate_kill_house_request['total_id_hasnt_warehouse'] or 0, + "total_weight_hasnt_assignment_state_archive": + aggregate_kill_house_request['total_weight_hasnt_assignment_state_archive'] or 0, + "total_quantity_hasnt_assignment_state_archive": + aggregate_kill_house_request['total_quantity_hasnt_assignment_state_archive'] or 0, + "total_id_hasnt_assignment_state_archive": + aggregate_kill_house_request['total_id_hasnt_assignment_state_archive'] or 0, + "total_weight_hasnt_killing_age": + aggregate_kill_house_request['total_weight_hasnt_killing_age'] or 0, + "total_quantity_hasnt_killing_age": + aggregate_kill_house_request['total_quantity_hasnt_killing_age'] or 0, + "total_id_hasnt_killing_age": aggregate_kill_house_request['total_id_hasnt_killing_age'] or 0, + 'different_bar_percent': different_bar_percent, + 'max_and_min_assigment': max_and_min_assigment, + 'management_kill_house_dict': management_kill_house_dict, + + } + return Response(result) + + +def create_update_chicken_commission_prices_cron(): + now = datetime.datetime.now().date() + for day in range(7): + past_date = now - timedelta(days=day) + past_datetime = datetime.datetime.combine(past_date, datetime.time.min) + + chicken_commission = ChickenCommissionPrices.objects.get_or_create(date__date=past_date, + defaults={'date': past_datetime, + 'kill_house_price': kill_house_price})[ + 0] + # # poultry_request + poultry_request = PoultryRequest.objects.filter(trash=False, send_date__date=past_date, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=False, + amount__gt=0).only( + 'amount') + print(len(poultry_request)) + poultry_request_amount = poultry_request.aggregate(total=Sum('amount'))[ + 'total'] or 0 + # ProvinceKillRequest + province_kill_req = ProvinceKillRequest.objects.filter(trash=False, kill_request__recive_date__date=past_date, + state__in=('pending', 'accepted'), + kill_house_price__gt=0).only( + 'kill_house_price') + + province_kill_req_kill_house_price = province_kill_req.aggregate(total=Sum('kill_house_price'))[ + 'total'] or 0 + + # KillRequest + kill_req = KillRequest.objects.filter(trash=False, recive_date__date=past_date, + province_state__in=('accepted', 'pending') + , poultry__isnull=False, + direct_buying_state__in=('accepted', 'pending'), amount__gt=0).only( + 'amount') + kill_req_amount = kill_req.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + kill_request_amount = round( + kill_req_amount / kill_req.count()) if kill_req.count() > 0 else 0 + + province_kill_request_amount = round(province_kill_req_kill_house_price / province_kill_req.count()) \ + if province_kill_req.count() > 0 else 0 + + poultry_req_amount = round(poultry_request_amount / poultry_request.count()) if poultry_request.count() > 0 \ + else 0 + + amount = round( + kill_req_amount + province_kill_req_kill_house_price + poultry_request_amount) + + counts = poultry_request.count() + province_kill_req.count() + kill_req.count() + + chicken_commission.chicken_average_price = round(amount / counts) if counts > 0 else 0 + chicken_commission.kill_request_amount = kill_request_amount + chicken_commission.province_kill_request_amount = province_kill_request_amount + chicken_commission.poultry_request_amount = poultry_req_amount + + chicken_commission.save() + + +def fix_amount(request): + my_tuple = ( + 31160, 31310, 31311, 31508, 31509, 31558, 31559, 31642, 31643, 31755, 31756, 31817, 31818, 31850, 31852, 31912, + 31913, 32019, 32020) + + steward_allocations = StewardAllocation.objects.filter(id__in=my_tuple) + for steward_allocation in steward_allocations: + amount = steward_allocation.amount - 20000 + total_amount = amount * steward_allocation.real_weight_of_carcasses + steward_allocation.amount = amount + steward_allocation.total_amount = total_amount + steward_allocation.total_amount_remain = total_amount + steward_allocation.save() + return HttpResponse('ok') + + +def fix_killing_age(request): + poultry_request = PoultryRequest.objects.filter(trash=False, killing_age=1).only('killing_age') + for p in poultry_request: + p.killing_age = (p.send_date.date() - p.hatching.date.date()).days + 1 + p.save() + return HttpResponse('ok') + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_bar_from_rsi_with_hatching(request): + page = '' + search_filter = '' + search = request.GET.get('search') + value = request.GET.get('value') + if search: + if search != 'undefined' and value.strip(): + search_filter = f'&search={search}&value={value}' + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else None + poultry_hatching = PoultryHatching.objects.filter( + key=request.GET['key'] + ).first() + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + temporary_trash=False, + temporary_deleted=False, + clearance_code__isnull=False, province_request__poultry_request__hatching=poultry_hatching + ).values_list('clearance_code', flat=True).distinct() + + kill_house_free_sale = PoultryRequest.objects.filter(trash=False, quarantine_code__isnull=False, out=True, + hatching=poultry_hatching) \ + .values_list('quarantine_code', flat=True).distinct() + + result = list(kill_house_request) + list(kill_house_free_sale) + if 'page' in request.GET: + page = f'&page={request.GET["page"]}&page_size={request.GET["page_size"]}' + + response = requests.get( + f'https://rsibackend.rasadyar.com/app/api_send_different_bar-from-hatching/?{page}' + f'{search_filter}' + f'&date1={date1}&date2={date2}&licence_number={poultry_hatching.licence_number}', + json=result, + headers={'Content-Type': 'application/json'} + ) + + return Response(response.json(), status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def driver_from_rsi_excel(request): + response = requests.get( + f'https://rsibackend.rasadyar.com/app/driver/?all' + ) + kill_house = KillHouse.objects.filter(trash=False, out_province=False).values_list('unique_identifier', flat=True) + + excel_options = [ + 'ردیف', + 'نام راننده', + 'نام مالک', + 'شهر', + 'رهگیری خودرو', + 'نوع ماشین', + 'پلاک', + 'محصول', + 'کد کشتارگاه', + 'نام کشتارگاه', + 'شماره موبایل راننده', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + m = 1 + create_header_freez(worksheet, excel_options, 1, 1, 2, 20, width=30) + + l = 2 + for data in response.json(): + if data['part_id_code'] in kill_house: + list1 = [ + m, + data['driver_name'], + data['owner_name'], + data['city'], + data['tracking_code'], + data['car_type'], + data['pelak'], + data['product'], + data['part_id_code'], + data['kill_house_name'], + + ] + create_value(worksheet, list1, l, 1, m=m, border_style='thin') + m += 1 + l += 1 + 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 + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def send_again_sms_for_register_code_guild(request): + guild = Guilds.objects.get(trash=False, key=request.data['key']) + if guild.is_registered == False and not guild.register_date_register_code: + number = random.randint(10000, 99000) + guild.register_code = number + guild.active_register_code = True + guild.register_date_register_code = datetime.datetime.now() + guild.save() + send_sms_for_guild_for_register(guild) + + elif datetime.datetime.now() > (guild.register_date_register_code + timedelta(minutes=10)): + number = random.randint(10000, 99000) + guild.register_code = number + guild.register_date_register_code = datetime.datetime.now() + guild.save() + send_sms_for_guild(guild) + else: + return Response({'result': 'شما تا 10 دقیقه دیگر مجاز به ارسال کد نمیباشد!'}, status=status.HTTP_403_FORBIDDEN) + return Response({'result': 'باموفقیت ارسال شد.'}) + + +def delete_free_bar_info(request): + kill_house_free_bar = KillHouseFreeBarInformation.objects.filter(trash=False, ware_house=False) + bar_clearance_code = kill_house_free_bar.values_list('bar_clearance_code', flat=True) + + bars = requests.post('https://rsibackend.rasadyar.com/app/delete_free_bar_from_rasadyaar/', data=bar_clearance_code) + if bars.json(): + for bar in bars.json(): + delete_kill_req = kill_house_free_bar.filter(bar_clearance_code=bar['TrackingCode']).first() + delete_kill_req.trash = True + delete_kill_req.save() + product = delete_kill_req.product + kill_house_free_buying_product_warehousing(product) + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def send_again_sms_steward_allocation(request): + steward_allocation = StewardAllocation.objects.get(key=request.data['key'], trash=False) + if steward_allocation.to_guilds: + mobile = steward_allocation.to_guilds.user.mobile + buyer = steward_allocation.to_guilds.guilds_name + else: + mobile = steward_allocation.to_steward.user.mobile + buyer = steward_allocation.to_steward.guilds_name + + if steward_allocation.kill_house: + seller = steward_allocation.kill_house.name + else: + seller = steward_allocation.guilds.guilds_name + date = shamsi_date(steward_allocation.date) + weight = steward_allocation.weight_of_carcasses + amount = steward_allocation.amount + number = str(steward_allocation.registration_code) + + if (steward_allocation.expire_time_ten_minute and datetime.datetime.now() > ( + steward_allocation.expire_time_ten_minute + timedelta(minutes=10))) or \ + not steward_allocation.expire_time_ten_minute: + steward_allocation.expire_time_ten_minute = datetime.datetime.now() + steward_allocation.save() + steward_allocation_sms(mobile, date, weight, seller, number, buyer, amount) + + else: + return Response({'result': 'شما تا 10 دقیقه دیگر مجاز به ارسال کد نمیباشد!'}, status=status.HTTP_403_FORBIDDEN) + return Response({'result': 'باموفقیت ارسال شد.'}) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def pos_send_again_sms_steward_allocation(request): + steward_allocation = StewardAllocation.objects.get(key=request.data['key'], trash=False) + if steward_allocation.to_guilds: + mobile = steward_allocation.to_guilds.user.mobile + buyer = steward_allocation.to_guilds.guilds_name + else: + mobile = steward_allocation.to_steward.user.mobile + buyer = steward_allocation.to_steward.guilds_name + + if steward_allocation.kill_house: + seller = steward_allocation.kill_house.name + else: + seller = steward_allocation.guilds.guilds_name + date = shamsi_date(steward_allocation.date) + weight = steward_allocation.weight_of_carcasses + amount = steward_allocation.amount + number = str(steward_allocation.registration_code) + + if (steward_allocation.expire_time_ten_minute and datetime.datetime.now() > ( + steward_allocation.expire_time_ten_minute + timedelta(minutes=10))) or \ + not steward_allocation.expire_time_ten_minute: + steward_allocation.expire_time_ten_minute = datetime.datetime.now() + steward_allocation.save() + steward_allocation_sms(mobile, date, weight, seller, number, buyer, amount) + + else: + return Response({'result': 'شما تا 10 دقیقه دیگر مجاز به ارسال کد نمیباشد!'}, status=status.HTTP_403_FORBIDDEN) + return Response({'result': 'باموفقیت ارسال شد.'}) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def fix_number_from_rsi(request): + poultry = Poultry.objects.filter(trash=False).select_related('user').only('user__mobile', 'breeding_unique_id') + + result = { + str(p.breeding_unique_id): p.user.mobile + for p in poultry + if p.user and p.user.mobile + } + + response = requests.post( + f'https://rsibackend.rasadyar.com/app/fix_number/', + json=result, + headers={'Content-Type': 'application/json'} + ) + for r in response.json(): + for k, v in r.items(): + poultry = Poultry.objects.filter(breeding_unique_id=k).first() + if poultry: + if v is not None: + data = { + "first_mobile_number": poultry.user.mobile, + "second_mobile_number": v, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = v + user = User.objects.get(username=poultry.user.mobile) + user.username = second_mobile_number + user.save() + user_profile = SystemUserProfile.objects.filter(user=user).first() + user_profile.mobile = second_mobile_number + user_profile.save() + + return Response(response.json()) + + +def send_credit_sahandsms_sms(): + filters = {} + if base_url_for_sms_report == 'ha': + filters['username'] = 'hamedan' + elif base_url_for_sms_report == 'ku': + filters['username'] = 'kurdistan' + elif base_url_for_sms_report == 'ma': + filters['username__in'] = ['markazi', 'senfmarkazi'] + managements = ManagementSendSms.objects.filter(**filters) \ + .values('username') \ + .annotate(min_id=Min('id')) \ + .values_list('min_id', flat=True) + + managements = ManagementSendSms.objects.filter(id__in=managements) + + for management in managements: + r = requests.get( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/GetUserCredit?username={management.username}" + f"&password={management.password}") + + url = f'https://eitaayar.ir/api/{token}/sendMessage' + date = datetime.datetime.now().date() + if base_url_for_sms_report == 'ma': + province = 'مرکزی' + elif base_url_for_sms_report == 'ha': + province = 'همدان' + elif base_url_for_sms_report == 'ku': + province = 'کردستان' + elif base_url_for_sms_report == 'bu': + province = 'بوشهر' + else: + province = 'تست' + date_shamsi = shamsi_date(date).replace('-', '_') + base_message = '🗓📢❗ سامانه رصدیار، زنجیره تامین،تولید و توزیع مرغ گوشتی📢❗\n' + base_message += f' #گزارش_مانده_حساب_پنل_پیامکی #{date_shamsi}\n' + base_message += f' #استان_{province}\n\n' + base_message += f'➖➖➖➖➖➖➖➖➖➖\n' + + messages = [] + current_message = base_message + + root = ET.fromstring(r.content) + credit_amount = int(root.text) + amount = "{:,}".format(credit_amount) + + new_message_part = "🔸 نام کاربری پنل : {0} \n".format(management.username) + new_message_part += "🔸 مانده حساب پنل : {0} ریال \n".format(amount) + # new_message_part = "🔸 نام کاربری پنل {0}: {1} ریال \n".format(management.username, amount) + if credit_amount < 1000000: + new_message_part += "‼توجه: لطفا برای شارژ پنل پیامکی خود اقدام فرمایید‼" + + new_message_part += '\n➖➖➖➖➖➖➖➖➖➖\n' + + if len(current_message) + len(new_message_part) > 4000: + messages.append(current_message) + current_message = base_message + + current_message += new_message_part + + if current_message and current_message != base_message: + messages.append(current_message) + + for message in messages: + data = { + 'chat_id': chat_id_mali, + 'text': message, + } + response = requests.post(url, data=data, verify=False) + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def send_again_sms_steward_free_sale_bar(request): + steward_allocation = StewardFreeSaleBarInformation.objects.get(key=request.data['key'], trash=False) + + if (steward_allocation.expire_time_ten_minute and datetime.datetime.now() > + (steward_allocation.expire_time_ten_minute + timedelta(minutes=10))) or \ + not steward_allocation.expire_time_ten_minute: + steward_allocation.expire_time_ten_minute = datetime.datetime.now() + steward_allocation.save() + send_sms_for_sale_bar_for_steward(steward_allocation) + + else: + return Response({'result': 'شما تا 10 دقیقه دیگر مجاز به ارسال کد نمیباشد!'}, status=status.HTTP_403_FORBIDDEN) + return Response({'result': 'باموفقیت ارسال شد.'}) + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def send_again_sms_kill_house_free_sale_bar(request): + steward_allocation = KillHouseFreeSaleBarInformation.objects.get(key=request.data['key'], trash=False) + + if (steward_allocation.expire_time_ten_minute and datetime.datetime.now() > + (steward_allocation.expire_time_ten_minute + timedelta(minutes=10))) or \ + not steward_allocation.expire_time_ten_minute: + steward_allocation.expire_time_ten_minute = datetime.datetime.now() + steward_allocation.save() + send_sms_for_sale_bar(steward_allocation) + + else: + return Response({'result': 'شما تا 10 دقیقه دیگر مجاز به ارسال کد نمیباشد!'}, status=status.HTTP_403_FORBIDDEN) + return Response({'result': 'باموفقیت ارسال شد.'}) + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def send_again_sms_direct_buying_code(request): + kill_request = KillRequest.objects.get(key=request.data['key'], trash=False) + + if (kill_request.expire_time_ten_minute and datetime.datetime.now() > + (kill_request.expire_time_ten_minute + timedelta(minutes=10))) or \ + not kill_request.expire_time_ten_minute: + kill_request.expire_time_ten_minute = datetime.datetime.now() + kill_request.save() + + # Get required data for SMS + from authentication.sms_management import confirm_price_poultry_request_direct_buying_sms + from panel.helper_excel import shamsi_date + + mobile = kill_request.poultry.user.mobile + poultry_fullname = kill_request.poultry.user.fullname + quantity = "{:,}".format(int(kill_request.kill_capacity)) + chicken_breed = kill_request.chicken_breed + send_date = shamsi_date(kill_request.recive_date.date()) + free_sale_in_province = kill_request.poultry_request.free_sale_in_province if kill_request.poultry_request else False + amount = kill_request.amount + request_kill_house = kill_request.kill_house.name + confirm_code = kill_request.direct_buying_code + + confirm_price_poultry_request_direct_buying_sms( + mobile, + poultry_fullname, + quantity, + chicken_breed, + send_date, + free_sale_in_province, + amount, + request_kill_house, + confirm_code + ) + + else: + return Response({'result': 'شما تا 10 دقیقه دیگر مجاز به ارسال کد نمیباشد!'}, status=status.HTTP_403_FORBIDDEN) + return Response({'result': 'باموفقیت ارسال شد.'}) + + +def delete_sale_bar(): + steward_sale_bar = StewardFreeSaleBarInformation.objects.filter(trash=False, logged_registration_code__isnull=True, + system_registration_code=True, + active_expire_date_time=True, + registration_code__isnull=False) + + for free_sale_bar in steward_sale_bar: + free_sale_bar.trash = True + free_sale_bar.save() + guild_steward_free_sale_product_warehousing(free_sale_bar.product) + + kill_house_sale_bar = KillHouseFreeSaleBarInformation.objects.filter(trash=False, + logged_registration_code__isnull=True, + system_registration_code=True, + active_expire_date_time=True, + registration_code__isnull=False) + + for free_sale_bar_kill_house in kill_house_sale_bar: + product = free_sale_bar_kill_house.product + free_sale_bar_kill_house.trash = True + free_sale_bar_kill_house.save() + kill_house_free_sale_product_warehousing(product) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def delete_guilds_without_allocation(request): + # 1. اول همه صنف‌ها رو می‌گیریم + guilds = Guilds.objects.filter(trash=False, active=True).order_by('id') + + # 2. صنف‌هایی که توزیع دارند رو پیدا می‌کنیم + guilds_with_allocation = StewardAllocation.objects.filter( + trash=False + ).values_list('to_steward_id', 'to_guilds_id') + + allocated_guild_ids = set() + for to_steward_id, to_guilds_id in guilds_with_allocation: + if to_steward_id: + allocated_guild_ids.add(to_steward_id) + if to_guilds_id: + allocated_guild_ids.add(to_guilds_id) + + # 3. از صنف‌ها، فقط اونایی که توزیع ندارند رو می‌گیریم + guilds_without_allocation = guilds.exclude(id__in=allocated_guild_ids) + + # 4. از صنف‌های بدون توزیع، اونایی که اصلاً دستگاه پز ندارند رو پیدا می‌کنیم + guilds_without_pos = guilds_without_allocation.annotate( + has_pos_machine=Count('guild_pos', filter=Q(guild_pos__trash=False)) + ).filter(has_pos_machine=0) + + deleted_count = 0 + + # 5. صنف‌هایی که هم توزیع ندارند و هم دستگاه پز ندارند رو حذف می‌کنیم + for guild in guilds_without_pos: + guild.trash = True + guild.save() + deleted_count += 1 + + return Response({ + 'result': 'باموفقیت انجام شد.', + 'deleted_count': deleted_count, + }, status=status.HTTP_200_OK) + + +def get_evacuation_detail_by_request_code(rcode): + if not rcode: + raise ValueError("پارامتر code الزامی است.") + + payload = {"RequestCode": rcode} + try: + external_response = requests.post( + "https://rsibackend.rasadyar.com/app/get-evacuation-detail-by-request-code/", + json=payload, + timeout=15, + ) + external_response.raise_for_status() + except requests.RequestException as exc: + raise RuntimeError("عدم امکان اتصال به سرویس تخلیه.") from exc + + try: + return external_response.json() + except ValueError as exc: + raise ValueError( + f"پاسخ نامعتبر از سرویس تخلیه: {external_response.text}" + ) from exc + + +def save_mobile_numbers(request): + mobile_numbers = [ + '09188176737', + '09011110919', + '09181112717', + '09185914818', + '09187040838', + '09393946626', + '09127687317', + '09033073493', + ] + + for number in mobile_numbers: + SmsRecipient.objects.get_or_create( + phone_number=number, + defaults={'is_active': True} + ) + return HttpResponse('ok') + + +def _process_auto_warehouse_steward_allocations(): + now = datetime.datetime.now() + threshold = now - timedelta(hours=8) + + total_updated = 0 + + guilds = Guilds.objects.filter(trash=False, active=True).order_by('id') + for guild in guilds: + allocations = StewardAllocation.objects.filter( + trash=False, + receiver_state__in=['accepted', 'pending'], + create_date__lte=threshold + ).filter( + Q(to_steward=guild) | Q(to_guilds=guild), + Q(warehouse=False) | Q(steward_warehouse=False) + ) + + for allocation in allocations: + if allocation.warehouse is False: + allocation.warehouse = True + allocation.steward_warehouse = True + allocation.save() + + seller_product = allocation.product + + buyer_product = None + try: + if allocation.to_steward: + buyer_product = RolesProducts.objects.get( + guild=allocation.to_steward, + parent_product=seller_product.parent_product + ) + elif allocation.to_guilds: + buyer_product = RolesProducts.objects.get( + guild=allocation.to_guilds, + parent_product=seller_product.parent_product + ) + except RolesProducts.DoesNotExist: + buyer_product = None + + if allocation.seller_type == 'KillHouse': + if seller_product: + kill_house_allocations_product_warehousing(seller_product) + if buyer_product: + guild_steward_allocations_product_warehousing(buyer_product) + else: + if seller_product: + guild_steward_allocations_product_warehousing(seller_product) + if buyer_product: + guild_steward_allocations_product_warehousing(buyer_product) + + total_updated += 1 + + return total_updated + + +@api_view(['POST', 'GET']) +@permission_classes([AllowAny]) +def auto_warehouse_steward_allocations(request): + updated = _process_auto_warehouse_steward_allocations() + return Response({ + 'result': 'done', + 'updated_allocations': updated + }, status=status.HTTP_200_OK) + + +def auto_warehouse_steward_allocations_cron(): + try: + _process_auto_warehouse_steward_allocations() + return HttpResponse('ok') + except Exception as e: + return HttpResponse(f'error: {e}', status=500) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def import_poultry_science_from_excel(request): + file_obj = request.FILES.get('file') + if not file_obj: + return Response({"result": "فایل ارسال نشده است."}, status=status.HTTP_400_BAD_REQUEST) + + try: + workbook = openpyxl.load_workbook(BytesIO(file_obj.read()), data_only=True) + except Exception: + return Response({"result": "امکان خواندن فایل وجود ندارد."}, status=status.HTTP_400_BAD_REQUEST) + + sheet = workbook.active + rows = list(sheet.iter_rows(values_only=True)) + if not rows: + return Response({"result": "فایل خالی است."}, status=status.HTTP_400_BAD_REQUEST) + + expected_headers = ["ردیف", "نام", "نام خانوادگی", "شهرستان کاربر", "کد ملی", "کد نظام مهندسی", "شماره همراه"] + header_row = [ + str(value).strip() if value is not None else "" + for value in rows[0][:len(expected_headers)] + ] + if header_row != expected_headers: + return Response( + { + "result": "هدر فایل با قالب مورد انتظار همخوانی ندارد.", + "expected_headers": expected_headers, + "received_headers": header_row + }, + status=status.HTTP_400_BAD_REQUEST + ) + + group = Group.objects.filter(name__exact="PoultryScience").first() + if not group: + return Response({"result": "نقش PoultryScience تعریف نشده است."}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + latest_base_order = SystemUserProfile.objects.filter(trash=False).order_by('-base_order') \ + .values_list('base_order', flat=True).first() + next_base_order = (latest_base_order + 1) if latest_base_order else 1000 + + stats = { + "processed_rows": 0, + "created_profiles": 0, + "updated_profiles": 0, + "created_poultry_science": 0, + "skipped_rows": 0 + } + errors = [] + + def clean_text(value): + if value is None: + return None + text = str(value).strip() + return text or None + + def clean_digits(value): + if value is None: + return None + digits = re.sub(r'\D', '', str(value)) + return digits or None + + def normalize_mobile(value): + digits = clean_digits(value) + if not digits: + return None + if digits.startswith('98') and len(digits) == 12: + digits = digits[2:] + if len(digits) == 10: + digits = f'0{digits}' + if len(digits) == 11 and not digits.startswith('0'): + digits = f'0{digits[1:]}' + return digits if check_mobile_number(digits) else None + + def find_city(name): + if not name: + return None + return City.objects.filter( + trash=False + ).filter( + Q(name__iexact=name) | Q(city_name__iexact=name) + ).select_related('province').first() + + for row_index, row in enumerate(rows[1:], start=2): + if not row or not any(row): + continue + + stats["processed_rows"] += 1 + first_name = clean_text(row[1]) + last_name = clean_text(row[2]) + city_name = clean_text(row[3]) + national_code = clean_digits(row[4]) + engineering_code = clean_digits(row[5]) + mobile = normalize_mobile(row[6]) + + if not mobile: + stats["skipped_rows"] += 1 + errors.append({"row": row_index, "reason": "شماره همراه نامعتبر است."}) + continue + + city = find_city(city_name) + if not city: + stats["skipped_rows"] += 1 + errors.append({"row": row_index, "reason": "شهرستان یافت نشد.", "city": city_name}) + continue + + system_profile = SystemUserProfile.objects.filter(trash=False, mobile=mobile).last() + + if not system_profile: + password = '2025' + register_payload = { + "username": mobile, + "first_name": first_name or "", + "last_name": last_name or "", + "password": password, + "national_code": national_code or '0', + "role": "PoultryScience", + "api_key": PROJECT_API_KEY + } + try: + arta_response = requests.post( + url=ARTA_REGISTER, + data=register_payload, + verify=False, + timeout=20 + ) + except requests.RequestException as exc: + stats["skipped_rows"] += 1 + errors.append({"row": row_index, "reason": f"خطا در ثبت در آرتا: {exc}"}) + continue + + if arta_response.status_code not in (200, 201): + stats["skipped_rows"] += 1 + errors.append( + {"row": row_index, "reason": f"ثبت کاربر در آرتا انجام نشد ({arta_response.status_code})."}) + continue + + hashed_password = hashlib.sha256(password.encode()).hexdigest() + user, _ = User.objects.get_or_create( + username=mobile, + defaults={ + "first_name": first_name or "", + "last_name": last_name or "", + "password": hashed_password + } + ) + if first_name and user.first_name != first_name: + user.first_name = first_name + if last_name and user.last_name != last_name: + user.last_name = last_name + user.save() + + fullname = f"{first_name or ''} {last_name or ''}".strip() or None + system_profile = SystemUserProfile.objects.create( + mobile=mobile, + first_name=first_name, + last_name=last_name, + fullname=fullname, + user=user, + base_order=next_base_order, + password=password, + national_code=national_code, + city=city, + province=city.province, + city_name=city.name, + province_name=city.province.name if city.province else None, + city_number=city.city_number, + province_number=city.province.province_number if city.province else None + ) + next_base_order += 1 + stats["created_profiles"] += 1 + else: + updated = False + if first_name and system_profile.first_name != first_name: + system_profile.first_name = first_name + updated = True + if last_name and system_profile.last_name != last_name: + system_profile.last_name = last_name + updated = True + if national_code and system_profile.national_code != national_code: + system_profile.national_code = national_code + updated = True + if engineering_code and system_profile.system_code != engineering_code: + system_profile.system_code = engineering_code + updated = True + if system_profile.city_id != city.id: + system_profile.city = city + system_profile.city_name = city.name + system_profile.city_number = city.city_number + updated = True + if system_profile.province_id != (city.province.id if city.province else None): + system_profile.province = city.province + system_profile.province_name = city.province.name if city.province else None + system_profile.province_number = city.province.province_number if city.province else None + updated = True + + fullname = f"{system_profile.first_name or ''} {system_profile.last_name or ''}".strip() + if fullname and system_profile.fullname != fullname: + system_profile.fullname = fullname + updated = True + + if not system_profile.user: + hashed_password = hashlib.sha256('123456'.encode()).hexdigest() + user, _ = User.objects.get_or_create( + username=mobile, + defaults={ + "first_name": first_name or system_profile.first_name or "", + "last_name": last_name or system_profile.last_name or "", + "password": hashed_password + } + ) + system_profile.user = user + updated = True + else: + user = system_profile.user + if first_name and user.first_name != first_name: + user.first_name = first_name + user.save(update_fields=["first_name"]) + if last_name and user.last_name != last_name: + user.last_name = last_name + user.save(update_fields=["last_name"]) + + if updated: + system_profile.save() + stats["updated_profiles"] += 1 + + if not system_profile.role.filter(id=group.id).exists(): + system_profile.role.add(group) + + poultry_science = PoultryScience.objects.filter(trash=False, user=system_profile).first() + if not poultry_science: + PoultryScience.objects.create(user=system_profile, engineering_code=engineering_code) + stats["created_poultry_science"] += 1 + else: + updated_fields = [] + if engineering_code and poultry_science.engineering_code != engineering_code: + poultry_science.engineering_code = engineering_code + updated_fields.append("engineering_code") + if updated_fields: + poultry_science.save(update_fields=updated_fields) + + return Response( + { + "result": "done", + "summary": stats, + "errors": errors + }, + status=status.HTTP_200_OK + ) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +def sync_guilds_user_profile_from_inquiry(request): + """ + برگرداندن لیست صنف‌هایی که: + - برای کاربرشان کد ملی ثبت شده است (user__national_id خالی/NULL نیست) + - هنوز استعلام نشده‌اند (has_inquiry = False) + + علاوه بر لیست، برای هر صنف استعلام «شخص» و «صنف» انجام می‌شود + و فقط اطلاعات کاربر (SystemUserProfile) به‌روزرسانی می‌شود. + در صورت موفقیت، روی خود صنف فقط has_inquiry=True ست می‌شود. + """ + queryset = Guilds.objects.filter( + trash=False, + user__national_id__isnull=False, + steward=True + ).exclude(user__national_id__exact="") + + failed_records = [] + updated_ids = [] + + # کش شهرها برای بهبود کارایی جستجوی شهر + all_cities_cache = list(City.objects.filter(trash=False).values('id', 'name')) + + def _normalize_fa_ar(text): + if not text: + return text + mapping = { + 'ك': 'ک', + 'ي': 'ی', + 'ى': 'ی', + '\u0649': 'ی', + '\u06CC': 'ی', + '\u064A': 'ی', + 'ۀ': 'ه', + 'ة': 'ه', + 'ؤ': 'و', + 'أ': 'ا', + 'إ': 'ا', + 'ٱ': 'ا', + '\u200c': ' ', + } + out = str(text) + for src, dst in mapping.items(): + out = out.replace(src, dst) + return out.strip() + + def parse_yes_no(val): + if not val: + return False + return str(val).strip() == 'بله' + + for guild in queryset: + national_id = getattr(getattr(guild, "user", None), "national_id", None) + if not national_id: + failed_records.append( + {"guild_id": guild.id, "reason": "کد ملی برای کاربر این صنف ثبت نشده است"} + ) + continue + + try: + # دریافت اطلاعات شخص + try: + person_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_id}&type=person" + ) + person_data = person_response.json() + if not person_data.get('status'): + failed_records.append( + {"guild_id": guild.id, "national_id": national_id, "reason": "اطلاعات شخص یافت نشد"} + ) + continue + person_info = person_data.get('data', {}) + except Exception as e: + failed_records.append( + { + "guild_id": guild.id, + "national_id": national_id, + "reason": f"خطا در دریافت اطلاعات شخصی: {str(e)}", + } + ) + continue + + # دریافت اطلاعات صنفی + try: + guild_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_id}&type=guild" + ) + guild_data = guild_response.json() + if not guild_data.get('status') or not guild_data.get('data'): + failed_records.append( + {"guild_id": guild.id, "national_id": national_id, "reason": "اطلاعات صنفی یافت نشد"} + ) + continue + + guild_list = guild_data.get('data', []) + guild_info = None + + for g in guild_list: + license_status_value = g.get('licenseStatus', '') + if license_status_value and 'فعال' in license_status_value: + guild_info = g + break + + if not guild_info: + failed_records.append( + { + "guild_id": guild.id, + "national_id": national_id, + "reason": "هیچ پروانه کسب فعالی برای این کد ملی یافت نشد (تمام پروانه‌ها ابطال شده‌اند)", + } + ) + continue + + guild_layer_two = guild_info.get('layerTwo', {}) + except Exception as e: + failed_records.append( + { + "guild_id": guild.id, + "national_id": national_id, + "reason": f"خطا در دریافت اطلاعات صنفی: {str(e)}", + } + ) + continue + + # مقادیر مورد نیاز برای به‌روزرسانی + first_name = person_info.get('firstName') + last_name = person_info.get('lastName') + father_name = person_info.get('fatherName') + gender = person_info.get('gender') + identity_no = person_info.get('identityNo') + is_alive = person_info.get('isLive', True) + birth_date = person_info.get('birthDate') + + try: + jalali_date = jdatetime.datetime.strptime(birth_date, "%Y/%m/%d").togregorian().date() + birthday_str = jalali_date.strftime("%Y-%m-%d") + except Exception: + birthday_str = None + + city_name = guild_info.get('city') + mobile_from_guild = guild_layer_two.get('mobilenumber') + + has_partner = parse_yes_no(guild_layer_two.get('hasPartner')) + is_foreign_national = parse_yes_no(guild_layer_two.get('isForeigner')) + + # پیدا کردن شهر (همان منطق قبلی) + city = City.objects.filter(name__icontains=city_name, trash=False).first() + if not city: + normalized_city = _normalize_fa_ar(city_name) + city = City.objects.filter(name__icontains=normalized_city, trash=False).first() + if not city: + alt_city = str(city_name or '') + alt_city = alt_city.replace('ک', 'ك').replace('ی', 'ي') + city = City.objects.filter(name__icontains=alt_city, trash=False).first() + if not city: + try: + target = _normalize_fa_ar(city_name or '') + best_id = None + best_ratio = 0.0 + for c in all_cities_cache: + cand = _normalize_fa_ar(c.get('name', '') or '') + ratio = difflib.SequenceMatcher(None, target, cand).ratio() + if ratio > best_ratio: + best_ratio = ratio + best_id = c['id'] + if best_id is not None and best_ratio >= 0.72: + city = City.objects.filter(id=best_id, trash=False).first() + except Exception: + city = None + + # به‌روزرسانی اطلاعات کاربر و فلگ استعلام صنف (بدون دست‌زدن به سایر فیلدهای صنف) + try: + user_profile = guild.user + if user_profile: + # اگر شماره موبایل در استعلام صنفی وجود دارد و با موبایل فعلی فرق می‌کند + if mobile_from_guild and mobile_from_guild != user_profile.mobile: + first_mobile_number = user_profile.mobile + second_mobile_number = mobile_from_guild + + # شماره جدید قبلا برای شخص دیگری ثبت نشده باشد + if SystemUserProfile.objects.filter(mobile=second_mobile_number) \ + .exclude(id=user_profile.id).exists(): + failed_records.append( + { + "guild_id": guild.id, + "national_id": national_id, + "reason": "این شماره در سامانه به نام شخص دیگری است", + } + ) + continue + + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + user = User.objects.get(id=user_profile.user.id) + user.username = second_mobile_number + user.save() + user_profile.mobile = second_mobile_number + else: + failed_records.append( + { + "guild_id": guild.id, + "national_id": national_id, + "reason": "در تغییر شماره موبایل در آرتا مشکلی به‌وجود آمده است", + } + ) + continue + + user_profile.national_id = national_id + user_profile.national_code = identity_no + user_profile.first_name = first_name + user_profile.last_name = last_name + user_profile.fullname = f"{first_name} {last_name}".strip() + user_profile.father_name = father_name + user_profile.gender = gender + if birthday_str: + user_profile.birthday = birthday_str + user_profile.is_alive = is_alive + if city: + user_profile.city = city + user_profile.province = city.province + user_profile.save() + + guild.has_inquiry = True + guild.save(update_fields=["has_inquiry"]) + updated_ids.append(guild.id) + except Exception as e: + failed_records.append( + {"guild_id": guild.id, "national_id": national_id, "reason": f"خطا در آپدیت صنف/کاربر: {str(e)}"} + ) + continue + + except Exception as e: + failed_records.append( + {"guild_id": guild.id, "national_id": national_id, "reason": f"خطای کلی: {str(e)}"} + ) + continue + + updated_guilds = Guilds.objects.filter(id__in=updated_ids) + serializer = GuildsSerializer(updated_guilds, many=True) + + return Response( + { + "result": "پردازش کامل شد", + "updated_count": len(updated_ids), + "failed_count": len(failed_records), + "failed_records": failed_records, + "guilds": serializer.data, + }, + status=status.HTTP_200_OK, + ) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +def report_guilds_without_national_or_pos_transactions(request): + """ + برگرداندن لیست صنف‌هایی که: + - کاربرشان کد ملی ندارد (national_id خالی/NULL است) + - یا هیچ تراکنش فعالی در جدول PosMachineTransactions برای آن‌ها ثبت نشده است + """ + # ۱) ابتدا برای همه صنف‌ها has_inquiry را False می‌کنیم + Guilds.objects.filter(trash=False).update(has_inquiry=False) + + # ۲) فقط صنف‌های فعال و غیرحذف‌شده را برای بررسی انتخاب می‌کنیم + queryset = Guilds.objects.filter(trash=False, active=True) + + result_guilds = [] + missing_national_id_count = 0 + missing_pos_txn_count = 0 + deactivated_count = 0 + + for guild in queryset: + national_id = getattr(getattr(guild, "user", None), "national_id", None) + has_national_id = bool(national_id) + + transactions = PosMachineTransactions.objects.filter( + trash=False, + pos__guild=guild, + paid=True + ).order_by('-date') + has_pos_transactions = transactions.exists() + + # صنف‌هایی که یا کد ملی ندارند یا هیچ تراکنش فعالی ندارند + if (not has_national_id) or (not has_pos_transactions): + result_guilds.append(guild) + if not has_national_id: + missing_national_id_count += 1 + if not has_pos_transactions: + missing_pos_txn_count += 1 + + # صنف‌هایی که نه کد ملی دارند و نه تراکنش => غیرفعال می‌شوند + if (not has_national_id) and (not has_pos_transactions) and guild.active: + guild.active = False + guild.save(update_fields=["active"]) + deactivated_count += 1 + + total = len(result_guilds) + serializer = GuildsSerializer(result_guilds, many=True) + + return Response( + { + "result": "ok", + "total": total, + "missing_national_id_count": missing_national_id_count, + "missing_pos_transactions_count": missing_pos_txn_count, + "deactivated_count": deactivated_count, + "guilds": serializer.data, + }, + status=status.HTTP_200_OK, + ) + + +@api_view(["GET"]) +@permission_classes([TokenHasReadWriteScope]) +def get_guilds_for_update_or_create(request): + national_code = request.GET['national_code'] + role = request.GET.get('role') + update_flag = request.GET.get('update', '').lower() == 'true' + users = SystemUserProfile.objects.filter(trash=False, national_id=national_code, active=True).order_by('id') + _guilds = Guilds.objects.filter( + trash=False, + user__national_id=national_code, + active=True + ).order_by('id') + api_data = {"dbRegister": False} + # اگر کاربر یا صنف نباشند، یا اگر update_flag برابر true باشد، برو داخل if + if (not users.exists() or not _guilds.exists()) or update_flag: + try: + person_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_code}&type=person" + ) + person_data = person_response.json() + if not person_data.get('status'): + return Response({"result": "اطلاعات شخص یافت نشد"}, status=status.HTTP_403_FORBIDDEN) + person_info = person_data.get('data', {}) + api_data['user'] = person_info + except Exception as e: + return Response({"result": f"خطا در دریافت اطلاعات شخصی: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + try: + guild_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_code}&type=guild" + ) + guild_data = guild_response.json() + if (not guild_data.get('status') or not guild_data.get('data')) and role == 'AdminX': + return Response(api_data, status=status.HTTP_200_OK) + # بررسی اینکه status true باشد و data وجود داشته باشد + if (not guild_data.get('status') or not guild_data.get('data')) and role != 'AdminX': + return Response({"result": "اطلاعات صنفی یافت نشد با واحد پشتیبانی تماس بگیرید."}, + status=status.HTTP_403_FORBIDDEN) + + guild_list = guild_data.get('data', []) + + # بررسی اینکه لیست guildها خالی نباشد + if not guild_list or len(guild_list) == 0: + return Response({"result": "اطلاعات صنفی یافت نشد با واحد پشتیبانی تماس بگیرید."}, + status=status.HTTP_403_FORBIDDEN) + + # بررسی اینکه حداقل یک guild با licenseIssueDate وجود داشته باشد + has_valid_guild = False + for guild in guild_list: + layer_two = guild.get('layerTwo', {}) + if layer_two and layer_two.get('licenseIssueDate'): + has_valid_guild = True + break + + if not has_valid_guild: + return Response({"result": "اطلاعات صنفی یافت نشد با واحد پشتیبانی تماس بگیرید."}, + status=status.HTTP_403_FORBIDDEN) + + guild_info = None + active_guilds = [] + inactive_guilds = [] + + # جدا کردن guildهای فعال و غیرفعال + for guild in guild_list: + layer_two = guild.get('layerTwo', {}) + license_status_value = layer_two.get('licenseStatus', '') if layer_two else '' + if license_status_value and 'فعال' in license_status_value: + active_guilds.append(guild) + else: + inactive_guilds.append(guild) + + # اول guild فعال را انتخاب کن + if active_guilds: + guild_info = active_guilds[0] + # اگر فعال نداشت، جدیدترین را بر اساس licenseIssueDate انتخاب کن + elif inactive_guilds: + def parse_persian_date(date_str): + """تبدیل تاریخ فارسی به jdatetime برای مقایسه""" + if not date_str: + return None + try: + # فرمت تاریخ فارسی معمولاً YYYY/MM/DD است + date_str = date_str.strip() + parts = date_str.split('/') + if len(parts) == 3: + year = int(parts[0]) + month = int(parts[1]) + day = int(parts[2]) + return jdatetime.date(year, month, day) + except: + pass + return None + + # پیدا کردن guild با جدیدترین تاریخ + latest_guild = None + latest_date = None + + for guild in inactive_guilds: + layer_two = guild.get('layerTwo', {}) + license_issue_date = layer_two.get('licenseIssueDate', '') if layer_two else '' + parsed_date = parse_persian_date(license_issue_date) + if parsed_date: + if latest_date is None or parsed_date > latest_date: + latest_date = parsed_date + latest_guild = guild + + if latest_guild: + guild_info = latest_guild + + # اگر guild_info پیدا نشد، اولین guild از لیست را انتخاب کن + if not guild_info and guild_list: + guild_info = guild_list[0] + + # ذخیره guild_info (که یا فعال است یا جدیدترین تاریخ را دارد) در api_data + if guild_info: + api_data['guild'] = guild_info + except Exception as e: + # اگر خطایی رخ داد، لاگ کن ولی guild_info را اگر پیدا شده بود اضافه کن + import logging + logger = logging.getLogger(__name__) + logger.error(f"خطا در پردازش اطلاعات صنفی: {str(e)}") + # اگر guild_info پیدا شده بود، آن را اضافه کن + if 'guild_info' in locals() and guild_info: + api_data['guild'] = guild_info + # اگر guild_info پیدا نشد ولی guild_list وجود دارد، اولین را انتخاب کن + elif 'guild_list' in locals() and guild_list: + api_data['guild'] = guild_list[0] + + # اگر چند کاربر با این کد ملی وجود داشت، بررسی کن کدام یک صنف دارد و شرایط را دارد + if users.count() > 1: + users_with_valid_guilds = [] + + # برای هر کاربر بررسی کن که آیا صنف دارد و شرایط را دارد + for user in users: + guilds = Guilds.objects.filter(trash=False, user=user, active=True) + + if guilds.exists(): + # بررسی کن که آیا صنف‌های این کاربر شرایط را دارند + has_steward_guild = guilds.filter(steward=True).exists() + + # بررسی کن که آیا صنف‌های این کاربر allocation جدید دارند + has_allocation = False + if not has_steward_guild: + for guild in guilds: + latest_allocation = StewardAllocation.objects.filter( + Q(to_steward=guild) | Q(to_guilds=guild), + trash=False + ).order_by('-date').first() + if latest_allocation: + has_allocation = True + break + + # اگر کاربر صنف دارد و شرایط را دارد، آن را اضافه کن + if has_steward_guild or has_allocation: + users_with_valid_guilds.append(user) + + # اگر کاربرانی با صنف معتبر وجود دارند، فقط آن‌ها را نگه دار + if users_with_valid_guilds: + # اگر چند کاربر با شرایط مناسب وجود داشت، جدیدترین را نگه دار + if len(users_with_valid_guilds) > 1: + # پیدا کردن جدیدترین کاربر بر اساس created_at و updated_at + valid_user_ids = [u.id for u in users_with_valid_guilds] + latest_user = SystemUserProfile.objects.filter(id__in=valid_user_ids).order_by('-id').first() + if latest_user: + users_with_valid_guilds = [latest_user] + else: + # اگر latest_user پیدا نشد، اولین را نگه دار + users_with_valid_guilds = users_with_valid_guilds[:1] + + # بقیه کاربران را غیرفعال کن و کد ملی را 0 بگذار + valid_user_ids = [u.id for u in users_with_valid_guilds] + guilds = Guilds.objects.filter(trash=False, user__in=users, active=True).exclude( + user__id__in=valid_user_ids).update(active=False) + users.exclude(id__in=valid_user_ids).update(active=False, national_id=0) + users = SystemUserProfile.objects.filter(id__in=valid_user_ids, trash=False, active=True) + + else: + # اگر هیچ کاربری صنف معتبر ندارد، جدیدترین را نگه دار + latest_user = users.order_by('-id').first() + users.exclude(id=latest_user.id).update(active=False, national_id=0) + users = SystemUserProfile.objects.filter(id=latest_user.id, trash=False, active=True) + + for user in users: + guilds = Guilds.objects.filter(trash=False, user=user, active=True) + + # اگر چند صنف وجود داشت، فقط آن‌هایی که شرایط را دارند فعال بمانند + if guilds.count() > 1: + # صنف‌هایی که باید فعال بمانند + guilds_to_keep_active = set() + + # 1. صنف‌هایی که steward=True هستند - همه را نگه دار + steward_guilds = guilds.filter(steward=True) + guilds_to_keep_active.update(steward_guilds.values_list('id', flat=True)) + + # 2. صنف‌هایی که در StewardAllocation هستند - فقط آن‌هایی که جدیدترین allocation را دارند + # پیدا کردن همه allocation‌های مربوط به این guilds + guilds_with_allocation_info = [] + for guild in guilds: + # بررسی وجود در StewardAllocation به عنوان to_steward یا to_guilds + latest_allocation = StewardAllocation.objects.filter( + Q(to_steward=guild) | Q(to_guilds=guild), + trash=False + ).order_by('-date').first() + + if latest_allocation: + # تاریخ allocation را بگیر (date یا created_at) + allocation_date = latest_allocation.date if latest_allocation.date else latest_allocation.created_at + guilds_with_allocation_info.append({ + 'guild_id': guild.id, + 'allocation_date': allocation_date, + 'allocation': latest_allocation + }) + + # اگر guildهایی با allocation وجود دارند، فقط آن‌هایی که جدیدترین تاریخ را دارند نگه دار + if guilds_with_allocation_info: + # فیلتر کردن مواردی که تاریخ دارند + valid_allocation_info = [item for item in guilds_with_allocation_info if item['allocation_date']] + if valid_allocation_info: + # پیدا کردن جدیدترین تاریخ + max_date = max(item['allocation_date'] for item in valid_allocation_info) + # اضافه کردن guildهایی که جدیدترین تاریخ را دارند + for item in valid_allocation_info: + if item['allocation_date'] == max_date: + guilds_to_keep_active.add(item['guild_id']) + + # اگر هیچ صنفی شرایط را نداشت، جدیدترین را نگه دار + if not guilds_to_keep_active: + latest_guild = guilds.order_by('-created_at', '-updated_at').first() + if latest_guild: + guilds_to_keep_active.add(latest_guild.id) + + # بقیه صنف‌ها را غیرفعال کن + guilds.exclude(id__in=guilds_to_keep_active).update(active=False) + + # بررسی اینکه آیا در api_data چیزی غیر از dbRegister وجود دارد + if api_data and any(key != 'dbRegister' for key in api_data.keys()): + return Response(api_data, status=status.HTTP_200_OK) + final_guilds = Guilds.objects.filter( + trash=False, + user__national_id=national_code, + active=True + ) + + serializer = GuildsSerializer(final_guilds.first()) + return Response(serializer.data, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +def get_legal_person_unit_info(request): + national_code = request.GET.get('national_code') + + if not national_code: + return Response({"result": "کد ملی الزامی است"}, status=status.HTTP_400_BAD_REQUEST) + + existing_user = SystemUserProfile.objects.filter( + trash=False, + national_id=national_code, + active=True + ).first() + + if existing_user: + return Response({ + "result": "کاربر در سیستم وجود دارد!" + }, status=status.HTTP_403_FORBIDDEN) + + try: + unit_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_code}&type=unit" + ) + unit_data = unit_response.json() + + if not unit_data.get('status') or not unit_data.get('data'): + return Response({"result": "اطلاعات واحد صنفی یافت نشد"}, status=status.HTTP_403_FORBIDDEN) + + unit_info = unit_data.get('data', {}) + unit_name = unit_info.get('name', '') + unit_national_code = unit_info.get('nationalCode', '') + unit_address = unit_info.get('address', '') + city_name = None + province_name = None + + if unit_address: + address_parts = unit_address.split() + if 'استان' in address_parts: + province_idx = address_parts.index('استان') + if province_idx + 1 < len(address_parts): + province_parts = [] + for i in range(province_idx + 1, len(address_parts)): + if address_parts[i] in ['شهرستان', 'شهر', 'بخش']: + break + province_parts.append(address_parts[i]) + if province_parts: + province_name = ' '.join(province_parts) + + if 'شهرستان' in address_parts: + city_idx = address_parts.index('شهرستان') + if city_idx + 1 < len(address_parts): + city_parts = [] + for i in range(city_idx + 1, len(address_parts)): + if address_parts[i] in ['بخش', 'شهر']: + break + city_parts.append(address_parts[i]) + if city_parts: + city_name = ' '.join(city_parts) + + if not city_name and 'شهر' in address_parts: + city_idx = address_parts.index('شهر') + if city_idx + 1 < len(address_parts): + city_parts = [] + for i in range(city_idx + 1, len(address_parts)): + if address_parts[i] in ['بخش', 'کوچه', 'خیابان', 'پلاک']: + break + city_parts.append(address_parts[i]) + if city_parts: + city_name = ' '.join(city_parts) + + first_name = unit_name.split(' ')[0] + last_name = unit_name.split(' ')[1] + result_data = { + "is_real_person": False, + "first_name": first_name or "", + "last_name": last_name or "", + "national_id": unit_national_code, + "province": province_name or "", + "address": unit_address, + "unit_name": unit_name, + + } + + return Response(result_data, status=status.HTTP_200_OK) + + except requests.RequestException as e: + return Response({"result": f"خطا در ارتباط با API: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + except Exception as e: + import logging + logger = logging.getLogger(__name__) + logger.error(f"خطا در پردازش اطلاعات واحد صنفی: {str(e)}") + return Response({"result": f"خطا در پردازش اطلاعات: {str(e)}"}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +def update_all_active_guilds_from_api(request): + """ + دریافت تمام guild های فعال و آپدیت آن‌ها از API + """ + import logging + logger = logging.getLogger(__name__) + + # دریافت تمام guild های فعال + active_guilds = Guilds.objects.filter(trash=False, active=True) + + success_count = 0 + failed_count = 0 + skipped_count = 0 + failed_records = [] + + def _normalize_fa_ar(text): + """نرمالایز کردن متن فارسی/عربی""" + if not text: + return text + mapping = { + 'ك': 'ک', + 'ي': 'ی', + 'ى': 'ی', + '\u0649': 'ی', + '\u06CC': 'ی', + '\u064A': 'ی', + 'ۀ': 'ه', + 'ة': 'ه', + 'ؤ': 'و', + 'أ': 'ا', + 'إ': 'ا', + 'ٱ': 'ا', + '\u200c': ' ', + } + out = str(text) + for src, dst in mapping.items(): + out = out.replace(src, dst) + return out.strip() + + def parse_yes_no(val): + """تبدیل مقدار به boolean""" + if isinstance(val, bool): + return val + if isinstance(val, str): + return False if val == 'خیر' else True + return bool(val) + + def persian_date_to_datetime(persian_date_str): + """تبدیل تاریخ فارسی به datetime""" + if not persian_date_str: + return None + try: + persian_numbers = '۰۱۲۳۴۵۶۷۸۹' + english_numbers = '0123456789' + translation_table = str.maketrans(persian_numbers, english_numbers) + english_date = persian_date_str.translate(translation_table) + parts = english_date.split('/') + if len(parts) != 3: + return None + year = int(parts[0]) + month = int(parts[1]) + day = int(parts[2]) + return convert_to_miladi(year=year, month=month, day=day) + except: + return None + + all_cities_cache = list(City.objects.filter(trash=False).values('id', 'name')) + + for guild in active_guilds: + try: + # دریافت کد ملی کاربر + user = guild.user + if not user or not user.national_id: + skipped_count += 1 + continue + + national_code = user.national_id + + # دریافت اطلاعات شخصی از API + try: + person_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_code}&type=person" + ) + person_data = person_response.json() + if not person_data.get('status') or not person_data.get('data'): + failed_count += 1 + failed_records.append({ + 'guild_id': guild.id, + 'national_id': national_code, + 'error': 'اطلاعات شخصی یافت نشد' + }) + continue + person_info = person_data.get('data', {}) + except Exception as e: + failed_count += 1 + failed_records.append({ + 'guild_id': guild.id, + 'national_id': national_code, + 'error': f'خطا در دریافت اطلاعات شخصی: {str(e)}' + }) + continue + + # دریافت اطلاعات صنفی از API + try: + guild_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_code}&type=guild" + ) + guild_data = guild_response.json() + if not guild_data.get('status') or not guild_data.get('data'): + failed_count += 1 + failed_records.append({ + 'guild_id': guild.id, + 'national_id': national_code, + 'error': 'اطلاعات صنفی یافت نشد' + }) + continue + + guild_list = guild_data.get('data', []) + if not guild_list or len(guild_list) == 0: + failed_count += 1 + failed_records.append({ + 'guild_id': guild.id, + 'national_id': national_code, + 'error': 'لیست صنف‌ها خالی است' + }) + continue + + # انتخاب guild مناسب (فعال یا جدیدترین) + guild_info = None + active_guilds_list = [] + inactive_guilds_list = [] + + for g in guild_list: + layer_two = g.get('layerTwo', {}) + license_status_value = layer_two.get('licenseStatus', '') if layer_two else '' + if license_status_value and 'فعال' in license_status_value: + active_guilds_list.append(g) + else: + inactive_guilds_list.append(g) + + if active_guilds_list: + guild_info = active_guilds_list[0] + elif inactive_guilds_list: + def parse_persian_date(date_str): + if not date_str: + return None + try: + date_str = date_str.strip() + parts = date_str.split('/') + if len(parts) == 3: + year = int(parts[0]) + month = int(parts[1]) + day = int(parts[2]) + return jdatetime.date(year, month, day) + except: + pass + return None + + latest_guild = None + latest_date = None + for g in inactive_guilds_list: + layer_two = g.get('layerTwo', {}) + license_issue_date = layer_two.get('licenseIssueDate', '') if layer_two else '' + parsed_date = parse_persian_date(license_issue_date) + if parsed_date: + if latest_date is None or parsed_date > latest_date: + latest_date = parsed_date + latest_guild = g + + if latest_guild: + guild_info = latest_guild + + if not guild_info: + guild_info = guild_list[0] + + except Exception as e: + failed_count += 1 + failed_records.append({ + 'guild_id': guild.id, + 'national_id': national_code, + 'error': f'خطا در دریافت اطلاعات صنفی: {str(e)}' + }) + continue + + # استخراج اطلاعات از API + layer_one = guild_info.get('layerOne', {}) + layer_two = guild_info.get('layerTwo', {}) + + # اطلاعات شخصی + first_name = person_info.get('firstName', '') + last_name = person_info.get('lastName', '') + father_name = person_info.get('fatherName', '') + gender = person_info.get('gender', '') + identity_no = person_info.get('identityNo', '') + birth_date = person_info.get('birthDate', '') + city_name = layer_two.get('city', '') + address_text = layer_two.get('address', '') + postal_code = layer_two.get('postalcode', '') + mobile = person_info.get('mobile', '') or person_info.get('mobilenumber', '') + + # اطلاعات صنفی + title = layer_one.get('title', '') or layer_two.get('title', '') or guild_info.get('title', '') + license_number = guild_info.get('licenseNumber', '') + license_type = guild_info.get('licenseType', '') + license_status = guild_info.get('licenseStatus', '') + license_issue_date = layer_two.get('licenseIssueDate', '') + license_expire_date = guild_info.get('licenseExpireDate', '') + type_activity_name = layer_one.get('isicname', '') or layer_two.get('isicname', '') + company_name = layer_one.get('corporationName', '') or layer_two.get('corporationName', '') + company_identifier = layer_one.get('nationalId', '') or layer_two.get('nationalId', '') + union_name = layer_one.get('unionName', '') or layer_two.get('unionName', '') + phone = layer_one.get('phonenumber', '') or layer_two.get('phonenumber', '') + has_partner_val = layer_one.get('hasPartner', '') or layer_two.get('hasPartner', '') + is_foreigner_val = layer_one.get('isForeigner', '') or layer_two.get('isForeigner', '') + steward = guild.steward # حفظ مقدار فعلی + + # تبدیل تاریخ تولد + birthday_str = None + if birth_date: + try: + jalali_date = jdatetime.datetime.strptime(birth_date, "%Y/%m/%d").togregorian().date() + birthday_str = jalali_date.strftime("%Y-%m-%d") + except: + pass + + # تبدیل boolean ها + has_partner = parse_yes_no(has_partner_val) + is_foreign_national = parse_yes_no(is_foreigner_val) + + # پیدا کردن شهر + city = City.objects.filter(name__icontains=city_name, trash=False).first() + if not city: + normalized_city = _normalize_fa_ar(city_name) + city = City.objects.filter(name__icontains=normalized_city, trash=False).first() + if not city: + alt_city = str(city_name or '') + alt_city = alt_city.replace('ک', 'ك').replace('ی', 'ي') + city = City.objects.filter(name__icontains=alt_city, trash=False).first() + if not city: + try: + target = _normalize_fa_ar(city_name or '') + best_id = None + best_ratio = 0.0 + for c in all_cities_cache: + cand = _normalize_fa_ar(c.get('name', '') or '') + ratio = difflib.SequenceMatcher(None, target, cand).ratio() + if ratio > best_ratio: + best_ratio = ratio + best_id = c['id'] + if best_id is not None and best_ratio >= 0.72: + city = City.objects.filter(id=best_id, trash=False).first() + except Exception: + city = None + + if not city: + failed_count += 1 + failed_records.append({ + 'guild_id': guild.id, + 'national_id': national_code, + 'error': f"شهر '{city_name}' یافت نشد" + }) + continue + + province = city.province + + # آپدیت اطلاعات کاربر + if user: + user.national_id = national_code + user.national_code = identity_no + user.father_name = father_name + user.gender = gender + user.birthday = birthday_str + if city: + user.city = city + user.province = province + if first_name: + user.first_name = first_name + if last_name: + user.last_name = last_name + user.fullname = f"{first_name} {last_name}".strip() + if mobile and not user.mobile: + user.mobile = mobile + user.save() + + # ایجاد یا آپدیت آدرس + if address_text: + address = SystemAddress(city=city, province=province, address=address_text, postal_code=postal_code) + address.save() + else: + address = guild.address if guild.address else None + + # پیدا کردن TypeActivity و AreaActivity + from panel.models import TypeActivity, AreaActivity + type_activity = TypeActivity.objects.filter(title__icontains=type_activity_name, trash=False).first() + if not type_activity: + type_activity = TypeActivity.objects.filter(trash=False).first() + + area_activity = AreaActivity.objects.filter(trash=False).first() + + # آپدیت guild + guild.guilds_name = title + guild.license_number = license_number + guild.license_type = license_type + guild.license_status = license_status + guild.is_foreign_national = is_foreign_national + guild.has_partner = has_partner + guild.has_inquiry = True + guild.company_name = company_name + guild.company_identifier = company_identifier + if address: + guild.address = address + guild.type_activity = type_activity.title if type_activity else type_activity_name + guild.area_activity = area_activity.title if area_activity else '' + guild.guild_type_activity = type_activity + guild.guild_area_activity = area_activity + guild.union_name = union_name + guild.phone_number = phone + guild.active = True + + if license_issue_date: + converted_date = persian_date_to_datetime(license_issue_date) + if converted_date: + guild.license_issue_date = converted_date + + if license_expire_date: + converted_date = persian_date_to_datetime(license_expire_date) + if converted_date: + guild.license_expire_date = converted_date + + guild.save() + success_count += 1 + + except Exception as e: + failed_count += 1 + failed_records.append({ + 'guild_id': guild.id, + 'national_id': getattr(guild.user, 'national_id', '') if guild.user else '', + 'error': f'خطای کلی: {str(e)}' + }) + logger.error(f"خطا در آپدیت guild {guild.id}: {str(e)}") + continue + + return Response({ + 'result': 'پردازش کامل شد', + 'total_guilds': active_guilds.count(), + 'success_count': success_count, + 'failed_count': failed_count, + 'skipped_count': skipped_count, + 'failed_records': failed_records[:100] # فقط 100 مورد اول خطاها + }, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def find_users_with_duplicate_national_id(request): + users = SystemUserProfile.objects.filter( + trash=False, + national_id__isnull=False, + role__name__in=['Guilds', 'Steward'] + ).exclude(national_id__exact='').exclude(national_id__exact='0').distinct() + + national_id_dict = {} + for user in users: + nid = str(user.national_id).strip() + if nid.isdigit() and len(nid) == 10: + if nid not in national_id_dict: + national_id_dict[nid] = [] + national_id_dict[nid].append(user) + + result = [] + for nid, user_list in national_id_dict.items(): + if len(user_list) > 1: + users_data = [] + for user in user_list: + users_data.append({ + 'id': user.id, + 'mobile': user.mobile, + 'first_name': user.first_name, + 'last_name': user.last_name, + 'fullname': user.fullname, + 'national_id': user.national_id + }) + result.append({ + 'national_id': nid, + 'count': len(user_list), + 'users': users_data + }) + + result.sort(key=lambda x: x['count'], reverse=True) + + total_duplicate = len(result) + total_users = 0 + for item in result: + total_users += item['count'] + + return Response({ + 'result': 'ok', + 'total_duplicate_national_ids': total_duplicate, + 'total_users_with_duplicate': total_users, + 'duplicate_national_ids': result + }, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def fix_duplicate_national_id_users(request): + users = SystemUserProfile.objects.filter( + trash=False, + national_id__isnull=False, + role__name__in=['Guilds', 'Steward'] + ).exclude(national_id__exact='').exclude(national_id__exact='0') + + national_id_dict = {} + for user in users: + nid = str(user.national_id).strip() + if nid.isdigit() and len(nid) == 10: + if nid not in national_id_dict: + national_id_dict[nid] = [] + national_id_dict[nid].append(user) + + duplicate_national_ids = {} + for nid, user_list in national_id_dict.items(): + if len(user_list) > 1: + duplicate_national_ids[nid] = user_list + + all_cities_cache = list(City.objects.filter(trash=False).values('id', 'name')) + + def _normalize_fa_ar(text): + if not text: + return text + mapping = { + 'ك': 'ک', + 'ي': 'ی', + 'ى': 'ی', + '\u0649': 'ی', + '\u06CC': 'ی', + '\u064A': 'ی', + 'ۀ': 'ه', + 'ة': 'ه', + 'ؤ': 'و', + 'أ': 'ا', + 'إ': 'ا', + 'ٱ': 'ا', + '\u200c': ' ', + } + out = str(text) + for src, dst in mapping.items(): + out = out.replace(src, dst) + return out.strip() + + def parse_yes_no(val): + if isinstance(val, bool): + return val + if isinstance(val, str): + x = False if val.strip() == 'خیر' else True + return x + return bool(val) + + def find_city(city_name): + if not city_name: + return None + city = City.objects.filter(name__icontains=city_name, trash=False).first() + if not city: + normalized_city = _normalize_fa_ar(city_name) + city = City.objects.filter(name__icontains=normalized_city, trash=False).first() + if not city: + alt_city = str(city_name or '') + alt_city = alt_city.replace('ک', 'ك').replace('ی', 'ي') + city = City.objects.filter(name__icontains=alt_city, trash=False).first() + if not city: + try: + target = _normalize_fa_ar(city_name or '') + best_id = None + best_ratio = 0.0 + for c in all_cities_cache: + cand = _normalize_fa_ar(c.get('name', '') or '') + ratio = difflib.SequenceMatcher(None, target, cand).ratio() + if ratio > best_ratio: + best_ratio = ratio + best_id = c['id'] + if best_id is not None and best_ratio >= 0.72: + city = City.objects.filter(id=best_id, trash=False).first() + except Exception: + city = None + return city + + def generate_random_mobile(): + while True: + random_num = ''.join([str(random.randint(0, 9)) for _ in range(9)]) + mobile = '08' + random_num + if not SystemUserProfile.objects.filter(mobile=mobile).exists(): + try: + check_response = requests.get( + f"{ARTA_URL_CHECK_USER_EXISTS}?username={mobile}", + verify=False + ) + if check_response.status_code == 200: + return mobile + except Exception: + continue + + processed = [] + failed = [] + + for national_id, user_list in duplicate_national_ids.items(): + try: + guild_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_id}&type=guild" + ) + guild_data = guild_response.json() + + if not guild_data.get('status') or not guild_data.get('data'): + failed.append({ + 'national_id': national_id, + 'reason': 'اطلاعات صنفی یافت نشد' + }) + continue + + guild_list = guild_data.get('data', []) + guild_info = None + + for g in guild_list: + license_status_value = g.get('licenseStatus', '') + if license_status_value and 'فعال' in license_status_value: + guild_info = g + break + + if not guild_info and guild_list: + guild_info = guild_list[0] + + if not guild_info: + failed.append({ + 'national_id': national_id, + 'reason': 'اطلاعات صنفی یافت نشد' + }) + continue + + guild_layer_two = guild_info.get('layerTwo', {}) + mobile_from_api = guild_layer_two.get('mobilenumber') + steward_from_api = guild_layer_two.get('steward', False) + + if isinstance(steward_from_api, str): + steward_value = steward_from_api.strip().lower() in ('true', 'بله', '1', 'yes') + else: + steward_value = bool(steward_from_api) + + if not mobile_from_api: + failed.append({ + 'national_id': national_id, + 'reason': 'شماره موبایل در API یافت نشد' + }) + continue + + existing_user = SystemUserProfile.objects.filter( + trash=False, + mobile=mobile_from_api + ).first() + + if existing_user: + has_killhouse = existing_user.role.filter(name='KillHouse').exists() + if not has_killhouse: + person_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_id}&type=person" + ) + person_data = person_response.json() + + if not person_data.get('status'): + failed.append({ + 'national_id': national_id, + 'reason': 'اطلاعات شخص یافت نشد' + }) + continue + + person_info = person_data.get('data', {}) + + first_name = person_info.get('firstName') + last_name = person_info.get('lastName') + father_name = person_info.get('fatherName') + gender = person_info.get('gender') + identity_no = person_info.get('identityNo') + is_alive = person_info.get('isLive', True) + birth_date = person_info.get('birthDate') + + try: + jalali_date = jdatetime.datetime.strptime(birth_date, "%Y/%m/%d").togregorian().date() + birthday_str = jalali_date.strftime("%Y-%m-%d") + except Exception: + birthday_str = None + + city_name = guild_info.get('city') + city = find_city(city_name) + + existing_user.national_id = national_id + existing_user.national_code = identity_no + existing_user.first_name = first_name + existing_user.last_name = last_name + existing_user.fullname = f"{first_name} {last_name}".strip() + existing_user.father_name = father_name + existing_user.gender = gender + if birthday_str: + existing_user.birthday = birthday_str + existing_user.is_alive = is_alive + if city: + existing_user.city = city + existing_user.province = city.province + existing_user.save() + + for user in user_list: + has_killhouse = user.role.filter(name='KillHouse').exists() + if user.id != existing_user.id: + user_guilds = Guilds.objects.filter(trash=False, user=user) + if user_guilds.exists(): + user_guilds.update(active=False) + + has_killhouse = user.role.filter(name='KillHouse').exists() + if not has_killhouse: + random_mobile = generate_random_mobile() + data = { + "first_mobile_number": user.mobile, + "second_mobile_number": random_mobile, + } + user.national_id = '0' + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + user.user.username = random_mobile + user.user.save() + user.mobile = random_mobile + user.save() + + else: + user_guilds = Guilds.objects.filter(trash=False, user=user) + if user_guilds.exists(): + user_guilds.update(active=False) + user.national_id = '0' + user.save() + else: + if has_killhouse: + user_guilds = Guilds.objects.filter(trash=False, user=user) + if user_guilds.exists(): + user_guilds.update(active=False) + user.national_id = '0' + user.save() + + processed.append({ + 'national_id': national_id, + 'action': 'updated_existing_user', + 'user_id': existing_user.id + }) + else: + for user in user_list: + has_killhouse = existing_user.role.filter(name='KillHouse').exists() + if not has_killhouse: + user.active = False + user.save() + + user_guilds = Guilds.objects.filter(trash=False, user=user) + user_guilds.update(active=False) + + person_response = requests.get( + f"https://pay.rasadyar.net/national-documents?info={national_id}&type=person" + ) + person_data = person_response.json() + + if not person_data.get('status'): + failed.append({ + 'national_id': national_id, + 'reason': 'اطلاعات شخص یافت نشد' + }) + continue + + person_info = person_data.get('data', {}) + + first_name = person_info.get('firstName') + last_name = person_info.get('lastName') + father_name = person_info.get('fatherName') + gender = person_info.get('gender') + identity_no = person_info.get('identityNo') + is_alive = person_info.get('isLive', True) + birth_date = person_info.get('birthDate') + + try: + jalali_date = jdatetime.datetime.strptime(birth_date, "%Y/%m/%d").togregorian().date() + birthday_str = jalali_date.strftime("%Y-%m-%d") + except Exception: + birthday_str = None + + city_name = guild_info.get('city') + city = find_city(city_name) + + role_name = "Steward" if steward_value else "Guilds" + + password = '123456' + register_payload = { + "username": mobile_from_api, + "first_name": first_name or "", + "last_name": last_name or "", + "password": password, + "national_code": identity_no or '0', + "role": role_name, + "api_key": PROJECT_API_KEY + } + + req = requests.post( + url=ARTA_REGISTER, + data=register_payload, + verify=False + ) + + if req.status_code == 200: + hashed_password = hashlib.sha256(password.encode()).hexdigest() + user = User.objects.filter(username=mobile_from_api).first() + if not user: + user = User( + username=mobile_from_api, + first_name=first_name or "", + last_name=last_name or "", + password=hashed_password + ) + user.save() + + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + + new_user = SystemUserProfile( + mobile=mobile_from_api, + first_name=first_name, + last_name=last_name, + fullname=f"{first_name} {last_name}".strip(), + user=user, + base_order=base_id, + password=password, + national_id=national_id, + national_code=identity_no, + father_name=father_name, + gender=gender, + birthday=birthday_str if birthday_str else str(datetime.datetime.now().date()), + is_alive=is_alive, + city=city, + province=city.province if city else None + ) + new_user.save() + + if steward_value: + group = Group.objects.get(name__exact="Steward") + else: + group = Group.objects.get(name__exact="Guilds") + new_user.role.add(group) + + wallet = Wallet() + wallet.save() + + address = SystemAddress( + province=city.province if city else None, + city=city, + address=city_name or '' + ) + address.save() + + title = guild_info.get('title', f"{first_name} {last_name}".strip()) + license_number = guild_info.get('licenseNumber', '') + license_type = guild_info.get('licenseType', '') + license_status = guild_info.get('licenseStatus', '') + type_activity_name = guild_info.get('isicname', '') + company_name = guild_info.get('corporationName', '') + company_identifier = guild_info.get('nationalId', '') + union_name = guild_info.get('unionName', '') + phone = guild_layer_two.get('phonenumber', '') + has_partner_val = guild_layer_two.get('hasPartner', False) + is_foreigner_val = guild_layer_two.get('isForeigner', False) + + has_partner = parse_yes_no(has_partner_val) + is_foreign_national = parse_yes_no(is_foreigner_val) + + from panel.models import TypeActivity, AreaActivity + type_activity = TypeActivity.objects.filter(title__icontains=type_activity_name, + trash=False).first() + if not type_activity: + type_activity = TypeActivity.objects.filter(trash=False).first() + + area_activity = AreaActivity.objects.filter(trash=False).first() + + new_guild = Guilds( + user=new_user, + guilds_name=title, + license_number=license_number, + license_type=license_type, + license_status=license_status, + is_foreign_national=is_foreign_national, + has_partner=has_partner, + has_inquiry=True, + steward=steward_value, + company_name=company_name, + company_identifier=company_identifier, + address=address, + wallet=wallet, + type_activity=type_activity.title if type_activity else type_activity_name, + area_activity=area_activity.title if area_activity else '', + guild_type_activity=type_activity, + guild_area_activity=area_activity, + union_name=union_name, + phone_number=phone, + active=True, + province_accept_state='pending' + ) + new_guild.save() + + from panel.models import NewProduct, BroadcastPrice + parent_product = NewProduct.objects.all().first() + price = BroadcastPrice.objects.filter(trash=False).first() + + if parent_product and price: + approved_price = price.steward_price if steward_value else price.guild_price + approved_type = price.active if approved_price > 0 else False + + product = RolesProducts( + parent_product=parent_product, + guild=new_guild, + name='مرغ گرم', + approved_price_status=approved_type, + approved_price=approved_price, + ) + product.save() + + processed.append({ + 'national_id': national_id, + 'action': 'created_new_user', + 'user_id': new_user.id + }) + else: + failed.append({ + 'national_id': national_id, + 'reason': 'خطا در ثبت کاربر در آرتا' + }) + except Exception as e: + failed.append({ + 'national_id': national_id, + 'reason': f'خطا: {str(e)}' + }) + continue + + return Response({ + 'result': 'ok', + 'processed_count': len(processed), + 'failed_count': len(failed), + 'processed': processed, + 'failed': failed + }, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def fix_duplicate_guilds_steward_allocation(request): + users_with_multiple_guilds = SystemUserProfile.objects.filter( + trash=False, + role__name__in=['Guilds', 'Steward'] + ).annotate( + guilds_count=Count('guilds_user', filter=Q(guilds_user__trash=False)) + ).filter(guilds_count__gt=1) + + processed = [] + failed = [] + + for user in users_with_multiple_guilds: + try: + user_guilds = Guilds.objects.filter( + user=user, + trash=False, + ).order_by('-active', '-create_date') + + if user_guilds.count() <= 1: + continue + + active_guild = user_guilds.filter(active=True).first() + + if not active_guild: + continue + + inactive_guilds = user_guilds.exclude(id=active_guild.id).filter(active=False) + + if not inactive_guilds.exists(): + continue + + allocations_to_move = StewardAllocation.objects.filter( + trash=False + ).filter( + Q(guilds__in=inactive_guilds) | + Q(to_guilds__in=inactive_guilds) | + Q(to_steward__in=inactive_guilds) + ) + + allocations_moved_count = 0 + steward_updated = False + for allocation in allocations_to_move: + if allocation.guilds and allocation.guilds in inactive_guilds: + allocation.guilds = active_guild + if allocation.to_guilds and allocation.to_guilds in inactive_guilds: + allocation.to_guilds = active_guild + if allocation.to_steward and allocation.to_steward in inactive_guilds: + allocation.to_steward = active_guild + if not active_guild.steward: + active_guild.steward = True + active_guild.save() + steward_updated = True + allocation.save() + allocations_moved_count += 1 + + if steward_updated: + try: + steward_group = Group.objects.get(name__exact="Steward") + if not user.role.filter(id=steward_group.id).exists(): + user.role.add(steward_group) + except Group.DoesNotExist: + pass + + pos_machines_to_move = POSMachine.objects.filter( + trash=False, + guild__in=inactive_guilds + ) + + pos_machines_moved_count = 0 + for pos_machine in pos_machines_to_move: + pos_machine.guild = active_guild + pos_machine.save() + pos_machines_moved_count += 1 + + pos_segmentations_to_move = PosSegmentation.objects.filter( + trash=False + ).filter( + Q(guild__in=inactive_guilds) | + Q(to_guild__in=inactive_guilds) + ) + + pos_segmentations_moved_count = 0 + for pos_segmentation in pos_segmentations_to_move: + + if pos_segmentation.guild and pos_segmentation.guild in inactive_guilds: + pos_segmentation.guild = active_guild + if pos_segmentation.to_guild and pos_segmentation.to_guild in inactive_guilds: + pos_segmentation.to_guild = active_guild + pos_segmentation.save() + pos_segmentations_moved_count += 1 + + roles_products_to_trash = RolesProducts.objects.filter( + trash=False, + guild__in=inactive_guilds + ) + + roles_products_trashed_count = 0 + for roles_product in roles_products_to_trash: + roles_product.trash = True + roles_product.save() + roles_products_trashed_count += 1 + + for inactive_guild in inactive_guilds: + inactive_guild.trash = True + inactive_guild.save() + + active_guild_products = RolesProducts.objects.get( + trash=False, + guild=active_guild + ) + + try: + guild_steward_allocations_product_warehousing(active_guild_products) + except Exception: + pass + + processed.append({ + 'user_id': user.id, + 'user_mobile': user.mobile, + 'user_national_id': user.national_id, + 'active_guild_id': active_guild.id, + 'active_guild_name': active_guild.guilds_name, + 'inactive_guilds_count': inactive_guilds.count(), + 'inactive_guild_ids': list(inactive_guilds.values_list('id', flat=True)), + 'allocations_moved': allocations_moved_count, + 'pos_machines_moved': pos_machines_moved_count, + 'pos_segmentations_moved': pos_segmentations_moved_count, + 'roles_products_trashed': roles_products_trashed_count + }) + + except Exception as e: + failed.append({ + 'user_id': user.id, + 'user_mobile': user.mobile, + 'reason': f'خطا: {str(e)}' + }) + continue + + return Response({ + 'result': 'ok', + 'processed_count': len(processed), + 'failed_count': len(failed), + 'processed': processed, + 'failed': failed + }, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def upload_image_to_server_for_poultry_science(request): + files = request.FILES.getlist('file') + if not files: + single_file = request.FILES.get('file') + if single_file: + files = [single_file] + + uploaded_urls = [] + + for idx, f in enumerate(files): + now = datetime.datetime.now() + name = now.strftime('%Y%m%d%H%M%S') + name = f"{name}{idx}.jpg" + + url = send_image_to_server_for_poultry_science(f, name) + uploaded_urls.append(url) + + return Response({ + 'urls': uploaded_urls + }, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def poultry_science_for_bazresi(request): + query = PoultryScienceReport.objects.filter(trash=False).order_by('-id') + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if search != 'undefined' and search.strip(): + query = query.filter( + build_query(PoultryScienceReportFilterSet.Meta.fields, value) + ) + + serializer = PoultryScienceReportSerializer(query, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/panel/VetFarm/__init__.py b/panel/VetFarm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/VetFarm/excel_processing.py b/panel/VetFarm/excel_processing.py new file mode 100644 index 0000000..29c8c72 --- /dev/null +++ b/panel/VetFarm/excel_processing.py @@ -0,0 +1,679 @@ +import datetime +from io import BytesIO +from django.db.models import Sum, Q, F +from openpyxl import Workbook +from openpyxl.styles import Alignment +from django.http import HttpResponse +from panel.helper_excel import shamsi_date, create_header, excel_description, create_header_freez, create_value +from panel.models import Poultry, PoultryHatching, VetFarm, PoultryRequest, KillHouseRequest + + +def technical_responsible_performance_excel(request): + vat_farm = VetFarm.objects.filter(trash=False, poultry__isnull=False, vet__key=request.GET.get('key')) + poultry_id = vat_farm.values_list('poultry__id', flat=True).distinct() + poultries = Poultry.objects.filter(id__in=poultry_id, trash=False) + excel_options = [ + 'ردیف', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'نام واحد', + 'نام و خانوادگی مالک', + 'تلفن مالک', + 'جوجه ریزی فعال', + 'تعداد دوره جوجه ریزی', + 'مجموع جوجه ریزی', + 'تعداد درخواست کشتار', + 'حجم درخواست کشتار', + 'وزن درخواست کشتار', + 'میانگین وزنی درخواست کشتار', + 'تعداد بار', + 'حجم بار', + 'وزن بارها', + 'تعداد بارهای دارای مجوز قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'وزن بارهای دارای کد قرنطینه', + 'تعداد بارهای فاقد مجوز قرنطینه', + 'حجم بارهای فاقد کد قرنطینه', + 'وزن بارهای فاقد کد قرنطینه', + 'تعداد بارهای مغایرت دار', + 'حجم بارهای مغایرت دار', + 'وزن بارهای مغایرت دار', + 'تعداد بار خارج استان', + 'حجم بار خارج استان', + 'وزن بار خارج استان', + 'میانگین وزن خارج از استان', + + ] + date1 = datetime.datetime.now().date() + from_date_1 = shamsi_date(date1) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد واحد تحت نظر', + 'مجموع جوجه ریزی تحت نظر', + 'مجموع درخواست کشتار', + 'مجموع حجم درخواست کشتار', + 'مجموع وزن درخواست کشتار', + 'مجموع تعداد بارها', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'مجموع تعداد بارهای قرنطینه شده', + 'مجموع حجم بارهای قرنطینه شده', + 'مجموع وزن بارهای قرنطینه شده', + 'مجموع تعداد بارهای فاقد قرنطینه', + 'مجموع حجم بارهای فاقد قرنطینه', + 'مجموع وزن بارهای فاقد قرنطینه نشده', + 'مجموع تعداد بارهای دارای مغایرت', + 'مجموع حجم بارهای دارای مغایرت', + 'مجموع وزن بارهای دارای مغایرت', + 'مجموع تعداد بارهای خارج استان', + 'مجموع حجم بارهای خارج استان', + 'مجموع وزن بارهای خارج استان', + 'مجموع وزن تقریبی بارهای خارج استان', + + ] + header_list2 = [ + 'درصد قرنطینه سازی بارها', + 'درصد عدم قرنطینه سازی بارها', + + ] + excel_description(worksheet, 'A2', 'عملکرد مسئول فنی', color='red', row2='B2') + vat_farm = vat_farm.first() + description = f'{vat_farm.vet.user.fullname}/{vat_farm.vet.user.mobile}' + excel_description(worksheet, 'A3', description, color='red', row2='B3') + + create_header(worksheet, header_list, 3, 2, height=20, color='green') + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=22) + + l = 6 + m = 1 + poultry_hatchings = PoultryHatching.objects.filter(poultry__in=poultries, trash=False).only('quantity', 'left_over' + ) + poultry_requests = PoultryRequest.objects.filter(trash=False, poultry__in=poultries, + state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending')).only('quantity', + 'Index_weight') + kill_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__in=poultry_requests).only( + 'accepted_real_quantity', 'accepted_real_weight') + + out_poultry_requests = poultry_requests.filter(out=True, out_province_request_cancel=False).only( + 'quantity', 'Index_weight' + ) + + for poultry in poultries: + poultry_hatching = poultry_hatchings.filter(poultry=poultry) + poultry_hatching_pending = poultry_hatching.filter(state='pending', allow_hatching='pending', + archive=False).last() + + hatching = 'ندارد' if not poultry_hatching_pending else f'دارد' + period='-' + if poultry_hatching_pending: + period = poultry_hatching_pending.period + else: + if poultry_hatching: + period = poultry_hatching.last().period + + total_quantity = \ + poultry_hatching.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_request = poultry_requests.filter(poultry=poultry) + total_quantity_poultry_request = \ + poultry_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight_poultry_request = \ + poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + total_index_weight_poultry_request = \ + poultry_request.aggregate(total=Sum('Index_weight'))[ + 'total'] or 0 + index_weight = round(total_index_weight_poultry_request / len(poultry_request), 2) if len( + poultry_request) > 0 else 0 + kill_request = kill_requests.filter(province_request__poultry_request__in=poultry_request) + kill_request_quantity = kill_request.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight = kill_request.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + has_code = kill_request.filter(clearance_code__isnull=False) + kill_request_quantity_has_code = has_code.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_has_code = has_code.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + hasnt_code = kill_request.filter(clearance_code__isnull=True) + kill_request_quantity_hasnt_code = hasnt_code.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_hasnt_code = hasnt_code.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + deffrent_bar = kill_request.filter( + ~Q(quantity=F('quarantine_quantity') + , quarantine_quantity__isnull=False)) + kill_request_quantity_deffrent_bar = deffrent_bar.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_deffrent_bar = deffrent_bar.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + out_poultry_request = out_poultry_requests.filter(poultry=poultry) + total_quantity_poultry_request_out = \ + out_poultry_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight_poultry_request_out = \ + out_poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + total_index_weight_poultry_request_out = \ + out_poultry_request.aggregate(total=Sum('Index_weight'))[ + 'total'] or 0 + index_weight_out = round(total_index_weight_poultry_request_out / len(out_poultry_request), 2) if len( + out_poultry_request) > 0 else 0 + + list1 = [ + m, + vat_farm.vet.user.fullname, + vat_farm.vet.user.mobile, + poultry.unit_name, + poultry.user.fullname, + poultry.user.mobile, + hatching, + period, + total_quantity, + len(poultry_request), + total_quantity_poultry_request, + total_weight_poultry_request, + index_weight, + len(kill_request), + kill_request_quantity, + kill_request_weight, + len(has_code), + kill_request_quantity_has_code, + kill_request_weight_has_code, + len(hasnt_code), + kill_request_quantity_hasnt_code, + kill_request_weight_hasnt_code, + len(deffrent_bar), + kill_request_quantity_deffrent_bar, + kill_request_weight_deffrent_bar, + len(out_poultry_request), + total_quantity_poultry_request_out, + total_weight_poultry_request_out, + index_weight_out, + ] + create_value(worksheet, list1, l, 1) + m += 1 + l += 1 + total_quantity = \ + poultry_hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_quantity_poultry_request = \ + poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight_poultry_request = \ + poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + kill_request_quantity = kill_requests.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight = kill_requests.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + has_code = kill_requests.filter(clearance_code__isnull=False) + kill_request_quantity_has_code = has_code.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_has_code = has_code.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + deffrent_bar = kill_requests.filter( + ~Q(quantity=F('quarantine_quantity') + , quarantine_quantity__isnull=False)) + kill_request_quantity_deffrent_bar = deffrent_bar.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_deffrent_bar = deffrent_bar.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + hasnt_code = kill_requests.filter(clearance_code__isnull=True) + kill_request_quantity_hasnt_code = hasnt_code.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_hasnt_code = hasnt_code.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + total_quantity_poultry_request_out = \ + out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight_poultry_request_out = \ + out_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + total_index_weight_poultry_request_out = \ + out_poultry_requests.aggregate(total=Sum('Index_weight'))[ + 'total'] or 0 + index_weight_out = round(total_index_weight_poultry_request_out / len(out_poultry_requests), 2) if len( + out_poultry_requests) > 0 else 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_quantity, + len(poultry_requests), + total_quantity_poultry_request, + total_weight_poultry_request, + '', + len(kill_requests), + kill_request_quantity, + kill_request_weight, + len(has_code), + kill_request_quantity_has_code, + kill_request_weight_has_code, + len(hasnt_code), + kill_request_quantity_hasnt_code, + kill_request_weight_hasnt_code, + len(deffrent_bar), + kill_request_quantity_deffrent_bar, + kill_request_weight_deffrent_bar, + len(out_poultry_requests), + total_quantity_poultry_request_out, + total_weight_poultry_request_out, + index_weight_out, + + ] + + create_value(worksheet, list2, l + 2, 1, color='green') + + value_header_list = [ + len(poultries), + total_quantity, + len(poultry_requests), + total_quantity_poultry_request, + total_weight_poultry_request, + len(kill_requests), + kill_request_quantity, + kill_request_weight, + len(has_code), + kill_request_quantity_has_code, + kill_request_weight_has_code, + len(hasnt_code), + kill_request_quantity_hasnt_code, + kill_request_weight_hasnt_code, + len(deffrent_bar), + kill_request_quantity_deffrent_bar, + kill_request_weight_deffrent_bar, + len(out_poultry_requests), + total_quantity_poultry_request_out, + total_weight_poultry_request_out, + index_weight_out, + ] + create_value(worksheet, value_header_list, 3, 3) + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="عملکرد مسئول فنی({vat_farm.vet.user.fullname}).xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + +def totoal_technical_responsible_performance_excel(request): + vat_farm = VetFarm.objects.filter(trash=False, poultry__isnull=False) + poultry_id = vat_farm.values_list('poultry__id', flat=True).distinct() + poultries = Poultry.objects.filter(id__in=poultry_id, trash=False) + excel_options = [ + 'ردیف', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'تعداد واحد تحت نظر', + 'مجموع جوجه ریزی تحت نظر', + 'مجموع درخواست کشتار', + 'مجموع حجم درخواست کشتار', + 'مجموع وزن درخواست کشتار', + 'مجموع تعداد بارها', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'مجموع تعداد بارهای قرنطینه شده', + 'مجموع حجم بارهای قرنطینه شده', + 'مجموع وزن بارهای قرنطینه شده', + 'مجموع تعداد بارهای فاقد قرنطینه', + 'مجموع حجم بارهای فاقد قرنطینه', + 'مجموع وزن بارهای فاقد قرنطینه نشده', + 'مجموع تعداد بارهای دارای مغایرت', + 'مجموع حجم بارهای دارای مغایرت', + 'مجموع وزن بارهای دارای مغایرت', + 'مجموع تعداد بارهای خارج استان', + 'مجموع حجم بارهای خارج استان', + 'مجموع وزن بارهای خارج استان', + 'مجموع وزن تقریبی بارهای خارج استان', + + ] + date1 = datetime.datetime.now().date() + from_date_1 = shamsi_date(date1) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد واحد تحت نظر', + 'مجموع جوجه ریزی تحت نظر', + 'مجموع درخواست کشتار', + 'مجموع حجم درخواست کشتار', + 'مجموع وزن درخواست کشتار', + 'مجموع تعداد بارها', + 'مجموع حجم بارها', + 'مجموع وزن بارها', + 'مجموع تعداد بارهای قرنطینه شده', + 'مجموع حجم بارهای قرنطینه شده', + 'مجموع وزن بارهای قرنطینه شده', + 'مجموع تعداد بارهای فاقد قرنطینه', + 'مجموع حجم بارهای فاقد قرنطینه', + 'مجموع وزن بارهای فاقد قرنطینه نشده', + 'مجموع تعداد بارهای دارای مغایرت', + 'مجموع حجم بارهای دارای مغایرت', + 'مجموع وزن بارهای دارای مغایرت', + 'مجموع تعداد بارهای خارج استان', + 'مجموع حجم بارهای خارج استان', + 'مجموع وزن بارهای خارج استان', + 'مجموع وزن تقریبی بارهای خارج استان', + + ] + + excel_description(worksheet, 'A2', 'عملکرد مسئول فنی', color='red', row2='B2') + + + create_header(worksheet, header_list, 3, 2, height=20, color='green') + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=22) + + l = 6 + m = 1 + poultry_hatchings = PoultryHatching.objects.filter(poultry__in=poultries, trash=False).only('quantity', 'left_over') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() + poultry_requests = PoultryRequest.objects.filter(send_date__date__gte=date1,send_date__date__lte=date2,trash=False, poultry__in=poultries, + state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending')).only('quantity', + 'Index_weight') + kill_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,kill_request__recive_date__date__lte=date2,trash=False, + province_request__poultry_request__in=poultry_requests).only( + 'accepted_real_quantity', 'accepted_real_weight') + else: + poultry_requests = PoultryRequest.objects.filter(trash=False, poultry__in=poultries, + state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending')).only('quantity', + 'Index_weight') + + kill_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__in=poultry_requests).only( + 'accepted_real_quantity', 'accepted_real_weight') + + + out_poultry_requests = poultry_requests.filter(out=True, out_province_request_cancel=False).only( + 'quantity', 'Index_weight' + ) + for vet in vat_farm: + poultry = Poultry.objects.filter(id=vet.poultry.id, trash=False) + poultry_hatchings = PoultryHatching.objects.filter(poultry__in=poultry, trash=False).only('quantity', + 'left_over') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() + poultry_requests = PoultryRequest.objects.filter(send_date__date__gte=date1, send_date__date__lte=date2, + trash=False, poultry__in=poultry, + state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending')).only( + 'quantity', + 'Index_weight') + kill_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, trash=False, + province_request__poultry_request__in=poultry).only( + 'accepted_real_quantity', 'accepted_real_weight') + else: + poultry_requests = PoultryRequest.objects.filter(trash=False, poultry__in=poultry, + state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending')).only( + 'quantity', + 'Index_weight') + + kill_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__in=poultry_requests).only( + 'accepted_real_quantity', 'accepted_real_weight') + + out_poultry_requests = poultry_requests.filter(out=True, out_province_request_cancel=False).only( + 'quantity', 'Index_weight' + ) + poultry_hatching = poultry_hatchings.filter(poultry=poultries) + total_quantity = \ + poultry_hatching.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_request = poultry_requests.filter(poultry=poultry) + total_quantity_poultry_request = \ + poultry_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight_poultry_request = \ + poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + total_index_weight_poultry_request = \ + poultry_request.aggregate(total=Sum('Index_weight'))[ + 'total'] or 0 + index_weight = round(total_index_weight_poultry_request / len(poultry_request), 2) if len( + poultry_request) > 0 else 0 + kill_request = kill_requests.filter(province_request__poultry_request__in=poultry_request) + kill_request_quantity = kill_request.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight = kill_request.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + has_code = kill_request.filter(clearance_code__isnull=False) + kill_request_quantity_has_code = has_code.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_has_code = has_code.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + hasnt_code = kill_request.filter(clearance_code__isnull=True) + kill_request_quantity_hasnt_code = hasnt_code.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_hasnt_code = hasnt_code.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + deffrent_bar = kill_request.filter( + ~Q(quantity=F('quarantine_quantity') + , quarantine_quantity__isnull=False)) + kill_request_quantity_deffrent_bar = deffrent_bar.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_deffrent_bar = deffrent_bar.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + out_poultry_request = out_poultry_requests.filter(poultry=poultry) + total_quantity_poultry_request_out = \ + out_poultry_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight_poultry_request_out = \ + out_poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + total_index_weight_poultry_request_out = \ + out_poultry_request.aggregate(total=Sum('Index_weight'))[ + 'total'] or 0 + index_weight_out = round(total_index_weight_poultry_request_out / len(out_poultry_request), 2) if len( + out_poultry_request) > 0 else 0 + + list1 = [ + m, + vet.vet.user.fullname, + vet.vet.user.mobile, + len(poultries), + total_quantity, + len(poultry_requests), + total_quantity_poultry_request, + total_weight_poultry_request, + len(kill_requests), + kill_request_quantity, + kill_request_weight, + len(has_code), + kill_request_quantity_has_code, + kill_request_weight_has_code, + len(hasnt_code), + kill_request_quantity_hasnt_code, + kill_request_weight_hasnt_code, + len(deffrent_bar), + kill_request_quantity_deffrent_bar, + kill_request_weight_deffrent_bar, + len(out_poultry_requests), + total_quantity_poultry_request_out, + total_weight_poultry_request_out, + index_weight_out, + ] + create_value(worksheet, list1, l, 1) + m += 1 + l += 1 + total_quantity = \ + poultry_hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_quantity_poultry_request = \ + poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight_poultry_request = \ + poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + kill_request_quantity = kill_requests.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight = kill_requests.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + has_code = kill_requests.filter(clearance_code__isnull=False) + kill_request_quantity_has_code = has_code.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_has_code = has_code.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + + deffrent_bar = kill_requests.filter( + ~Q(quantity=F('quarantine_quantity') + , quarantine_quantity__isnull=False)) + kill_request_quantity_deffrent_bar = deffrent_bar.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_deffrent_bar = deffrent_bar.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + hasnt_code = kill_requests.filter(clearance_code__isnull=True) + kill_request_quantity_hasnt_code = hasnt_code.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_request_weight_hasnt_code = hasnt_code.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + total_quantity_poultry_request_out = \ + out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight_poultry_request_out = \ + out_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + total_index_weight_poultry_request_out = \ + out_poultry_requests.aggregate(total=Sum('Index_weight'))[ + 'total'] or 0 + index_weight_out = round(total_index_weight_poultry_request_out / len(out_poultry_requests), 2) if len( + out_poultry_requests) > 0 else 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + total_quantity, + len(poultry_requests), + total_quantity_poultry_request, + total_weight_poultry_request, + '', + len(kill_requests), + kill_request_quantity, + kill_request_weight, + len(has_code), + kill_request_quantity_has_code, + kill_request_weight_has_code, + len(hasnt_code), + kill_request_quantity_hasnt_code, + kill_request_weight_hasnt_code, + len(deffrent_bar), + kill_request_quantity_deffrent_bar, + kill_request_weight_deffrent_bar, + len(out_poultry_requests), + total_quantity_poultry_request_out, + total_weight_poultry_request_out, + index_weight_out, + + ] + + create_value(worksheet, list2, l + 2, 1, color='green') + + value_header_list = [ + len(poultries), + total_quantity, + len(poultry_requests), + total_quantity_poultry_request, + total_weight_poultry_request, + len(kill_requests), + kill_request_quantity, + kill_request_weight, + len(has_code), + kill_request_quantity_has_code, + kill_request_weight_has_code, + len(hasnt_code), + kill_request_quantity_hasnt_code, + kill_request_weight_hasnt_code, + len(deffrent_bar), + kill_request_quantity_deffrent_bar, + kill_request_weight_deffrent_bar, + len(out_poultry_requests), + total_quantity_poultry_request_out, + total_weight_poultry_request_out, + index_weight_out, + ] + create_value(worksheet, value_header_list, 3, 3) + 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 \ No newline at end of file diff --git a/panel/VetFarm/helpers.py b/panel/VetFarm/helpers.py new file mode 100644 index 0000000..864aee9 --- /dev/null +++ b/panel/VetFarm/helpers.py @@ -0,0 +1,260 @@ +from django.db.models import Sum, F, Q + +from panel.KillHouse.helpers import get_difference_carcasses_percent +from panel.models import PoultryRequest, ProvinceKillRequest, KillHouse, KillHouseRequest, PercentageOfWageType, \ + WageType, SubSectorTransactions, BarDifferenceRequest + + +def get_vet_sub_sector_finance_info(vet,date1,date2): + total_quantity = 0 + total_weight = 0 + total_wage = 0 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', + trash=False).first().amount + + percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) + other_province_kill_request_percent = percentages_wage_type.filter( + wage_type__en_name='province-kill-request', share_type__en_name='other').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 + + other_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province', + share_type__en_name='other').first().percent / 100 + other_province_kill_request_amount = province_live_wage_amount * other_province_kill_request_percent + other_free_sell_carcasses_amount = free_sell_carcasses_wage_amount * other_free_sell_carcasses_percent + + other_out_poultry_request_amount = out_poultry_request_wage_amount * other_out_poultry_request_percent + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + if date1: + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False, vet_farm=vet, + send_date__date__gte=date1, + send_date__date__lte=date2) + 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, + province_request__poultry_request__vet_farm=vet, + clearance_code__isnull=False, + # clearance_code__isnull=False, + trash=False, calculate_status=True, kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ) + vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet=vet, date__date__gte=date1, + date__date__lte=date2) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted', acceptor_date__date__gte=date1, + acceptor_date__date__lte=date2) + else: + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False, vet_farm=vet, + ) + 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, + province_request__poultry_request__vet_farm=vet, + clearance_code__isnull=False, + # clearance_code__isnull=False, + trash=False, calculate_status=True + ) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted') + vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet=vet) + + # quarantine_code__isnull=False) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + # province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, trash=False, + # archive_wage=False, return_to_province=False, + # state__in=('pending', 'accepted'), + # province_request__poultry_request__vet_farm=vet, + # province_request__poultry_request__quarantine_code__isnull=False, + # + # first_car_allocated_quantity=0).order_by('id') + + # province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + # 'total'] or 0 + # province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + # 'total'] or 0 + province_live_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + province_live_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + province_live_weight += \ + difference_requests.aggregate(total=Sum('weight'))['total'] or 0 + total_quantity += province_live_quantity + out_province_poultry_request_quantity + total_weight += province_live_weight + out_province_poultry_request_weight + + province_carcasses_weight = province_live_weight * 0.75 + if date1: + internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent(date1,date2) + else: + internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent() + + external_pure_province_carcasses_weight = province_carcasses_weight - internal_pure_province_carcasses_weight + + total_pure_internal_province_carcasses_amount = internal_pure_province_carcasses_weight * other_province_kill_request_amount + total_pure_external_province_carcasses_amount = external_pure_province_carcasses_weight * other_free_sell_carcasses_amount + out_province_poultry_request_amount = out_province_poultry_request_weight * other_out_poultry_request_amount + + vet_deposit_amount = vet_deposit.aggregate(total=Sum('amount'))['total'] or 0 + total_wage += total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount + total_remain_wage = total_wage - vet_deposit_amount + + result = { + "total_quantity": total_quantity, + "total_weight": total_weight, + "out_province_poultry_request_quantity": out_province_poultry_request_quantity, + "out_province_poultry_request_weight": out_province_poultry_request_weight, + "province_live_quantity": province_live_quantity, + "province_live_weight": province_live_weight, + "province_carcasses_weight": province_carcasses_weight, + "internal_pure_province_carcasses_weight": internal_pure_province_carcasses_weight, + "external_pure_province_carcasses_weight": external_pure_province_carcasses_weight, + "total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount, + "total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount, + "out_province_poultry_request_amount": out_province_poultry_request_amount, + "total_wage": total_wage, + "number_of_deposit": len(vet_deposit), + "vet_deposit_amount": vet_deposit_amount, + "total_remain_wage": total_remain_wage, + } + return result + + +def get_vet_sub_sector_finance_info_with_date(vet,date1,date2): + total_quantity = 0 + total_weight = 0 + total_wage = 0 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', + trash=False).first().amount + + percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) + other_province_kill_request_percent = percentages_wage_type.filter( + wage_type__en_name='province-kill-request', share_type__en_name='other').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 + + other_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province', + share_type__en_name='other').first().percent / 100 + other_province_kill_request_amount = province_live_wage_amount * other_province_kill_request_percent + other_free_sell_carcasses_amount = free_sell_carcasses_wage_amount * other_free_sell_carcasses_percent + + other_out_poultry_request_amount = out_poultry_request_wage_amount * other_out_poultry_request_percent + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + if date1: + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False, vet_farm=vet, send_date__date__gte=date1, + send_date__date__lte=date2) + 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, + province_request__poultry_request__vet_farm=vet, + clearance_code__isnull=False, + # clearance_code__isnull=False, + trash=False, calculate_status=True, kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ) + vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet=vet, date__date__gte=date1, + date__date__lte=date2) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted',acceptor_date__date__gte=date1,acceptor_date__date__lte=date2) + else: + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False, vet_farm=vet, + ) + 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, + province_request__poultry_request__vet_farm=vet, + clearance_code__isnull=False, + # clearance_code__isnull=False, + trash=False, calculate_status=True + ) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted') + vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet=vet) + + # quarantine_code__isnull=False) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + # province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, trash=False, + # archive_wage=False, return_to_province=False, + # state__in=('pending', 'accepted'), + # province_request__poultry_request__vet_farm=vet, + # province_request__poultry_request__quarantine_code__isnull=False, + # + # first_car_allocated_quantity=0).order_by('id') + + + # province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + # 'total'] or 0 + # province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + # 'total'] or 0 + province_live_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + province_live_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + province_live_weight += \ + difference_requests.aggregate(total=Sum('weight'))['total'] or 0 + total_quantity += province_live_quantity + out_province_poultry_request_quantity + total_weight += province_live_weight + out_province_poultry_request_weight + + province_carcasses_weight = province_live_weight * 0.75 + internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent(date1,date2) + external_pure_province_carcasses_weight = province_carcasses_weight - internal_pure_province_carcasses_weight + + total_pure_internal_province_carcasses_amount = internal_pure_province_carcasses_weight * other_province_kill_request_amount + total_pure_external_province_carcasses_amount = external_pure_province_carcasses_weight * other_free_sell_carcasses_amount + out_province_poultry_request_amount = out_province_poultry_request_weight * other_out_poultry_request_amount + + vet_deposit_amount = vet_deposit.aggregate(total=Sum('amount'))['total'] or 0 + total_wage += total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount + total_remain_wage = total_wage - vet_deposit_amount + + result = { + "total_quantity": total_quantity, + "total_weight": total_weight, + "out_province_poultry_request_quantity": out_province_poultry_request_quantity, + "out_province_poultry_request_weight": out_province_poultry_request_weight, + "province_live_quantity": province_live_quantity, + "province_live_weight": province_live_weight, + "province_carcasses_weight": province_carcasses_weight, + "internal_pure_province_carcasses_weight": internal_pure_province_carcasses_weight, + "external_pure_province_carcasses_weight": external_pure_province_carcasses_weight, + "total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount, + "total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount, + "out_province_poultry_request_amount": out_province_poultry_request_amount, + "total_wage": total_wage, + "number_of_deposit": len(vet_deposit), + "vet_deposit_amount": vet_deposit_amount, + "total_remain_wage": total_remain_wage, + } + return result diff --git a/panel/VetFarm/serializers.py b/panel/VetFarm/serializers.py new file mode 100644 index 0000000..1bdabb4 --- /dev/null +++ b/panel/VetFarm/serializers.py @@ -0,0 +1,190 @@ +import datetime + +from rest_framework import serializers + +from authentication.serializer.serializer import SystemUserProfileForGuildSerializer +# سریالایزر مربوط به درخواست بورسی مرغدار +from authentication.serializers import SystemAddressSerializer +from panel.KillHouse.serializers import VetSerializer, VetForBarManagementSerializer +from panel.VetFarm.helpers import get_vet_sub_sector_finance_info, get_vet_sub_sector_finance_info_with_date +from panel.models import VetFarm, VetFarmInspection, PoultryHatching, Poultry, Vet +from panel.poultry.serializers import PoultrySerializer, PoultryHatchingSerializer + + +class VetFarmSerializer(serializers.ModelSerializer): + vet = VetSerializer(read_only=True) + poultry = PoultrySerializer(read_only=True) + inspection_info = serializers.SerializerMethodField('get_inspections') + hatching_quantity = serializers.SerializerMethodField('get_hatching_quantity') + + class Meta: + model = VetFarm + fields = '__all__' + + def get_inspections(self, instance): + inspections = len(VetFarmInspection.objects.filter(vet_farm=instance)) + hatching = PoultryHatching.objects.filter(poultry=instance.poultry, hall=int(instance.hall)).only( + 'quantity').last() + number_of_hatching = 0 + if hatching: + number_of_hatching = hatching.quantity + dict1 = {} + if inspections > 0: + dict1 = { + "number_of_inspections": inspections, + "number_of_hatching": number_of_hatching + } + return dict1 + + def get_hatching_quantity(self, instance): + quantity = 0 + poultry = Poultry.objects.get(key=instance.poultry.key) + poultry_hatching = PoultryHatching.objects.filter(poultry=poultry).only('left_over').last() + if poultry_hatching: + quantity = poultry_hatching.left_over + + return quantity + + +class VetForSubSectorSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = Vet + fields = ['key', 'user', 'wage_info'] + + def get_wage_info(self, obj): + if self.context.get('request').GET.get('date1'): + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + else: + date1=None + date2=None + return get_vet_sub_sector_finance_info(obj,date1,date2) + + +class VetForSubSectorTransactionSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = Vet + fields = ['key', 'user'] + + +class VetFarmInspectionSerializer(serializers.ModelSerializer): + vet_farm = VetFarmSerializer(read_only=True) + poultry_hatching = PoultryHatchingSerializer(read_only=True) + + class Meta: + model = VetFarmInspection + fields = '__all__' + + +class ManagementVetFarmSerializer(serializers.ModelSerializer): + # vet = VetSerializer(read_only=True) + poultry = PoultrySerializer(read_only=True) + inspection_info = serializers.SerializerMethodField('get_inspections') + hatching_quantity = serializers.SerializerMethodField('get_hatching_quantity') + + class Meta: + model = VetFarm + fields = '__all__' + + def get_inspections(self, instance): + inspections = len(VetFarmInspection.objects.filter(vet_farm=instance)) + hatching = PoultryHatching.objects.filter(poultry=instance.poultry, hall=int(instance.hall)).only( + 'quantity').last() + number_of_hatching = 0 + if hatching: + number_of_hatching = hatching.quantity + dict1 = {} + if inspections > 0: + dict1 = { + "number_of_inspections": inspections, + "number_of_hatching": number_of_hatching + } + return dict1 + + def get_hatching_quantity(self, instance): + quantity = 0 + poultry = Poultry.objects.get(key=instance.poultry.key) + poultry_hatching = PoultryHatching.objects.filter(poultry=poultry).only('left_over').last() + if poultry_hatching: + quantity = poultry_hatching.left_over + + return quantity + + +class PoultryForCityVetSerializer(serializers.ModelSerializer): + address = SystemAddressSerializer(read_only=True) + inspection_info = serializers.SerializerMethodField('get_inspections') + hatching_quantity = serializers.SerializerMethodField('get_hatching_quantity') + + class Meta: + model = Poultry + fields = ['key', 'unit_name', 'address', 'number_of_halls', 'breeding_unique_id', 'inspection_info', + 'hatching_quantity'] + + def get_inspections(self, instance): + inspections = len(VetFarmInspection.objects.filter(vet_farm__poultry=instance)) + hatching = PoultryHatching.objects.filter(poultry=instance, trash=False).only('quantity').last() + number_of_hatching = 0 + if hatching: + number_of_hatching = hatching.quantity + dict1 = {} + if inspections > 0: + dict1 = { + "number_of_inspections": inspections, + "number_of_hatching": number_of_hatching + } + return dict1 + + def get_hatching_quantity(self, instance): + total_quantity = 0 + left_over = 0 + vet_farm_losses = 0 + union_losses = 0 + period = None + hatching_key = None + poultry_hatching = PoultryHatching.objects.filter(poultry=instance, allow_hatching='pending', state='pending', + archive=False, violation=False, trash=False).last() + if poultry_hatching: + total_quantity = poultry_hatching.quantity + left_over = poultry_hatching.left_over + vet_farm_losses = poultry_hatching.losses + union_losses = poultry_hatching.direct_losses + period = poultry_hatching.period + hatching_key = poultry_hatching.key + + return { + "total_quantity": total_quantity, + "left_over": left_over, + "vet_farm_losses": vet_farm_losses, + "union_losses": union_losses, + "period": period, + "total_losses": union_losses + vet_farm_losses, + "hatching_key": hatching_key, + } + + +class VetForSubSectorSerializerForExcel(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + wage_info = serializers.SerializerMethodField('get_wage_info') + + class Meta: + model = Vet + fields = ['key', 'user', 'wage_info'] + + def get_wage_info(self, obj): + if self.context.get('request').GET['date1']: + date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']), + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']), + '%Y-%m-%d').date() + else: + date1=None + date2=None + return get_vet_sub_sector_finance_info_with_date(obj,date1,date2) \ No newline at end of file diff --git a/panel/VetFarm/views.py b/panel/VetFarm/views.py new file mode 100644 index 0000000..1b8f69a --- /dev/null +++ b/panel/VetFarm/views.py @@ -0,0 +1,452 @@ +import datetime + +from django.db.models import Prefetch, Q, Sum, F +from django.http import QueryDict +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework import viewsets +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, +) +from rest_framework.pagination import PageNumberPagination +from rest_framework.permissions import AllowAny + +from ticket.helper import send_image_to_server +from authentication.helper.refresh import refresh +from authentication.models import SystemUserProfile +from panel.KillHouse.helpers import get_difference_carcasses_percent +from panel.ReportingPanel.filterset import ProfileFilterSet, ManagementVetFarmFilterSet, PoultryFilterSet +from panel.VetFarm.serializers import VetFarmSerializer, VetFarmInspectionSerializer, ManagementVetFarmSerializer, \ + PoultryForCityVetSerializer, VetForSubSectorSerializer, VetForSubSectorTransactionSerializer +from rest_framework.response import Response +from rest_framework import status +import string +import random +import os + +ARVAN_Vet_Farm_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' +# ARVAN_Vet_Farm_URL = 'https://vet-farm.s3.ir-thr-at1.arvanstorage.ir/' + +from panel.models import VetFarm, Poultry, PoultryHatching, Vet, VetFarmInspection, PoultryRequest, KillHouseRequest, \ + PercentageOfWageType, WageType, KillHouse, SubSectorTransactions, BarDifferenceRequest + + +# ویوست مربوط به ثبت و نمایش و ... دامپزشک فارم +class VetFarmViewSet(viewsets.ModelViewSet): + queryset = VetFarm.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = VetFarmSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + + user = SystemUserProfile.objects.get(user=request.user) + if 'vet_key' in request.data.keys(): + vet = Vet.objects.get(key=request.data['vet_key']) + request.data.pop('vet_key') + else: + vet = Vet.objects.get(user=user) + poultry = Poultry.objects.get(key=request.data['poultry_key']) + request.data.pop('poultry_key') + halls = request.data['halls'] + request.data.pop('halls') + # vet_farm = VetFarm.objects.filter(poultry=poultry, hall=int(request.data['hall'])) + # if vet_farm.count() > 0: + # vet_farm = vet_farm.last() + # if vet_farm.vet.id == vet.id: + # return Response({"result": "object exist"}, status=status.HTTP_403_FORBIDDEN) + # else: + # pass + for hall in halls: + vet_farm = VetFarm( + vet=vet, + poultry=poultry, + hall=int(hall), + ) + vet_farm.save() + return Response({"result": "created"}, status=status.HTTP_201_CREATED) + + # serializer = self.serializer_class(data=request.data) + # if serializer.is_valid(): + # vetfarm = serializer.create(validated_data=request.data) + # vetfarm.vet = vet + # vetfarm.poultry = poultry + # vetfarm.save() + # return Response(serializer.data, status=status.HTTP_201_CREATED) + # return Response(serializer.errors) + + # تابع مربوط به نمایش دوره جوجه ریزی مرغدار + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + # list of self poultry houses + user = SystemUserProfile.objects.get(user=request.user) + vet = Vet.objects.get(user=user) + vet_farm = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry', 'vet') + serializer = VetFarmSerializer(vet_farm, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + try: + vet_farm = VetFarm.objects.get(key=request.GET["vet_farm_key"]) + # if VetFarmInspection.objects.filter(vet_farm=vet_farm).exists(): + # return Response({"result": "object can not delete"}, status=status.HTTP_403_FORBIDDEN) + vet_farm.trash = True + vet_farm.save() + return Response({"result": "object deleted"}, status=status.HTTP_200_OK) + except: + return Response({"result": "مشکلی پیش آمده است !"}, status=status.HTTP_403_FORBIDDEN) + + +class TotalVetSubSectorWageDashboardViewSet(viewsets.ModelViewSet): + queryset = Vet.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = VetForSubSectorSerializer + + def list(self, request, *args, **kwargs): + + total_quantity = 0 + total_weight = 0 + total_wage = 0 + total_wage_type = WageType.objects.filter(trash=False) + province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount + free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount + out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', + trash=False).first().amount + + percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) + other_province_kill_request_percent = percentages_wage_type.filter( + wage_type__en_name='province-kill-request', share_type__en_name='other').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 + + other_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province', + share_type__en_name='other').first().percent / 100 + other_province_kill_request_amount = province_live_wage_amount * other_province_kill_request_percent + other_free_sell_carcasses_amount = free_sell_carcasses_wage_amount * other_free_sell_carcasses_percent + + other_out_poultry_request_amount = out_poultry_request_wage_amount * other_out_poultry_request_percent + + kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False, vet_farm__isnull=False, + send_date__date__gte=date1, + send_date__date__lte=date2 + ) + 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, + province_request__poultry_request__vet_farm__isnull=False, + # clearance_code__isnull=False, + clearance_code__isnull=False, + trash=False, calculate_status=True, kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ) + vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet__isnull=False, date__date__gte=date1, + date__date__lte=date2) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted',acceptor_date__date__gte=date1, + acceptor_date__date__lte=date2) + else: + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, temporary_trash=False, + wage_pay=True, has_wage=True, + temporary_deleted=False, vet_farm__isnull=False, + ) + 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, + province_request__poultry_request__vet_farm__isnull=False, + # clearance_code__isnull=False, + clearance_code__isnull=False, + trash=False, calculate_status=True + ) + difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, + state='accepted') + vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet__isnull=False) + # quarantine_code__isnull=False) + out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + + + province_live_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + province_live_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + + province_live_weight += \ + difference_requests.aggregate(total=Sum('weight'))['total'] or 0 + total_quantity += province_live_quantity + out_province_poultry_request_quantity + total_weight += province_live_weight + out_province_poultry_request_weight + + province_carcasses_weight = province_live_weight * 0.75 + if 'date1' in request.GET: + internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent(date1,date2) + else: + internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent() + + external_pure_province_carcasses_weight = province_carcasses_weight - internal_pure_province_carcasses_weight + + total_pure_internal_province_carcasses_amount = internal_pure_province_carcasses_weight * other_province_kill_request_amount + total_pure_external_province_carcasses_amount = external_pure_province_carcasses_weight * other_free_sell_carcasses_amount + out_province_poultry_request_amount = out_province_poultry_request_weight * other_out_poultry_request_amount + + + vet_deposit_amount = vet_deposit.aggregate(total=Sum('amount'))['total'] or 0 + total_wage += total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount + total_remain_wage = total_wage - vet_deposit_amount + + result = { + "total_quantity": total_quantity, + "total_weight": total_weight, + "out_province_poultry_request_quantity": out_province_poultry_request_quantity, + "out_province_poultry_request_weight": out_province_poultry_request_weight, + "province_live_quantity": province_live_quantity, + "province_live_weight": province_live_weight, + "province_carcasses_weight": province_carcasses_weight, + "internal_pure_province_carcasses_weight": internal_pure_province_carcasses_weight, + "external_pure_province_carcasses_weight": external_pure_province_carcasses_weight, + "total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount, + "total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount, + "out_province_poultry_request_amount": out_province_poultry_request_amount, + "total_wage": total_wage, + "number_of_deposit": len(vet_deposit), + "vet_deposit_amount": vet_deposit_amount, + "total_remain_wage": total_remain_wage, + } + + return Response(result, status=status.HTTP_200_OK) + + +class VetForSubSectorViewSet(viewsets.ModelViewSet): + queryset = Vet.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = VetForSubSectorSerializer + + # تابع مربوط به نمایش دوره جوجه ریزی مرغدار + def list(self, request, *args, **kwargs): + vet = Vet.objects.filter(pk__in=VetFarm.objects.all().values_list('vet', flat=True), trash=False).order_by('id') + serializer = self.serializer_class(vet, many=True,context={'request':request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + try: + vet_farm = VetFarm.objects.get(key=request.GET["vet_farm_key"]) + # if VetFarmInspection.objects.filter(vet_farm=vet_farm).exists(): + # return Response({"result": "object can not delete"}, status=status.HTTP_403_FORBIDDEN) + vet_farm.trash = True + vet_farm.save() + return Response({"result": "object deleted"}, status=status.HTTP_200_OK) + except: + return Response({"result": "مشکلی پیش آمده است !"}, status=status.HTTP_403_FORBIDDEN) + + +class VetForSubSectorTransactionViewSet(viewsets.ModelViewSet): + queryset = Vet.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = VetForSubSectorTransactionSerializer + + def list(self, request, *args, **kwargs): + vet = Vet.objects.filter(pk__in=VetFarm.objects.all().values_list('vet', flat=True), trash=False).order_by('id') + serializer = self.serializer_class(vet, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به ثبت و نمایش و ... دامپزشک فارم +class VetFarmInspectionViewSet(viewsets.ModelViewSet): + queryset = VetFarmInspection.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = VetFarmInspectionSerializer + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + vet = Vet.objects.get(user=user) + image_list = [] + vet_farm = VetFarm.objects.get(key=request.data['key']) + request.data.pop('key') + try: + poultry_hatching = PoultryHatching.objects.get(key=request.data['poultry_hatching_key']) + request.data.pop('poultry_hatching_key') + except: + poultry_hatching = None + try: + images = request.data['image'] + request.data.pop('image') + except: + images = None + if poultry_hatching != None: + if PoultryRequest.objects.filter(hatching=poultry_hatching, hatching__left_over=0, + hatching__allow_hatching='pending', hatching__state='pending').exists(): + return Response({"result": "باقی مانده موجود در سالن صفر میباشد."}, + status=status.HTTP_406_NOT_ACCEPTABLE) + today = datetime.datetime.now().date() + inspections = VetFarmInspection.objects.filter(vet_farm__vet=vet, state='pending', create_date__year=today.year, + create_date__month=today.month, create_date__day=today.day) + if inspections.count() > 0: + inspection = inspections.last() + if poultry_hatching != None: + if inspection.poultry_hatching.poultry.id != poultry_hatching.poultry.id: + return Response({"result": "can not register"}, status=status.HTTP_403_FORBIDDEN) + elif inspection.poultry_hatching.poultry.id == poultry_hatching.poultry.id and inspection.poultry_hatching.hall == int( + request.data['hall']): + return Response({"result": "can not register"}, status=status.HTTP_400_BAD_REQUEST) + elif poultry_hatching == None: + if inspection.vet_farm.poultry != vet_farm.poultry: + return Response({"result": "can not register"}, status=status.HTTP_403_FORBIDDEN) + elif inspection.vet_farm.hall == int(request.data['hall']): + return Response({"result": "can not register"}, status=status.HTTP_400_BAD_REQUEST) + + # + # else: + # for inspect in inspections: + # if inspect.hall == int(request.data['hall']): + # return Response({"result": "can not register"}, status=status.HTTP_403_FORBIDDEN) + # else: + # pass + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + vet_farm_inspection = serializer.create(validated_data=request.data) + vet_farm_inspection.vet_farm = vet_farm + if images != None: + for image in images: + image_list.append(send_image_to_server(image)) + + vet_farm_inspection.image = image_list + if poultry_hatching != None: + if int(vet_farm_inspection.Losses) > 0: + vet_farm.vetfarm_losses += int(vet_farm_inspection.Losses) + vet_farm.save() + if poultry_hatching.losses != 0: + poultry_hatching.losses = poultry_hatching.losses + int(vet_farm_inspection.Losses) + poultry_hatching.left_over = poultry_hatching.left_over - int(vet_farm_inspection.Losses) + else: + poultry_hatching.losses = vet_farm_inspection.Losses + poultry_hatching.left_over = poultry_hatching.quantity - int(vet_farm_inspection.Losses) + poultry_hatching.save() + vet_farm_inspection.poultry_hatching = poultry_hatching + vet_farm_inspection.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + if 'key' in request.GET: + vet_farm_inspection = VetFarmInspection.objects.filter(vet_farm__key=request.GET['key']) + serializer = VetFarmInspectionSerializer(vet_farm_inspection, many=True) + elif 'poultry_key' in request.GET: + if 'hall' in request.GET: + vet_farm_inspection = VetFarmInspection.objects.filter( + vet_farm__poultry__key=request.GET['poultry_key'], hall=int(request.GET['hall'])) + if vet_farm_inspection.count() == 0: + vet_farm_inspection = [] + serializer = VetFarmInspectionSerializer(vet_farm_inspection, many=True) + + else: + user = SystemUserProfile.objects.get(user=request.user) + vet = Vet.objects.get(userprofile=user) + vet_farm_inspection = VetFarmInspection.objects.filter(vet_farm__vet=vet) + serializer = VetFarmInspectionSerializer(vet_farm_inspection, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CustomPagination(PageNumberPagination): + page_size = 10 + + +class ManagementVetFarmViewSet(viewsets.ModelViewSet): + queryset = VetFarm.objects.all() + permission_classes = [AllowAny] + serializer_class = ManagementVetFarmSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ManagementVetFarmFilterSet + poultry_filterset_class = PoultryFilterSet + filterset_fields = [ + 'poultry__user__mobile', + 'poultry__unit_name', + 'poultry__address__city__name', + + ] + poultry_filterset_fields = [ + 'user__mobile', + 'unit_name', + 'address__city__name', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + if request.GET['role'] == 'VetFarm': + vet = Vet.objects.get(user=user) + vet_farm = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry', 'vet') + vet_farm_list = [] + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=vet_farm + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=vet_farm) + vet_farm_list = ps.filter() + vet_farm = [] if len(vet_farm_list) == 0 else vet_farm_list + page_size = request.query_params.get('page_size', None) + + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(vet_farm) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = ManagementVetFarmSerializer(vet_farm, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + else: + poultries = Poultry.objects.filter( + pk__in=PoultryHatching.objects.filter(trash=False, allow_hatching='pending', state='pending', + archive=False).values_list('poultry__id', flat=True), + address__city=user.city) + poultries_list = [] + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.poultry_filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.poultry_filterset_class( + data=query, + queryset=poultries + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=poultries) + poultries_list = ps.filter() + poultries = [] if len(poultries_list) == 0 else poultries_list + page_size = request.query_params.get('page_size', None) + + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultries) + if page is not None: + serializer = PoultryForCityVetSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = PoultryForCityVetSerializer(poultries, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) diff --git a/panel/__init__.py b/panel/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/admin.py b/panel/admin.py new file mode 100644 index 0000000..273059b --- /dev/null +++ b/panel/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin + +# Register your models here. +PROJECT_API_KEY = '22d14a14-bd14-1414-a03f-2cc1cbf5e1d1' diff --git a/panel/apps.py b/panel/apps.py new file mode 100644 index 0000000..2f860e5 --- /dev/null +++ b/panel/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PanelConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'panel' diff --git a/panel/convert_date.py b/panel/convert_date.py new file mode 100644 index 0000000..31d74fd --- /dev/null +++ b/panel/convert_date.py @@ -0,0 +1,80 @@ +import datetime +import jdatetime + + +def convert_to_shamsi(year=None, month=None, day=None,datetime=None,date=None,in_value=None): + if datetime is not None: + date = jdatetime.datetime.fromgregorian(year=year, month=month, day=day,datetime=datetime).strftime("%Y-%m-%d (%H:%M)") + if in_value and date is not None: + if "(" in date: # اگر زمان وجود دارد + date_part, time_part = date.split(" (") + parts = date_part.split("-") + reversed_date = "-".join(reversed(parts)) + date = f"{reversed_date} ({time_part}" + else: + parts = date.split("-") + reversed_date = "-".join(reversed(parts)) + date = reversed_date + elif date: + date = jdatetime.datetime.fromgregorian(date=date).strftime( + "%Y-%m-%d") + else: + date = jdatetime.datetime.fromgregorian(year=int(year), month=int(month), day=int(day), datetime=datetime).strftime( + "%Y-%m-%d") + return date + + +def convert_to_miladi(year=None, month=None, day=None): + date = jdatetime.datetime(year, month, day).togregorian() + return date + + +def get_month_start_end_dates(period_type): + today = jdatetime.date.today() + + day_of_month = today.day + + # Function to convert Jalali date to Gregorian date + def to_gregorian(jalali_date): + return jalali_date.togregorian() + + # Function to get start and end dates for a given Jalali month + def get_start_end_of_month(jalali_date): + start_of_month = jdatetime.date(jalali_date.year, jalali_date.month, 1) + # Calculate the end of the month + if jalali_date.month == 12: + end_of_month = jdatetime.date(jalali_date.year + 1, 1, 1) - jdatetime.timedelta(days=1) + else: + end_of_month = jdatetime.date(jalali_date.year, jalali_date.month + 1, 1) - jdatetime.timedelta(days=1) + return to_gregorian(start_of_month), to_gregorian(end_of_month) + + # Helper function to get the previous month in Jalali calendar + def get_previous_month(jalali_date): + if jalali_date.month == 1: + return jdatetime.date(jalali_date.year - 1, 12, jalali_date.day) + else: + return jdatetime.date(jalali_date.year, jalali_date.month - 1, jalali_date.day) + + # Determine the months to consider based on the period type and current day + months_to_consider = 1 if period_type == 'oneMonth' else 3 if period_type == 'threeMonths' else 6 if period_type == 'sixMonths' else 12 + + # List to hold the start and end dates + start_end_dates = [] + + if day_of_month >= 30: + # Include the current month if today is the 30th or 31st + for _ in range(months_to_consider): + start, end = get_start_end_of_month(today) + start_end_dates.append({"start_date": start, "end_date": end}) + today = get_previous_month(today) + else: + # Exclude the current month if today is less than the 30th + today = get_previous_month(today) + for _ in range(months_to_consider): + start, end = get_start_end_of_month(today) + start_end_dates.append({"start_date": start, "end_date": end}) + today = get_previous_month(today) + + return start_end_dates[::-1] # Reverse to get chronological order + + diff --git a/panel/excel_processing.py b/panel/excel_processing.py new file mode 100644 index 0000000..d8158eb --- /dev/null +++ b/panel/excel_processing.py @@ -0,0 +1,38244 @@ +import hashlib +import uuid +import random +import cryptocode +import requests +import jdatetime +import datetime +import openpyxl + +from django.http import HttpResponse +from django.utils import timezone +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from django.db.models import Q, Sum +from datetime import timedelta + +from oauth2_provider.models import AccessToken + +from general_urls import base_url_for_sms_report +from panel.filterset import \ + PoultryRequestFilterSet, KillRequestFilterSet, GuildsFilterSet, ProvinceKillRequestNewFilterSet, \ + KillHouseRequestFilterSet, ChainAllocationFilterSet +from django.db import models + +from django.db.models import F, Count + +from panel.admin import PROJECT_API_KEY +from rest_framework.decorators import permission_classes, api_view +from .convert_date import convert_to_miladi, convert_to_shamsi +from django.views.decorators.csrf import csrf_exempt +from django.http import JsonResponse, QueryDict +from rest_framework.permissions import AllowAny + +from .helper import build_query +from .helper_excel import shamsi_date, create_header, excel_description, create_header_freez, create_value, \ + percent_of_losses, start_excel, close_excel, convert_str_to_date +from .models import Poultry, PoultryHatching, PoultryRequest, ProvinceKillRequest, KillHouseRequest, VetFarm, \ + KillRequest, KillHouseVet, KillHouseAssignmentInformation, VetCheckRequest, \ + ProvinceFactorToKillHouse, ProvinceCheckOperatorRequest, KillHouseFactorToProvince, KillHouseWareHouse, \ + KillHouseFreeBarInformation, Guilds, Wallet, Steward, StewardAllocation, KillHouseOperator, KillHousePercentage, \ + CityOperator, KillHouseDriver, \ + ProvinceOperator, POSMachine, StewardWareHouse, Vet, WagePayment, ChainCompany, ReportsUsers, \ + PoultryRequestQuarantineCode, ChainAllocation +from authentication.models import ( + UserProfile, + User, + BankCard, + SystemUserProfile, + SystemAddress, + City, + Province, ExternalTransaction +) + +from .models import ( + KillHouse, + KillHouseADDCAR +) +from django.contrib.auth.models import Group +from rest_framework.response import Response +from authentication.models import Address +from django.shortcuts import get_object_or_404 + +ARTA_REGISTER = "https://userbackend.rasadyar.com/api/register_all/" + + +# تابع برای ثبت اطلاعات مرغداران از سامانه سماسط +@api_view(["POST"]) +@csrf_exempt +@permission_classes([AllowAny]) +def user_excel(request): + file = request.FILES['file'].read() + read = openpyxl.load_workbook(BytesIO(file), data_only=True) + sheet = read.active + group = Group.objects.get(id=1) + password = '00100' + hashed_password = hashlib.sha256(str(password).encode()).hexdigest() + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i <= 1: + continue + if row[3] is not None: + last_name = row[3] + else: + last_name = '' + + first_name = row[2] + mobile = "0" + str(row[4]) + system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).exists() + if not system_profile: + data = { + "username": mobile, + "first_name": first_name, + "last_name": last_name, + "password": hashed_password, + "national_code": '0', + "role": "Poultry", + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User.objects.filter(username=mobile).first() + if not user: + user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=mobile, + first_name=str(first_name), + last_name=str(last_name), + fullname=str(first_name) + ' ' + str(last_name), + user=user, + base_order=base_id, + password=password, + birthday=str(datetime.datetime.now().date()), + ) + system_profile.save() + system_profile.role.add(group) + wallet = Wallet() + wallet.save() + poultry = Poultry( + unit_name=row[7], + system_code=row[10], + epidemiological_code=row[9], + breeding_unique_id=row[11], + unit_status=row[13], + samasat_user_code=row[0], + ) + address = SystemAddress() + address.save() + poultry.address = address + poultry.user = system_profile + poultry.wallet = wallet + poultry.save() + # send_sms(userprofile.mobile, rand) + return JsonResponse({"Msg": "Done"}) + + +# تابع برای آپدیت اطلاعات ثبت شذه مرغداران از سامانه سماسط +@api_view(["POST"]) +@csrf_exempt +@permission_classes([AllowAny]) +def user_excel_update(request): + file = request.FILES['file'].read() + read = openpyxl.load_workbook(filename=BytesIO(file), data_only=True) + sheet = read.active + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i == 0: + continue + if row[6] is not None: + if Poultry.objects.filter(breeding_unique_id=row[6]).exists(): + poultry = Poultry.objects.get(breeding_unique_id=row[6]) + poultry.total_capacity = row[9] + poultry.save() + poultry.fullname = row[8] + poultry.unit_name = row[7] + poultry.operating_licence_capacity = 0 + poultry.system_code = row[3] + poultry.epidemiological_code = row[5] + poultry.breeding_unique_id = row[6] + poultry.licence_number = row[10] + poultry.health_certificate_number = row[11] + poultry.number_of_requests = row[12] + poultry.number_of_incubators = row[15] + poultry.herd_age_by_day = row[16] + poultry.herd_age_by_week = row[17] + poultry.number_of_party = row[18] + poultry.communication_type = row[19] + poultry.cooperative = "" + poultry.save() + if row[13] != 'تاریخ جوجه ریزی': + date_of_incubators = row[13] + date_incube = date_of_incubators.split('/') + date = convert_to_miladi( + year=int(date_incube[0]), + month=int(date_incube[1]), + day=int(date_incube[2]) + ) + poultry.incubation_date = date + if row[14] != 'تاریخ آخرین پارتی': + last_party_date = row[14].split('/') + party_date = convert_to_miladi( + year=int(last_party_date[0]), + month=int(last_party_date[1]), + day=int(last_party_date[2]) + ) + poultry.last_party_date = party_date + if row[1] != 'استان' and row[2] != 'شهر': + if not Province.objects.filter(name=row[1]).exists(): + province = Province(name=row[1]) + province.save() + else: + province = Province.objects.get(name=row[1]) + + if not City.objects.filter(name=row[2]).exists(): + city = City(name=row[2]) + city.save() + else: + city = City.objects.get(name=row[2]) + + # if poultry.address.city != row[2] and poultry.address.province != row[1]: + poultry.address.city = city + poultry.address.province = province + poultry.address.save() + poultry.user.province = province + poultry.user.city = city + poultry.user.save() + poultry.save() + return JsonResponse({"msg": "Done"}) + + +# تابع برای ثبت نام کاربر درون سیستم +# @api_view(["POST"]) +# @csrf_exempt +# @permission_classes([AllowAny]) +# def test_register(request): +# # last_user = UserProfile.objects.all().last().base_orde + 1 +# last_user = UserProfile.objects.all() +# if len(last_user) > 0: +# last_user = last_user.last().base_order + 1 +# else: +# last_user = 1000 +# rand = random.randint(100000, 999000) +# str_rand = str(rand) +# password = cryptocode.encrypt(str_rand, str_rand) +# first = "آقای" +# mobile = "09121196753" +# last = "امیدی" +# userprofile = UserProfile( +# key=uuid.uuid4(), +# company="", +# fullname=first + " " + last, +# first_name=first, +# last_name=last, +# natinal_id="", +# mobile=mobile, +# birthday="", +# image="", +# state="", +# unit_name="", +# gis_code="", +# operating_licence_capacity=0, +# number_of_halls=0, +# tenant="", +# person_type="", +# economic_code="", +# system_code="", +# epidemiological_code="", +# breeding_unique_id="", +# total_capacity=0, +# licence_number="", +# health_certificate_number="", +# number_of_requests=0, +# number_of_incubators=0, +# herd_age_by_day=0, +# herd_age_by_week=0, +# number_of_party=0, +# communication_type="", +# cooperative="", +# unit_status="", +# samasat_user_code="", +# base_order=last_user, +# password=str_rand +# ) +# userprofile.save() +# user = User( +# first_name=first, +# username=userprofile.key, +# password=password, +# ) +# user.save() +# userprofile.user = user +# userprofile.save() +# # send_sms(mobile, rand) +# return Response("ok") + + +# تابع برای ثبت کستارگاه ار لیست اکسل +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def upload_kill_house(request): + last_user = UserProfile.objects.all() + if len(last_user) > 0: + last_user = last_user.last().base_order + 1 + else: + last_user = 1000 + rand = random.randint(100000, 999000) + str_rand = str(rand) + password = cryptocode.encrypt(str_rand, str_rand) + role = Group.objects.get(id=4) + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i == 0: + continue + [name, family, mobile, national_id, kill_hose, province, city, address, capocity, phone, name_of_bank_user, + bank_name, shaba, + account, card + ] = row + userprofile = UserProfile( + key=uuid.uuid4(), + fullname=name + " " + family, + first_name=name, + last_name=family, + mobile=str(mobile), + natinal_id=national_id + ) + userprofile.save() + user = User( + first_name=rand, + last_name=family, + username=mobile, + password=password, + ) + user.save() + address = Address(province=province, city=city, address=address) + address.save() + userprofile.user = user + userprofile.role = role + userprofile.address = address + userprofile.base_order = last_user + userprofile.save() + kill__house = KillHouse(user=userprofile, address=address, capacity=capocity, name=kill_hose, phone=phone) + kill__house.save() + bank = BankCard(name_of_bank_user=name_of_bank_user, bank_name=bank_name, card=str(card), shaba=str(shaba), + account=str(account)) + bank.save() + userprofile.user_bank_info = bank + userprofile.save() + + return Response(200) + + +# تابع برای ثبت ماشین های کستارگاه برای کشتارگاه های ثبت شده ار لیست اکسل +# @api_view(["POST"]) +# @permission_classes([TokenHasReadWriteScope]) +# @csrf_exempt +# def upload_kill_house_cars(request): +# file = request.FILES['file'].read() +# wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) +# sheet = wb_obj.active +# for i, row in enumerate(sheet.iter_rows(values_only=True)): +# if i == 0: +# continue +# [kill_house_name, national_id, driver_name, driver_mobile, type_car, type_weight, pelak, capacity, +# weight_without_load, +# health_code +# ] = row +# user = UserProfile.objects.filter(natinal_id=str(national_id)) +# id = user[0].id +# userprofile = UserProfile.objects.get(id=id) +# kill_house = KillHouse.objects.get(user=userprofile, name=kill_house_name) +# car_dict2 = {} +# if kill_house.car == None: +# kill_house.car = [] +# kill_house.save() +# car_list1 = list(kill_house.car) +# add_car = KillHouseADDCAR( +# kill_house=kill_house, +# driver_name=driver_name, +# driver_mobile=driver_mobile, +# type_car=type_car, +# type_weight=type_weight, +# pelak=pelak, +# capocity=capacity, +# weight_without_load=weight_without_load, +# health_code=health_code +# +# ) +# add_car.save() +# car_dict2.update( +# {"driver_name": add_car.driver_name, +# "driver_mobile": add_car.driver_mobile, "pelak": add_car.pelak, +# "quantity": add_car.capocity, +# "type_car": add_car.type_car, "health_code": add_car.health_code}) +# car_list1.append(car_dict2) +# kill_house.car = car_list1 +# kill_house.save() +# +# return Response(200) + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def find_password(request): + user = UserProfile.objects.get(mobile=request.data['mobile']) + decrypted_password = cryptocode.decrypt(user.user.password, user.user.password) + return HttpResponse(decrypted_password) + + +# تابع برای ارسال اطلاعات برای مرغدار +# @api_view(["POST"]) +# @csrf_exempt +# @permission_classes([AllowAny]) +# def send_info_poultry(request): +# users = UserProfile.objects.filter(role_id=1).order_by('id') +# for user in users: +# mobile = user.mobile +# password = user.password +# send_sms(mobile, password) +# return Response({"result": "done!"}, status=status.HTTP_200_OK) + + +# تابع برای ارسال اطلاعات برای کشتارگاه +# @api_view(["POST"]) +# @csrf_exempt +# @permission_classes([AllowAny]) +# def send_info_kill_house(request): +# users = UserProfile.objects.filter(role_id=4).order_by('id') +# for user in users: +# mobile = user.mobile +# password = user.password +# send_sms_kill_house(mobile, password) +# return Response({"result": "done!"}, status=status.HTTP_200_OK) + + +# تابع برای ارسال اطلاعات برای شهرستان +# @api_view(["POST"]) +# @csrf_exempt +# @permission_classes([AllowAny]) +# def send_info_city(request): +# users = UserProfile.objects.filter(role_id=2).order_by('id') +# for user in users: +# mobile = user.mobile +# password = user.password +# send_sms_city(mobile, password) +# return Response({"result": "done!"}, status=status.HTTP_200_OK) + + +# +# def poultry(request): +# list2 = [] +# users = SystemUserProfile.objects.filter(role__name='Poultry', trash=False).order_by('create_date') +# for user in users: +# list2.append(user) +# +# excel_options = ['نام و نام خانوادگی', 'شماره همراه' +# ] +# output = BytesIO() +# workbook = xlsxwriter.Workbook(output) +# worksheet = workbook.add_worksheet() +# for count in range(len(excel_options)): +# worksheet.write(0, count, excel_options[count]) +# l = 0 +# for user in users: +# l += 1 +# +# list1 = [user.fullname, user.mobile] +# for item in range(len(list1)): +# worksheet.write(l, item, list1[item]) +# +# list1 = [] +# +# workbook.close() +# output.seek(0) +# +# response = HttpResponse(content_type='application/vnd.ms-excel') +# +# response['Content-Disposition'] = 'attachment;filename="Reporting.xlsx"' +# response.write(output.getvalue()) +# +# return response + + +# def hatching_report_excel(request): +# hatching_list = [] +# today = datetime.now().date() +# if 'age' in request.GET: +# hatchings = PoultryHatching.objects.filter(trash=False) +# input_age = int(request.GET['age']) +# if hatchings.count() > 0: +# for hatching in hatchings: +# age = (today - hatching.date.date()).days + 1 +# if int(age) == input_age: +# hatching_list.append(hatching) +# +# excel_options = [ +# 'نام و نام خانوادگی', +# 'تاریخ جوجه ریزی', +# 'سن مرغ', +# 'تعداد جوجه ریزی', +# 'تعداد باقی مانده', +# 'شماره همراه', +# 'استان', +# 'شهرستان', +# ] +# output = BytesIO() +# workbook = xlsxwriter.Workbook(output, {'strings_to_numbers': True}) +# worksheet = workbook.add_worksheet() +# +# # Set the cell format for right alignment +# right_align_format = workbook.add_format({'align': 'right'}) +# +# # Adjust the column width in reverse order +# for count, option in enumerate(reversed(excel_options)): +# worksheet.write(0, count, option) +# worksheet.set_column(count, count, None, right_align_format) +# +# l = 0 +# for hatch in hatching_list: +# l += 1 +# age = (today - hatch.date.date()).days + 1 +# gregorian_date = jdatetime.date.fromgregorian( +# day=hatch.date.day, +# month=hatch.date.month, +# year=hatch.date.year +# ) +# incubation_date = gregorian_date +# +# list1 = [ +# hatch.poultry.user.fullname, +# str(incubation_date), +# str(age), +# hatch.quantity, +# hatch.left_over, +# hatch.poultry.user.mobile, +# hatch.poultry.address.province.name, +# hatch.poultry.address.city.name, +# ] +# for item in range(len(list1)): +# worksheet.write(l, item, list1[item]) +# list1 = [] +# workbook.close() +# output.seek(0) +# +# response = HttpResponse(content_type='application/vnd.ms-excel') +# response['Content-Disposition'] = 'attachment;filename="Reporting.xlsx"' +# response.write(output.getvalue()) +# +# return response + + +# def hatching_report_excel(request): +# hatching_list = [] +# today = datetime.now().date() +# if 'age' in request.GET: +# hatchings = PoultryHatching.objects.filter(trash=False) +# input_age = int(request.GET['age']) +# if hatchings.count() > 0: +# for hatching in hatchings: +# age = (today - hatching.date.date()).days + 1 +# if int(age) == input_age: +# hatching_list.append(hatching) +# +# excel_options = [ +# 'نام و نام خانوادگی', +# 'تاریخ جوجه ریزی', +# 'سن مرغ', +# 'تعداد جوجه ریزی', +# 'تعداد باقی مانده', +# 'شماره همراه', +# 'استان', +# 'شهرستان', +# ] +# output = BytesIO() +# workbook = Workbook() +# worksheet = workbook.active +# +# # Set the right-to-left direction +# worksheet.sheet_view.rightToLeft = True +# +# # Set the fill color for the first row +# yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid") +# for col_num, option in enumerate(excel_options, 1): +# col_letter = get_column_letter(col_num) +# cell = worksheet.cell(row=1, column=col_num, value=option) +# cell.alignment = Alignment(horizontal='center') +# cell.fill = yellow_fill +# +# # Set the font size for the first row +# cell.font = Font(size=12, bold=True) +# +# # Set the width of the column +# worksheet.column_dimensions[col_letter].width = 20.01 +# +# l = 0 +# for hatch in hatching_list: +# l += 1 +# age = (today - hatch.date.date()).days + 1 +# gregorian_date = jdatetime.date.fromgregorian( +# day=hatch.date.day, +# month=hatch.date.month, +# year=hatch.date.year +# ) +# incubation_date = gregorian_date +# +# list1 = [ +# hatch.poultry.user.fullname, +# str(incubation_date), +# str(age), +# hatch.quantity, +# hatch.left_over, +# hatch.poultry.user.mobile, +# hatch.poultry.address.province.name, +# hatch.poultry.address.city.name, +# ] +# for item in range(len(list1)): +# cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) +# cell.alignment = Alignment(horizontal='center') +# +# list1 = [] +# +# workbook.save(output) +# output.seek(0) +# +# response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') +# response['Content-Disposition'] = 'attachment; filename="Reporting.xlsx"' +# response.write(output.getvalue()) +# +# return response + + +def vet_check_excel(request): + kill_house_req = KillHouseRequest.objects.filter(trash=False, clearance_code=None, + ).order_by('-create_date') + + excel_options = [ + 'نام و نام خانوادگی مرغدار', + 'تاریخ', + 'نام دکتر ', + 'تعداد بار', + 'کشتارگاه', + 'کد بهداشتی', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + # worksheet.merge_cells(start_row=1, end_row=2, start_column=1, end_column=1) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 0 + + for kill in kill_house_req: + l += 1 + vet_farm = VetFarm.objects.filter(trash=False, poultry=kill.province_request.poultry_request.poultry) + for vets in vet_farm: + date = jdatetime.date.fromgregorian( + day=kill.province_request.poultry_request.send_date.day, + month=kill.province_request.poultry_request.send_date.month, + year=kill.province_request.poultry_request.send_date.year + ) + list1 = [ + kill.province_request.poultry_request.poultry.unit_name, + str(date), + vets.vet.user.fullname, + kill.quantity, + kill.kill_request.kill_house.name, + kill.traffic_code + ] + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = 'attachment; filename="Reporting.xlsx"' + response.write(output.getvalue()) + return response + + +def kill_house_request_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + filterset_class = KillRequestFilterSet + filterset_fields = [ + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__unit_name', + ] + filtered_kill_reqs = ( + KillRequest.objects.filter(trash=False, recive_date__date__gte=date1, recive_date__date__lte=date2, + poultry__isnull=True) + .select_related('kill_house').order_by('-recive_date')) + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + excel_options = [ + 'ردیف', + 'نام خریدار', + 'ماهیت خریدار', + 'محل کشتار', + 'تاریخ ایجاد درخواست', + 'تعداد درخواست(قطعه)', + 'مانده(قطعه)', + 'تعداد تخصیص داده شده(قطعه)', + 'زمان دریافت', + 'تاریخ درخواستی کشتار', + 'وضعیت تایید استان', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=30, width=20.1) + l = 4 + m = 1 + + worksheet['A2'] = f'اعلام نیاز خریداران و کشتارگاه ها' + + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range2 = 'A2:B2' + + worksheet.merge_cells(merge_range2) + worksheet['A2'].font = Font(size=11) + + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + worksheet['A3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + + merge_range1 = 'A3:B3' + + worksheet.merge_cells(merge_range1) + + worksheet['A3'].font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد خریداران', + 'مجموع تعداد درخواست (قطعه)', + 'مانده(قطعه)', + 'مجموع تعداد تخصیص داده شده(قطعه)', + + ] + + create_header(worksheet, header_list, 3, 2, height=21, width=16.01) + all_kill_capacity = filtered_kill_reqs.aggregate( + total_quantity=Sum('kill_capacity')).get( + 'total_quantity', 0) + all_remain_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('remain_quantity')).get( + 'total_quantity', 0) + if filtered_kill_reqs: + for kill_request in filtered_kill_reqs: + l += 1 + + create_date = jdatetime.date.fromgregorian( + day=kill_request.create_date.day, + month=kill_request.create_date.month, + year=kill_request.create_date.year, + ) + recive_date = jdatetime.date.fromgregorian( + day=kill_request.recive_date.day, + month=kill_request.recive_date.month, + year=kill_request.recive_date.year + ) + + if kill_request.kill_house.killer == False: + killer = 'کشتارگاه' + else: + killer = 'کشتار کن' + if kill_request.slaughter_house != None: + kill_place = kill_request.slaughter_house.name + else: + kill_place = kill_request.kill_house.name + if kill_request.province_state == 'accepted': + province_state = 'تایید شده' + elif kill_request.province_state == 'pending': + province_state = 'در انتظار تایید' + else: + province_state = 'رد شده' + + allocation = kill_request.kill_capacity - kill_request.remain_quantity + list1 = [ + m, + kill_request.kill_house.name, + killer, + kill_place, + str(create_date), + kill_request.kill_capacity, + kill_request.remain_quantity, + allocation, + kill_request.recive_time, + str(recive_date), + province_state, + ] + m += 1 + + create_value(worksheet, list1, l + 1, 1) + value_list = [ + len(filtered_kill_reqs), + all_kill_capacity, + all_remain_quantity, + all_kill_capacity - all_remain_quantity if all_kill_capacity and all_remain_quantity != None else 0, + + ] + + create_value(worksheet, value_list, 3, 3) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + all_kill_capacity, + all_remain_quantity, + all_kill_capacity - all_remain_quantity if all_kill_capacity and all_remain_quantity != None else 0, + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + 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 + + +def request_report_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + today = datetime.datetime.now().date() + poultry_reqs = PoultryRequest.objects.filter(trash=False).order_by('-send_date') + filtered_poultry_reqs = [ + poultry_req for poultry_req in poultry_reqs + if date1 <= poultry_req.send_date.date() <= date2 + ] + + excel_options = [ + 'کد سفارش', + 'نام واحد', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'آدرس', + 'تاریخ جوجه ریزی', + 'تعداد کل جوجه ریزی', + 'سن مرغ', + 'کشتار شده', + 'تعداد باقی مانده', + 'نژاد', + 'تاریخ درخواست کشتار', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'زمان تخصیص', + 'ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس خریدار', + 'محل کشتار', + 'دامپزشک کشتارگاه', + 'تلفن دامپزشک کشتارگاه', + 'راننده', + 'تلفن راننده', + 'ماشین حمل', + 'کد بهداشتی حمل و نقل', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تحویلی', + 'وزن بار', + 'تاریخ تخلیه کشتارگاه', + 'مبلغ فاکتور', + 'تاریخ پرداخت فاکتور', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + + for filtered_poultry_req in filtered_poultry_reqs: + l += 1 + vet_farm = VetFarm.objects.filter(poultry=filtered_poultry_req.poultry, trash=False).last() + vet_farm_name = vet_farm.vet.user.fullname if vet_farm else '-' + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else '-' + + age = (today - filtered_poultry_req.hatching.date.date()).days + 1 + gregorian_date = jdatetime.date.fromgregorian( + day=filtered_poultry_req.hatching.date.day, + month=filtered_poultry_req.hatching.date.month, + year=filtered_poultry_req.hatching.date.year + ) + incubation_date = gregorian_date + + province_kill_reqs = ProvinceKillRequest.objects.filter(province_request__poultry_request=filtered_poultry_req, + trash=False) + for province_kill_req in province_kill_reqs: + kill_house_vet = KillHouseVet.objects.filter(kill_house=province_kill_req.kill_request.kill_house, + trash=False).last() + kill_house_vet_name = kill_house_vet.vet.user.fullname if kill_house_vet else '-' + kill_house_vet_mobile = kill_house_vet.vet.user.mobile if kill_house_vet else '-' + date_of_inner_bar = '-' + kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_req, trash=False) + for kill_house_request in kill_house_requests: + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request) + killers = 'کشتارکن' + if kill_house_request.killhouse_user.killer == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_request).last() + assignment_quantity = assignment.real_quantity if assignment else '-' + assignment_weight = assignment.net_weight if assignment else '-' + + factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill_house_request).last() + factor_amount = factor.total_price if factor else '-' + date_factor = '-' + factor_payment = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request).last() + if factor_payment: + date_factor = jdatetime.date.fromgregorian( + day=factor_payment.create_date.day, + month=factor_payment.create_date.month, + year=factor_payment.create_date.year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_req.create_date.day, + month=filtered_poultry_req.create_date.month, + year=filtered_poultry_req.create_date.year + ) + + time = jdatetime.date.fromgregorian( + day=kill_house_request.create_date.day, + month=kill_house_request.create_date.month, + year=kill_house_request.create_date.year + ) + for vet_checks in vet_check: + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_checks.create_date.day, + month=vet_checks.create_date.month, + year=vet_checks.create_date.year + ) + + code = kill_house_request.clearance_code if kill_house_request.clearance_code else '-' + list1 = [ + filtered_poultry_req.order_code, + filtered_poultry_req.poultry.unit_name, + filtered_poultry_req.poultry.user.fullname, + filtered_poultry_req.poultry.user.mobile, + filtered_poultry_req.poultry.user.city.name, + str(incubation_date), + filtered_poultry_req.hatching.quantity, + str(age), + filtered_poultry_req.quantity, + filtered_poultry_req.hatching.left_over, + filtered_poultry_req.hatching.chicken_breed, + str(date_of_kill), + vet_farm_name, + vet_farm_mobile, + str(time), + killers, + province_kill_req.kill_request.kill_house.name, + province_kill_req.kill_request.kill_house.phone, + province_kill_req.kill_request.kill_house.system_address.city.name, + province_kill_req.kill_request.kill_house.system_address.city.name, + kill_house_vet_name, + kill_house_vet_mobile, + kill_house_request.add_car.driver.driver_name, + kill_house_request.add_car.driver.driver_mobile, + kill_house_request.add_car.driver.type_car, + kill_house_request.traffic_code, + code, + assignment_quantity, + assignment_weight, + str(date_of_inner_bar), + factor_amount, + str(date_factor) + ] + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + workbook.save(output) + output.seek(0) + + response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = 'attachment; filename="Reporting.xlsx"' + response.write(output.getvalue()) + + return response + + +def allocated_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() if 'start' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() if 'end' in request.GET else now + filterset_class = ProvinceKillRequestNewFilterSet + if request.GET.get('type') == 'deleted': + filtered_province_kill = ProvinceKillRequest.objects.filter( + province_request__poultry_request__send_date__date__gte=date1, + province_request__poultry_request__send_date__date__lte=date2, trash=True, delete_message__isnull=False) \ + .select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', + 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request__poultry__address').order_by('-create_date') + else: + filtered_province_kill = ProvinceKillRequest.objects.filter( + province_request__poultry_request__send_date__date__gte=date1, + province_request__poultry_request__send_date__date__lte=date2, trash=False).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', + 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request__poultry__address').order_by('-create_date') + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_province_kill_reqs = filtered_province_kill.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_province_kill_reqs = filtered_province_kill.filter( + province_request__poultry_request__poultry__user__city=user.city) + elif request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(trash=False, kill_house_operator__user=user) + filtered_province_kill_reqs = filtered_province_kill.filter( + Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house)) + else: + filtered_province_kill_reqs = filtered_province_kill + else: + filtered_province_kill_reqs = filtered_province_kill + value = request.GET.get('value') + search = request.GET.get('filter') + if value and search == 'search': + if value != 'undefined' and value.strip(): + filtered_province_kill_reqs = filtered_province_kill.filter( + build_query(filterset_class, value) + ) + if request.GET.get('type') == 'deleted': + excel_options = [ + 'ردیف', + 'وضعیت', + 'کد سفارش', + 'نوع درخواست', + 'نوع فروش', + 'کشتار', + 'نام فارم', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'شهر', + 'تاریخ کشتار', + 'تعداد کشتار', + 'وزن کشتار', + 'زمان تخصیص', + 'نوع تخصیص', + 'خریدار', + 'تعداد تخصیص داده شده', + 'مانده قابل تخصیص', + ' تلفن خریدار', + ' آدرس خریدار', + 'قیمت مرغدار', + 'قیمت کشتارگاه', + 'وضعیت تایید خریدار', + 'تخصیص ماشین', + 'پیام حذف', + + ] + else: + excel_options = [ + 'ردیف', + 'وضعیت', + 'کد سفارش', + 'درخواست', + 'نوع فروش', + 'کشتار', + 'نام فارم', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'شهر', + 'تاریخ کشتار', + 'تعداد کشتار', + 'وزن کشتار', + 'زمان تخصیص', + 'نوع تخصیص', + 'خریدار', + 'تعداد تخصیص داده شده', + 'مانده قابل تخصیص', + ' تلفن خریدار', + ' آدرس خریدار', + 'قیمت مرغدار', + 'قیمت کشتارگاه', + 'وضعیت تایید خریدار', + 'تخصیص ماشین', + + ] + header_list = [ + 'تعداد تخصیصات', + 'مجموع کل کشتار(قطعه)', + 'وزن کل کشتار', + 'مجموع تخصیص داده شده(قطعه)', + 'تعداد تایید شده', + 'تعداد تخصیصی ماشین', + + ] + + to_date_1 = shamsi_date(date1) + + to_date_2 = shamsi_date(date2) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + create_header(worksheet, header_list, 3, 2, height=21, width=16.01) + if request.GET.get('type') == 'deleted': + excel_description(worksheet, 'A1', f' مدیریت تخصیصات حذف شده', color='red', row2='B1') + else: + excel_description(worksheet, 'A1', f' مدیریت تخصیصات', color='red', row2='B1') + excel_description(worksheet, 'A3', f'از تاریخ {to_date_1} تا {to_date_2}', color='red', row2='B3') + + if filtered_province_kill_reqs.exists(): + province = filtered_province_kill_reqs.first().province_request.poultry_request.poultry.address.province.name + excel_description(worksheet, 'A2', f'استان {province}', color='red', row2='B2') + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=19, width=21.01) + + l = 4 + m = 1 + all_state = 0 + all_car = 0 + all_return_quantity = 0 + for filtered_province_kill_req in filtered_province_kill_reqs: + + if KillHouseRequest.objects.filter(province_kill_request=filtered_province_kill_req, + trash=False).exists(): + car = 'دارد' + all_car += 1 + else: + car = '-' + l += 1 + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.province_request.poultry_request.send_date.day, + month=filtered_province_kill_req.province_request.poultry_request.send_date.month, + year=filtered_province_kill_req.province_request.poultry_request.send_date.year + ) + date_of_allocation = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.create_date.day, + month=filtered_province_kill_req.create_date.month, + year=filtered_province_kill_req.create_date.year + ) + if filtered_province_kill_req.state == "accepted": + state_1 = 'تایید شده' + all_state += 1 + elif filtered_province_kill_req.state == "pending": + state_1 = 'در انتظار تایید' + else: + state_1 = 'رد شده' + + automatic = 'خودکار' if filtered_province_kill_req.automatic else 'دستی' + if filtered_province_kill_req.province_request.poultry_request.union == True: + type = 'اتحادیه' + elif filtered_province_kill_req.province_request.poultry_request.direct_buying == True: + type = 'خرید مستقیم' + elif filtered_province_kill_req.market == True: + type = 'پنل معاملات' + + else: + type = 'اتحادیه' + if filtered_province_kill_req.province_request.poultry_request.free_sale_in_province == True: + free_type = 'آزاد' + else: + free_type = 'دولتی' + + freez_state = 'منجمد' if filtered_province_kill_req.province_request.poultry_request.freezing == True else 'عادی' + + if filtered_province_kill_req.return_to_province == True: + state = 'تخصیص برگشت داده شده' + elif filtered_province_kill_req.quantity == 0: + state = 'تخصیص بسته شده' + elif filtered_province_kill_req.trash == True: + state = 'حذف شده' + else: + state = 'فعال' + message = filtered_province_kill_req.message if filtered_province_kill_req.message is not None else '-' + return_quantity = filtered_province_kill_req.quantity if filtered_province_kill_req.return_to_province == False else 0 + all_return_quantity += return_quantity + if request.GET.get('type') == 'deleted': + list1 = [ + m, + state, + str(filtered_province_kill_req.province_request.poultry_request.order_code), + type, + free_type, + freez_state, + filtered_province_kill_req.province_request.poultry_request.poultry.unit_name, + filtered_province_kill_req.province_request.poultry_request.poultry.user.fullname, + filtered_province_kill_req.province_request.poultry_request.poultry.user.mobile, + filtered_province_kill_req.province_request.poultry_request.poultry.address.city.name, + str(date_of_kill), + filtered_province_kill_req.province_request.poultry_request.quantity, + str(filtered_province_kill_req.province_request.poultry_request.Index_weight), + str(date_of_allocation), + automatic, + filtered_province_kill_req.killhouse_user.name, + filtered_province_kill_req.main_quantity, + return_quantity, + filtered_province_kill_req.killhouse_user.kill_house_operator.user.mobile, + filtered_province_kill_req.kill_request.kill_house.system_address.city.name, + filtered_province_kill_req.province_request.city_request_Poultry.poultry_request.amount, + filtered_province_kill_req.kill_house_price, + state_1, + car, + message + + ] + else: + list1 = [ + m, + state, + str(filtered_province_kill_req.province_request.poultry_request.order_code), + type, + free_type, + freez_state, + filtered_province_kill_req.province_request.poultry_request.poultry.unit_name, + filtered_province_kill_req.province_request.poultry_request.poultry.user.fullname, + filtered_province_kill_req.province_request.poultry_request.poultry.user.mobile, + filtered_province_kill_req.province_request.poultry_request.poultry.address.city.name, + str(date_of_kill), + filtered_province_kill_req.province_request.poultry_request.quantity, + str(filtered_province_kill_req.province_request.poultry_request.Index_weight), + str(date_of_allocation), + automatic, + filtered_province_kill_req.killhouse_user.name, + filtered_province_kill_req.main_quantity, + return_quantity, + filtered_province_kill_req.killhouse_user.kill_house_operator.user.mobile, + filtered_province_kill_req.kill_request.kill_house.system_address.city.name, + filtered_province_kill_req.province_request.city_request_Poultry.poultry_request.amount, + filtered_province_kill_req.kill_house_price, + state_1, + car + + ] + create_value(worksheet, list1, l + 1, 1) + + m += 1 + total_requests_quantity = \ + filtered_province_kill_reqs.aggregate(total=Sum('province_request__poultry_request__quantity'))['total'] or 0 + total_main_quantity = \ + filtered_province_kill_reqs.aggregate(total=Sum('main_quantity'))['total'] or 0 + total_requests_weight = filtered_province_kill_reqs.aggregate( + total=Sum( + F('province_request__poultry_request__quantity') * F('province_request__poultry_request__Index_weight')))[ + 'total'] or 0 + + value_list = [ + m - 1, + total_requests_quantity, + int(total_requests_weight), + total_main_quantity, + all_state, + all_car + ] + create_value(worksheet, value_list, 3, 3) + + total_requests_quantity = \ + filtered_province_kill_reqs.aggregate(total=Sum('province_request__poultry_request__quantity'))['total'] or 0 + if request.GET.get('type') == 'deleted': + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_requests_quantity, + '', + '', + '', + '', + total_main_quantity, + all_return_quantity, + '', + '', + '', + '', + '', + + ] + else: + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + total_requests_quantity, + '', + '', + '', + '', + total_main_quantity, + all_return_quantity, + '', + '', + '', + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def allocated_trash_true_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + + prvince_kill_requests = ProvinceKillRequest.objects.filter(trash=True, delete_message__isnull=False).order_by( + '-create_date') + filtered_province_kill_reqs = [ + province_kill for province_kill in prvince_kill_requests + if date1 <= province_kill.province_request.poultry_request.send_date.date() <= date2 + ] + excel_options = [ + 'کد سفارش', + 'نام فارم', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'آدرس', + 'تاریخ کشتار', + 'تعداد کشتار', + 'زمان تخصیص', + 'خریدار', + 'تعداد تخصیص داده شده', + ' تلفن خریدار', + ' آدرس خریدار', + 'تایید تخصیص', + 'تخصیص ماشین', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + for filtered_province_kill_req in filtered_province_kill_reqs: + if KillHouseRequest.objects.filter(province_kill_request=filtered_province_kill_req, trash=False).exists(): + car = 'دارد' + else: + car = '-' + l += 1 + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.province_request.poultry_request.send_date.day, + month=filtered_province_kill_req.province_request.poultry_request.send_date.month, + year=filtered_province_kill_req.province_request.poultry_request.send_date.year + ) + date_of_allocation = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.create_date.day, + month=filtered_province_kill_req.create_date.month, + year=filtered_province_kill_req.create_date.year + ) + if filtered_province_kill_req.state == "accepted": + state = 'تایید شده' + elif filtered_province_kill_req.state == "pending": + state = 'در انتظار تایید' + else: + state = 'رد شده' + list1 = [ + filtered_province_kill_req.province_request.poultry_request.order_code, + filtered_province_kill_req.province_request.poultry_request.poultry.unit_name, + filtered_province_kill_req.province_request.poultry_request.poultry.user.fullname, + filtered_province_kill_req.province_request.poultry_request.poultry.user.mobile, + filtered_province_kill_req.province_request.poultry_request.poultry.user.city.name, + str(date_of_kill), + filtered_province_kill_req.province_request.poultry_request.quantity, + str(date_of_allocation), + filtered_province_kill_req.killhouse_user.name, + filtered_province_kill_req.main_quantity, + filtered_province_kill_req.killhouse_user.kill_house_operator.user.mobile, + filtered_province_kill_req.killhouse_user.system_address.city.name, + state, + car + + ] + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + 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 + + +def poultry_kill_request_excel(request): + access = AccessToken.objects.get(token=request.GET['token']) + user = get_object_or_404(SystemUserProfile, user=access.user) + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + filterset_class = PoultryRequestFilterSet + filterset_fields = [ + 'order_code', + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__address__city__name', + + ] + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + filtered_province_kill_reqs = PoultryRequest.objects.filter(poultry__city_operator=city_operator.unit_name, + trash=False, send_date__date__gte=date1, + send_date__date__lte=date2).select_related( + 'poultry', 'poultry__user').order_by( + '-send_date') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_province_kill_reqs = PoultryRequest.objects.filter(state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, send_date__date__gte=date1, + send_date__date__lte=date2, + poultry__address__city=user.city, ).select_related( + 'poultry', 'poultry__user').order_by( + '-send_date') + else: + filtered_province_kill_reqs = PoultryRequest.objects.filter(state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, send_date__date__gte=date1, + send_date__date__lte=date2).select_related( + 'poultry', 'poultry__user').order_by( + '-send_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_province_kill_reqs + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_province_kill_reqs) + filtered_province_kill_reqs = ps.filter() + + excel_options = [ + 'ردیف', + 'کد سفارش', + 'فروش', + 'کشتار', + 'درخواست', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'کشتارگاه های پیشنهادی', + 'آدرس', + 'سن مرغ', + 'میانگین وزنی هر قطعه(کیلوگرم)', + 'وزن تقریبی(کیلوگرم)', + 'حجم درخواست کشتار', + 'قیمت مرغدار(ریال)', + 'مانده در سالن', + 'تایید شده', + 'تخصیص داده شده', + 'مانده قابل تخصیص', + 'وضعیت', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد درخواست', + 'مجموع تعداد قطعه', + 'وزن تقریبی کل درخواست', + 'مجموع مانده در سالن', + 'میانگین سنی', + ] + create_header(worksheet, header_list, 4, 2, height=17) + + excel_description(worksheet, 'A2', 'درخواست کشتار مرغداران', size=11, row2='B2') + + from_date_1 = shamsi_date(date1) + to_date_1 = shamsi_date(date2) + + excel_description(worksheet, 'A3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', color='red', row2='C3') + m = 1 + + create_header_freez(worksheet, excel_options, 1, 5, 6, height=23, width=21.01) + l = 4 + all_quantity = 0 + all_wight = 0 + all_left_over = 0 + all_age = [] + if filtered_province_kill_reqs: + for filtered_poultry_kill_request in filtered_province_kill_reqs: + all_quantity += filtered_poultry_kill_request.quantity + all_wight += int(filtered_poultry_kill_request.quantity * filtered_poultry_kill_request.Index_weight) + l += 1 + date_of_create = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.create_date.day, + month=filtered_poultry_kill_request.create_date.month, + year=filtered_poultry_kill_request.create_date.year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.send_date.day, + month=filtered_poultry_kill_request.send_date.month, + year=filtered_poultry_kill_request.send_date.year + ) + state = 'تایید شده' + if filtered_poultry_kill_request.state == 'pending': + state = 'در انتظار تایید' + kill_house = '-' + if filtered_poultry_kill_request.kill_house_list is not None: + for name in filtered_poultry_kill_request.kill_house_list: + kill_house += name + '/' + age = ( + filtered_poultry_kill_request.send_date.date() - filtered_poultry_kill_request.hatching.date.date()).days + 1 + + if age not in all_age: + all_age.append(age) + + if filtered_poultry_kill_request.union == True: + type = 'اتحادیه' + elif filtered_poultry_kill_request.direct_buying == True: + type = 'خرید مستقیم' + elif filtered_poultry_kill_request.market == True: + type = 'پنل معاملات' + + else: + type = 'اتحادیه' + + freez_state = 'منجمد' if filtered_poultry_kill_request.freezing == True else 'عادی' + + sale_type = 'دولتی' if filtered_poultry_kill_request.free_sale_in_province == False else 'آزاد' + all_left_over += filtered_poultry_kill_request.hatching.left_over + + list1 = [ + m, + str(filtered_poultry_kill_request.order_code), + sale_type, + freez_state, + type, + str(date_of_create), + str(date_of_kill), + filtered_poultry_kill_request.poultry.unit_name, + filtered_poultry_kill_request.poultry.user.mobile, + kill_house, + filtered_poultry_kill_request.poultry.address.city.name, + str(age), + str(filtered_poultry_kill_request.Index_weight), + int(filtered_poultry_kill_request.quantity * filtered_poultry_kill_request.Index_weight), + filtered_poultry_kill_request.first_quantity, + filtered_poultry_kill_request.amount, + filtered_poultry_kill_request.hatching.left_over, + filtered_poultry_kill_request.quantity, + filtered_poultry_kill_request.quantity - filtered_poultry_kill_request.remain_quantity, + filtered_poultry_kill_request.remain_quantity, + + state + ] + m += 1 + create_value(worksheet, list1, l + 1, 1) + all_age1 = sorted(all_age) + value_header_list = [ + len(filtered_province_kill_reqs), + all_quantity, + all_wight, + all_left_over, + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + + ] + create_value(worksheet, value_header_list, 3, 4) + 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 + + +def request_registration_kill_house(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + + kill_requests = KillRequest.objects.filter( + kill_house__kill_house_operator__user_id=SystemUserProfile.objects.get(user_id=request.user), + trash=False).order_by('-recive_date') + filtered_kill_reqs = [ + kill_request for kill_request in kill_requests + if date1 <= kill_request.recive_date.date() <= date2 + ] + + excel_options = [ + 'نام خریدار', + 'تاریخ ایجاد درخواست', + 'تعداد درخواست(قطعه)', + 'مانده(قطعه)', + 'تعداد تخصیص داده شده(قطعه)', + 'زمان دریافت', + 'تاریخ درخواستی کشتار', + 'وضعیت تایید استان', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + if filtered_kill_reqs: + for kill_request in filtered_kill_reqs: + l += 1 + create_date = jdatetime.date.fromgregorian( + day=kill_request.create_date.day, + month=kill_request.create_date.month, + year=kill_request.create_date.year + ) + recive_date = jdatetime.date.fromgregorian( + day=kill_request.recive_date.day, + month=kill_request.recive_date.month, + year=kill_request.recive_date.year + ) + + if kill_request.province_state == 'accepted': + province_state = 'تایید شده' + elif kill_request.province_state == 'pending': + province_state = 'در انتظار تایید' + else: + province_state = 'رد شده' + + allocation = kill_request.kill_capacity - kill_request.remain_quantity + list1 = [ + kill_request.kill_house.name, + str(create_date), + kill_request.kill_capacity, + kill_request.remain_quantity, + allocation, + kill_request.recive_time, + str(recive_date), + province_state, + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + workbook.save(output) + output.seek(0) + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = f'attachment; filename="kill_request {date1} to {date2}.xlsx"' + response.write(output.getvalue()) + return response + + +def request_pending_allocation(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + + prvince_kill_requests = ProvinceKillRequest.objects.filter( + killhouse_user__kill_house_operator__user_id=SystemUserProfile.objects.get(user_id=request.user), + trash=False).order_by('-create_date') + filtered_province_kill_reqs = [ + province_kill for province_kill in prvince_kill_requests + if date1 <= province_kill.province_request.poultry_request.send_date.date() <= date2 + ] + excel_options = [ + 'کد سفارش', + 'تاریخ درخواست', + 'نام فارم', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'آدرس', + 'سن مرغ', + 'تعداد کشتار', + 'نژاد', + 'میانگین وزن', + 'زمان تخصیص', + 'تعداد تخصیص داده شده', + 'تایید تخصیص', + 'تخصیص ماشین', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + for filtered_province_kill_req in filtered_province_kill_reqs: + if KillHouseRequest.objects.filter(province_kill_request=filtered_province_kill_req, trash=False).exists(): + car = 'دارد' + else: + car = '-' + l += 1 + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.province_request.poultry_request.send_date.day, + month=filtered_province_kill_req.province_request.poultry_request.send_date.month, + year=filtered_province_kill_req.province_request.poultry_request.send_date.year + ) + date_of_allocation = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.create_date.day, + month=filtered_province_kill_req.create_date.month, + year=filtered_province_kill_req.create_date.year + ) + age = ( + filtered_province_kill_req.create_date - filtered_province_kill_req.province_request.poultry_request.hatching.date).days + 1 + if filtered_province_kill_req.state == "accepted": + state = 'تایید شده' + elif filtered_province_kill_req.state == "pending": + state = 'در انتظار تایید' + else: + state = 'رد شده' + list1 = [ + filtered_province_kill_req.province_request.poultry_request.order_code, + str(date_of_kill), + filtered_province_kill_req.province_request.poultry_request.poultry.unit_name, + filtered_province_kill_req.province_request.poultry_request.poultry.user.fullname, + filtered_province_kill_req.province_request.poultry_request.poultry.user.mobile, + filtered_province_kill_req.province_request.poultry_request.poultry.user.city.name, + age, + filtered_province_kill_req.province_request.poultry_request.quantity, + filtered_province_kill_req.province_request.poultry_request.chicken_breed, + filtered_province_kill_req.province_request.poultry_request.Index_weight, + str(date_of_allocation), + filtered_province_kill_req.main_quantity, + state, + car, + + ] + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + workbook.save(output) + output.seek(0) + + response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = f'attachment; filename="Awaiting confirmation {date1} to {date2} .xlsx"' + response.write(output.getvalue()) + + return response + + +def new_load_of_kill_house_vet(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + kill_house_requests = KillHouseRequest.objects.filter( + killhouse_user__kill_house_operator__user=SystemUserProfile.objects.get(user=request.user), + trash=False).order_by('-create_date') + + filtered_kill_house_requests = [ + kill_house for kill_house in kill_house_requests + if date1 <= kill_house.kill_request.recive_date.date() <= date2 + ] + excel_options = [ + 'کد بار', + 'کد رهگیری سامانه قرنطینه', + 'خریدار', + 'تاریخ درخواست', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'سن مرغ', + 'تعداد', + 'راننده', + 'ماشین', + 'پلاک', + 'نژاد', + 'میانگین وزن', + 'کد حمل و نقل' + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + for filtered_kill_house_request in filtered_kill_house_requests: + l += 1 + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_kill_house_request.kill_request.recive_date + .day, + month=filtered_kill_house_request.kill_request.recive_date + .month, + year=filtered_kill_house_request.kill_request.recive_date + .year + ) + traffic_code = filtered_kill_house_request.traffic_code if filtered_kill_house_request.traffic_code else '-' + clearance_code = filtered_kill_house_request.clearance_code if filtered_kill_house_request.clearance_code else '-' + age = ( + filtered_kill_house_request.kill_request.recive_date - filtered_kill_house_request.province_request.poultry_request.hatching.date).days + 1 + list1 = [ + str(filtered_kill_house_request.bar_code), + clearance_code, + filtered_kill_house_request.killhouse_user.name, + str(date_of_kill), + filtered_kill_house_request.province_request.poultry_request.poultry.unit_name, + filtered_kill_house_request.province_request.poultry_request.poultry.user.mobile, + filtered_kill_house_request.province_request.poultry_request.poultry.address.city.name, + age, + filtered_kill_house_request.province_kill_request.main_quantity, + filtered_kill_house_request.add_car.driver.driver_name, + filtered_kill_house_request.add_car.driver.type_car, + filtered_kill_house_request.add_car.driver.pelak, + filtered_kill_house_request.province_request.poultry_request.chicken_breed, + filtered_kill_house_request.province_request.poultry_request.Index_weight, + traffic_code, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + workbook.save(output) + output.seek(0) + response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = f'attachment; filename="kill_house_vet {date1} to {date2} .xlsx"' + response.write(output.getvalue()) + return response + + +def car_allocation_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + + kill_house_requests = KillHouseRequest.objects.filter( + killhouse_user__kill_house_operator__user=SystemUserProfile.objects.get(user=request.user), + trash=False).order_by('-create_date') + + filtered_kill_house_requests = [ + kill_house for kill_house in kill_house_requests + if date1 <= kill_house.kill_request.recive_date.date() <= date2 + ] + excel_options = [ + 'کد سفارش', + 'کد بار', + 'تاریخ کشتار', + 'تاریخ ثبت خودرو', + 'مرغدار', + 'راننده', + 'ماشین', + 'پلاک', + 'تعداد', + 'کد حمل و نقل' + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + for filtered_kill_house_request in filtered_kill_house_requests: + l += 1 + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_kill_house_request.kill_request.recive_date + .day, + month=filtered_kill_house_request.kill_request.recive_date + .month, + year=filtered_kill_house_request.kill_request.recive_date + .year + ) + date_of_allocation_car = jdatetime.date.fromgregorian( + day=filtered_kill_house_request.create_date + .day, + month=filtered_kill_house_request.create_date + .month, + year=filtered_kill_house_request.create_date + .year + ) + list1 = [ + filtered_kill_house_request.province_request.poultry_request.order_code, + str(filtered_kill_house_request.bar_code), + str(date_of_kill), + str(date_of_allocation_car), + filtered_kill_house_request.province_request.poultry_request.poultry.unit_name, + filtered_kill_house_request.add_car.driver.driver_name, + filtered_kill_house_request.add_car.driver.type_car, + filtered_kill_house_request.add_car.driver.pelak, + filtered_kill_house_request.quantity, + filtered_kill_house_request.traffic_code, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + workbook.save(output) + output.seek(0) + response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = f'attachment; filename="car allocation {date1} to {date2} .xlsx"' + response.write(output.getvalue()) + return response + + +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def Test(request): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() if 'start' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + timedelta( + days=1) if 'end' in request.GET else now + killhouse_names = KillHouse.objects.filter(trash=False, system_address__province=user.province).values_list('name', + flat=True).distinct() + + names_list = [] + for killhouse_name in killhouse_names: + names_list.append(killhouse_name) + + excel_options = [ + 'کد بار', + 'مرغدار', + 'تلفن مرغدار', + 'کدسفارش مرغدار', + ' شهر مرغدار', + ' تاریخ کشتار', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'خریدار', + ' تلفن خریدار', + ' ماهیت خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تخصیصی', + 'تعداد تخلیه شده', + 'وزن بار', + 'تاریخ تخلیه (کشتارگاه)', + 'مبلغ فاکتور', + 'تاریخ پرداخت فاکتور', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + for name in names_list: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + for kill in KillHouseRequest.objects.filter(trash=False, killhouse_user__name=name, + kill_request__recive_date__range=(date1, date2)): + if kill: + l += 1 + vet_farm = VetFarm.objects.filter(poultry=kill.province_request.poultry_request.poultry, + trash=False).last() + vet_farm_name = vet_farm.vet.user.fullname if vet_farm else '-' + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.killhouse_user).last() + vet_checks = VetCheckRequest.objects.filter(kill_house_request=kill).last() + kill_house_vet_name = kil_house_vet.vet.user.fullname if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.vet.user.mobile if kil_house_vet else '-' + factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill).last() + factor_amount = factor.total_price if factor else '-' + factor_payment = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill).last() + date_factor = jdatetime.date.fromgregorian( + day=factor_payment.create_date.day, + month=factor_payment.create_date.month, + year=factor_payment.create_date.year + ) if factor_payment else '-' + code = kill.clearance_code if kill.clearance_code else '-' + quantity = kill.quantity if kill.quantity else '-' + date_of_poultry_request = jdatetime.date.fromgregorian( + day=kill.province_request.poultry_request.send_date.day, + month=kill.province_request.poultry_request.send_date.month, + year=kill.province_request.poultry_request.send_date.year + ) + killers = 'کشتارکن' + if kill.killhouse_user.killer == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill, trash=False).last() + net_weighte = assignment.net_weight if assignment else '-' + real_quantity = assignment.real_quantity if assignment else '-' + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_checks.create_date.day, + month=vet_checks.create_date.month, + year=vet_checks.create_date.year + ) if vet_checks else '-' + if kill.kill_request.slaughter_house != None: + kill_place = kill.kill_request.slaughter_house.name + else: + kill_place = kill.killhouse_user.name + + list1 = [ + str(kill.bar_code), + kill.province_request.poultry_request.poultry.unit_name, + str(kill.province_request.poultry_request.poultry.user.mobile), + kill.province_request.poultry_request.order_code, + kill.province_request.poultry_request.poultry.user.city.name, + str(date_of_poultry_request), + kill.province_request.poultry_request.chicken_breed, + vet_farm_name, + vet_farm_mobile, + kill.kill_request.kill_house.name, + kill.killhouse_user.phone, + killers, + kill.killhouse_user.system_address.city.name, + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.add_car.driver.driver_name, + kill.add_car.driver.driver_mobile, + kill.add_car.driver.type_car, + kill.add_car.driver.health_code, + code, + quantity, + real_quantity, + net_weighte, + str(date_of_inner_bar), + factor_amount, + str(date_factor) + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = 'attachment; filename="Reporting.xlsx"' + response.write(output.getvalue()) + return response + + +@permission_classes([AllowAny]) +def Test1(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + today = datetime.datetime.now().date() + poultry_reqs = PoultryRequest.objects.filter(trash=False).order_by('-send_date') + total = 0 + filtered_poultry_reqs = [ + poultry_req for poultry_req in poultry_reqs + if date1 <= poultry_req.send_date.date() <= date2 + ] + + excel_options = [ + 'کد سفارش', + 'نام واحد', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'آدرس', + 'تاریخ جوجه ریزی', + 'تعداد کل جوجه ریزی', + 'سن مرغ', + 'تعداد درخواست کشتار', + 'تعداد باقی مانده', + 'نژاد', + 'تاریخ درخواست کشتار', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'زمان تخصیص', + 'ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس خریدار', + 'محل کشتار', + 'دامپزشک کشتارگاه', + 'تلفن دامپزشک کشتارگاه', + 'راننده', + 'تلفن راننده', + 'ماشین حمل', + 'کد بهداشتی حمل و نقل', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تحویلی', + 'وزن بار', + 'تاریخ تخلیه کشتارگاه', + 'مبلغ فاکتور', + 'تاریخ پرداخت فاکتور', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + + for filtered_poultry_req in filtered_poultry_reqs: + vet_farm = VetFarm.objects.filter(poultry=filtered_poultry_req.poultry, trash=False).last() + vet_farm_name = vet_farm.vet.user.fullname if vet_farm else '-' + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else '-' + + age = (today - filtered_poultry_req.hatching.date.date()).days + 1 + gregorian_date = jdatetime.date.fromgregorian( + day=filtered_poultry_req.hatching.date.day, + month=filtered_poultry_req.hatching.date.month, + year=filtered_poultry_req.hatching.date.year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_req.create_date.day, + month=filtered_poultry_req.create_date.month, + year=filtered_poultry_req.create_date.year + ) + incubation_date = gregorian_date + + province_kill_reqs = ProvinceKillRequest.objects.filter(province_request__poultry_request=filtered_poultry_req, + trash=False) + for province_kill_req in province_kill_reqs: + kill_house_vet = KillHouseVet.objects.filter(kill_house=province_kill_req.kill_request.kill_house, + trash=False).last() + kill_house_vet_name = kill_house_vet.vet.user.fullname if kill_house_vet else '-' + kill_house_vet_mobile = kill_house_vet.vet.user.mobile if kill_house_vet else '-' + date_of_inner_bar = '-' + kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_req, trash=False) + for kill_house_request in kill_house_requests: + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request) + killers = 'کشتارکن' + if kill_house_request.killhouse_user.killer == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_request).last() + assignment_quantity = assignment.real_quantity if assignment else '-' + assignment_weight = assignment.net_weight if assignment else '-' + + factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill_house_request).last() + factor_amount = factor.total_price if factor else '-' + date_factor = '-' + factor_payment = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request).last() + if factor_payment: + date_factor = jdatetime.date.fromgregorian( + day=factor_payment.create_date.day, + month=factor_payment.create_date.month, + year=factor_payment.create_date.year + ) + + time = jdatetime.date.fromgregorian( + day=kill_house_request.create_date.day, + month=kill_house_request.create_date.month, + year=kill_house_request.create_date.year + ) + for vet_checks in vet_check: + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_checks.create_date.day, + month=vet_checks.create_date.month, + year=vet_checks.create_date.year + ) + total += filtered_poultry_req.hatching.quantity + code = kill_house_request.clearance_code if kill_house_request.clearance_code else '-' + list1 = [ + filtered_poultry_req.order_code, + filtered_poultry_req.poultry.unit_name, + filtered_poultry_req.poultry.user.fullname, + filtered_poultry_req.poultry.user.mobile, + filtered_poultry_req.poultry.user.city.name, + str(incubation_date), + filtered_poultry_req.hatching.quantity, + str(age), + filtered_poultry_req.quantity, + filtered_poultry_req.hatching.left_over, + filtered_poultry_req.hatching.chicken_breed, + str(date_of_kill), + vet_farm_name, + vet_farm_mobile, + str(time), + killers, + province_kill_req.kill_request.kill_house.name, + province_kill_req.kill_request.kill_house.phone, + province_kill_req.kill_request.kill_house.system_address.city.name, + province_kill_req.kill_request.kill_house.system_address.city.name, + kill_house_vet_name, + kill_house_vet_mobile, + kill_house_request.add_car.driver.driver_name, + kill_house_request.add_car.driver.driver_mobile, + kill_house_request.add_car.driver.type_car, + kill_house_request.traffic_code, + code, + assignment_quantity, + assignment_weight, + str(date_of_inner_bar), + factor_amount, + str(date_factor) + ] + l += 1 + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + list1 = [ + filtered_poultry_req.order_code, + filtered_poultry_req.poultry.unit_name, + filtered_poultry_req.poultry.user.fullname, + filtered_poultry_req.poultry.user.mobile, + filtered_poultry_req.poultry.user.city.name, + str(incubation_date), + filtered_poultry_req.hatching.quantity, + str(age), + filtered_poultry_req.quantity, + filtered_poultry_req.hatching.left_over, + filtered_poultry_req.hatching.chicken_breed, + str(date_of_kill), + vet_farm_name, + vet_farm_mobile, + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-' + ] + l += 1 + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + # اضافه کردن ستون جدید + max_col = worksheet.max_column + worksheet.insert_cols(max_col + 1) + + # افزودن هدر جدید + header_cell = worksheet.cell(row=1, column=max_col + 1, value="تعداد کل کشتار") + header_cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + header_cell.fill = PatternFill(start_color="9fff40", end_color="9fff40", fill_type="solid") + header_cell.font = Font(size=10, bold=True, color='D9FFFFFF') + + # افزودن مقدار جدید + header_cell_below = worksheet.cell(row=2, column=max_col + 1, value=total) + header_cell_below.alignment = Alignment(horizontal='center', vertical='center') + worksheet.column_dimensions[get_column_letter(max_col + 1)].width = 20.01 + + workbook.save(output) + output.seek(0) + + response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = f'attachment; filename="file {date1} to {date2}.xlsx"' + response.write(output.getvalue()) + + return response + + +from io import BytesIO +from openpyxl import Workbook +from openpyxl.styles import PatternFill, Alignment, Font +from openpyxl.utils import get_column_letter + + +@permission_classes([AllowAny]) +@csrf_exempt +def excel_for_all_user(request): + users = SystemUserProfile.objects.filter(trash=False) + poultry_list = Poultry.objects.filter(trash=False) + kill_house_list = KillHouse.objects.filter(trash=False) + vet_list = VetFarm.objects.filter(trash=False) + + excel_options = { + 'مرغدار': ['نام کامل', + 'شماره تلفن', + 'تاریخ تولد', + 'کد کاربری', + 'شهر', + 'کلمه عبور', + 'نام فارم', + 'آدرس', + 'شهر', + 'کد پستی', + 'موبایل', + 'شناسه یکتا', + 'کد اقتصادی', + 'کد اپیدمیولوژیک', + 'تعداد سالن', ], + 'دامپزشک کشتارگاه': ['کد بار', 'نام دامپزشک', 'شماره تلفن'], + 'دامپزشک فارم': ['کد بار', 'نام دامپزشک', 'شماره تلفن'], + 'کشتارگاه': ['کد بار', 'نام کشتارگاه', 'شماره تلفن'], + } + output = BytesIO() + workbook = Workbook() + for name, options in excel_options.items(): + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + for col_num, option in enumerate(options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 0 + if sheet_name == 'مرغدار': + for p in poultry_list: + list1 = [ + p.user.fullname, + p.user.mobile, + p.user.birthday, + p.user.base_order, + p.user.city.name, + p.user.password, + p.unit_name, + p.address.address, + p.address.city.name, + p.address.postal_code, + p.address.phone, + p.breeding_unique_id, + p.economic_code, + p.epidemiological_code, + p.number_of_halls, + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + elif sheet_name == 'کشتارگاه': + for kill in kill_house_list: + list1 = [ + kill.name + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + elif sheet_name == 'دامپزشک فارم': + for vet in vet_list: + list1 = [ + vet.state + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = 'attachment; filename="Reporting.xlsx"' + response.write(output.getvalue()) + return response + + +def inventory(request): + now = datetime.datetime.now().date() + date = datetime.datetime.strptime(request.GET['date'], + '%Y-%m-%d').date() if 'date' in request.GET else now + + kill_house = KillHouse.objects.filter(key=request.GET['kill_house_key'], trash=False).select_related( + 'system_address__province').first() + + if kill_house.killer == True: + percentage = KillHousePercentage.objects.get(kill_house=kill_house, trash=False) + kill_house_vet = KillHouseVet.objects.filter(kill_house=percentage.kill_house_for_killer, + trash=False).select_related( + 'vet__user').last() + else: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_house, trash=False).select_related( + 'vet__user').last() + + kill_house_ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house, + date__year=date.year, + date__month=date.month, + date__day=date.day, + trash=False).last() + kill_house_free_bar_info_list = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, + date__year=date.year, + date__month=date.month, + date__day=date.day, + trash=False) + date = date - timedelta(days=1) + + queryset = PoultryRequest.objects.filter( + poultry__address__province=kill_house.system_address.province, + final_state__in=('pending', 'archive'), + trash=False, out=False, + send_date__date=date, + + ).select_related('poultry', 'poultry__user', 'poultry__address__city').order_by('-send_date') + + excel_options = { + + 'اطلاعات بارهای سیستمی': ['کد بار', + 'مرغدار', + 'کد سفارش', + 'شهر مرغدار', + 'تاریخ کشتار', + 'نژاد', + 'دامپزشک فارم', + ' موبایل دامپزشک فارم', + ' دامپزشک کشتارگاه', + 'موبایل دامپزشک کشتارگاه', + 'راننده', + 'نوع خودرو', + 'کدبهداشتی حمل و نقل', + 'کدرهگیری قرنطینه', + 'تعداد تخصیصی', + 'وضعیت', + 'تعداد تخلیه شده', + 'وزن بار(کیلوگرم)'], + 'اطلاعات بارهای آزاد': ['مرغدار', + 'استان/شهر', + 'تاریخ خرید', + 'نام دامپزشک', + 'موبایل دامپزشک', + 'ماشین', + 'راننده', + ' موبایل راننده', + 'کدقرنطینه', + 'تعداد قطعه', + 'وزن زنده (کیلوگرم)', + 'تعداد لاشه', + 'وزن لاشه(کیلوگرم)', + ], + } + red_font = Font(color="C00000", bold=True) + + output = BytesIO() + workbook = Workbook() + for name, options in excel_options.items(): + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="0070C0", fill_type="solid") + blue_fill1 = PatternFill(start_color="00B0F0", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + for col_num, option in enumerate(options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[5].height = 32 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 4 + if sheet_name == 'اطلاعات بارهای سیستمی': + worksheet['B1'] = f'موجودی انبار' + worksheet['A4'] = f'اطلاعات بارهای سیستمی' + + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A4'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:C1' + merge_range2 = 'A4:C4' + # merge_range2 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + # worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['A4'].font = red_font + header_list = ['تعداد بار سیستمی', + 'تعداد قطعه تخصیصی', + 'وزن بار زنده', + 'تعداد لاشه', + 'وزن لاشه ها (افت 25٪) کیلوگرم', + 'میانگین وزن لاشه ها (کیلوگرم)' + , 'تعداد بار (خرید آزاد)', 'تعداد لاشه (خرید آزاد)' + , 'وزن لاشه (خرید آزاد) (کیلوگرم)' + , 'مجموع بارها' + , 'مجموع لاشه ها ' + , 'مجموع وزن لاشه ها (کیلوگرم)', + 'تعداد لاشه(ویرایش شده)', + 'وزن لاشه ها (افت 25٪) کیلوگرم(ویرایش شده)', + ] + for item in range(len(header_list)): + cell = worksheet.cell(row=2, column=item + 2, value=header_list[item]) + value = header_list[item] + cell.fill = blue_fill1 + cell.font = Font(size=9, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 25 + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + if len(queryset) > 0: + for poultry_req in queryset: + vet_farm = VetFarm.objects.filter(poultry=poultry_req.poultry).select_related('vet__user').last() + if vet_farm: + vet_name = vet_farm.vet.user.fullname + vet_mobile = vet_farm.vet.user.mobile + else: + vet_name = None + vet_mobile = None + + kill_house_requests = KillHouseRequest.objects.filter( + province_kill_request__province_request__poultry_request=poultry_req, + killhouse_user=kill_house, trash=False).select_related( + 'kill_request__kill_house__kill_house_operator__user', 'add_car__driver', + 'kill_request__kill_house') + if kill_house_requests: + for kill_house_request in kill_house_requests: + + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_request).last() + if assignment: + assignment_state = 'تایید نهایی' + assignment_real_quantity = kill_house_request.accepted_real_quantity + assignment_net_weight = kill_house_request.accepted_real_weight + + else: + if kill_house_request.vet_state == 'pending': + assignment_state = 'در انتظار تایید تخلیه' + else: + assignment_state = 'در انتظار وروداطلاعات بار' + assignment_real_quantity = kill_house_request.accepted_real_quantity + assignment_net_weight = kill_house_request.accepted_real_weight + clearance_code = kill_house_request.clearance_code if kill_house_request.clearance_code else '-' + + list1 = [ + str(kill_house_request.bar_code), + poultry_req.poultry.unit_name, + str(poultry_req.order_code), + poultry_req.poultry.address.city.name, + str(date), + poultry_req.chicken_breed, + vet_name, + vet_mobile, + kill_house_vet.vet.user.fullname, + kill_house_vet.vet.user.mobile, + kill_house_request.add_car.driver.driver_name, + kill_house_request.add_car.driver.type_car, + kill_house_request.traffic_code, + clearance_code, + kill_house_request.quantity, + assignment_state, + assignment_real_quantity, + assignment_net_weight + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + if kill_house_ware_house: + list1 = [ + kill_house_ware_house.bar_quantity, + kill_house_ware_house.allocated_quantity, + kill_house_ware_house.bar_live_weight, + kill_house_ware_house.number_of_carcasses, + kill_house_ware_house.weight_of_carcasses, + kill_house_ware_house.ave_weight_of_carcasses, + kill_house_ware_house.free_bar_quantity, + kill_house_ware_house.number_of_free_carcasses, + kill_house_ware_house.free_weight_of_carcasses, + kill_house_ware_house.total_bar_quantity, + kill_house_ware_house.total_number_of_carcasses, + kill_house_ware_house.total_weight_of_carcasses, + kill_house_ware_house.updated_number_of_carcasses, + kill_house_ware_house.updated_weight_of_carcasses, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=3, column=item + 2, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + else: + list1 = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=3, column=item + 2, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + elif sheet_name == 'اطلاعات بارهای آزاد': + header_list = [ + 'تعداد بار (خرید آزاد)', + 'تعداد لاشه (خرید آزاد)', + 'وزن لاشه (خرید آزاد) (کیلوگرم)', + 'مجموع بارها', + 'مجموع لاشه ها ', + 'مجموع وزن لاشه ها (کیلوگرم)', + 'تعداد لاشه(ویرایش شده)', + 'وزن لاشه ها (افت 25٪) کیلوگرم(ویرایش شده)', + ] + for item in range(len(header_list)): + cell = worksheet.cell(row=2, column=item + 2, value=header_list[item]) + value = header_list[item] + cell.fill = blue_fill1 + cell.font = Font(size=9, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 25 + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + for kill_house_free_bar in kill_house_free_bar_info_list: + date = jdatetime.date.fromgregorian(year=kill_house_free_bar.date.year, + month=kill_house_free_bar.date.month, + day=kill_house_free_bar.date.day) + list1 = [ + kill_house_free_bar.poultry_name, + kill_house_free_bar.province + ' ' + kill_house_free_bar.city, + str(date), + kill_house_free_bar.vet_farm_name, + kill_house_free_bar.vet_farm_mobile, + kill_house_free_bar.car, + kill_house_free_bar.driver_name, + kill_house_free_bar.driver_mobile, + kill_house_free_bar.clearance_code, + kill_house_free_bar.quantity, + kill_house_free_bar.live_weight, + kill_house_free_bar.number_of_carcasses, + kill_house_free_bar.weight_of_carcasses, + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + if kill_house_ware_house: + list1 = [ + kill_house_ware_house.free_bar_quantity, + kill_house_ware_house.number_of_free_carcasses, + kill_house_ware_house.free_weight_of_carcasses, + kill_house_ware_house.total_bar_quantity, + kill_house_ware_house.total_number_of_carcasses, + kill_house_ware_house.total_weight_of_carcasses, + kill_house_ware_house.updated_number_of_carcasses, + kill_house_ware_house.updated_weight_of_carcasses, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=3, column=item + 2, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' + else: + cell.value = value + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="{kill_house.name} در تاریخ {str(date)}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def steward_excel(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + group = Group.objects.get(name__exact="Guilds") + l = 0 + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i <= 0: + continue + mobile = str(row[5]) + if len(mobile) == 10: + mobile = '0' + str.zfill(mobile, 10) + postal_code = row[4] + national_code = row[9] + guild_id = row[8] + first_name = row[2] + last_name = row[3] + license_num = 0 + password = '00100' + hashed_password = hashlib.sha256(str(password).encode()).hexdigest() + province = Province.objects.filter(name='مرکزی') + province = province.first() + city = City.objects.filter(name='اراک') + city = city.first() + system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).first() + if system_profile: + pass + # if not system_profile: + # pass + # # data = { + # # "username": mobile, + # # "first_name": first_name, + # # "last_name": last_name, + # # "password": hashed_password, + # # "national_code": '0', + # # "role": "Guilds", + # # "api_key": PROJECT_API_KEY + # # } + # # req = requests.post( + # # url=ARTA_REGISTER, + # # data=data, + # # verify=False + # # ) + # # + # # if req.status_code == 200: + # # user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password) + # # user.save() + # # base_id = SystemUserProfile.objects.all() + # # if base_id.count() > 0: + # # base_id = int(base_id.last().base_order) + 1 + # # else: + # # base_id = 1000 + # # system_profile = SystemUserProfile( + # # mobile=mobile, + # # first_name=first_name, + # # last_name=last_name, + # # fullname=first_name + ' ' + last_name, + # # user=user, + # # base_order=base_id, + # # password=password, + # # birthday=str(datetime.datetime.now().date()), + # # city=city, + # # province=province + # # ) + # # system_profile.save() + # # system_profile.role.add(group) + # # l+=1 + # else: + # guilds = Guilds.objects.filter(user=system_profile).exists() + # if not guilds: + # address = SystemAddress(city=city, province=province, address=row[6]) + # address.save() + # wallet = Wallet() + # wallet.save() + # guilds = Guilds( + # user=system_profile, + # address=address, + # wallet=wallet, + # guilds_name=first_name + ' ' + last_name, + # type_activity='خرده فروش', + # area_activity='گوشت و مرغ', + # guilds_id=guild_id, + # license_number=license_num, + # + # ) + # guilds.save() + # l += 1 + + # Guilds.objects.bulk_create(guilds_list) + return Response( + l + ) + + +def Broadcast_management(request): + abc_list = ['A', 'B', 'C', 'D', 'E', 'G', 'I', 'K', 'M', 'O', 'Q', 'S'] + + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(request.GET['date'], + '%Y-%m-%d').date() if 'date' in request.GET else now + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False) + + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1, date__date__lte=date2, + kill_house=kill_house, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + # to_date = jdatetime.date.fromgregorian( + # year=date2.year, + # month=date2.month, + # day=date2.day + # ).strftime('%Y-%m-%d') + # reversed_date = reversed(to_date.split("-")) + # separate = "-" + # to_date_1 = separate.join(reversed_date) + + names_list = [kill_house.name] + output = BytesIO() + workbook = Workbook() + for name in names_list: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + worksheet['F2'] = f'اطلاعات کلی توزیع و پخش مرغ گرم در تاریخ {from_date_1}' + + worksheet['F2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range122 = 'F2:N2' + worksheet.merge_cells(merge_range122) + + worksheet['F2'].font = Font(size=10) + + for abc in abc_list[2:11]: + worksheet[f'{abc}3'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + withe_font = Font(size=12, bold=True, color='D9FFFFFF') + blue = PatternFill(start_color="4472C4", fill_type="solid") + worksheet['C3'] = f'ورودی از سردخانه' + worksheet['E3'] = f'پیش سرد' + worksheet['G3'] = f'خرید خارج از استان' + worksheet['I3'] = f'بارهای روزانه' + worksheet['K3'] = f'جمع کل انبار' + worksheet['M3'] = f'توزیع شده' + worksheet['O3'] = f'توزیع / تحویل شده' + worksheet['Q3'] = f'مانده انبار' + + worksheet['C3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['E3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['G3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['I3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['K3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['M3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['O3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['Q3'].alignment = Alignment(horizontal='center', vertical='center') + + merge_range1 = 'C3:D4' + merge_range2 = 'E3:F4' + merge_range3 = 'G3:H4' + merge_range4 = 'I3:J4' + merge_range5 = 'K3:L4' + merge_range6 = 'M3:N4' + merge_range7 = 'O3:P4' + merge_range8 = 'Q3:R4' + + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + + worksheet['C3'].font = withe_font + worksheet['E3'].font = withe_font + worksheet['G3'].font = withe_font + worksheet['I3'].font = withe_font + worksheet['K3'].font = withe_font + worksheet['M3'].font = withe_font + worksheet['O3'].font = withe_font + worksheet['Q3'].font = withe_font + + worksheet['C3'].fill = blue + worksheet['E3'].fill = blue + worksheet['G3'].fill = blue + worksheet['I3'].fill = blue + worksheet['K3'].fill = blue + worksheet['M3'].fill = blue + worksheet['O3'].fill = blue + worksheet['Q3'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + + for item in range(len(list1)): + cell = worksheet.cell(row=5, column=item + 3, value=list1[item]) + worksheet.row_dimensions[5].height = 19 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, + trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + total_pre_cold_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[ + 'total'] + total_pre_cold_weight = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[ + 'total'] + total_number_of_free_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('free_weight_of_carcasses'))[ + 'total'] + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + list2 = [ + + 0, + 0, + total_pre_cold_quantity if total_pre_cold_quantity != None else 0, + total_pre_cold_weight if total_pre_cold_weight != None else 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=6, column=item + 3, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + excel_options = [ + 'ردیف', + 'شناسه صنف', + 'تاریخ ثبت', + 'ماهیت', + 'نوع تخصیص', + 'نام واحد صنفی', + 'نام شخص', + 'کد ملی', + 'موبایل', + 'نوع فعالیت', + 'حوزه فعالیت', + 'شماره مجوز', + 'شهرستان', + 'تعداد لاشه تخصیص', + 'وزن لاشه تخصیصی', + 'تعداد لاشه تحویلی', + 'وزن لاشه تحویلی', + 'وضعیت', + 'کد احراز', + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=9, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[9].height = 26 + worksheet.freeze_panes = worksheet['A10'] + max_col = worksheet.max_column + range_str = f'A9:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + m = 1 + l = 10 + + stewards = ( + StewardAllocation.objects.filter(trash=False, ware_house__kill_house=kill_house, date__date=date1, + ) + .select_related('guilds', + 'guilds__user', + 'guilds__address__city', + 'kill_house', + 'kill_house__kill_house_operator').order_by( + 'id')) + + if stewards.exists(): + for steward_allocation in stewards: + create_date = jdatetime.date.fromgregorian( + day=steward_allocation.create_date.day, + month=steward_allocation.create_date.month, + year=steward_allocation.create_date.year + ) + steward = 'مباشر' if steward_allocation.seller_type == 'steward' else 'صنف' + sell_type = 'اختصاصی' if steward_allocation.sell_type == 'exclusive' else 'آزاد' + type = 'دستی' if steward_allocation.type == 'manual' else 'اتوماتیک' + try: + guilds_name = steward_allocation.steward.guilds.guilds_name + guilds_id = steward_allocation.steward.guilds.guilds_id + fullname = steward_allocation.steward.guilds.user.fullname + national_id = steward_allocation.steward.guilds.user.national_id + mobile = steward_allocation.steward.guilds.user.mobile + type_activity = steward_allocation.steward.guilds.type_activity + area_activity = steward_allocation.steward.guilds.area_activity + license_number = steward_allocation.steward.guilds.license_number + city_name = steward_allocation.steward.guilds.address.city.name + except: + guilds_name = steward_allocation.guilds.guilds_name + guilds_id = steward_allocation.guilds.guilds_id + fullname = steward_allocation.guilds.user.fullname + national_id = steward_allocation.guilds.user.national_id + mobile = steward_allocation.guilds.user.mobile + type_activity = steward_allocation.guilds.type_activity + area_activity = steward_allocation.guilds.area_activity + license_number = steward_allocation.guilds.license_number + city_name = steward_allocation.guilds.address.city.name + if steward_allocation.receiver_state == 'pending': + reciver_type = 'در انتظار تحویل' + register = '-' + elif steward_allocation.receiver_state == 'accepted': + reciver_type = 'تحویل گرفته شد' + register = steward_allocation.logged_registration_code if steward_allocation.logged_registration_code else 'وارد نشده' + + else: + reciver_type = 'رد شده' + register = '-' + + list2 = [ + m, + guilds_id, + str(create_date), + steward, + f'{sell_type}({type})', + guilds_name, + fullname, + national_id, + mobile, + type_activity, + area_activity, + license_number, + city_name, + steward_allocation.number_of_carcasses, + steward_allocation.weight_of_carcasses, + steward_allocation.receiver_real_number_of_carcasses, + steward_allocation.receiver_real_weight_of_carcasses, + reciver_type, + register, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + m += 1 + l += 1 + + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="{kill_house.name} در تاریخ {str(now)}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def guilds_excel(request): + filterset_class = GuildsFilterSet + filterset_fields = [ + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__city__name', + 'user__province__name', + 'address__city__name', + 'guilds_name', + 'type_activity', + 'area_activity', + + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + + active_state = request.GET.get('active_state') + active_filter = {} + if active_state == 'active': + active_filter['active'] = True + elif active_state == 'deactive': + active_filter['active'] = False + if request.GET['role'] in ['CityCommerce', 'CityJahad', 'CityPoultry']: + guilds = Guilds.objects.filter(trash=False, province_accept_state='accepted', + address__city=user.city, **active_filter).order_by('id') + elif request.GET['role'] == 'Guilds': + + guilds = [] + + if request.GET['steward'] == 'true': + steward = Steward.objects.get(guilds__user=user, trash=False) + guilds_list = [] + first_guilds = Guilds.objects.filter(trash=False, centers_allocation__isnull=False, + province_accept_state__in=('pending', 'accepted'), + **active_filter).order_by('id') + for guild in first_guilds: + + if len(guild.centers_allocation) == 0 or guild.centers_allocation == None: + continue + if guild.centers_allocation[0]['value'] == str( + steward.key): + guilds_list.append(guild.key) + if len(guilds_list) > 0: + guilds = Guilds.objects.filter(key__in=guilds_list, **active_filter).order_by('id') + + elif request.GET['role'] == 'KillHouse': + guilds_list = [] + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if 'steward' in request.GET and request.GET['steward'] == 'true': + guilds = Guilds.objects.filter(trash=False, steward=True, + kill_house_centers_allocation__isnull=False, + province_accept_state__in=('pending', 'accepted'), + **active_filter).order_by('id') + else: + guilds = Guilds.objects.filter(trash=False, kill_house_centers_allocation__isnull=False, + province_accept_state__in=('pending', 'accepted'), + **active_filter).order_by('id') + for guild in guilds: + + if len(guild.kill_house_centers_allocation) == 0 or guild.kill_house_centers_allocation == None: + continue + if guild.kill_house_centers_allocation[0]['value'] == str( + kill_house.key): + guilds_list.append(guild.key) + if len(guilds_list) > 0: + guilds = Guilds.objects.filter(key__in=guilds_list, **active_filter).order_by('id') + else: + guilds = [] + + else: + if 'check' in request.GET: + if request.GET['state'] == 'pending': + guilds = Guilds.objects.filter( + Q(kill_house_register=True) | Q(steward_register=True) | Q(pos_company_register=True), + province_accept_state='pending', + trash=False, **active_filter).order_by('id') + else: + guilds = Guilds.objects.filter(kill_house_register=True, + trash=False, **active_filter).order_by('id') + else: + if 'steward' in request.GET and request.GET['steward'] == 'true': + guilds = Guilds.objects.filter(province_accept_state='accepted', steward=True, + trash=False, **active_filter).order_by('id') + else: + guilds = Guilds.objects.filter(province_accept_state='accepted', trash=False, + **active_filter).order_by('id') + if 'value' in request.GET and request.GET['value'] == 'undefined': + pass + else: + if 'search' in request.GET and request.GET['search'] == 'filter': + if request.GET.get('value', '') != "": + guilds_list = [] + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + filtered_queryset = filterset_class(data=query, queryset=guilds).filter() + if filtered_queryset.exists(): + if len(guilds_list) == 0: + guilds_list = list(filtered_queryset.values_list('id', flat=True)) + else: + guilds_list = list(set(guilds_list) & set(filtered_queryset.values_list('id', flat=True))) + if len(guilds_list) > 0: + guilds = guilds.filter(id__in=guilds_list) + excel_options = [ + 'ردیف', + 'کد ملی', + 'نام', + 'نام خانوادگی', + 'شماره شناسنامه', + 'در قید حیات', + 'تاریخ تولد', + 'نام پدر', + 'جنسیت', + 'شهر', + 'شماره همراه', + 'نام واحد', + 'رسته واحد صنفی', + 'استان', + 'شهرستان', + 'تاریخ انقضا مجوز', + 'شماره مجوز', + 'نام اتحادیه', + 'وضعیت', + 'کد پستی', + 'شماره تلفن', + 'آیا اتباع است؟', + 'نام شرکت', + 'شناسه ملی شرکت', + 'وضعیت مجوز', + 'آدرس', + 'مباشر', + 'احراز شماره موبایل', + ] + header_list = [ + 'تعداد اصناف', + 'تعداد مباشرین', + 'تعداد دارای کارتخوان', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'] = f'گزارش اصناف' + red_font = Font(color="C00000", bold=True) + + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + worksheet['A1'].font = red_font + + worksheet.merge_cells(merge_range1) + for col_num, option in enumerate(header_list, 4): + cell = worksheet.cell(row=2, column=col_num, value=option) + col_letter = get_column_letter(col_num) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 21 + worksheet.column_dimensions[col_letter].width = 16.01 + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[5].height = 18 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 4 + m = 1 + has_pos = 0 + is_steward = 0 + for guild in guilds: + user = guild.user if getattr(guild, 'user', None) else None + address = guild.address if getattr(guild, 'address', None) else None + + national_id = getattr(user, 'national_id', None) if user else None + national_id = national_id if national_id else '-' + first_name = getattr(user, 'first_name', '-') if user else '-' + last_name = getattr(user, 'last_name', '-') if user else '-' + id_number = getattr(user, 'national_code', None) if user else None + id_number = id_number if id_number else '-' + is_alive_value = getattr(user, 'is_alive', None) if user else None + is_alive = 'بلی' if is_alive_value == True else ('خیر' if is_alive_value == False else '-') + birthday = '-' + if user: + birthday_value = getattr(user, 'birthday', None) + if birthday_value: + try: + if type(birthday_value) == str: + birthday_value = convert_str_to_date(birthday_value) + birthday = str(shamsi_date(birthday_value, in_value=True)) + else: + birthday = str(shamsi_date(birthday_value, in_value=True)) + + except: + birthday = '-' + father_name = getattr(user, 'father_name', None) if user else None + father_name = father_name if father_name else '-' + gender_value = getattr(user, 'gender', None) if user else None + if gender_value == True or str(gender_value).lower() in ['true', '1', 'male', 'مرد', 'm']: + gender = 'مرد' + elif gender_value == False or str(gender_value).lower() in ['false', '0', 'female', 'زن', 'f']: + gender = 'زن' + else: + gender = '-' + user_city = getattr(user.city, 'name', '-') if user and getattr(user, 'city', None) else '-' + mobile = getattr(user, 'mobile', '-') if user else '-' + user_province = getattr(user.province, 'name', '-') if user and getattr(user, 'province', None) else '-' + + guild_name = getattr(guild, 'guilds_name', None) + guild_name = guild_name if guild_name else '-' + area_activity = getattr(guild, 'area_activity', None) + area_activity = area_activity if area_activity else '-' + + address_city = getattr(address.city, 'name', '-') if address and getattr(address, 'city', None) else '-' + postal_code = getattr(address, 'postal_code', '-') if address else '-' + phone = getattr(address, 'phone', None) if address else None + phone = phone if phone else '-' + address_value = getattr(address, 'address', '-') if address else '-' + + license_expire_date = '-' + if getattr(guild, 'license_expire_date', None): + try: + license_expire_date = str(shamsi_date(guild.license_expire_date.date(), in_value=True)) + except: + license_expire_date = '-' + license_number = getattr(guild, 'license_number', None) + license_number = license_number if license_number else '-' + union_name = getattr(guild, 'union_name', None) + union_name = union_name if union_name else '-' + license_status = getattr(guild, 'license_status', None) + license_status = license_status if license_status else '-' + + active_status = 'فعال' if getattr(guild, 'active', False) else 'غیر فعال' + + is_foreign = getattr(guild, 'is_foreign_national', None) + if is_foreign == True: + is_foreign_national = 'بلی' + elif is_foreign == False: + is_foreign_national = 'خیر' + else: + is_foreign_national = '-' + + company_name = getattr(guild, 'company_name', None) + company_name = company_name if company_name else '-' + company_identifier = getattr(guild, 'company_identifier', None) + company_identifier = company_identifier if company_identifier else '-' + + if guild.steward == True: + steward = 'می باشد' + is_steward += 1 + else: + steward = 'نمی باشد' + + register_code = getattr(guild, 'register_code', None) + mobile_verified = 'احراز دارد' if register_code and str(register_code).strip() else '-' + + if guild.has_pos == True: + has_pos += 1 + + list1 = [ + m, + national_id, + first_name, + last_name, + id_number, + is_alive, + birthday, + father_name, + gender, + user_city, + mobile, + guild_name, + area_activity, + user_province, + address_city, + license_expire_date, + license_number, + union_name, + active_status, + postal_code, + phone, + is_foreign_national, + company_name, + company_identifier, + license_status, + address_value, + steward, + mobile_verified, + ] + l += 1 + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + value_list = [ + m - 1, + is_steward, + has_pos + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=3, column=item + 4, value=value_list[item]) + cell.alignment = Alignment(horizontal='center') + 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 + + +def commerce_report_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + today = datetime.datetime.now().date() + poultry_reqs = PoultryRequest.objects.filter(trash=False).select_related('poultry').order_by('-send_date') + filtered_poultry_reqs = [ + poultry_req for poultry_req in poultry_reqs + if date1 <= poultry_req.send_date.date() <= date2 + ] + + excel_options = [ + 'کد سفارش', + 'نام واحد', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'آدرس', + 'تاریخ جوجه ریزی', + 'تعداد کل جوجه ریزی', + 'سن مرغ', + 'تعداد درخواست کشتار', + 'تعداد باقی مانده', + 'نژاد', + 'تاریخ درخواست کشتار', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'زمان تخصیص', + 'ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس خریدار', + 'محل کشتار', + 'دامپزشک کشتارگاه', + 'تلفن دامپزشک کشتارگاه', + 'راننده', + 'تلفن راننده', + 'ماشین حمل', + 'کد بهداشتی حمل و نقل', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تحویلی', + 'وزن بار', + 'تاریخ تخلیه کشتارگاه', + 'مبلغ فاکتور', + 'تاریخ پرداخت فاکتور', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + + for filtered_poultry_req in filtered_poultry_reqs: + vet_farm = VetFarm.objects.filter(poultry=filtered_poultry_req.poultry, trash=False).last() + vet_farm_name = vet_farm.vet.user.fullname if vet_farm else '-' + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else '-' + + age = (today - filtered_poultry_req.hatching.date.date()).days + 1 + gregorian_date = jdatetime.date.fromgregorian( + day=filtered_poultry_req.hatching.date.day, + month=filtered_poultry_req.hatching.date.month, + year=filtered_poultry_req.hatching.date.year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_req.create_date.day, + month=filtered_poultry_req.create_date.month, + year=filtered_poultry_req.create_date.year + ) + incubation_date = gregorian_date + + province_kill_reqs = ProvinceKillRequest.objects.filter(province_request__poultry_request=filtered_poultry_req, + trash=False) + for province_kill_req in province_kill_reqs: + kill_house_vet = KillHouseVet.objects.filter(kill_house=province_kill_req.kill_request.kill_house, + trash=False).only('vet__user__fullname', + 'vet__user__mobile').last() + kill_house_vet_name = kill_house_vet.vet.user.fullname if kill_house_vet else '-' + kill_house_vet_mobile = kill_house_vet.vet.user.mobile if kill_house_vet else '-' + date_of_inner_bar = '-' + kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_req, trash=False) + for kill_house_request in kill_house_requests: + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request).only('create_date') + killers = 'کشتارکن' + if kill_house_request.killhouse_user.killer == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_request).only( + 'real_quantity', 'net_weight').last() + assignment_quantity = assignment.real_quantity if assignment else '-' + assignment_weight = assignment.net_weight if assignment else '-' + + factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill_house_request).only( + 'total_price').last() + factor_amount = factor.total_price if factor else '-' + date_factor = '-' + factor_payment = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request).only( + 'create_date').last() + if factor_payment: + date_factor = jdatetime.date.fromgregorian( + day=factor_payment.create_date.day, + month=factor_payment.create_date.month, + year=factor_payment.create_date.year + ) + + time = jdatetime.date.fromgregorian( + day=kill_house_request.create_date.day, + month=kill_house_request.create_date.month, + year=kill_house_request.create_date.year + ) + for vet_checks in vet_check: + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_checks.create_date.day, + month=vet_checks.create_date.month, + year=vet_checks.create_date.year + ) + + code = kill_house_request.clearance_code if kill_house_request.clearance_code else '-' + list1 = [ + filtered_poultry_req.order_code, + filtered_poultry_req.poultry.unit_name, + filtered_poultry_req.poultry.user.fullname, + filtered_poultry_req.poultry.user.mobile, + filtered_poultry_req.poultry.user.city.name, + str(incubation_date), + filtered_poultry_req.hatching.quantity, + str(age), + filtered_poultry_req.quantity, + filtered_poultry_req.hatching.left_over, + filtered_poultry_req.hatching.chicken_breed, + str(date_of_kill), + vet_farm_name, + vet_farm_mobile, + str(time), + killers, + province_kill_req.kill_request.kill_house.name, + province_kill_req.kill_request.kill_house.phone, + province_kill_req.kill_request.kill_house.system_address.city.name, + province_kill_req.kill_request.kill_house.system_address.city.name, + kill_house_vet_name, + kill_house_vet_mobile, + kill_house_request.add_car.driver.driver_name, + kill_house_request.add_car.driver.driver_mobile, + kill_house_request.add_car.driver.type_car, + kill_house_request.traffic_code, + code, + assignment_quantity, + assignment_weight, + str(date_of_inner_bar), + factor_amount, + str(date_factor) + ] + l += 1 + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + list1 = [ + filtered_poultry_req.order_code, + filtered_poultry_req.poultry.unit_name, + filtered_poultry_req.poultry.user.fullname, + filtered_poultry_req.poultry.user.mobile, + filtered_poultry_req.poultry.user.city.name, + str(incubation_date), + filtered_poultry_req.hatching.quantity, + str(age), + filtered_poultry_req.quantity, + filtered_poultry_req.hatching.left_over, + filtered_poultry_req.hatching.chicken_breed, + str(date_of_kill), + vet_farm_name, + vet_farm_mobile, + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-' + ] + l += 1 + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + 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 + + +def commerce_bar_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + + kill_requests = KillHouseRequest.objects.filter(trash=False).order_by('-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry') + filtered_kill_reqs = [ + kill_request for kill_request in kill_requests + if date1 <= kill_request.kill_request.recive_date.date() <= date2 + ] + excel_options = [ + 'کد بار', + 'مرغدار', + 'تلفن مرغدار', + 'کدسفارش مرغدار', + ' شهر مرغدار', + ' تاریخ کشتار', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'خریدار', + ' تلفن خریدار', + ' ماهیت خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تخصیصی', + 'تعداد تخلیه شده', + 'وزن بار', + 'تاریخ تخلیه (کشتارگاه)', + 'مبلغ فاکتور', + 'تاریخ پرداخت فاکتور', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + l += 1 + vet_farm = VetFarm.objects.filter(poultry=kill.province_request.poultry_request.poultry, trash=False).last() + vet_farm_name = vet_farm.vet.user.fullname if vet_farm else '-' + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.killhouse_user).last() + vet_checks = VetCheckRequest.objects.filter(kill_house_request=kill).only('create_date').last() + kill_house_vet_name = kil_house_vet.vet.user.fullname if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.vet.user.mobile if kil_house_vet else '-' + factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill).only('total_price').last() + factor_amount = factor.total_price if factor else '-' + factor_payment = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill).only( + 'create_date').last() + date_factor = jdatetime.date.fromgregorian( + day=factor_payment.create_date.day, + month=factor_payment.create_date.month, + year=factor_payment.create_date.year + ) if factor_payment else '-' + code = kill.clearance_code if kill.clearance_code else '-' + quantity = kill.quantity if kill.quantity else '-' + date_of_poultry_request = jdatetime.date.fromgregorian( + day=kill.province_request.poultry_request.send_date.day, + month=kill.province_request.poultry_request.send_date.month, + year=kill.province_request.poultry_request.send_date.year + ) + killers = 'کشتارکن' + if kill.killhouse_user.killer == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill, trash=False).last() + net_weighte = assignment.net_weight if assignment else '-' + real_quantity = assignment.real_quantity if assignment else '-' + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_checks.create_date.day, + month=vet_checks.create_date.month, + year=vet_checks.create_date.year + ) if vet_checks else '-' + if kill.kill_request.slaughter_house != None: + kill_place = kill.kill_request.slaughter_house.name + else: + kill_place = kill.killhouse_user.name + + list1 = [ + str(kill.bar_code), + kill.province_request.poultry_request.poultry.unit_name, + str(kill.province_request.poultry_request.poultry.user.mobile), + kill.province_request.poultry_request.order_code, + kill.province_request.poultry_request.poultry.user.city.name, + str(date_of_poultry_request), + kill.province_request.poultry_request.chicken_breed, + vet_farm_name, + vet_farm_mobile, + kill.kill_request.kill_house.name, + kill.killhouse_user.phone, + killers, + kill.killhouse_user.system_address.city.name, + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.add_car.driver.driver_name, + kill.add_car.driver.driver_mobile, + kill.add_car.driver.type_car, + kill.add_car.driver.health_code, + code, + quantity, + real_quantity, + net_weighte, + str(date_of_inner_bar), + factor_amount, + str(date_factor) + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + 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 + + +def number_of_kills_weight_excel(request): + now = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'کد بار', + 'مرغدار', + 'تلفن مرغدار', + 'کدسفارش مرغدار', + ' شهر مرغدار', + ' تاریخ کشتار', + ' نژاد', + 'خریدار', + ' ماهیت خریدار', + ' آدرس ', + ' محل کشتار ', + 'تعداد تخصیصی', + 'وزن بار', + + ] + to_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + worksheet['A1'] = f'گزارش تعداد کشتار' + worksheet['A3'] = f'در تاریخ:({to_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:B1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 21.01 + worksheet.row_dimensions[4].height = 19 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 3 + m = 1 + now = timezone.now().date() + ten_days_ago = now - timedelta(days=int(request.GET['day'])) + for day in range(int(request.GET['day']) + 1): + date = ten_days_ago + timedelta(days=day) + + kill_reqs = KillHouseRequest.objects.filter( + kill_request__recive_date__date=date, + trash=False).select_related( + 'killhouse_user', 'province_request__poultry_request__poultry', 'province_request__poultry_request', + 'kill_request').order_by( + '-kill_request__recive_date') + + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + kill_requests = kill_reqs.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + kill_requests = kill_reqs.filter(province_request__poultry_request__poultry__user__city=user.city) + else: + kill_requests = kill_reqs + else: + kill_requests = kill_reqs + if kill_requests: + for kill in kill_requests: + l += 1 + total_weight = 0 + kill_house_request_information = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill).first() + if kill_house_request_information: + total_weight += kill_house_request_information.net_weight + else: + total_weight += kill.province_request.poultry_request.Index_weight * kill.quantity + quantity = kill.quantity if kill.quantity else '-' + date_of_poultry_request = jdatetime.date.fromgregorian( + day=kill.province_request.poultry_request.send_date.day, + month=kill.province_request.poultry_request.send_date.month, + year=kill.province_request.poultry_request.send_date.year + ) + killers = 'کشتارکن' + if kill.killhouse_user.killer == False: + killers = 'کشتارگاه' + + if kill.kill_request.slaughter_house != None: + kill_place = kill.kill_request.slaughter_house.name + else: + kill_place = kill.killhouse_user.name + + list1 = [ + m, + str(kill.bar_code), + kill.province_request.poultry_request.poultry.unit_name, + str(kill.province_request.poultry_request.poultry.user.mobile), + kill.province_request.poultry_request.order_code, + kill.province_request.poultry_request.poultry.user.city.name, + str(date_of_poultry_request), + kill.province_request.poultry_request.chicken_breed, + kill.kill_request.kill_house.name, + killers, + kill.killhouse_user.system_address.city.name, + kill_place, + quantity, + total_weight, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="گزارش تعداد کشتار {request.GET["day"]} روز گذشته (براساس بار).xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def number_of_kills_excel(request): + now = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'کد بار', + 'مرغدار', + 'تلفن مرغدار', + 'کدسفارش مرغدار', + ' شهر مرغدار', + ' تاریخ کشتار', + ' نژاد', + 'خریدار', + ' ماهیت خریدار', + ' آدرس ', + ' محل کشتار ', + 'تعداد تخصیصی', + 'وزن بار', + + ] + to_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + worksheet['A1'] = f'گزارش تعداد کشتار' + worksheet['A3'] = f'در تاریخ:({to_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:B1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 21.01 + worksheet.row_dimensions[4].height = 19 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 3 + m = 1 + now = timezone.now().date() + ten_days_ago = now - timedelta(days=int(request.GET['day'])) + for day in range(int(request.GET['day']) + 1): + date = ten_days_ago + timedelta(days=day) + + kill_reqs = KillHouseRequest.objects.filter( + kill_request__recive_date__date=date, + trash=False).select_related( + 'killhouse_user', 'province_request__poultry_request__poultry', 'province_request__poultry_request', + 'kill_request').order_by( + '-kill_request__recive_date') + + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + kill_requests = kill_reqs.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + kill_requests = kill_reqs.filter(province_request__poultry_request__poultry__user__city=user.city) + else: + kill_requests = kill_reqs + else: + kill_requests = kill_reqs + + if kill_requests: + for kill in kill_requests: + l += 1 + total_weight = 0 + kill_house_request_information = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill).first() + if kill_house_request_information: + total_weight += kill_house_request_information.net_weight + else: + total_weight += kill.province_request.poultry_request.Index_weight * kill.quantity + quantity = kill.quantity if kill.quantity else '-' + date_of_poultry_request = jdatetime.date.fromgregorian( + day=kill.province_request.poultry_request.send_date.day, + month=kill.province_request.poultry_request.send_date.month, + year=kill.province_request.poultry_request.send_date.year + ) + killers = 'کشتارکن' + if kill.killhouse_user.killer == False: + killers = 'کشتارگاه' + + if kill.kill_request.slaughter_house != None: + kill_place = kill.kill_request.slaughter_house.name + else: + kill_place = kill.killhouse_user.name + + list1 = [ + m, + str(kill.bar_code), + kill.province_request.poultry_request.poultry.unit_name, + str(kill.province_request.poultry_request.poultry.user.mobile), + kill.province_request.poultry_request.order_code, + kill.province_request.poultry_request.poultry.user.city.name, + str(date_of_poultry_request), + kill.province_request.poultry_request.chicken_breed, + kill.kill_request.kill_house.name, + killers, + kill.killhouse_user.system_address.city.name, + kill_place, + quantity, + total_weight, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="گزارش تعداد کشتار {request.GET["day"]} روز گذشته (براساس بار).xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def single_hatching_age_range_excel(request): + filtered_poultry_hatchs = PoultryHatching.objects.filter(state__in=('pending', 'complete'), archive=False, + allow_hatching='pending', + trash=False).order_by('-create_date').select_related( + 'poultry') + + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_poultry_hatch = filtered_poultry_hatchs.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_poultry_hatch = filtered_poultry_hatchs.filter(poultry__user__city=user.city) + else: + filtered_poultry_hatch = filtered_poultry_hatchs + else: + filtered_poultry_hatch = filtered_poultry_hatchs + + excel_options = [ + 'ردیف', + 'نام فارم', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'کشتار شده', + 'مانده در سالن', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + header_list = [ + 'تعداد کل فارم ها', + 'مجموع جوجه ریزی', + 'مجموع کشتار شده', + 'مجموع مانده در سالن', + ] + for col_num, option in enumerate(header_list, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 30 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 4 + m = 1 + for poultry_hatching in filtered_poultry_hatch: + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + poultry_requests = PoultryRequest.objects.filter(hatching=poultry_hatching, trash=False).only('quantity') + age = (datetime.datetime.now().date() - poultry_hatching.date.date()).days + 1 + quantity_sum = 0 + for poultry_request in poultry_requests: + if poultry_request and hasattr(poultry_request, 'quantity'): + quantity_sum += poultry_request.quantity + list1 = [ + m, + poultry_hatching.poultry.unit_name, + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.losses, + poultry_hatching.killed_quantity, + poultry_hatching.left_over, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + total_poultry_hatchings_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + total_poultry_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity') or 0 + total_poultry_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity') or 0 + value_list = [ + m - 1, + total_poultry_hatchings_quantity, + total_poultry_killed_quantity, + total_poultry_left_over, + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=3, column=item + 3, value=value_list[item]) + cell.alignment = Alignment(horizontal='center') + value = value_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + 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 + + +def total_poultry_request_dashboard_excel(request): + now = datetime.datetime.now().date() + + filtered_province_kill = PoultryRequest.objects.filter(send_date__date=now, trash=False).order_by('-send_date') + + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_province_kill_reqs = filtered_province_kill.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_province_kill_reqs = filtered_province_kill.filter(poultry__user__city=user.city) + else: + filtered_province_kill_reqs = filtered_province_kill + else: + filtered_province_kill_reqs = filtered_province_kill + + excel_options = [ + 'ردیف', + 'کد سفارش', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'نام و نام خانوادگی مرغدار', + 'نام فارم', + 'موبایل', + 'کشتارگاه های پیشنهادی', + 'آدرس', + 'سن مرغ', + 'تعداد درخواست کشتار', + 'مانده در سالن', + 'تایید شده', + ] + to_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if filtered_province_kill_reqs.exists(): + province = filtered_province_kill_reqs.first().poultry.address.province.name + worksheet['A2'] = f'استان {province}' + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + + worksheet['A1'] = f'درخواست های کشتار' + worksheet['A3'] = f'در تاریخ:({to_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:B1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 21.01 + worksheet.row_dimensions[4].height = 19 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 3 + m = 1 + if filtered_province_kill_reqs: + for filtered_poultry_kill_request in filtered_province_kill_reqs: + l += 1 + date_of_create = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.create_date.day, + month=filtered_poultry_kill_request.create_date.month, + year=filtered_poultry_kill_request.create_date.year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.send_date.day, + month=filtered_poultry_kill_request.send_date.month, + year=filtered_poultry_kill_request.send_date.year + ) + state = 'تایید شده' + if filtered_poultry_kill_request.state == 'pending': + state = 'در انتظار تایید' + kill_house = '' + for name in filtered_poultry_kill_request.kill_house_list: + kill_house += name + '-' + age = ( + filtered_poultry_kill_request.send_date.date() - filtered_poultry_kill_request.hatching.date.date()).days + 1 + list1 = [ + m, + filtered_poultry_kill_request.order_code, + str(date_of_create), + str(date_of_kill), + filtered_poultry_kill_request.poultry.user.fullname, + filtered_poultry_kill_request.poultry.unit_name, + filtered_poultry_kill_request.poultry.user.mobile, + kill_house, + filtered_poultry_kill_request.poultry.address.city.name, + age, + filtered_poultry_kill_request.quantity, + filtered_poultry_kill_request.hatching.left_over, + state + ] + m += 1 + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + 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 + + +def total_poultry_hatching_dashboard_excel(request): + excel_options = [ + 'تعداد فارم', + 'جوجه ریزی', + 'تلفات (10٪)', + 'کشتار شده', + 'مانده در سالن', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 1 + poultry_counts = Poultry.objects.filter(trash=False) + poultry_hatchings = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False, + trash=False) + total_poultry_hatchings_quantity = poultry_hatchings.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + total_poultry_hatchings_left = poultry_hatchings.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + losses = poultry_hatchings.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + total_kill_house_request_quantity = KillHouseRequest.objects.filter( + trash=False + ).aggregate(total_quantity=Sum('quantity'))['total_quantity'] or 0 + + list1 = [ + poultry_counts.count(), + total_poultry_hatchings_quantity, + losses, + total_kill_house_request_quantity, + total_poultry_hatchings_left + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + 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 + + +def doughnut_left_hatching_excel(request): + now = datetime.datetime.now().date() + # user = SystemUserProfile.objects.get(token=request.GET['token']) + # total = 0 + # city_list = [] + # hatchings_list = [] + hatchings = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False + ).order_by('-date') + + if 'role' in request.GET: + user = SystemUserProfile.objects.get(token=request.GET['token']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + hatchingss_list = hatchings.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + hatchingss_list = hatchings.filter(poultry__user__city=user.city) + else: + hatchingss_list = hatchings + else: + hatchingss_list = hatchings + + excel_options = [ + 'ردیف', + 'نام فارم', + 'شهر', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'کشتار شده', + 'مانده در سالن', + ] + + to_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if hatchingss_list.exists(): + province = hatchingss_list.first().poultry.address.province.name + worksheet['A2'] = f'استان {province}' + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'] = f'گزارش کل جوجه ریزی بر اساس شهرستان' + worksheet['A3'] = f'در تاریخ:({to_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:B1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 21.01 + worksheet.row_dimensions[4].height = 19 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 3 + m = 1 + for hatchingss in hatchingss_list: + + if (jdatetime.datetime.fromgregorian(year=hatchingss.date.year, month=hatchingss.date.month, + day=hatchingss.date.day)).month == int(request.GET['month']): + # hatchings_list.append(hatchingss) + # total += hatchingss.quantity + # if hatchingss.poultry.address.city not in city_list: + # city_list.append(hatchingss.poultry.address.city) + + create_date = jdatetime.date.fromgregorian( + day=hatchingss.create_date.day, + month=hatchingss.create_date.month, + year=hatchingss.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=hatchingss.date.day, + month=hatchingss.date.month, + year=hatchingss.date.year + ) + age = (datetime.datetime.now().date() - hatchingss.date.date()).days + 1 + # for city in city_list: + # for hatch in hatchings_list: + list1 = [ + m, + hatchingss.poultry.unit_name, + hatchingss.poultry.address.city.name, + hatchingss.hall, + hatchingss.period, + str(create_date), + str(date), + hatchingss.chicken_breed, + age, + hatchingss.quantity, + hatchingss.losses, + hatchingss.killed_quantity, + hatchingss.left_over, + ] + l += 1 + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + 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 + + +def doughnut_hatching_excel(request): + now = datetime.datetime.now().date() + # total = 0 + # city_list = [] + # hatchings_list = [] + hatchings = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False + ).order_by('-date') + + if 'role' in request.GET: + user = SystemUserProfile.objects.get(token=request.GET['token']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + hatchingss_list = hatchings.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + hatchingss_list = hatchings.filter(poultry__user__city=user.city) + else: + hatchingss_list = hatchings + else: + hatchingss_list = hatchings + + province = hatchingss_list.first().poultry.address.province.name + excel_options = [ + 'ردیف', + 'نام فارم', + 'شهر', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'کشتار شده', + 'مانده در سالن', + ] + + to_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + worksheet['A1'] = f'گزارش کل جوجه ریزی بر اساس شهرستان' + worksheet['A2'] = f'استان {province}' + worksheet['A3'] = f'در تاریخ:({to_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:B1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 21.01 + worksheet.row_dimensions[4].height = 19 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 3 + m = 1 + for hatchingss in hatchingss_list: + + if (jdatetime.datetime.fromgregorian(year=hatchingss.date.year, month=hatchingss.date.month, + day=hatchingss.date.day)).month == int(request.GET['month']): + # hatchings_list.append(hatchingss) + # total += hatchingss.quantity + # if hatchingss.poultry.address.city not in city_list: + # city_list.append(hatchingss.poultry.address.city) + + create_date = jdatetime.date.fromgregorian( + day=hatchingss.create_date.day, + month=hatchingss.create_date.month, + year=hatchingss.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=hatchingss.date.day, + month=hatchingss.date.month, + year=hatchingss.date.year + ) + age = (datetime.datetime.now().date() - hatchingss.date.date()).days + 1 + # for city in city_list: + # for hatch in hatchings_list: + list1 = [ + m, + hatchingss.poultry.unit_name, + hatchingss.poultry.address.city.name, + hatchingss.hall, + hatchingss.period, + str(create_date), + str(date), + hatchingss.chicken_breed, + age, + hatchingss.quantity, + hatchingss.losses, + hatchingss.killed_quantity, + hatchingss.left_over, + ] + l += 1 + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="گزارش کل جوجه ریزی بر اساس شهرستان های استان {province}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def forecast_hatching_left_over_excel(request): + user = SystemUserProfile.objects.get(user=request.user) + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + age = int(request.GET['age']) + days_interval = (date2 - date1).days + hatchings = PoultryHatching.objects.filter(state='pending', poultry__address__province=user.province, + allow_hatching='pending', archive=False, + trash=False) + excel_options = [ + 'نام فارم', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'کشتار شده', + 'مانده در سالن', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + if hatchings: + l = 0 + for i in range(days_interval + 1): + hatching_left_over = 0 + first_date = date1 + timedelta(days=i) + for hatch in hatchings: + if (first_date - hatch.date.date()).days + 1 == age: + l += 1 + hatching_left_over += hatch.left_over + create_date = jdatetime.date.fromgregorian( + day=hatch.create_date.day, + month=hatch.create_date.month, + year=hatch.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=hatch.date.day, + month=hatch.date.month, + year=hatch.date.year + ) + poultry_requests = PoultryRequest.objects.filter(hatching=hatch, trash=False).only('quantity') + quantity_sum = 0 + for poultry_request in poultry_requests: + if poultry_request and hasattr(poultry_request, 'quantity'): + quantity_sum += poultry_request.quantity + list1 = [ + hatch.poultry.unit_name, + hatch.hall, + hatch.period, + str(create_date), + str(date), + hatch.chicken_breed, + hatch.quantity, + hatch.losses, + quantity_sum, + hatching_left_over, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + # hatching_list.append({"date": first_date, "hatching_left_over": hatching_left_over}) + if days_interval == 0: + break + + 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 + + +def manager_of_farm_excel(request): + now = datetime.datetime.now().date() + filtered_kill_reqs = KillHouseRequest.objects.filter(kill_request__recive_date__date=now, trash=False).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry') + + excel_options = [ + 'کد بار', + 'مرغدار', + 'تلفن مرغدار', + 'کدسفارش مرغدار', + ' شهر مرغدار', + ' تاریخ کشتار', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'خریدار', + ' تلفن خریدار', + ' ماهیت خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تخصیصی', + 'تعداد تخلیه شده', + 'وزن بار', + 'تاریخ تخلیه (کشتارگاه)', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + vet_farm = VetFarm.objects.filter(poultry=kill.province_request.poultry_request.poultry, trash=False).last() + vet_farm_name = vet_farm.vet.user.fullname if vet_farm else '-' + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.killhouse_user).last() + vet_checks = VetCheckRequest.objects.filter(kill_house_request=kill).only('create_date').last() + kill_house_vet_name = kil_house_vet.vet.user.fullname if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.vet.user.mobile if kil_house_vet else '-' + + code = kill.clearance_code if kill.clearance_code else '-' + quantity = kill.quantity if kill.quantity else '-' + date_of_poultry_request = jdatetime.date.fromgregorian( + day=kill.province_request.poultry_request.send_date.day, + month=kill.province_request.poultry_request.send_date.month, + year=kill.province_request.poultry_request.send_date.year + ) + killers = 'کشتارکن' + if kill.killhouse_user.killer == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill, trash=False).last() + net_weighte = assignment.net_weight if assignment else '-' + real_quantity = assignment.real_quantity if assignment else '-' + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_checks.create_date.day, + month=vet_checks.create_date.month, + year=vet_checks.create_date.year + ) if vet_checks else '-' + if kill.kill_request.slaughter_house != None: + kill_place = kill.kill_request.slaughter_house.name + else: + kill_place = kill.killhouse_user.name + if kill.clearance_code: + l += 1 + list1 = [ + str(kill.bar_code), + kill.province_request.poultry_request.poultry.unit_name, + str(kill.province_request.poultry_request.poultry.user.mobile), + kill.province_request.poultry_request.order_code, + kill.province_request.poultry_request.poultry.user.city.name, + str(date_of_poultry_request), + kill.province_request.poultry_request.chicken_breed, + vet_farm_name, + vet_farm_mobile, + kill.kill_request.kill_house.name, + kill.killhouse_user.phone, + killers, + kill.killhouse_user.system_address.city.name, + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + code, + quantity, + real_quantity, + net_weighte, + str(date_of_inner_bar), + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response['Content-Disposition'] = f'attachment; filename="Reporting.xlsx"' + response.write(output.getvalue()) + return response + + +def kill_house__request_vet_killing_process_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date2' in request.GET else now + + filtered_kill_reqs = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).order_by('-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry') + # filtered_kill_reqs = [ + # kill_request for kill_request in kill_requests + # if date1 <= kill_request.kill_request.recive_date.date() <= date2 + # ] + excel_options = [ + 'کد بار', + 'مرغدار', + 'تلفن مرغدار', + 'کدسفارش مرغدار', + ' تاریخ کشتار', + ' نژاد', + 'خریدار', + ' تلفن خریدار', + ' ماهیت خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'تعداد تخصیصی', + 'تعداد تخلیه شده', + 'وزن بار', + 'تاریخ تخلیه (کشتارگاه)', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + l += 1 + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.killhouse_user).last() + vet_checks = VetCheckRequest.objects.filter(kill_house_request=kill).only('create_date').last() + kill_house_vet_name = kil_house_vet.vet.user.fullname if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.vet.user.mobile if kil_house_vet else '-' + + quantity = kill.quantity if kill.quantity else '-' + date_of_poultry_request = jdatetime.date.fromgregorian( + day=kill.province_request.poultry_request.send_date.day, + month=kill.province_request.poultry_request.send_date.month, + year=kill.province_request.poultry_request.send_date.year + ) + killers = 'کشتارکن' + if kill.killhouse_user.killer == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill, trash=False).last() + net_weighte = assignment.net_weight if assignment else '-' + real_quantity = assignment.real_quantity if assignment else '-' + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_checks.create_date.day, + month=vet_checks.create_date.month, + year=vet_checks.create_date.year + ) if vet_checks else '-' + if kill.kill_request.slaughter_house != None: + kill_place = kill.kill_request.slaughter_house.name + else: + kill_place = kill.killhouse_user.name + + list1 = [ + str(kill.bar_code), + kill.province_request.poultry_request.poultry.unit_name, + str(kill.province_request.poultry_request.poultry.user.mobile), + kill.province_request.poultry_request.order_code, + str(date_of_poultry_request), + kill.province_request.poultry_request.chicken_breed, + kill.kill_request.kill_house.name, + kill.killhouse_user.phone, + killers, + kill.killhouse_user.system_address.city.name, + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + quantity, + real_quantity, + net_weighte, + str(date_of_inner_bar), + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + 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 + + +def kill_house_percent_excel(request): + user_profile = SystemUserProfile.objects.get(user=request.user, trash=False) + # kill_house = KillHouse.objects.filter(system_address__province=user_profile.province, trash=False) + kill_house = KillHousePercentage.objects.filter( + kill_house__system_address__province=user_profile.province).prefetch_related('kill_house', + 'kill_house_for_killer') + excel_options = [ + 'نام واحد', + 'نام و نام خانوادگی', + 'تلفن', + 'آدرس', + 'ماهیت', + 'محل کشتار', + 'نام دامپزشک', + 'تلفن دامپزشک', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 0 + if kill_house: + for kill in kill_house: + l += 1 + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.kill_house).prefetch_related('vet__user').last() + kill_house_vet_name = kil_house_vet.vet.user.fullname if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.vet.user.mobile if kil_house_vet else '-' + kill_place = kill.kill_house_for_killer.name if kill.kill_house_for_killer else kill.kill_house.name + killer = 'کشتارکن' if kill.kill_house.killer == True else 'کشتارگاه' + list1 = [ + kill.kill_house.name, + kill.kill_house.kill_house_operator.user.fullname, + kill.kill_house.kill_house_operator.user.mobile, + kill.kill_house.kill_house_operator.address.address, + killer, + kill_place, + kill_house_vet_name, + kill_house_vet_mobile + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + 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 + + +def poultry_request_out_excel(request): + now = datetime.datetime.now().date() + date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') if 'date' in request.GET else now + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + poultry_requests = PoultryRequest.objects.filter(poultry__address__province=user.province, + send_date__year=date.year, send_date__month=date.month, + send_date__day=date.day, + trash=False, out=True, out_province_request_cancel=False).order_by( + '-send_date').select_related( + 'poultry__user') + list1 = [] + for poultry_request in poultry_requests: + for buyer in poultry_request.buyer: + list1.append(buyer) + return HttpResponse(list1) + + # excel_options = [ + # 'نام فارم', + # 'سالن', + # ' دوره جوجه ریزی', + # 'تاریخ ثبت جوجه ریزی', + # 'تاریخ جوجه ریزی', + # 'نژاد', + # 'سن', + # 'تعداد جوجه ریزی', + # 'تلفات دوره', + # 'کشتار شده', + # 'مانده در سالن', + # ] + # output = BytesIO() + # workbook = Workbook() + # worksheet = workbook.active + # worksheet.sheet_view.rightToLeft = True + # worksheet.insert_rows(1) + # blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + # for col_num, option in enumerate(excel_options, 1): + # col_letter = get_column_letter(col_num) + # cell = worksheet.cell(row=1, column=col_num, value=option) + # cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + # cell.fill = blue_fill + # cell.font = Font(size=10, bold=True, color='D9FFFFFF') + # worksheet.column_dimensions[col_letter].width = 20.01 + # worksheet.row_dimensions[1].height = 18 + # worksheet.freeze_panes = worksheet['A2'] + # max_col = worksheet.max_column + # range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + # worksheet.auto_filter.ref = range_str + # + # l = 0 + # if poultry_requests: + # for poultry_request in poultry_requests: + # buyer_list = poultry_request.buyer + # for buyer in buyer_list: + # list1 = [ + # poultry_request.poultry.unit_name, + # ] + # for item in range(len(list1)): + # cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + # cell.alignment = Alignment(horizontal='center') + # 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 + + +def get_all_user_excel(request): + users = SystemUserProfile.objects.filter(trash=False).prefetch_related('role').only( + 'role__name', 'fullname', 'mobile', 'city__name', 'user_gate_way_id' + ).exclude(role__name='Rancher').order_by('id') + + excel_options = [ + 'ردیف', + 'نام کامل', + 'شماره تلفن', + 'رمز', + 'توکن', + 'شهرستان', + 'مرغدار', + 'کشتارگاه', + 'اپراتور استان', + 'اپراتور شهرستان', + 'دامپزشک فارم', + 'دامپزشک کشتارگاه', + 'راننده', + 'اصناف', + 'مباشر', + 'اپراتور مالی', + 'دامپزشک کل', + 'شرکت psp', + 'استانداری', + 'بازرس استان', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 26.01 + worksheet.row_dimensions[3].height = 25 + worksheet.freeze_panes = worksheet['A4'] + max_col = worksheet.max_column + range_str = f'A3:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + worksheet['A2'] = f'گزارش کاربران استان {users.first().province.name}' + + worksheet['A2'].font = Font(color="C00000", bold=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:B2' + + worksheet.merge_cells(merge_range1) + l = 2 + m = 1 + + for user in users: + role_list = [role.name for role in user.role.all()] + + poultry = '✔' if 'Poultry' in role_list else '-' + KillHouse = '✔' if 'KillHouse' in role_list else '-' + ProvinceOperator = '✔' if 'ProvinceOperator' in role_list else '-' + CityOperator = '✔' if 'CityOperator' in role_list else '-' + VetFarm = '✔' if 'VetFarm' in role_list else '-' + KillHouseVet = '✔' if 'KillHouseVet' in role_list else '-' + Driver = '✔' if 'Driver' in role_list else '-' + Guilds = '✔' if 'Guilds' in role_list else '-' + Steward = '✔' if 'Steward' in role_list else '-' + ProvinceFinancial = '✔' if 'ProvinceFinancial' in role_list else '-' + VetSupervisor = '✔' if 'VetSupervisor' in role_list else '-' + PosCompany = '✔' if 'PosCompany' in role_list else '-' + ProvincialGovernment = '✔' if 'ProvincialGovernment' in role_list else '-' + ProvinceInspector = '✔' if 'ProvinceInspector' in role_list else '-' + city = user.city.name if user.city else '-' + list1 = [ + m, + user.fullname, + user.mobile, + user.password, + user.user_gate_way_id, + city, + poultry, + KillHouse, + ProvinceOperator, + CityOperator, + VetFarm, + KillHouseVet, + Driver, + Guilds, + Steward, + ProvinceFinancial, + VetSupervisor, + PosCompany, + ProvincialGovernment, + ProvinceInspector, + + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + m += 1 + 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 + + +def stewards_excel(request): + stewards = Steward.objects.filter(guilds__steward=True, trash=False).order_by('-create_date') + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] in ['CityCommerce', 'CityJahad', 'CityPoultry']: + stewards = stewards.filter(guilds__address__city=user.city).order_by('id') + + elif request.GET['role'] in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin', + 'ImprovingLivestock', 'AdminX', 'Supporter']: + stewards = stewards.filter(guilds__address__province=user.province, + ).order_by('id') + else: + stewards = stewards + + excel_options = [ + 'ردیف', + 'شناسه صنف', + 'نام واحد صنفی', + 'نام شخص/شرکت', + 'موبایل شخص/شرکت', + 'کدملی', + 'نوع فعالیت', + 'حوزه فعالیت', + 'شماره مجوز', + 'استان', + 'شهرستان', + 'آدرس واحد صنفی', + 'محدودیت تخصیص', + 'حداکثر تخصیص', + 'مراکز تخصیص', + 'کارتخوان دارد / ندارد', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[4].height = 18 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + header_list = [ + 'تعداد کل مباشرین', + 'تعداد مباشرین فاقد کشتارگاه', + 'تعداد مباشرین دارای کارتخوان', + ] + if stewards: + city = 'استان' + ' ' + stewards.first().guilds.address.province.name + else: + city = '' + worksheet['A2'] = f'مدیریت مباشرین {city}' + + worksheet['A2'].font = Font(color="C00000", bold=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:B2' + worksheet.merge_cells(merge_range1) + + l = 3 + m = 1 + all_centers_allocations = 0 + all_has_pos = 0 + for steward in stewards: + l += 1 + max_allocation = steward.allocation_limit if steward.allocation_limit else 0 + limitation_allocation = 'دارد' if steward.limitation_allocation == True else 'ندارد' + + centers_allocations = '-' + if steward.centers_allocation == None: + centers_allocations = '-' + all_centers_allocations += 1 + + else: + for center_allocation in steward.centers_allocation: + centers_allocations = center_allocation['label'] + + if steward.guilds.has_pos == True: + has_pos = 'دارد' + all_has_pos += 1 + else: + has_pos = 'ندارد' + list1 = [ + m, + steward.guilds.guilds_id, + steward.guilds.guilds_name, + steward.guilds.user.fullname, + steward.guilds.user.mobile, + steward.guilds.user.national_id if steward.guilds.user.national_id else '-', + steward.guilds.type_activity, + steward.guilds.area_activity, + steward.guilds.license_number, + steward.guilds.address.province.name, + steward.guilds.address.city.name, + steward.guilds.address.address, + limitation_allocation, + max_allocation, + centers_allocations, + has_pos + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + m += 1 + for col_num, option in enumerate(header_list, 4): + cell = worksheet.cell(row=2, column=col_num, value=option) + col_letter = get_column_letter(col_num) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 21 + worksheet.column_dimensions[col_letter].width = 16.01 + values_list = [ + m - 1, + all_centers_allocations, + all_has_pos + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=3, column=item + 4, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + + 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 + + +def all_kill_house_total_wage_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + kill_house_list = [] + access = AccessToken.objects.get(token=request.GET['token']) + + user = get_object_or_404(SystemUserProfile, user=access.user) + kill_houses = KillHouse.objects.filter(system_address__province=user.province, trash=False) + if 'date1' in request.GET: + for kill_house in kill_houses: + if ProvinceKillRequest.objects.filter(kill_request__recive_date__gte=date1, + kill_request__recive_date__lte=date2, killhouse_user=kill_house, + trash=False).exists(): + if kill_house not in kill_house_list: + kill_house_list.append(kill_house) + else: + for kill_house in kill_houses: + if ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=False).exists(): + if kill_house not in kill_house_list: + kill_house_list.append(kill_house) + excel_options = [ + 'ردیف', + 'خریدار', + 'مالک', + 'تلفن خریدار', + 'شهر', + 'تعداد کل سفارشات', + 'تعداد کل قطعه ها', + 'وزن کل(کیلوگرم)', + 'مبلغ کل(ریال)', + 'تعداد سفارشات پرداخت شده', + 'تعداد قطعات پرداخت شده', + 'وزن قطعات پرداخت شده(کیلوگرم)', + 'مبلغ قطعات پرداخت شده(ریال)', + 'تعداد سفارشات پرداخت نشده', + 'تعداد قطعات پرداخت نشده', + 'وزن قطعات پرداخت نشده(کیلوگرم)', + 'مبلغ قطعات پرداخت نشده(ریال)', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[5].height = 29 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 4 + m = 1 + if 'date1' in request.GET: + province_kill_requests = ProvinceKillRequest.objects.filter(kill_request__recive_date__gte=date1, + kill_request__recive_date__lte=date2, + trash=False, return_to_province=False, + state__in=('accepted', 'pending') + ).annotate( + total_quantity=Sum('total_killed_quantity'), + total_weight=Sum('total_killed_weight'), + total_amount_wage=Sum( + F('wage') * F('total_killed_weight')), + total_paid=Count('id', filter=models.Q(wage_pay=True, archive_by_province=False)), + total_unpaid=Count('id', filter=models.Q(wage_pay=False, archive_by_province=False)), + total_archive=Count('id', filter=models.Q(wage_pay=False, archive_by_province=True)), + ) + else: + province_kill_requests = ProvinceKillRequest.objects.filter( + trash=False, return_to_province=False, state__in=('accepted', 'pending') + ).annotate( + total_quantity=Sum('total_killed_quantity'), + total_weight=Sum('total_killed_weight'), + total_amount_wage=Sum( + F('wage') * F('total_killed_weight')), + total_paid=Count('id', filter=models.Q(wage_pay=True, archive_by_province=False)), + total_unpaid=Count('id', filter=models.Q(wage_pay=False, archive_by_province=False)), + total_archive=Count('id', filter=models.Q(wage_pay=False, archive_by_province=True)), + ) + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + worksheet['A2'] = f'گزارش کارمزدها از {from_date_1} تا {from_date_2}' + + worksheet['A2'].font = Font(color="C00000", bold=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:B2' + + worksheet.merge_cells(merge_range1) + total_requests_buyers = province_kill_requests.values('kill_request__kill_house').distinct().count() + total_requests = province_kill_requests.count() + total_requests_quantity = province_kill_requests.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = province_kill_requests.aggregate(total=Sum('total_weight'))['total'] + total_requests_amount = province_kill_requests.aggregate(total=Sum('total_amount_wage'))['total'] + total_paid_requests = province_kill_requests.aggregate(total=Sum('total_paid'))['total'] + total_paid_requests_quantity = \ + province_kill_requests.filter(wage_pay=True).aggregate(total=Sum('total_quantity'))['total'] + total_paid_requests_weight = province_kill_requests.filter(wage_pay=True).aggregate(total=Sum('total_weight'))[ + 'total'] + total_paid_requests_amount = \ + province_kill_requests.filter(wage_pay=True).aggregate(total=Sum('total_amount_wage'))['total'] + total_unpaid_requests = province_kill_requests.aggregate(total=Sum('total_unpaid'))['total'] + total_unpaid_requests_quantity = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=False).aggregate( + total=Sum('total_quantity'))['total'] + total_unpaid_requests_weight = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=False).aggregate( + total=Sum('total_weight'))['total'] + total_unpaid_requests_amount = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=False).aggregate( + total=Sum('total_amount_wage'))['total'] + + total_archive_requests = province_kill_requests.aggregate(total=Sum('total_archive'))['total'] + total_archive_requests_quantity = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=True).aggregate( + total=Sum('total_quantity'))['total'] + total_archive_requests_weight = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=True).aggregate( + total=Sum('total_weight'))['total'] + total_archive_requests_amount = \ + province_kill_requests.filter(wage_pay=False, archive_by_province=True).aggregate( + total=Sum('total_amount_wage'))['total'] + head_list = [ + 'تعداد خریداران', + 'تعداد کل سفارشات', + 'تعداد کل قطعه', + 'وزن کل سفارشات (کیلوگرم)', + 'مبلغ کل سفارشات (ریال)', + 'تعداد سفارش پرداخت شده', + 'تعداد قطعه پرداخت شده', + 'وزن سفارشات پرداخت شده (کیلوگرم)', + 'مبلغ سفارشات پرداخت شده (ریال)', + 'تعداد سفارش پرداخت نشده', + 'تعداد قطعه پرداخت نشده', + 'وزن سفارشات پرداخت نشده (کیلوگرم)', + 'مبلغ سفارشات پرداخت نشده (ریال)', + 'تعداد سفارش بایگانی شده', + 'تعداد قطعه بایگانی شده', + 'وزن سفارشات بایگانی شده (کیلوگرم)', + 'مبلغ سفارشات بایگانی شده (ریال)', + ] + for col_num, option in enumerate(head_list, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 36 + worksheet.column_dimensions[col_letter].width = 16 + value_list = [ + total_requests_buyers, + total_requests, + total_requests_quantity, + total_requests_weight, + total_requests_amount, + total_paid_requests, + total_paid_requests_quantity if total_paid_requests_quantity != None else 0, + total_paid_requests_weight if total_paid_requests_weight != None else 0, + total_paid_requests_amount if total_paid_requests_amount != None else 0, + total_unpaid_requests, + total_unpaid_requests_quantity, + total_unpaid_requests_weight, + total_unpaid_requests_amount, + total_archive_requests, + total_archive_requests_quantity, + total_archive_requests_weight, + total_archive_requests_amount, + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=3, column=item + 3, value=value_list[item]) + cell.alignment = Alignment(horizontal='center') + value = value_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + for kill_houses in kill_house_list: + l += 1 + province_kill_request = province_kill_requests.filter(killhouse_user=kill_houses) + + paid_count = 0 # + unpaid_count = 0 # + total_weight_unpaid = 0 # + total_weight_paid = 0 # + total_unpaid_wage = 0 # + total_paid_wage = 0 # + total_paid_quantity = 0 # + total_unpaid_quantity = 0 # + fullname = kill_houses.kill_house_operator.user.fullname + city = kill_houses.kill_house_operator.user.city.name + mobile = kill_houses.kill_house_operator.user.mobile + total_count = len(province_kill_request) # + total_quantity = province_kill_request.aggregate(total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity', 0) # + + for province_kill in province_kill_request: + if province_kill.wage_pay == True: + paid_count += 1 # + total_paid_quantity += province_kill.total_killed_quantity # + total_paid_wage += int(province_kill.depositor['total_amount']) # + total_weight_paid += province_kill.total_killed_weight # + elif province_kill.wage_pay == False and province_kill.archive_by_province == False: + unpaid_count += 1 # + total_unpaid_quantity += province_kill.total_killed_quantity # + total_unpaid_wage += province_kill.total_killed_weight * province_kill.wage # + total_weight_unpaid += province_kill.total_killed_weight # + + else: + pass + killer = 'کشتارگاه' if kill_houses.killer == False else 'کشتارکن' + list1 = [ + m, + killer + '(' + kill_houses.name + ')', + fullname, + mobile, + city, + total_count, + total_quantity, + int(total_weight_paid + total_weight_unpaid), + total_paid_wage + total_unpaid_wage, + paid_count, + total_paid_quantity, + int(total_weight_paid), + total_paid_wage, + unpaid_count, + total_unpaid_quantity, + int(total_weight_unpaid), + total_unpaid_wage, + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + 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 + + +def kill_house_total_wage_not_payid_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + kill_house_list = [] + access = AccessToken.objects.get(token=request.GET['token']) + user = get_object_or_404(SystemUserProfile, user=access.user) + kill_houses = KillHouse.objects.filter(system_address__province=user.province, trash=False) + if 'date1' in request.GET: + + for kill_house in kill_houses: + if ProvinceKillRequest.objects.filter(kill_request__recive_date__gte=date1, + kill_request__recive_date__lte=date2, killhouse_user=kill_house, + wage_pay=True, + archive_by_province=False, return_to_province=False, + trash=False).exists(): + if kill_house not in kill_house_list: + kill_house_list.append(kill_house) + else: + for kill_house in kill_houses: + if ProvinceKillRequest.objects.filter(killhouse_user=kill_house, wage_pay=True, + archive_by_province=False, return_to_province=False, + trash=False).exists(): + if kill_house not in kill_house_list: + kill_house_list.append(kill_house) + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_name = 'اطلاعات کلی' + worksheet = workbook.create_sheet(sheet_name) + + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + worksheet['C2'] = f'کارمزد های پرداخت شده از {from_date_1} تا {from_date_2}' + + worksheet['C2'].font = Font(color="C00000", bold=True) + worksheet['C2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + header_list1 = [ + 'تعداد کل سفارشات ', + 'مجموع تعداد کل(قطعه)', + 'مجموع وزن کل(کیلوگرم)', + 'میانگین کل کارمزداتحادیه(ریال)', + 'مبلغ کل کارمزدها(ریال)', + + ] + header_list = [ + 'خریدار', + 'مالک', + 'تعداد سفارشات ', + 'مجموع تعداد(قطعه)', + 'مجموع وزن(کیلوگرم)', + 'میانگین کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + + ] + for col_num, option in enumerate(header_list, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[5].height = 45 + worksheet.column_dimensions[col_letter].width = 27 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list1, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 35 + worksheet.column_dimensions[col_letter].width = 18 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l = 6 + all_province_kill_request = 0 + final_quantity = 0 + fianl_wage = 0 + final_wage_all = [] + final_total_amount = 0 + if 'date1' in request.GET: + for kill_house in kill_house_list: + province_kill_request = ProvinceKillRequest.objects.filter(kill_request__recive_date__gte=date1, + kill_request__recive_date__lte=date2, + killhouse_user__key=kill_house.key, + state__in=('pending', 'accepted'), + wage_pay=True, + trash=False).select_related( + 'province_request').only('province_request__key', 'main_quantity', 'wage', 'total_amount').order_by( + '-kill_request__recive_date') + all_quantity = province_kill_request.aggregate(total_quantity=Sum('main_quantity')).get( + 'total_quantity', 0) + all_wiegh = 0 + all_wage = [] + all_total_amount = 0 + all_province_kill_request += len(province_kill_request) + final_quantity += all_quantity + for province in province_kill_request: + province_request = ProvinceCheckOperatorRequest.objects.select_related( + 'poultry_request').filter( + key=province.province_request.key, + trash=False).only('poultry_request__Index_weight').first() + wieght = int(province.main_quantity * province_request.poultry_request.Index_weight) + all_wiegh += wieght + wage = province.wage + if wage > 0: + all_wage.append(wage) + total_amount = province.total_amount if province.total_amount > 0 else int(province.wage) * int( + province.main_quantity * province_request.poultry_request.Index_weight) + all_total_amount += total_amount + final_total_amount += all_total_amount + fianl_wage += all_wiegh + + if len(all_wage) > 0: + wage_all = sum(all_wage) / len(all_wage) + final_wage_all.append(wage_all) + else: + wage_all = 0 + killer = 'کشتارگاه' if kill_house.killer == False else 'کشتارکن' + + values_list = [ + killer + '(' + kill_house.name + ')', + kill_house.kill_house_operator.user.fullname, + len(province_kill_request), + all_quantity, + all_wiegh, + wage_all, + all_total_amount, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=l, column=item + 3, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l += 1 + else: + for kill_house in kill_house_list: + province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user__key=kill_house.key, + state__in=('pending', 'accepted'), + wage_pay=True, + trash=False).select_related( + 'province_request').only('province_request__key', 'main_quantity', 'wage', 'total_amount').order_by( + '-kill_request__recive_date') + all_quantity = province_kill_request.aggregate(total_quantity=Sum('main_quantity')).get( + 'total_quantity', 0) + all_wiegh = 0 + all_wage = [] + all_total_amount = 0 + all_province_kill_request += len(province_kill_request) + final_quantity += all_quantity + for province in province_kill_request: + province_request = ProvinceCheckOperatorRequest.objects.select_related( + 'poultry_request').filter( + key=province.province_request.key, + trash=False).only('poultry_request__Index_weight').first() + wieght = int(province.main_quantity * province_request.poultry_request.Index_weight) + all_wiegh += wieght + wage = province.wage + if wage > 0: + all_wage.append(wage) + total_amount = province.total_amount if province.total_amount > 0 else int(province.wage) * int( + province.main_quantity * province_request.poultry_request.Index_weight) + all_total_amount += total_amount + final_total_amount += all_total_amount + fianl_wage += all_wiegh + + if len(all_wage) > 0: + wage_all = sum(all_wage) / len(all_wage) + final_wage_all.append(wage_all) + else: + wage_all = 0 + killer = 'کشتارگاه' if kill_house.killer == False else 'کشتارکن' + + values_list = [ + killer + '(' + kill_house.name + ')', + kill_house.kill_house_operator.user.fullname, + len(province_kill_request), + all_quantity, + all_wiegh, + wage_all, + all_total_amount, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=l, column=item + 3, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l += 1 + + if len(final_wage_all) > 0: + wage = sum(final_wage_all) / len(final_wage_all) + else: + wage = 0 + values_list = [ + all_province_kill_request, + final_quantity, + fianl_wage, + wage, + final_total_amount + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=3, column=item + 4, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for kill_house in kill_house_list: + sheet_name = kill_house.kill_house_operator.user.fullname + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if 'date1' in request.GET: + province_kill_request = ProvinceKillRequest.objects.filter(kill_request__recive_date__gte=date1, + kill_request__recive_date__lte=date2, + killhouse_user__key=kill_house.key, + wage_pay=True, + state__in=('pending', 'accepted'), + trash=False).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', + 'kill_request').order_by( + '-kill_request__recive_date') + else: + province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user__key=kill_house.key, + wage_pay=True, + state__in=('pending', 'accepted'), + trash=False).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', + 'kill_request').order_by( + '-kill_request__recive_date') + all_quantity = province_kill_request.aggregate(total_quantity=Sum('main_quantity')).get( + 'total_quantity', 0) + all_wiegh = 0 + all_wage = [] + + all_total_amount = 0 + + # برای بالای هدر + header_list = [ + 'تعداد سفارشات ', + 'مجموع تعداد(قطعه)', + 'مجموع وزن(کیلوگرم)', + 'میانگین کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + + ] + for col_num, option in enumerate(header_list, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 36 + worksheet.column_dimensions[col_letter].width = 16 + + l = 4 + m = 1 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[5].height = 27 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + for province in province_kill_request: + + province_request = ProvinceCheckOperatorRequest.objects.select_related( + 'poultry_request__poultry__user', 'poultry_request__poultry__address__city', 'poultry_request').filter( + key=province.province_request.key, + trash=False).only('poultry_request__send_date', 'poultry_request__order_code', + 'poultry_request__poultry__user__fullname', 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__address__city__name', 'poultry_request__chicken_breed', + 'poultry_request__Index_weight').first() + kill_place = province.kill_request.slaughter_house.name if province.kill_request.slaughter_house != None else province.kill_request.kill_house.name + total_amount = province.total_amount if province.total_amount > 0 else int(province.wage) * int( + province.main_quantity * province_request.poultry_request.Index_weight) + all_total_amount += total_amount + send_date = jdatetime.date.fromgregorian( + day=province_request.poultry_request.send_date.day, + month=province_request.poultry_request.send_date.month, + year=province_request.poultry_request.send_date.year + ) if province_request.poultry_request.send_date else '-' + wieght = int(province.main_quantity * province_request.poultry_request.Index_weight) + all_wiegh += wieght + wage = province.wage + if wage > 0: + all_wage.append(wage) + list1 = [ + m, + str(province_request.poultry_request.order_code), + province_request.poultry_request.poultry.user.fullname, + province_request.poultry_request.poultry.user.mobile, + province_request.poultry_request.poultry.address.city.name, + str(send_date), + kill_place, + province_request.poultry_request.chicken_breed, + province.main_quantity, + wieght, + province_request.poultry_request.Index_weight, + province.wage, + total_amount + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + if len(all_wage) > 0: + wage_all = sum(all_wage) / len(all_wage) + else: + wage_all = 0 + values_list = [ + m - 1, + all_quantity, + all_wiegh, + wage_all, + all_total_amount, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=3, column=item + 4, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + list2 = [ + 'مجموع==>', + '', + '', + '', + f'', + '', + '', + '', + all_quantity, + all_wiegh, + '', + wage_all, + all_total_amount, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + 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 + + +def slaughterhouse_fee_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else '-' + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else '-' + user = get_object_or_404(SystemUserProfile, key=request.GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if 'date1' and 'date2' in request.GET: + + province_kill_request = (ProvinceKillRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + killhouse_user=kill_house, + state__in=('pending', 'accepted'), wage_pay=True, + trash=False, + archive_by_province=False, + return_to_province=False, + ).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', 'kill_request') + .only('kill_request__kill_house__name', 'total_killed_quantity', 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount' + , 'total_killed_weight') + .values('kill_request__kill_house__name', 'total_killed_quantity', 'total_killed_weight', + 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount', ).order_by( + '-kill_request__recive_date')) + else: + province_kill_request = (ProvinceKillRequest.objects.filter( + killhouse_user=kill_house, + state__in=('pending', 'accepted'), wage_pay=True, + trash=False, + archive_by_province=False, + return_to_province=False, + ).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', 'kill_request') + .only('kill_request__kill_house__name', 'total_killed_quantity', 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount' + , 'total_killed_weight', 'kill_request__recive_date') + .values('kill_request__kill_house__name', 'total_killed_quantity', 'total_killed_weight', + 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount', 'kill_request__recive_date').order_by( + '-kill_request__recive_date')) + all_quantity = province_kill_request.aggregate(total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity', 0) + all_wiegh = province_kill_request.aggregate(total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_wage = [] + + all_total_amount = 0 + + red_font = Font(color="C00000", bold=True) + + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center', ) + if kill_house: + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + worksheet['A2'] = f'کارمزد های پرداخت شده خریدار {kill_house.name} از تاریخ {from_date_1} تا {to_date_1}' + else: + first = province_kill_request.first()['kill_request__recive_date'] + last = province_kill_request.last()['kill_request__recive_date'] + from_date = jdatetime.date.fromgregorian( + year=first.year, + month=first.month, + day=first.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=last.year, + month=last.month, + day=last.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + worksheet['A2'] = f'کارمزد های پرداخت شده خریدار {kill_house.name} از تاریخ {to_date_1} تا {from_date_1}' + + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range1 = 'A2:C2' + + worksheet.merge_cells(merge_range1) + worksheet['A2'].font = red_font + # برای بالای هدر + header_list = [ + 'تعداد سفارشات ', + 'مجموع تعداد(قطعه)', + 'مجموع وزن(کیلوگرم)', + 'میانگین کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + + ] + for col_num, option in enumerate(header_list, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 36 + worksheet.column_dimensions[col_letter].width = 16 + + l = 4 + m = 1 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[5].height = 27 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + for province in province_kill_request: + + province_request = ProvinceCheckOperatorRequest.objects.select_related( + 'poultry_request__poultry__user', 'poultry_request__poultry__address__city', 'poultry_request').filter( + key=province['province_request__key'], + trash=False).only('poultry_request__send_date', 'poultry_request__order_code', + 'poultry_request__poultry__user__fullname', 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__address__city__name', 'poultry_request__chicken_breed', + 'poultry_request__Index_weight').values('poultry_request__send_date', + 'poultry_request__order_code', + 'poultry_request__poultry__user__fullname', + 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__address__city__name', + 'poultry_request__chicken_breed', + 'poultry_request__Index_weight').first() + kill_place = province['kill_request__slaughter_house__name'] if province[ + 'kill_request__slaughter_house'] != None else \ + province['kill_request__kill_house__name'] + total_amount = (province['total_killed_weight'] * province['wage']) if province['total_amount'] == 0 else \ + province['total_amount'] + all_total_amount += total_amount + send_date = jdatetime.date.fromgregorian( + day=province_request['poultry_request__send_date'].day, + month=province_request['poultry_request__send_date'].month, + year=province_request['poultry_request__send_date'].year + ) if province_request['poultry_request__send_date'] else '-' + wieght = province['total_killed_weight'] + wage = province['wage'] + if wage > 0: + all_wage.append(wage) + list1 = [ + m, + str(province_request['poultry_request__order_code']), + province_request['poultry_request__poultry__user__fullname'], + province_request['poultry_request__poultry__user__mobile'], + province_request['poultry_request__poultry__address__city__name'], + str(send_date), + kill_place, + province_request['poultry_request__chicken_breed'], + province['total_killed_quantity'], + wieght, + province_request['poultry_request__Index_weight'], + province['wage'], + total_amount + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + if len(all_wage) > 0: + wage_all = sum(all_wage) / len(all_wage) + else: + wage_all = 0 + values_list = [ + m - 1, + all_quantity, + all_wiegh, + wage_all, + all_total_amount, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=3, column=item + 4, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + list2 = [ + 'مجموع==>', + '', + '', + '', + f'', + '', + '', + '', + all_quantity, + all_wiegh, + '', + wage_all, + all_total_amount, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if kill_house: + response[ + 'Content-Disposition'] = f'attachment; filename="کارمزدهای پرداخت شده {kill_house.name}.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="کارمزدهای پرداخت شده.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def slaughterhouse_fee_not_paid_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else '-' + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else '-' + user = get_object_or_404(SystemUserProfile, key=request.GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if 'date1' and 'date2' in request.GET: + + province_kill_request = (ProvinceKillRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + killhouse_user=kill_house, + state__in=('pending', 'accepted'), wage_pay=False, + trash=False, + archive_by_province=False, + return_to_province=False, + ).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', 'kill_request') + .only('kill_request__kill_house__name', 'total_killed_quantity', 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount' + , 'total_killed_weight') + .values('kill_request__kill_house__name', 'total_killed_quantity', 'total_killed_weight', + 'province_request__key', 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount', ).order_by( + '-kill_request__recive_date')) + else: + province_kill_request = (ProvinceKillRequest.objects.filter( + killhouse_user=kill_house, + state__in=('pending', 'accepted'), wage_pay=False, + trash=False, + archive_by_province=False, + return_to_province=False, + ).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', 'kill_request') + .only('kill_request__kill_house__name', 'total_killed_quantity', 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount' + , 'total_killed_weight', 'kill_request__recive_date') + .values('kill_request__kill_house__name', 'total_killed_quantity', 'total_killed_weight', + 'province_request__key', 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount', 'kill_request__recive_date').order_by( + '-kill_request__recive_date')) + all_quantity = province_kill_request.aggregate(total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity', 0) + all_wiegh = province_kill_request.aggregate(total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_wage = [] + + all_total_amount = 0 + + red_font = Font(color="C00000", bold=True) + + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center', ) + if kill_house: + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + worksheet['A2'] = f'کارمزد های پرداخت نشده خریدار {kill_house.name} از تاریخ {from_date_1} تا {to_date_1}' + else: + first = province_kill_request.first()['kill_request__recive_date'] + last = province_kill_request.last()['kill_request__recive_date'] + from_date = jdatetime.date.fromgregorian( + year=first.year, + month=first.month, + day=first.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=last.year, + month=last.month, + day=last.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + worksheet['A2'] = f'کارمزد های پرداخت شده خریدار {kill_house.name} از تاریخ {to_date_1} تا {from_date_1}' + + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range1 = 'A2:C2' + + worksheet.merge_cells(merge_range1) + worksheet['A2'].font = red_font + # برای بالای هدر + header_list = [ + 'تعداد سفارشات ', + 'مجموع تعداد(قطعه)', + 'مجموع وزن(کیلوگرم)', + 'میانگین کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + + ] + for col_num, option in enumerate(header_list, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 36 + worksheet.column_dimensions[col_letter].width = 16 + + l = 4 + m = 1 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[5].height = 27 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + for province in province_kill_request: + + province_request = ProvinceCheckOperatorRequest.objects.select_related( + 'poultry_request__poultry__user', 'poultry_request__poultry__address__city', 'poultry_request').filter( + key=province['province_request__key'], + trash=False).only('poultry_request__send_date', 'poultry_request__order_code', + 'poultry_request__poultry__user__fullname', 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__address__city__name', 'poultry_request__chicken_breed', + 'poultry_request__Index_weight').values('poultry_request__send_date', + 'poultry_request__order_code', + 'poultry_request__poultry__user__fullname', + 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__address__city__name', + 'poultry_request__chicken_breed', + 'poultry_request__Index_weight').first() + kill_place = province['kill_request__slaughter_house__name'] if province[ + 'kill_request__slaughter_house'] != None else \ + province['kill_request__kill_house__name'] + total_amount = (province['total_killed_weight'] * province['wage']) if province['total_amount'] == 0 else \ + province['total_amount'] + all_total_amount += total_amount + send_date = jdatetime.date.fromgregorian( + day=province_request['poultry_request__send_date'].day, + month=province_request['poultry_request__send_date'].month, + year=province_request['poultry_request__send_date'].year + ) if province_request['poultry_request__send_date'] else '-' + wieght = province['total_killed_weight'] + wage = province['wage'] + if wage > 0: + all_wage.append(wage) + list1 = [ + m, + str(province_request['poultry_request__order_code']), + province_request['poultry_request__poultry__user__fullname'], + province_request['poultry_request__poultry__user__mobile'], + province_request['poultry_request__poultry__address__city__name'], + str(send_date), + kill_place, + province_request['poultry_request__chicken_breed'], + province['total_killed_quantity'], + wieght, + province_request['poultry_request__Index_weight'], + province['wage'], + total_amount + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + if len(all_wage) > 0: + wage_all = sum(all_wage) / len(all_wage) + else: + wage_all = 0 + values_list = [ + m - 1, + all_quantity, + all_wiegh, + wage_all, + all_total_amount, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=3, column=item + 4, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + list2 = [ + 'مجموع==>', + '', + '', + '', + f'', + '', + '', + '', + all_quantity, + all_wiegh, + '', + wage_all, + all_total_amount, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if kill_house: + response[ + 'Content-Disposition'] = f'attachment; filename="کارمزدهای پرداخت نشده {kill_house.name}.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="کارمزدهای پرداخت نشده.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def car_province_excel(request): + user = get_object_or_404(SystemUserProfile, key=request.GET['key']) + cars = KillHouseDriver.objects.filter(trash=False).select_related('user').order_by( + 'id') + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(trash=False, kill_house_operator__user=user).first() + kill_house_cars = KillHouseADDCAR.objects.filter(kill_house=kill_house, trash=False).values_list('driver__id', + flat=True).distinct() + cars = cars.filter(id__in=kill_house_cars) + excel_options = [ + 'ردیف', + 'مدل خودرو', + 'ماهیت', + 'پلاک', + 'ظرفیت', + 'کد بهداشتی', + 'نام راننده', + 'موبایل راننده', + 'کشتارگاه ها/کشتارکن ها', + 'وضعیت' + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A2'] + max_col = worksheet.max_column + range_str = f'A1:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 0 + m = 1 + for car in cars: + l += 1 + + kill_house_list_name = '' + kill_house_list = [] + active = 'فعال' if car.active_state else 'غیرفعال' + + add_car = KillHouseADDCAR.objects.filter(driver=car, trash=False).select_related('kill_house').only( + 'kill_house__name') + kill_house_list = [add_car_obj.kill_house.name if add_car_obj.kill_house else '-' for add_car_obj in add_car] + + if car.type == "rental": + car_type = "اجاره ای" + kill_house_list_name = 'همه کشتارگاه ها/کشتارکن ها' + else: + car_type = "اختصاصی" + if kill_house_list: + if len(kill_house_list) > 1: + kill_house_list_name = '/'.join(kill_house_list) + else: + kill_house_list_name = kill_house_list[0] + else: + kill_house_list_name = '-' + fullname = car.user.fullname if car.user else '-' + + mobile = car.user.mobile if car.user else '-' + list1 = [ + m, + car.type_car, + car_type, + car.pelak, + car.capocity, + car.health_code, + fullname, + mobile, + kill_house_list_name, + active + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + m += 1 + 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 + + +def kill_house_wage_archive_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else '-' + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else '-' + user = get_object_or_404(SystemUserProfile, key=request.GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first() + if 'date1' and 'date2' in request.GET: + province_kill_request = (ProvinceKillRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + killhouse_user=kill_house, + state__in=('pending', 'accepted'), wage_pay=False, + archive_by_province=True, return_to_province=False, + trash=False).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', 'kill_request') + .only('kill_request__kill_house__name', 'total_killed_quantity', 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount' + , 'total_killed_weight') + .values('kill_request__kill_house__name', 'total_killed_quantity', 'total_killed_weight', + 'province_request__key', 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount', ).order_by( + '-kill_request__recive_date')) + else: + province_kill_request = (ProvinceKillRequest.objects.filter( + killhouse_user=kill_house, + state__in=('pending', 'accepted'), wage_pay=False, + archive_by_province=True, return_to_province=False, + trash=False).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', 'kill_request') + .only('kill_request__kill_house__name', 'total_killed_quantity', 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount' + , 'total_killed_weight', 'kill_request__recive_date') + .values('kill_request__kill_house__name', 'total_killed_quantity', 'total_killed_weight', + 'province_request__key', 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount', 'kill_request__recive_date').order_by( + '-kill_request__recive_date')) + all_quantity = province_kill_request.aggregate(total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity', 0) + all_wiegh = province_kill_request.aggregate(total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_wage = [] + + all_total_amount = 0 + + red_font = Font(color="C00000", bold=True) + + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center', ) + if kill_house: + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + worksheet['A2'] = f'کارمزد های بایگانی شده خریدار {kill_house.name} از تاریخ {from_date_1} تا {to_date_1}' + else: + first = province_kill_request.first()['kill_request__recive_date'] + last = province_kill_request.last()['kill_request__recive_date'] + from_date = jdatetime.date.fromgregorian( + year=first.year, + month=first.month, + day=first.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=last.year, + month=last.month, + day=last.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + worksheet['A2'] = f'کارمزد های پرداخت شده خریدار {kill_house.name} از تاریخ {to_date_1} تا {from_date_1}' + + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range1 = 'A2:C2' + + worksheet.merge_cells(merge_range1) + worksheet['A2'].font = red_font + # برای بالای هدر + header_list = [ + 'تعداد سفارشات ', + 'مجموع تعداد(قطعه)', + 'مجموع وزن(کیلوگرم)', + 'میانگین کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + + ] + for col_num, option in enumerate(header_list, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 36 + worksheet.column_dimensions[col_letter].width = 16 + + l = 4 + m = 1 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[5].height = 27 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + for province in province_kill_request: + + province_request = ProvinceCheckOperatorRequest.objects.select_related( + 'poultry_request__poultry__user', 'poultry_request__poultry__address__city', 'poultry_request').filter( + key=province['province_request__key'], + trash=False).only('poultry_request__send_date', 'poultry_request__order_code', + 'poultry_request__poultry__user__fullname', 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__address__city__name', 'poultry_request__chicken_breed', + 'poultry_request__Index_weight').values('poultry_request__send_date', + 'poultry_request__order_code', + 'poultry_request__poultry__user__fullname', + 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__address__city__name', + 'poultry_request__chicken_breed', + 'poultry_request__Index_weight').first() + kill_place = province['kill_request__slaughter_house__name'] if province[ + 'kill_request__slaughter_house'] != None else \ + province['kill_request__kill_house__name'] + total_amount = (province['total_killed_weight'] * province['wage']) if province['total_amount'] == 0 else \ + province['total_amount'] + all_total_amount += total_amount + send_date = jdatetime.date.fromgregorian( + day=province_request['poultry_request__send_date'].day, + month=province_request['poultry_request__send_date'].month, + year=province_request['poultry_request__send_date'].year + ) if province_request['poultry_request__send_date'] else '-' + wieght = province['total_killed_weight'] + wage = province['wage'] + if wage > 0: + all_wage.append(wage) + list1 = [ + m, + str(province_request['poultry_request__order_code']), + province_request['poultry_request__poultry__user__fullname'], + province_request['poultry_request__poultry__user__mobile'], + province_request['poultry_request__poultry__address__city__name'], + str(send_date), + kill_place, + province_request['poultry_request__chicken_breed'], + province['total_killed_quantity'], + wieght, + province_request['poultry_request__Index_weight'], + province['wage'], + total_amount + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + if len(all_wage) > 0: + wage_all = sum(all_wage) / len(all_wage) + else: + wage_all = 0 + values_list = [ + m - 1, + all_quantity, + all_wiegh, + wage_all, + all_total_amount, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=3, column=item + 4, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + list2 = [ + 'مجموع==>', + '', + '', + '', + f'', + '', + '', + '', + all_quantity, + all_wiegh, + '', + wage_all, + all_total_amount, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + if kill_house: + response[ + 'Content-Disposition'] = f'attachment; filename="کارمزدهای بایگانی شده {kill_house.name}.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename="کارمزدهای بایگانی شده.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def kill_house_total_wage_archive_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else None + kill_house_list = [] + user = get_object_or_404(SystemUserProfile, key=request.GET['key']) + kill_houses = (KillHouse.objects.filter(system_address__province=user.province, trash=False).select_related( + 'kill_house_operator__user') + .only('name', 'key', 'kill_house_operator__user__fullname', 'killer').values('name', 'key', + 'kill_house_operator__user__fullname', + 'killer')) + if 'date1' in request.GET: + for kill_house in kill_houses: + if ProvinceKillRequest.objects.filter(kill_request__recive_date__gte=date1, + kill_request__recive_date__lte=date2, + killhouse_user__key=kill_house['key'], wage_pay=False, + archive_by_province=True, return_to_province=False, + trash=False).exists(): + if kill_house not in kill_house_list: + kill_house_list.append(kill_house) + else: + for kill_house in kill_houses: + if ProvinceKillRequest.objects.filter(killhouse_user__key=kill_house['key'], wage_pay=False, + archive_by_province=True, return_to_province=False, + trash=False).exists(): + if kill_house not in kill_house_list: + kill_house_list.append(kill_house) + excel_options = [ + 'ردیف', + 'کد سفارش', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'تاریخ کشتار', + 'محل کشتار', + 'نژاد', + 'تعداد(قطعه)', + 'وزن(کیلوگرم)', + 'میانگین وزنی(کیلوگرم)', + 'کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_name = 'اطلاعات کلی' + worksheet = workbook.create_sheet(sheet_name) + if sheet_name == 'اطلاعات کلی': + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + if 'date1' in request.GET: + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date1 = reversed(to_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date1) + worksheet['C2'] = f'کارمزد های معوقه از {from_date_1} تا {from_date_2}' + + worksheet['C2'].font = Font(color="C00000", bold=True) + worksheet['C2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.alignment = Alignment(horizontal='center', vertical='center') + header_list1 = [ + 'تعداد کل سفارشات ', + 'مجموع تعداد کل(قطعه)', + 'مجموع وزن کل(کیلوگرم)', + 'میانگین کل کارمزداتحادیه(ریال)', + 'مبلغ کل کارمزدها(ریال)', + + ] + header_list = [ + 'خریدار', + 'مالک', + 'تعداد سفارشات ', + 'مجموع تعداد(قطعه)', + 'مجموع وزن(کیلوگرم)', + 'میانگین کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + + ] + for col_num, option in enumerate(header_list, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[5].height = 45 + worksheet.column_dimensions[col_letter].width = 27 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list1, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 35 + worksheet.column_dimensions[col_letter].width = 18 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l = 6 + all_province_kill_request = 0 + final_quantity = 0 + fianl_wage = 0 + final_wage_all = [] + final_total_amount = 0 + if 'date1' in request.GET: + for kill_house in kill_house_list: + province_kill_request = ProvinceKillRequest.objects.filter(kill_request__recive_date__gte=date1, + kill_request__recive_date__lte=date2, + killhouse_user__key=kill_house['key'], + state__in=('pending', 'accepted'), + wage_pay=False, archive_by_province=True, + return_to_province=False, + trash=False).select_related( + 'province_request').only('total_killed_quantity', 'province_request__key', 'main_quantity', 'wage', + 'total_amount').order_by( + '-kill_request__recive_date') + all_quantity = province_kill_request.aggregate(total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity', 0) + all_wiegh = province_kill_request.aggregate(total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_wage = [] + all_total_amount = 0 + all_province_kill_request += len(province_kill_request) + final_quantity += all_quantity + for province in province_kill_request: + wage = province.wage + if wage > 0: + all_wage.append(wage) + total_amount = (province.total_killed_weight * province.wage) + all_total_amount += total_amount + final_total_amount += all_total_amount + fianl_wage += all_wiegh + + if len(all_wage) > 0: + wage_all = sum(all_wage) / len(all_wage) + final_wage_all.append(wage_all) + else: + wage_all = 0 + killer = 'کشتارگاه' if kill_house['killer'] == False else 'کشتارکن' + values_list = [ + killer + '(' + kill_house['name'] + ')', + kill_house['kill_house_operator__user__fullname'], + len(province_kill_request), + all_quantity, + all_wiegh, + wage_all, + all_total_amount, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=l, column=item + 3, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l += 1 + else: + for kill_house in kill_house_list: + province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user__key=kill_house['key'], + state__in=('pending', 'accepted'), + wage_pay=False, archive_by_province=True, + return_to_province=False, + trash=False).select_related( + 'province_request').only('total_killed_quantity', 'province_request__key', 'main_quantity', + 'wage', + 'total_amount').order_by( + '-kill_request__recive_date') + all_quantity = province_kill_request.aggregate(total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity', 0) + all_wiegh = province_kill_request.aggregate(total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_wage = [] + all_total_amount = 0 + all_province_kill_request += len(province_kill_request) + final_quantity += all_quantity + for province in province_kill_request: + wage = province.wage + if wage > 0: + all_wage.append(wage) + total_amount = (province.total_killed_weight * province.wage) + all_total_amount += total_amount + final_total_amount += all_total_amount + fianl_wage += all_wiegh + + if len(all_wage) > 0: + wage_all = sum(all_wage) / len(all_wage) + final_wage_all.append(wage_all) + else: + wage_all = 0 + killer = 'کشتارگاه' if kill_house['killer'] == False else 'کشتارکن' + values_list = [ + killer + '(' + kill_house['name'] + ')', + kill_house['kill_house_operator__user__fullname'], + len(province_kill_request), + all_quantity, + all_wiegh, + wage_all, + all_total_amount, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=l, column=item + 3, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + l += 1 + + if len(final_wage_all) > 0: + wage = sum(final_wage_all) / len(final_wage_all) + else: + wage = 0 + values_list = [ + all_province_kill_request, + final_quantity, + fianl_wage, + wage, + final_total_amount + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=3, column=item + 4, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.fill = PatternFill(start_color="EEEAF2", fill_type="solid") + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for kill_house in kill_house_list: + sheet_name = kill_house['name'] + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + if 'date1' in request.GET: + province_kill_request = ( + ProvinceKillRequest.objects.filter(kill_request__recive_date__gte=date1, + kill_request__recive_date__lte=date2, + killhouse_user__key=kill_house['key'], wage_pay=False, + archive_by_province=True, return_to_province=False, + state__in=('pending', 'accepted'), + trash=False).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', 'kill_request') + .only('total_killed_quantity', 'province_request__key', 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount' + , 'total_killed_weight') + .values('total_killed_quantity', 'total_killed_weight', 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount', ).order_by( + '-kill_request__recive_date')) + else: + province_kill_request = ( + ProvinceKillRequest.objects.filter(killhouse_user__key=kill_house['key'], wage_pay=False, + archive_by_province=True, return_to_province=False, + state__in=('pending', 'accepted'), + trash=False).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', 'kill_request') + .only('total_killed_quantity', 'province_request__key', 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount' + , 'total_killed_weight') + .values('total_killed_quantity', 'total_killed_weight', 'province_request__key', + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', + 'main_quantity', 'wage', 'total_amount', ).order_by( + '-kill_request__recive_date')) + all_quantity = province_kill_request.aggregate(total_quantity=Sum('total_killed_quantity')).get( + 'total_quantity', 0) + all_wiegh = province_kill_request.aggregate(total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_wage = [] + + all_total_amount = 0 + + # برای بالای هدر + header_list = [ + 'تعداد سفارشات ', + 'مجموع تعداد(قطعه)', + 'مجموع وزن(کیلوگرم)', + 'میانگین کارمزد اتحادیه(ریال)', + 'مبلغ کل کارمزد(ریال)', + + ] + for col_num, option in enumerate(header_list, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 36 + worksheet.column_dimensions[col_letter].width = 16 + + l = 4 + m = 1 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[5].height = 27 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + for province in province_kill_request: + + province_request = ProvinceCheckOperatorRequest.objects.select_related( + 'poultry_request__poultry__user', 'poultry_request__poultry__address__city', 'poultry_request').filter( + key=province['province_request__key'], + trash=False).only('poultry_request__send_date', 'poultry_request__order_code', + 'poultry_request__poultry__user__fullname', 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__address__city__name', 'poultry_request__chicken_breed', + 'poultry_request__Index_weight').values('poultry_request__send_date', + 'poultry_request__order_code', + 'poultry_request__poultry__user__fullname', + 'poultry_request__poultry__user__mobile', + 'poultry_request__poultry__address__city__name', + 'poultry_request__chicken_breed', + 'poultry_request__Index_weight').first() + kill_place = province['kill_request__slaughter_house__name'] if province[ + 'kill_request__slaughter_house'] != None else \ + province['kill_request__slaughter_house__name'] + total_amount = (province['total_killed_weight'] * province['wage']) + all_total_amount += total_amount + send_date = jdatetime.date.fromgregorian( + day=province_request['poultry_request__send_date'].day, + month=province_request['poultry_request__send_date'].month, + year=province_request['poultry_request__send_date'].year + ) if province_request['poultry_request__send_date'] else '-' + wieght = province['total_killed_weight'] + wage = province['wage'] + if wage > 0: + all_wage.append(wage) + list1 = [ + m, + str(province_request['poultry_request__order_code']), + province_request['poultry_request__poultry__user__fullname'], + province_request['poultry_request__poultry__user__mobile'], + province_request['poultry_request__poultry__address__city__name'], + str(send_date), + kill_place, + province_request['poultry_request__chicken_breed'], + province['total_killed_quantity'], + wieght, + province_request['poultry_request__Index_weight'], + province['wage'], + total_amount + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + if len(all_wage) > 0: + wage_all = sum(all_wage) / len(all_wage) + else: + wage_all = 0 + values_list = [ + m - 1, + all_quantity, + all_wiegh, + wage_all, + all_total_amount, + + ] + for item in range(len(values_list)): + cell = worksheet.cell(row=3, column=item + 4, value=values_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10) + value = values_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + list2 = [ + 'مجموع==>', + '', + '', + '', + f'', + '', + '', + '', + all_quantity, + all_wiegh, + '', + wage_all, + all_total_amount, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + 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 + + +def process_for_each_hatching(request): + hatching = PoultryHatching.objects.get(trash=False, key=request.GET['key']) + name = hatching.poultry.unit_name + province_name = hatching.poultry.address.province.name + now = datetime.datetime.now().date() + now_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(now_date.split("-")) + separate = "-" + date_now = separate.join(reversed_date) + + hatch_date = jdatetime.date.fromgregorian( + day=hatching.date.day, + month=hatching.date.month, + year=hatching.date.year + ) + quantity = hatching.quantity + ninety_percent = (quantity * 90) / 100 + killed = 0 + + poultry_requests = PoultryRequest.objects.filter(out_province_request_cancel=False, trash=False, hatching=hatching, + archive=False, + state_process__in=('accepted', 'pending')).order_by('id') + all_quantity_of_request = poultry_requests.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + excel_options = [ + 'ردیف', + 'کد سفارش', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'سن کشتار', + 'نوع درخواست', + 'فروش', + 'تعداد درخواست کشتار', + 'میانگین وزنی درخواست', + 'وزن کل درخواست ', + 'ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + 'تعداد تخصیصی استان به خریدار(قطعه)', + 'وزن تخصیصی استان به خریدار', + 'مانده در سالن', + ' تعداد بار', + 'تعداد بار قطعه', + 'وزن بار', + 'تعداد قطعه وارد شده در قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + red_font = Font(color="C00000", bold=True) + sheet_list = [ + 'مدیریت بارها', + 'بار های زنجیره' + ] + + for name in sheet_list: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + + if sheet_name == 'مدیریت بارها': + header_list = [ + 'نام واحد', + 'نام مالک', + 'تاریخ جوجه ریزی', + 'تعداد جوجه ریزی', + 'نود درصد جوجه ریزی', + 'تعداد نهایی قطعه کشتار شده', + 'وزن نهایی کشتار شده', + 'مجموع تلفات', + 'مانده در سالن', + 'متوسط سن کشتار', + 'تعداد ثبت سفارش', + 'تعداد درخواست کشتار (قطعه)', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد تخصیصی استان به خریدار(قطعه)', + 'وزن تخصیصی استان به خریدار(کیلوگرم)', + 'درصد کشتار نسبت به جوجه ریزی', + 'مجموع تخصیصی به ماشین(قطعه)', + 'مجموع وزن تخصیصی به ماشین(کیلوگرم)', + 'تعداد تخلیه شده دامپزشک', + 'وزن تخلیه شده دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'حجم زنجیره', + 'وزن زنجیره', + + ] + # برای بالای هدر + for col_num, option in enumerate(header_list, 2): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=9, bold=True, color='FFFFFF') + worksheet.row_dimensions[3].height = 36 + worksheet.column_dimensions[col_letter].width = 14 + + worksheet['A5'] = 'جزئیات سفارشات' + worksheet[ + 'F1'] = f'گزارش پایش اطلاعاتی مرغداری {name} سامانه رصدیار استان {province_name} در تاریخ {date_now}' + worksheet['C2'] = f'اطلاعات کلی' + + worksheet['F1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['C2'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A5'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'F1:K1' + + worksheet.merge_cells(merge_range1) + worksheet['F1'].font = red_font + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=36, width=15) + + l = 6 + + final_left_over = [] + all_quantity_of_car = 0 + average_age_list = [] + all_percent = 0 + m = 1 + all_weight = [] + all_quantity_of_car_vet_state_accepted = 0 + request_weight = [] + all_request_weight = [] + all_free_sale_in_province_true = 0 + all_kill_province_request_poultry_request_Index_weight = [] + all_weight_of_car = 0 + all_weight_of_car_vet_state_accepted = 0 + all_main_quantity = 0 + sum_quantity_qarantineh = 0 + sum_all_quantity_vet_kill = 0 + sum_all_wight_vet_kill = 0 + sum_net_weight = 0 + sum_real_quantity_assigment = 0 + sum_accepted_real_quantity = 0 + sum_accepted_real_weight = 0 + all_free_sale_in_province_false = 0 + all_loses = 0 + all_province_quantity = 0 + for poultry_request in poultry_requests: + all_loses += poultry_request.hatching.losses + kill_request = ProvinceKillRequest.objects.filter(province_request__poultry_request=poultry_request, + trash=False, + state__in=('pending', 'accepted'), + return_to_province=False).select_related( + 'killhouse_user', 'province_request__poultry_request').order_by('-create_date') + car_date = shamsi_date(poultry_request.send_date, in_value=True) + + create_date = shamsi_date(poultry_request.create_date, in_value=True) + + average_age = (poultry_request.send_date.date() - hatching.date.date()).days + 1 + average_age_list.append(average_age) + + if poultry_request.direct_buying == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + free_sale_in_province_false = 0 + Index_weight_sale_in_province_false = 0 + free_sale_in_province_true = 0 + + all_province_quantity += poultry_request.quantity + if poultry_request.out == True: + sale_type = 'خارج از استان' + elif poultry_request.free_sale_in_province == False: + free_sale_in_province_false = poultry_request.quantity + all_free_sale_in_province_false += free_sale_in_province_false + Index_weight_sale_in_province_false = poultry_request.Index_weight + sale_type = 'دولتی' + else: + sale_type = 'آزاد' + free_sale_in_province_true = poultry_request.quantity + + all_free_sale_in_province_true += free_sale_in_province_true + + all_request_weight.append(poultry_request.Index_weight * poultry_request.quantity) + list1 = [ + m, + str(poultry_request.order_code), + str(create_date), + str(car_date), + average_age, + type, + sale_type, + poultry_request.quantity, + poultry_request.Index_weight, + round(poultry_request.quantity * poultry_request.Index_weight, 2), + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + # worksheet.column_dimensions[get_column_letter(item + 1)].width = 17.01 + worksheet.row_dimensions[l + 1].height = 21 + if m % 2 == 0: + cell.fill = PatternFill(start_color="DAE1F6", fill_type="solid") + # l += 1 + if kill_request.exists(): + o = l + 1 + if len(kill_request) > 1: + s = len(kill_request) - 1 + + for col in range(ord('A'), ord('J') + 1): + # rng = chr(col) + '7:{}'.format(r) + rng = f'{chr(col)}{o}:{chr(col)}{o + s}' + worksheet.merge_cells(rng) + worksheet[chr(col) + f'{o}'].alignment = Alignment(horizontal='center', vertical='center') + for kill in kill_request: + + all_main_quantity += kill.main_quantity + state_s = '' + if kill.state == 'pending': + state_s = 'درانتظار تایید' + elif kill.state == 'accepted': + state_s = ' تایید شده' + quantity_of_car_vet_state_accepted = 0 + weight_of_car_vet_state_accepted = 0 + quantity_of_car = 0 + weight_of_car = 0 + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_kill_request=kill).order_by( + 'id').only('create_date', 'vet_state') + all_net_weight = 0 + all_real_quantity_assigment = 0 + if kill_house_requests: + for kill_house_request in kill_house_requests: + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_request, trash=False).only('net_weight', + 'real_quantity').first() + if assignment: + all_net_weight += assignment.net_weight if assignment.net_weight != None else 0 + all_real_quantity_assigment += assignment.real_quantity if assignment.real_quantity != None else 0 + quantity_of_car += kill_house_request.quantity + all_quantity_of_car += kill_house_request.quantity + weight_of_car += int( + kill_house_request.quantity * kill_house_request.province_request.poultry_request.Index_weight) + + if kill_house_request.vet_state == 'accepted': + quantity_of_car_vet_state_accepted += kill_house_request.quantity + weight_of_car_vet_state_accepted += kill_house_request.accepted_real_weight + all_quantity_of_car_vet_state_accepted += kill_house_request.quantity + killed += kill.main_quantity + all_quantity_qarantineh = kill_house_requests.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + + all_quantity_vet_kill = kill_house_requests.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_weight_vet_kill = kill_house_requests.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + all_accepted_real_quantity = kill.total_killed_quantity + all_accepted_real_weight = kill.total_killed_weight + sum_all_wight_vet_kill += all_weight_vet_kill if all_weight_vet_kill != None else 0 + sum_all_quantity_vet_kill += all_quantity_vet_kill if all_quantity_vet_kill != None else 0 + sum_quantity_qarantineh += all_quantity_qarantineh if all_quantity_qarantineh != None else 0 + sum_accepted_real_quantity += all_accepted_real_quantity if all_accepted_real_quantity != None else 0 + sum_accepted_real_weight += all_accepted_real_weight if all_accepted_real_weight != None else 0 + left_over = (quantity - killed) + final_left_over.append(left_over) + percent_after_assigment = (quantity_of_car_vet_state_accepted * 100) / quantity + all_percent += percent_after_assigment + + all_weight.append(kill.main_quantity * kill.province_request.poultry_request.Index_weight) + killer = 'کشتارکن' if kill.killhouse_user.killer == True else 'کشتارگاه' + + request_weight.append(Index_weight_sale_in_province_false) + all_kill_province_request_poultry_request_Index_weight.append( + kill.province_request.poultry_request.Index_weight) + all_weight_of_car_vet_state_accepted += weight_of_car_vet_state_accepted + all_weight_of_car += weight_of_car + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = \ + ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = \ + ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + list1 = [ + killer, + kill.killhouse_user.name, + kill.killhouse_user.kill_house_operator.user.mobile, + kill.main_quantity, + kill.province_request.poultry_request.Index_weight, + left_over, + len(kill_house_requests) if kill_house_requests else 0, + quantity_of_car, + weight_of_car, + all_quantity_qarantineh if all_quantity_qarantineh else '-', + all_quantity_vet_kill if all_quantity_vet_kill else '-', + all_weight_vet_kill if all_weight_vet_kill else '-', + all_real_quantity_assigment if all_real_quantity_assigment > 0 else '-', + all_net_weight if all_net_weight > 0 else '-', + kill.total_killed_quantity, + kill.total_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 11, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + # worksheet.column_dimensions[get_column_letter(item + 11)].width = 17.01 + # worksheet.column_dimensions[get_column_letter(item + 11)].height = 20.01 + if m % 2 == 0: + cell.fill = PatternFill(start_color="DAE1F6", fill_type="solid") + l += 1 + + sum_net_weight += all_net_weight + sum_real_quantity_assigment += all_real_quantity_assigment + else: + if poultry_request.out == True: + left_over = (quantity - killed) + list1 = [ + 'خارج از استان', + poultry_request.buyer_fullname, + poultry_request.buyer_mobile, + poultry_request.quantity, + int(poultry_request.Index_weight), + left_over, + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + poultry_request.quantity, + int(poultry_request.quantity * poultry_request.Index_weight), + '-', + '-', + '-', + '-', + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 11, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + # worksheet.column_dimensions[get_column_letter(item + 11)].width = 17.01 + # worksheet.column_dimensions[get_column_letter(item + 11)].height = 20.01 + + if m % 2 == 0: + cell.fill = PatternFill(start_color="DAE1F6", fill_type="solid") + sum_accepted_real_weight += int(poultry_request.quantity * poultry_request.Index_weight) + sum_accepted_real_quantity += poultry_request.quantity + else: + list1 = [ + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 11, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + # worksheet.column_dimensions[get_column_letter(item + 11)].width = 17.01 + # worksheet.column_dimensions[get_column_letter(item + 11)].height = 20.01 + + if m % 2 == 0: + cell.fill = PatternFill(start_color="DAE1F6", fill_type="solid") + l += 1 + + try: + avrage_age1 = round((sum(average_age_list) / len(average_age_list))) + rw = round(sum(request_weight) / len(request_weight)) + dd = round(sum(all_kill_province_request_poultry_request_Index_weight) / len( + all_kill_province_request_poultry_request_Index_weight)) + except: + avrage_age1 = 0 + rw = 0 + dd = 0 + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__in=poultry_requests) + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + f'', + '', + '', + int(all_province_quantity), + '', + int(sum(all_request_weight)), + # int(all_free_sale_in_province_true), + '', + '', + '', + int(all_main_quantity), + int(dd), + f'', + '', + + int(all_quantity_of_car), + int(all_weight_of_car), + int(sum_quantity_qarantineh), + int(sum_all_quantity_vet_kill), + int(sum_all_wight_vet_kill), + int(sum_real_quantity_assigment), + int(sum_net_weight), + int(sum_accepted_real_quantity), + int(sum_accepted_real_weight), + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + try: + all_car = round((all_quantity_of_car * 100) / hatching.killed_quantity) + except: + all_car = 0 + try: + all_car_vet = round((all_quantity_of_car_vet_state_accepted * 100) / all_quantity_of_car) + except: + all_car_vet = 0 + + value_header_list = [ + hatching.poultry.unit_name, + hatching.poultry.user.fullname, + str(hatch_date), + quantity, + ninety_percent, + sum_accepted_real_quantity, + sum_accepted_real_weight, + all_loses, + hatching.left_over, + avrage_age1, + len(poultry_requests), + all_quantity_of_request, + hatching.out_province_killed_quantity, + hatching.out_province_killed_weight, + all_main_quantity, + sum(all_weight), + round((hatching.killed_quantity * 100) / quantity), + all_quantity_of_car, + all_weight_of_car, + sum_all_quantity_vet_kill, + sum_all_wight_vet_kill, + sum_real_quantity_assigment, + sum_net_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + hatching.chain_killed_quantity, + hatching.chain_killed_weight, + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=4, column=item + 2, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + else: + filterset_class = ChainAllocationFilterSet + filterset_fields = [ + 'poultry_hatching__poultry__breeding_unique_id', + 'poultry_hatching__poultry__user__mobile', + 'poultry_hatching__poultry__user__fullname', + 'poultry_hatching__poultry__user__first_name', + 'poultry_hatching__poultry__user__last_name', + 'poultry_hatching__poultry__unit_name', + 'chain_company__name', + + ] + chain_allocations = ChainAllocation.objects.filter(state='accepted',poultry_hatching=hatching + ).order_by('id') + + state1 = 'تایید شده' + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=chain_allocations + ) + ).filter(): + ps = filterset_class(data=query, queryset=chain_allocations) + chain_allocations = ps.filter() + + excel_options = [ + 'ردیف', + 'وضعیت', + ' تاریخ سفارش', + 'نوع فروش', + 'ثبت کننده سفارش', + 'تلفن ثبت کننده سفارش', + 'خریدار', + 'تلفن خریدار', + 'مرغداری', + 'تلفن مرغداری', + 'شرکت زنجیره', + ' تلفن شرکت زنجیره', + 'کد بهداشتی', + 'کد قرنطینه', + 'راننده ', + 'تلفن راننده ', + 'خودرو', + 'پلاک', + 'حجم', + 'میانگین وزن', + 'وزن', + 'حذف/رد کننده', + 'تلفن حذف/رد کننده', + ] + + + + + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if state1 == 'تایید شده': + for col_num, option in enumerate(excel_options[:21], 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + else: + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای {state1} شرکت زنجیره' + if chain_allocations.exists(): + name = chain_allocations.first().poultry_hatching.poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_age = [] + + all_quantity = chain_allocations.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_weighte = chain_allocations.aggregate( + total=Sum('weight'))[ + 'total'] or 0 + has_code = 0 + if chain_allocations: + for chain_allocation in chain_allocations: + age = (chain_allocation.poultry_hatching.chicken_age) + all_age.append(age) + chain_date = jdatetime.date.fromgregorian( + day=chain_allocation.date.day, + month=chain_allocation.date.month, + year=chain_allocation.date.year + ) + + if chain_allocation.quarantine_code: + has_code += 1 + + remover_fullname = '-' + remover_mobile = '-' + if chain_allocation.state == 'accepted': + state = 'تایید شده' + elif chain_allocation.state == 'rejected': + state = 'رد شده' + remover_fullname = chain_allocation.seconder['fullname'] if chain_allocation.seconder else None + remover_mobile = chain_allocation.seconder['mobile'] if chain_allocation.seconder else None + elif chain_allocation.state == 'pending': + state = 'در انتظار تایید' + else: + state = 'حذف شده' + remover_fullname = chain_allocation.remover['fullname'] if chain_allocation.remover else None + remover_mobile = chain_allocation.remover['mobile'] if chain_allocation.remover else None + out_province = 'خارج استان' if chain_allocation.out_province == True else 'داخل استان' + + full_name_registerer = chain_allocation.registerer[ + 'fullname'] if chain_allocation.registerer else '-' + mobile_registerer = chain_allocation.registerer['mobile'] if chain_allocation.registerer else '-' + + if chain_allocation.kill_house is not None: + buyer_fullname = chain_allocation.kill_house.name + buyer_mobile = chain_allocation.kill_house.kill_house_operator.user.mobile + else: + buyer_fullname = chain_allocation.buyer_name + buyer_mobile = chain_allocation.buyer_mobile + + list1 = [ + m, + state, + str(chain_date), + out_province, + full_name_registerer, + mobile_registerer, + buyer_fullname, + buyer_mobile, + chain_allocation.poultry_hatching.poultry.unit_name, + chain_allocation.poultry_hatching.poultry.user.mobile, + chain_allocation.company_name, + chain_allocation.company_user_mobile, + chain_allocation.health_code if chain_allocation.health_code else '-', + chain_allocation.quarantine_code if chain_allocation.quarantine_code else '-', + chain_allocation.driver_name if chain_allocation.driver_name else '-', + chain_allocation.driver_mobile if chain_allocation.driver_mobile else '-', + chain_allocation.type_car if chain_allocation.type_car else '-', + chain_allocation.pelak if chain_allocation.pelak else '-', + chain_allocation.quantity, + chain_allocation.index_weight, + chain_allocation.weight, + remover_fullname, + remover_mobile, + ] + m += 1 + if state1 == 'تایید شده': + for item in range(len(list1) - 2): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + else: + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(chain_allocations), + all_quantity, + all_weighte, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + '', + all_weighte, + '', + '', + + ] + if state1 == 'تایید شده': + for item in range(len(list2) - 2): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + else: + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="پایش اطلاعاتی مرغدار {name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def process_for_all_hatching(request): + hatchings = PoultryHatching.objects.filter(trash=False, allow_hatching='pending', archive=False) + name = hatchings.first().poultry.unit_name + province_name = hatchings.first().poultry.address.province.name + now = datetime.datetime.now().date() + now_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(now_date.split("-")) + separate = "-" + date_now = separate.join(reversed_date) + + excel_options = [ + 'نام واحد', + 'نام مالک', + 'تاریخ جوجه ریزی', + 'تعداد جوجه ریزی', + 'نود درصد جوجه ریزی', + 'مانده در سالن', + 'متوسط سن کشتار', + 'تعداد ثبت سفارش', + 'تعداد درخواست کشتار (قطعه)', + 'تعداد تخصیصی استان به خریدار(قطعه)', + 'وزن تخصیصی استان به خریدار(کیلوگرم)', + 'درصد کشتار نسبت به نود درصد', + 'مجموع تخصیصی به ماشین(قطعه)', + 'درصد تخصیصی به ماشین نسبت به تخصیص استان به خریدار', + 'درصد تخلیه شده نسبت به تخصیص به ماشین', + 'تعداد تخلیه شده در کشتارگاه', + 'کد سفارش', + 'تاریخ کشتار', + 'سن کشتار', + 'نوع درخواست', + 'فروش', + 'تعداد درخواست کشتار دولتی', + 'میانگین وزنی درخواست', + 'وزن کل درخواست ', + 'تعداد درخواست کشتار آزاد', + 'تعداد تخصیصی استان به خریدار(قطعه)', + 'وزن تخصیصی استان به خریدار', + 'مانده در سالن', + 'ماهیت خریدار', + 'خریدار', + 'تخصیصی خریدار به ماشین', + 'وزن تخصیصی خریدار به ماشین', + 'تلفات غیرعادی گله', + 'تعداد تخلیه شده در کشتار گاه', + 'وزن تخلیه شده در کشتارگاه', + 'درصد تخلیه شده به تخصیص به ماشین', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + red_font = Font(color="C00000", bold=True) + + worksheet['F1'] = f'گزارش پایش اطلاعاتی مرغداری {name} سامانه رصدیار استان {province_name} در تاریخ {date_now}' + worksheet['A2'] = f'اطلاعات کلی' + + worksheet['F1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['C2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'F1:K1' + + worksheet.merge_cells(merge_range1) + worksheet['F1'].font = red_font + + # برای کل + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + + worksheet.column_dimensions[col_letter].width = 14 + + worksheet.row_dimensions[3].height = 36 + + worksheet.freeze_panes = worksheet['A4'] + max_col = worksheet.max_column + range_str = f'A3:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + final_left_over = [] + all_quantity_of_car = 0 + all_percent = 0 + all_weight = [] + all_quantity_of_car_vet_state_accepted = 0 + request_weight = [] + average_age_list = [] + all_request_weight = [] + all_free_sale_in_province_true = 0 + all_kill_province_request_poultry_request_Index_weight = [] + all_weight_of_car = 0 + all_weight_of_car_vet_state_accepted = 0 + for hatching in hatchings: + l = 2 + + hatch_date = jdatetime.date.fromgregorian( + day=hatching.date.day, + month=hatching.date.month, + year=hatching.date.year + ) + quantity = hatching.quantity + ninety_percent = (quantity * 90) / 100 + killed = 0 + + poultry_requests = PoultryRequest.objects.filter(trash=False, hatching=hatching, archive=False).order_by('-id') + all_quantity_of_request = poultry_requests.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + for poultry_request in poultry_requests: + + kill_request = ProvinceKillRequest.objects.filter(province_request__poultry_request=poultry_request, + trash=False).select_related( + 'killhouse_user', 'province_request__poultry_request').order_by('-create_date') + + car_date = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + average_age = (poultry_request.send_date.date() - hatching.date.date()).days + 1 + average_age_list.append(average_age) + if poultry_request.union == True: + type = 'خارج از استان' + elif poultry_request.direct_buying == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + free_sale_in_province_false = 0 + Index_weight_sale_in_province_false = 0 + free_sale_in_province_true = 0 + + if poultry_request.free_sale_in_province == False: + free_sale_in_province_false = poultry_request.quantity + Index_weight_sale_in_province_false = poultry_request.Index_weight + sale_type = 'دولتی' + else: + free_sale_in_province_true = poultry_request.quantity + sale_type = 'آزاد' + + all_free_sale_in_province_true += free_sale_in_province_true + + all_request_weight.append(Index_weight_sale_in_province_false * free_sale_in_province_false) + try: + avrage_age1 = round((sum(average_age_list) / len(average_age_list))) + rw = round(sum(request_weight) / len(request_weight)) + dd = round(sum(all_kill_province_request_poultry_request_Index_weight) / len( + all_kill_province_request_poultry_request_Index_weight)) + except: + avrage_age1 = 0 + rw = 0 + dd = 0 + try: + all_car = round((all_quantity_of_car * 100) / hatching.killed_quantity) + except: + all_car = 0 + try: + all_car_vet = round((all_quantity_of_car_vet_state_accepted * 100) / all_quantity_of_car) + except: + all_car_vet = 0 + + if kill_request: + for kill in kill_request: + quantity_of_car_vet_state_accepted = 0 + weight_of_car_vet_state_accepted = 0 + quantity_of_car = 0 + weight_of_car = 0 + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_kill_request=kill).order_by( + 'id').only('create_date', 'vet_state') + if kill_house_requests: + + for kill_house_request in kill_house_requests: + quantity_of_car += kill_house_request.quantity + all_quantity_of_car += kill_house_request.quantity + weight_of_car += kill_house_request.accepted_real_weight + + if kill_house_request.vet_state == 'accepted': + quantity_of_car_vet_state_accepted += kill_house_request.quantity + weight_of_car_vet_state_accepted += kill_house_request.accepted_real_weight + all_quantity_of_car_vet_state_accepted += kill_house_request.quantity + killed += kill.main_quantity + + left_over = (quantity - killed) + final_left_over.append(left_over) + percent_after_assigment = (quantity_of_car_vet_state_accepted * 100) / quantity + all_percent += percent_after_assigment + + all_weight.append(kill.main_quantity * kill.province_request.poultry_request.Index_weight) + killer = 'کشتارکن' if kill.killhouse_user.killer == True else 'کشتارگاه' + + request_weight.append(Index_weight_sale_in_province_false) + all_kill_province_request_poultry_request_Index_weight.append( + kill.province_request.poultry_request.Index_weight) + all_weight_of_car_vet_state_accepted += weight_of_car_vet_state_accepted + all_weight_of_car += weight_of_car + list1 = [ + hatching.poultry.unit_name, + hatching.poultry.user.fullname, + str(hatch_date), + quantity, + ninety_percent, + hatching.left_over, + avrage_age1, + len(poultry_requests), + all_quantity_of_request, + hatching.killed_quantity, + sum(all_weight), + round((hatching.killed_quantity * 100) / ninety_percent), + all_quantity_of_car, + all_car, + all_car_vet, + all_quantity_of_car_vet_state_accepted, + poultry_request.order_code, + str(car_date), + average_age, + type, + sale_type, + free_sale_in_province_false, + Index_weight_sale_in_province_false, + round(free_sale_in_province_false * Index_weight_sale_in_province_false, 2), + free_sale_in_province_true, + kill.main_quantity, + kill.province_request.poultry_request.Index_weight, + left_over, + killer, + kill.killhouse_user.name, + quantity_of_car, + weight_of_car, + '0', + quantity_of_car_vet_state_accepted, + weight_of_car_vet_state_accepted, + round(percent_after_assigment), + + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + else: + list1 = [ + hatching.poultry.unit_name, + hatching.poultry.user.fullname, + str(hatch_date), + quantity, + ninety_percent, + hatching.left_over, + avrage_age1, + len(poultry_requests), + all_quantity_of_request, + hatching.killed_quantity, + sum(all_weight), + round((hatching.killed_quantity * 100) / ninety_percent), + all_quantity_of_car, + all_car, + all_car_vet, + all_quantity_of_car_vet_state_accepted, + poultry_request.order_code, + str(car_date), + average_age, + type, + sale_type, + free_sale_in_province_false, + Index_weight_sale_in_province_false, + round(free_sale_in_province_false * Index_weight_sale_in_province_false, 2), + free_sale_in_province_true, + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '0', + '-', + '-', + '-', + + ] + l += 1 + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + r = l + 1 + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="پایش اطلاعاتی مرغدار {name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def bar_management_kill_house_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(key=request.GET['key']) + try: + operator = KillHouseOperator.objects.get(user=user, trash=False) + kill_house = KillHouse.objects.filter(trash=False, kill_house_operator=operator) + except: + kill_house = KillHouse.objects.filter(trash=False) + kill_house_assignments_list = KillHouseAssignmentInformation.objects.filter( + kill_house_request__killhouse_user__in=kill_house, + trash=False, + unusual_casualties=False, + kill_house_request__kill_request__recive_date__date__gte=date1, + kill_house_request__kill_request__recive_date__date__lte=date2) + + excel_options = [ + 'ردیف', + 'کد بار', + 'کد سفارش', + 'خریدار', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + 'راننده', + 'موبایل راننده', + 'ماشین', + 'پلاک', + 'تاریخ کشتار', + 'مرغدار', + 'تلفن مرغدار', + 'شهر', + 'استان', + 'تعداد تخصیصی بار(قطعه)', + 'وزن(کیلوگرم)', + 'وزن کل(کیلوگرم)', + 'تعداد واقعی تحویلی(قطعه)', + 'وزن واقعی تحویلی(کیلوگرم)', + 'وزن وارد شده ماشین بدون بار باسکول(کیلوگرم)', + 'وزن وارد شده ماشین با بار باسکول(کیلوگرم)', + 'وزن بدست آمده از بار باسکول(کیلوگرم)', + 'لاشه استحصالی(قطعه)', + 'وضعیت بار', + + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد تخصیصی', + 'مجموع تعداد واقعی تحویلی', + 'مجموع وزن واقعی تحویلی', + ] + # برای بالای هدر + for col_num, option in enumerate(header_list, 4): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 17 + + worksheet['A1'] = f' مدیریت بارهای تکمیل شده ' + worksheet['A3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + # worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:B1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 21.01 + worksheet.row_dimensions[4].height = 28 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 3 + m = 1 + kill_kill_house_request_quantity_all = 0 + kill_kill_house_request_accepted_real_quantity_all = 0 + kill_kill_house_request_accepted_real_weight_all = 0 + killer_exclusive = 0 + for kill in kill_house_assignments_list: + kill_kill_house_request_quantity_all += kill.kill_house_request.quantity + kill_kill_house_request_accepted_real_quantity_all += kill.kill_house_request.accepted_real_quantity + kill_kill_house_request_accepted_real_weight_all += kill.kill_house_request.accepted_real_weight + + kill_date = jdatetime.date.fromgregorian( + year=kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.send_date.year, + month=kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.send_date.month, + day=kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.send_date.day + ) + final_state = 'در انتظار تایید' if kill.state == 'pending' else 'تایید شده' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.kill_house_request.killer != None: + name_killer_exclusive = kill.kill_house_request.killer.name + mobile_killer_exclusive = str(kill.kill_house_request.killhouse_user.kill_house_operator.user.mobile) + killer_exclusive += 1 + list1 = [ + m, + str(kill.kill_house_request.bar_code), + str(kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.order_code), + kill.kill_house_request.killhouse_user.name, + name_killer_exclusive, + mobile_killer_exclusive, + kill.kill_house_request.add_car.driver.driver_name, + kill.kill_house_request.add_car.driver.driver_mobile, + kill.kill_house_request.add_car.driver.type_car, + kill.kill_house_request.add_car.driver.pelak, + str(kill_date), + kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.poultry.user.fullname, + kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.poultry.user.mobile, + kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.poultry.user.city.name, + kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.poultry.user.province.name, + kill.kill_house_request.quantity, + kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight, + kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight * kill.kill_house_request.quantity, + kill.kill_house_request.accepted_real_quantity, + kill.kill_house_request.accepted_real_weight, + kill.car_weight_without_load, + kill.car_weight_with_load, + kill.net_weight, + kill.kill_house_request.province_kill_request.province_request.city_request_Poultry.poultry_request.hatching.losses, + final_state, + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + m += 1 + + value_header_list = [ + killer_exclusive, + kill_kill_house_request_quantity_all, + kill_kill_house_request_accepted_real_quantity_all, + kill_kill_house_request_accepted_real_weight_all + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 4, value=value_header_list[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + value = value_header_list[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + + 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 + + +def all_inventory_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + names_list = ['اطلاعات کلی'] + + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1, + date__date__lte=date2, trash=False) + for kill in kill_house_ware_houses: + if kill.kill_house.name not in names_list: + names_list.append(kill.kill_house.name) + # names_list= kill_house_ware_houses.values('kill_house__name') + # print(names_list) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + total_pre_cold_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[ + 'total'] + total_pre_cold_weight = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[ + 'total'] + total_number_of_free_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('free_weight_of_carcasses'))[ + 'total'] + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + abc_list = ['A', 'B', 'C', 'D', 'E', 'G', 'I', 'K', 'M', 'O', 'Q', 'S', 'T'] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + now_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(now_date.split("-")) + separate = "-" + now_date_1 = separate.join(reversed_date) + kill_houses = KillHouse.objects.filter( + pk__in=kill_house_ware_houses.values('kill_house') + ) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + for name in names_list: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + if sheet_name == 'اطلاعات کلی': + worksheet.row_dimensions[2].height = 24 + worksheet.row_dimensions[3].height = 30 + worksheet.row_dimensions[5].height = 19.04 + worksheet.row_dimensions[8].height = 32 + + worksheet['A2'] = f'این گزارش در مورخ {now_date_1} صادر شده است.' + worksheet['G2'] = f'اطلاعات کلی توزیع و پخش مرغ گرم از تاریخ {from_date_1} تا {to_date_1}' + + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['G2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range122 = 'A2:D2' + merge_range123 = 'G2:N2' + worksheet.merge_cells(merge_range122) + worksheet.merge_cells(merge_range123) + + worksheet['G2'].font = Font(size=12, color='FF0000') + + for abc in abc_list: + worksheet[f'{abc}8'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + for abc in abc_list[1:]: + worksheet[f'{abc}3'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + withe_font = Font(size=10, color='D9FFFFFF') + blue = PatternFill(start_color="4472C4", fill_type="solid") + green = PatternFill(start_color="00B050", fill_type="solid") + worksheet['B3'] = f'تعداد خریداران' + worksheet['C3'] = f'ورودی از سردخانه' + worksheet['E3'] = f'پیش سرد' + worksheet['G3'] = f'خرید خارج از استان' + worksheet['I3'] = f'بارهای روزانه' + worksheet['K3'] = f'جمع کل انبار' + worksheet['M3'] = f'توزیع شده' + worksheet['O3'] = f'توزیع / تحویل شده' + worksheet['Q3'] = f'مانده انبار' + worksheet['S3'] = f'تعداد مباشر تخصیص داده شده' + worksheet['T3'] = f'تعداد صنف تخصیص داده شده' + + worksheet['C3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['E3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['G3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['I3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['K3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['M3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['O3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['Q3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['S3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['T3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range1 = 'C3:D4' + merge_range2 = 'E3:F4' + merge_range3 = 'G3:H4' + merge_range4 = 'I3:J4' + merge_range5 = 'K3:L4' + merge_range6 = 'M3:N4' + merge_range7 = 'O3:P4' + merge_range8 = 'Q3:R4' + merge_range9 = 'B3:B5' + merge_range10 = 'S3:S5' + merge_range11 = 'T3:T5' + + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet.merge_cells(merge_range9) + worksheet.merge_cells(merge_range10) + worksheet.merge_cells(merge_range11) + + worksheet['C3'].font = withe_font + worksheet['B3'].font = withe_font + worksheet['E3'].font = withe_font + worksheet['G3'].font = withe_font + worksheet['I3'].font = withe_font + worksheet['K3'].font = withe_font + worksheet['M3'].font = withe_font + worksheet['O3'].font = withe_font + worksheet['Q3'].font = withe_font + worksheet['S3'].font = withe_font + worksheet['T3'].font = withe_font + + worksheet['B3'].fill = blue + worksheet['C3'].fill = blue + worksheet['E3'].fill = blue + worksheet['G3'].fill = blue + worksheet['I3'].fill = blue + worksheet['K3'].fill = blue + worksheet['M3'].fill = blue + worksheet['O3'].fill = blue + worksheet['Q3'].fill = blue + worksheet['S3'].fill = blue + worksheet['T3'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + + for item in range(len(list1)): + cell = worksheet.cell(row=5, column=item + 3, value=list1[item]) + worksheet.row_dimensions[5].height = 19 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + worksheet['A8'] = f'ردیف' + worksheet['B8'] = f'خریدار' + worksheet['C8'] = f'شهرستان' + worksheet['D8'] = f'تعداد مباشر/صنف تخصیصی' + worksheet['E8'] = f'ورودی از سردخانه' + worksheet['G8'] = f'پیش سرد' + worksheet['I8'] = f'خرید خارج از استان' + worksheet['K8'] = f'بارهای روزانه' + worksheet['M8'] = f'جمع کل انبار' + worksheet['O8'] = f'توزیع شده' + worksheet['Q8'] = f'توزیع / تحویل شده' + worksheet['S8'] = f'مانده انبار' + + worksheet['A8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['C8'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['D8'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['E8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['G8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['I8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['K8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['M8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['O8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['Q8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['S8'].alignment = Alignment(horizontal='center', vertical='center') + + merge_range11 = 'A8:A10' + merge_range12 = 'B8:B10' + merge_range13 = 'C8:C10' + merge_range14 = 'D8:D10' + merge_range1 = 'E8:F9' + merge_range2 = 'G8:H9' + merge_range3 = 'I8:J9' + merge_range4 = 'K8:L9' + merge_range5 = 'M8:N9' + merge_range6 = 'O8:P9' + merge_range7 = 'Q8:R9' + merge_range8 = 'S8:T9' + + worksheet.merge_cells(merge_range11) + worksheet.merge_cells(merge_range12) + worksheet.merge_cells(merge_range13) + worksheet.merge_cells(merge_range14) + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + + worksheet['A8'].font = withe_font + worksheet['B8'].font = withe_font + worksheet['C8'].font = withe_font + worksheet['D8'].font = withe_font + worksheet['E8'].font = withe_font + worksheet['G8'].font = withe_font + worksheet['I8'].font = withe_font + worksheet['K8'].font = withe_font + worksheet['M8'].font = withe_font + worksheet['O8'].font = withe_font + worksheet['Q8'].font = withe_font + worksheet['S8'].font = withe_font + + worksheet['A8'].fill = green + worksheet['B8'].fill = green + worksheet['C8'].fill = green + worksheet['D8'].fill = green + worksheet['E8'].fill = blue + worksheet['G8'].fill = blue + worksheet['I8'].fill = blue + worksheet['K8'].fill = blue + worksheet['M8'].fill = blue + worksheet['O8'].fill = blue + worksheet['Q8'].fill = blue + worksheet['S8'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + for item in range(len(list1)): + cell = worksheet.cell(row=10, column=item + 5, value=list1[item]) + worksheet.row_dimensions[5].height = 28 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + head_list1 = [len(names_list) - 1 + , 0, + 0, + total_pre_cold_quantity if total_pre_cold_quantity != None else 0, + total_pre_cold_weight if total_pre_cold_weight != None else 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + number_of_steward, + number_of_guild, + + ] + for item in range(len(head_list1)): + cell = worksheet.cell(row=6, column=item + 2, value=head_list1[item]) + worksheet.row_dimensions[6].height = 12 + value = head_list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + l = 11 + m = 1 + for kill_house in kill_houses: + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1, + date__date__lte=date2, kill_house=kill_house, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, + trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + total_pre_cold_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[ + 'total'] + total_pre_cold_weight = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[ + 'total'] + total_number_of_free_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('free_weight_of_carcasses'))[ + 'total'] + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + if kill_house.killer == True: + kill_house_name = 'کشتارکن' + '(' + kill_house.name + ')' + else: + kill_house_name = 'کشتارگاه' + '(' + kill_house.name + ')' + + list2 = [ + m, + kill_house_name, + kill_house.kill_house_operator.user.city.name, + number_of_guild + number_of_steward, + 0, + 0, + total_pre_cold_quantity if total_pre_cold_quantity != None else 0, + total_pre_cold_weight if total_pre_cold_weight != None else 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + l += 1 + m += 1 + else: + worksheet['F2'] = f'اطلاعات کلی توزیع و پخش مرغ گرم از تاریخ {from_date_1} تا {to_date_1}' + + worksheet['F2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range122 = 'F2:N2' + worksheet.merge_cells(merge_range122) + + worksheet['F2'].font = Font(size=10) + + for abc in abc_list[2:]: + worksheet[f'{abc}3'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + withe_font = Font(size=12, bold=True, color='D9FFFFFF') + withe_font1 = Font(size=10, color='D9FFFFFF') + blue = PatternFill(start_color="4472C4", fill_type="solid") + worksheet['C3'] = f'ورودی از سردخانه' + worksheet['E3'] = f'پیش سرد' + worksheet['G3'] = f'خرید خارج از استان' + worksheet['I3'] = f'مجموع بارها' + worksheet['K3'] = f'جمع کل انبار' + worksheet['M3'] = f'توزیع شده' + worksheet['O3'] = f'توزیع / تحویل شده' + worksheet['Q3'] = f'مانده انبار' + worksheet['S3'] = f'تعداد مباشر تخصیص داده شده' + worksheet['T3'] = f'تعداد صنف تخصیص داده شده' + + worksheet['C3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['E3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['G3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['I3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['K3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['M3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['O3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['Q3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['S3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['T3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range1 = 'C3:D4' + merge_range2 = 'E3:F4' + merge_range3 = 'G3:H4' + merge_range4 = 'I3:J4' + merge_range5 = 'K3:L4' + merge_range6 = 'M3:N4' + merge_range7 = 'O3:P4' + merge_range8 = 'Q3:R4' + merge_range9 = 'S3:S5' + merge_range10 = 'T3:T5' + + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet.merge_cells(merge_range9) + worksheet.merge_cells(merge_range10) + + worksheet['C3'].font = withe_font + worksheet['E3'].font = withe_font + worksheet['G3'].font = withe_font + worksheet['I3'].font = withe_font + worksheet['K3'].font = withe_font + worksheet['M3'].font = withe_font + worksheet['O3'].font = withe_font + worksheet['Q3'].font = withe_font + worksheet['S3'].font = withe_font1 + worksheet['T3'].font = withe_font1 + + worksheet['C3'].fill = blue + worksheet['E3'].fill = blue + worksheet['G3'].fill = blue + worksheet['I3'].fill = blue + worksheet['K3'].fill = blue + worksheet['M3'].fill = blue + worksheet['O3'].fill = blue + worksheet['Q3'].fill = blue + worksheet['S3'].fill = blue + worksheet['T3'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + + for item in range(len(list1)): + cell = worksheet.cell(row=5, column=item + 3, value=list1[item]) + worksheet.row_dimensions[5].height = 19 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1, + date__date__lte=date2, kill_house__name=sheet_name, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, + trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + total_pre_cold_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[ + 'total'] + total_pre_cold_weight = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[ + 'total'] + total_number_of_free_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('free_weight_of_carcasses'))[ + 'total'] + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + list2 = [ + + 0, + 0, + total_pre_cold_quantity if total_pre_cold_quantity != None else 0, + total_pre_cold_weight if total_pre_cold_weight != None else 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + number_of_steward, + number_of_guild, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=6, column=item + 3, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + excel_options = [ + 'ردیف', + 'شناسه صنف', + 'تاریخ ثبت', + 'ماهیت', + 'نوع تخصیص', + 'نام واحد صنفی', + 'نام شخص', + 'کد ملی', + 'موبایل', + 'نوع فعالیت', + 'حوزه فعالیت', + 'شماره مجوز', + 'شهرستان', + 'تعداد لاشه تخصیص', + 'وزن لاشه تخصیصی', + 'تعداد لاشه تحویلی', + 'وزن لاشه تحویلی', + 'وضعیت', + 'کد احراز', + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=9, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[9].height = 26 + worksheet.freeze_panes = worksheet['A10'] + max_col = worksheet.max_column - 1 + range_str = f'A9:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + m = 1 + l = 10 + + stewards = (StewardAllocation.objects.filter(trash=False, ware_house__kill_house__name=sheet_name, + date__date__gte=date1, date__date__lte=date2) + .select_related('guilds', + 'guilds__user', + 'guilds__address__city', + 'kill_house', + 'kill_house__kill_house_operator').order_by( + 'id')) + + if stewards.exists(): + for steward_allocation in stewards: + create_date = jdatetime.date.fromgregorian( + day=steward_allocation.create_date.day, + month=steward_allocation.create_date.month, + year=steward_allocation.create_date.year + ) + steward = 'مباشر' if steward_allocation.seller_type == 'steward' else 'صنف' + sell_type = 'اختصاصی' if steward_allocation.sell_type == 'exclusive' else 'آزاد' + type = 'دستی' if steward_allocation.type == 'manual' else 'اتوماتیک' + try: + guilds_name = steward_allocation.steward.guilds.guilds_name + guilds_id = steward_allocation.steward.guilds.guilds_id + fullname = steward_allocation.steward.guilds.user.fullname + national_id = steward_allocation.steward.guilds.user.national_id + mobile = steward_allocation.steward.guilds.user.mobile + type_activity = steward_allocation.steward.guilds.type_activity + area_activity = steward_allocation.steward.guilds.area_activity + license_number = steward_allocation.steward.guilds.license_number + city_name = steward_allocation.steward.guilds.address.city.name + except: + guilds_name = steward_allocation.guilds.guilds_name + guilds_id = steward_allocation.guilds.guilds_id + fullname = steward_allocation.guilds.user.fullname + national_id = steward_allocation.guilds.user.national_id + mobile = steward_allocation.guilds.user.mobile + type_activity = steward_allocation.guilds.type_activity + area_activity = steward_allocation.guilds.area_activity + license_number = steward_allocation.guilds.license_number + city_name = steward_allocation.guilds.address.city.name + if steward_allocation.receiver_state == 'pending': + reciver_type = 'در انتظار تحویل' + register = '-' + elif steward_allocation.receiver_state == 'accepted': + reciver_type = 'تحویل گرفته شد' + register = steward_allocation.logged_registration_code if steward_allocation.logged_registration_code else 'وارد نشده' + + else: + reciver_type = 'رد شده' + register = '-' + + list2 = [ + m, + guilds_id, + str(create_date), + steward, + f'{sell_type}({type})', + guilds_name, + fullname, + national_id, + mobile, + type_activity, + area_activity, + license_number, + city_name, + steward_allocation.number_of_carcasses, + steward_allocation.weight_of_carcasses, + steward_allocation.receiver_real_number_of_carcasses, + steward_allocation.receiver_real_weight_of_carcasses, + reciver_type, + register, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + m += 1 + l += 1 + 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 + + +def daily_process_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() if 'date' in request.GET else now + date_one_day_ago = date1 - timedelta(days=1) + + # user = get_object_or_404(SystemUserProfile, key=request.GET['key']) + poultry_requests = PoultryRequest.objects.filter( + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date=date_one_day_ago).select_related('poultry', + 'poultry__user', + 'poultry__address__province').order_by( + '-send_date') + if poultry_requests: + province_name = poultry_requests.first().poultry.user.province.name + else: + province_name = '' + excel_options = { + 'درخواست کشتار مرغداران': [ + 'ردیف', + 'کد سفارش', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'نام و نام خانوادگی مرغدار', + 'نام فارم', + 'موبایل', + 'کشتارگاه های پیشنهادی', + 'آدرس', + 'سن مرغ', + 'تعداد درخواست کشتار', + 'مانده در سالن', + 'تایید شده', + ], + 'تخصیص به خریداران توسط اتحادیه': [ + 'ردیف', + 'کد سفارش', + 'نوع درخواست', + 'نام فارم', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'شهر', + 'تاریخ کشتار', + 'تعداد کشتار', + 'زمان تخصیص', + 'نوع تخصیص', + 'خریدار', + 'تعداد تخصیص داده شده', + ' تلفن خریدار', + ' آدرس خریدار', + 'تایید تخصیص', + 'تخصیص ماشین', + + ], + 'ثبت ماشین(ایجاد بار)': [ + 'ردیف', + 'کد بار', + 'مرغدار', + 'تلفن مرغدار', + 'کدسفارش مرغدار', + ' شهر مرغدار', + ' تاریخ کشتار', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'خریدار', + ' تلفن خریدار', + ' ماهیت خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تخصیصی', + 'تعداد تخلیه شده', + 'وزن بار', + 'تاریخ تخلیه (کشتارگاه)', + 'مبلغ فاکتور', + 'تاریخ پرداخت فاکتور', + + ], + 'اطلاعات انبار خریداران': [ + 'ردیف', + 'خریدار', + 'شناسه صنف', + 'تاریخ ثبت', + 'ماهیت', + 'نوع تخصیص', + 'نام واحد صنفی', + 'نام شخص', + 'کد ملی', + 'موبایل', + 'نوع فعالیت', + 'حوزه فعالیت', + 'شماره مجوز', + 'شهرستان', + 'تعداد لاشه', + 'وزن لاشه', + 'کد احراز', + + ] + + } + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + fro_date = jdatetime.date.fromgregorian( + year=date_one_day_ago.year, + month=date_one_day_ago.month, + day=date_one_day_ago.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(fro_date.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date) + output = BytesIO() + workbook = Workbook() + # worksheet = workbook.active + + for name, options in excel_options.items(): + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.column_dimensions[col_letter].height = len(option) + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 3 + if sheet_name == 'درخواست کشتار مرغداران': + m = 1 + worksheet['A1'] = f'درخواست کشتار مرغداران استان {province_name}' + worksheet['A3'] = f'در تاریخ:({from_date_2})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + if poultry_requests: + for filtered_poultry_kill_request in poultry_requests: + date_of_create = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.create_date.day, + month=filtered_poultry_kill_request.create_date.month, + year=filtered_poultry_kill_request.create_date.year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.send_date.day, + month=filtered_poultry_kill_request.send_date.month, + year=filtered_poultry_kill_request.send_date.year + ) + state = 'تایید شده' + if filtered_poultry_kill_request.state == 'pending': + state = 'در انتظار تایید' + kill_house = '-' + if filtered_poultry_kill_request.kill_house_list is not None: + for name in filtered_poultry_kill_request.kill_house_list: + kill_house += name + '/' + age = ( + filtered_poultry_kill_request.send_date.date() - filtered_poultry_kill_request.hatching.date.date()).days + 1 + + list1 = [ + m, + filtered_poultry_kill_request.order_code, + str(date_of_create), + str(date_of_kill), + filtered_poultry_kill_request.poultry.user.fullname, + filtered_poultry_kill_request.poultry.unit_name, + filtered_poultry_kill_request.poultry.user.mobile, + kill_house, + filtered_poultry_kill_request.poultry.address.city.name, + str(age), + filtered_poultry_kill_request.quantity, + filtered_poultry_kill_request.hatching.left_over, + state + ] + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + elif sheet_name == 'تخصیص به خریداران توسط اتحادیه': + m = 1 + worksheet['A1'] = f'تخصیص به خریداران توسط اتحادیه استان {province_name}' + worksheet['A3'] = f'در تاریخ:({from_date_2})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + prvince_kill_requests = ProvinceKillRequest.objects.filter( + trash=False, + province_request__poultry_request__in=poultry_requests).order_by('-create_date') + for filtered_province_kill_req in prvince_kill_requests: + car = 'دارد' if KillHouseRequest.objects.filter(province_kill_request=filtered_province_kill_req, + trash=False).exists() else '-' + + l += 1 + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.province_request.poultry_request.send_date.day, + month=filtered_province_kill_req.province_request.poultry_request.send_date.month, + year=filtered_province_kill_req.province_request.poultry_request.send_date.year + ) + date_of_allocation = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.create_date.day, + month=filtered_province_kill_req.create_date.month, + year=filtered_province_kill_req.create_date.year + ) + if filtered_province_kill_req.state == "accepted": + state = 'تایید شده' + elif filtered_province_kill_req.state == "pending": + state = 'در انتظار تایید' + else: + state = 'رد شده' + + automatic = 'خودکار' if filtered_province_kill_req.automatic else 'دستی' + if filtered_province_kill_req.province_request.poultry_request.union == True: + type = 'فروش آزاد' + elif filtered_province_kill_req.province_request.poultry_request.direct_buying == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + list1 = [ + m, + filtered_province_kill_req.province_request.poultry_request.order_code, + type, + filtered_province_kill_req.province_request.poultry_request.poultry.unit_name, + filtered_province_kill_req.province_request.poultry_request.poultry.user.fullname, + filtered_province_kill_req.province_request.poultry_request.poultry.user.mobile, + filtered_province_kill_req.province_request.poultry_request.poultry.address.city.name, + str(date_of_kill), + filtered_province_kill_req.province_request.poultry_request.quantity, + str(date_of_allocation), + automatic, + filtered_province_kill_req.killhouse_user.name, + filtered_province_kill_req.main_quantity, + filtered_province_kill_req.killhouse_user.kill_house_operator.user.mobile, + # filtered_province_kill_req.killhouse_user.kill_house_operator.address.city.name, + filtered_province_kill_req.kill_request.kill_house.system_address.city.name, + state, + car + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + elif sheet_name == 'ثبت ماشین(ایجاد بار)': + m = 1 + worksheet['A1'] = f'ثبت ماشین توسط خریدار(ایجاد بار) استان {province_name}' + worksheet['A3'] = f'در تاریخ:({from_date_2})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + filtered_kill_reqs = KillHouseRequest.objects.filter( + kill_request__recive_date__date=date_one_day_ago, + trash=False).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code').values( + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + ) + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + l += 1 + date_of_inner_bar = '-' + date_factor = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__key=kill.get('key')).only( + 'total_price').values( + 'total_price').first() + factor_amount = factor.get('total_price') if factor else '-' + factor_payment = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__key=kill.get( + 'key')).only('create_date').values( + 'create_date').first() + if factor_payment: + factor_date = factor_payment.get('create_date') + date_factor = jdatetime.date.fromgregorian( + day=factor_date.day, + month=factor_date.month, + year=factor_date.year + ) if factor_payment else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity').first() + if assignment: + net_weighte = assignment.get('net_weight') if assignment else '-' + real_quantity = assignment.get('real_quantity') + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_check_date.day, + month=vet_check_date.month, + year=vet_check_date.year + ) if vet_checks else '-' + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + list1 = [ + m, + str(kill.get('bar_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__order_code'), + kill.get('province_request__poultry_request__poultry__user__city__name'), + str(date_of_poultry_request), + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + killers, + kill.get('killhouse_user__system_address__city__name'), + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + kill.get('add_car__driver__health_code'), + code, + quantity, + real_quantity, + net_weighte, + str(date_of_inner_bar), + factor_amount, + str(date_factor) + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + elif sheet_name == 'اطلاعات انبار خریداران': + m = 1 + worksheet['A1'] = f' اطلاعات انبار خریداران استان {province_name}' + worksheet['A3'] = f'در تاریخ:({from_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:B2' + + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), + kill_request__recive_date__date=date_one_day_ago).select_related( + 'killhouse_user') + kill_house_list = KillHouse.objects.filter( + pk__in=province_kill_requests.values('killhouse_user') + + ).select_related('kill_house_operator', 'kill_house_operator__user', 'kill_house_operator__address__city') + # برای بالای هدر + kill_house_ware_houses = KillHouseWareHouse.objects.filter(kill_house__in=kill_house_list, date__date=date1) + steward_allocations = StewardAllocation.objects.filter( + system_registration_code=True, + ware_house__in=kill_house_ware_houses, trash=False, + date__date=date1).select_related('guilds', 'guilds__user', 'guilds__address__city', 'kill_house', + 'kill_house__kill_house_operator').order_by('id') + + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + allocated_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('allocated_total_number_of_carcasses'))['total'] + allocated_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('allocated_total_weight_of_carcasses'))['total'] + remain_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))['total'] + remain_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))['total'] + + header_list = [ + 'تعداد خریداران', + 'تعداد مباشرین', + 'تعداد لاشه ها', + 'وزن لاشه ها (کیلوگرم)', + 'تعداد لاشه تخصیص داده شده', + 'وزن تخصیص داده شده (کیلوگرم)', + 'تعداد لاشه قابل تخصیص', + 'وزن قابل تخصیص (کیلوگرم)', + + ] + for col_num, option in enumerate(header_list, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 17 + worksheet.column_dimensions[col_letter].width = 21.01 + + # worksheet.row_dimensions[2].width = 21 + value_header_list = [ + len(kill_house_ware_houses), + len(steward_allocations), + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + allocated_total_number_of_carcasses if allocated_total_number_of_carcasses != None else 0, + allocated_total_weight_of_carcasses if allocated_total_weight_of_carcasses != None else 0, + remain_total_number_of_carcasses if remain_total_number_of_carcasses != None else 0, + remain_total_weight_of_carcasses if remain_total_weight_of_carcasses != None else 0, + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 3, value=value_header_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=11) + + for steward_allocation in steward_allocations: + killer = 'کشتارکن' if steward_allocation.kill_house.killer == True else 'کشتارگاه' + kill_house_name = steward_allocation.kill_house.name + + date = jdatetime.date.fromgregorian( + year=steward_allocation.date.year, + month=steward_allocation.date.month, + day=steward_allocation.date.day + ) + steward = 'مباشر' if steward_allocation.seller_type == 'steward' else 'صنف' + sell_type = 'اختصاصی' if steward_allocation.sell_type == 'exclusive' else 'آزاد' + type = 'دستی' if steward_allocation.type == 'manual' else 'اتوماتیک' + try: + guilds_name = steward_allocation.steward.guilds.guilds_name + guilds_id = steward_allocation.steward.guilds.guilds_id + fullname = steward_allocation.steward.guilds.user.fullname + national_id = steward_allocation.steward.guilds.user.national_id + mobile = steward_allocation.steward.guilds.user.mobile + type_activity = steward_allocation.steward.guilds.type_activity + area_activity = steward_allocation.steward.guilds.area_activity + license_number = steward_allocation.steward.guilds.license_number + city_name = steward_allocation.steward.guilds.address.city.name + except: + guilds_name = steward_allocation.guilds.guilds_name + guilds_id = steward_allocation.guilds.guilds_id + fullname = steward_allocation.guilds.user.fullname + national_id = steward_allocation.guilds.user.national_id + mobile = steward_allocation.guilds.user.mobile + type_activity = steward_allocation.guilds.type_activity + area_activity = steward_allocation.guilds.area_activity + license_number = steward_allocation.guilds.license_number + city_name = steward_allocation.guilds.address.city.name + register = steward_allocation.logged_registration_code if steward_allocation.logged_registration_code else '-' + list1 = [ + m, + f'{killer} {kill_house_name}({steward_allocation.kill_house.kill_house_operator.user.fullname})', + guilds_id, + str(date), + steward, + f'{sell_type}({type})', + guilds_name, + fullname, + national_id, + mobile, + type_activity, + area_activity, + license_number, + city_name, + steward_allocation.number_of_carcasses, + steward_allocation.weight_of_carcasses, + register, + ] + l += 1 + m += 1 + for col_num, option in enumerate(list1, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=l + 1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center') + + worksheet.row_dimensions[4].height = 19 + worksheet.column_dimensions[col_letter].width = 21.01 + + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + 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 + + +def daily_process_klling_proccess_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + + user = get_object_or_404(SystemUserProfile, key=request.GET['key']) + poultry_requests = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date=date1).select_related('poultry', + 'poultry__user', + 'poultry__address__province').order_by( + '-send_date') + province_name = user.province.name + + excel_options = { + 'درخواست کشتار مرغداران': [ + 'ردیف', + 'کد سفارش', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'نام و نام خانوادگی مرغدار', + 'نام فارم', + 'موبایل', + 'کشتارگاه های پیشنهادی', + 'آدرس', + 'سن مرغ', + 'تعداد درخواست کشتار', + 'مانده در سالن', + 'تایید شده', + ], + 'تخصیص به خریداران توسط اتحادیه': [ + 'ردیف', + 'کد سفارش', + 'نوع درخواست', + 'نام فارم', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'شهر', + 'تاریخ کشتار', + 'تعداد کشتار', + 'زمان تخصیص', + 'نوع تخصیص', + 'خریدار', + 'تعداد تخصیص داده شده', + ' تلفن خریدار', + ' آدرس خریدار', + 'تایید تخصیص', + 'تخصیص ماشین', + + ], + 'ثبت ماشین(ایجاد بار)': [ + 'ردیف', + 'کد بار', + 'مرغدار', + 'تلفن مرغدار', + 'کدسفارش مرغدار', + ' شهر مرغدار', + ' تاریخ کشتار', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'خریدار', + ' تلفن خریدار', + ' ماهیت خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تخصیصی', + 'تعداد تخلیه شده', + 'وزن بار', + 'تاریخ تخلیه (کشتارگاه)', + 'مبلغ فاکتور', + 'تاریخ پرداخت فاکتور', + + ] + } + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + # worksheet = workbook.active + + for name, options in excel_options.items(): + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.column_dimensions[col_letter].height = len(option) + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 3 + if sheet_name == 'درخواست کشتار مرغداران': + m = 1 + worksheet['A1'] = f'درخواست کشتار مرغداران استان {province_name}' + worksheet['A3'] = f'در تاریخ:({from_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + if poultry_requests: + for filtered_poultry_kill_request in poultry_requests: + date_of_create = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.create_date.day, + month=filtered_poultry_kill_request.create_date.month, + year=filtered_poultry_kill_request.create_date.year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.send_date.day, + month=filtered_poultry_kill_request.send_date.month, + year=filtered_poultry_kill_request.send_date.year + ) + state = 'تایید شده' + if filtered_poultry_kill_request.state == 'pending': + state = 'در انتظار تایید' + kill_house = '-' + if filtered_poultry_kill_request.kill_house_list is not None: + for name in filtered_poultry_kill_request.kill_house_list: + kill_house += name + '/' + age = ( + filtered_poultry_kill_request.send_date.date() - filtered_poultry_kill_request.hatching.date.date()).days + 1 + + list1 = [ + m, + filtered_poultry_kill_request.order_code, + str(date_of_create), + str(date_of_kill), + filtered_poultry_kill_request.poultry.user.fullname, + filtered_poultry_kill_request.poultry.unit_name, + filtered_poultry_kill_request.poultry.user.mobile, + kill_house, + filtered_poultry_kill_request.poultry.address.city.name, + str(age), + filtered_poultry_kill_request.quantity, + filtered_poultry_kill_request.hatching.left_over, + state + ] + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + elif sheet_name == 'تخصیص به خریداران توسط اتحادیه': + m = 1 + worksheet['A1'] = f'تخصیص به خریداران توسط اتحادیه استان {province_name}' + worksheet['A3'] = f'در تاریخ:({from_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + prvince_kill_requests = ProvinceKillRequest.objects.filter( + trash=False, + province_request__poultry_request__in=poultry_requests).order_by('-create_date') + for filtered_province_kill_req in prvince_kill_requests: + car = 'دارد' if KillHouseRequest.objects.filter(province_kill_request=filtered_province_kill_req, + trash=False).exists() else '-' + + l += 1 + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.province_request.poultry_request.send_date.day, + month=filtered_province_kill_req.province_request.poultry_request.send_date.month, + year=filtered_province_kill_req.province_request.poultry_request.send_date.year + ) + date_of_allocation = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.create_date.day, + month=filtered_province_kill_req.create_date.month, + year=filtered_province_kill_req.create_date.year + ) + if filtered_province_kill_req.state == "accepted": + state = 'تایید شده' + elif filtered_province_kill_req.state == "pending": + state = 'در انتظار تایید' + else: + state = 'رد شده' + + automatic = 'خودکار' if filtered_province_kill_req.automatic else 'دستی' + if filtered_province_kill_req.province_request.poultry_request.union == True: + type = 'فروش آزاد' + elif filtered_province_kill_req.province_request.poultry_request.direct_buying == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + list1 = [ + m, + filtered_province_kill_req.province_request.poultry_request.order_code, + type, + filtered_province_kill_req.province_request.poultry_request.poultry.unit_name, + filtered_province_kill_req.province_request.poultry_request.poultry.user.fullname, + filtered_province_kill_req.province_request.poultry_request.poultry.user.mobile, + filtered_province_kill_req.province_request.poultry_request.poultry.address.city.name, + str(date_of_kill), + filtered_province_kill_req.province_request.poultry_request.quantity, + str(date_of_allocation), + automatic, + filtered_province_kill_req.killhouse_user.name, + filtered_province_kill_req.main_quantity, + filtered_province_kill_req.killhouse_user.kill_house_operator.user.mobile, + # filtered_province_kill_req.killhouse_user.kill_house_operator.address.city.name, + filtered_province_kill_req.kill_request.kill_house.system_address.city.name, + state, + car + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + elif sheet_name == 'ثبت ماشین(ایجاد بار)': + m = 1 + worksheet['A1'] = f'ثبت ماشین توسط خریدار(ایجاد بار) استان {province_name}' + worksheet['A3'] = f'در تاریخ:({from_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + # worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + filtered_kill_reqs = KillHouseRequest.objects.filter( + province_request__poultry_request__poultry__address__province=user.province, + kill_request__recive_date__date=date1, + + trash=False).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code').values( + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + ) + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + l += 1 + date_of_inner_bar = '-' + date_factor = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__key=kill.get('key')).only( + 'total_price').values( + 'total_price').first() + factor_amount = factor.get('total_price') if factor else '-' + factor_payment = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__key=kill.get( + 'key')).only('create_date').values( + 'create_date').first() + if factor_payment: + factor_date = factor_payment.get('create_date') + date_factor = jdatetime.date.fromgregorian( + day=factor_date.day, + month=factor_date.month, + year=factor_date.year + ) if factor_payment else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity').first() + if assignment: + net_weighte = assignment.get('net_weight') if assignment else '-' + real_quantity = assignment.get('real_quantity') + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_check_date.day, + month=vet_check_date.month, + year=vet_check_date.year + ) if vet_checks else '-' + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + list1 = [ + m, + str(kill.get('bar_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__order_code'), + kill.get('province_request__poultry_request__poultry__user__city__name'), + str(date_of_poultry_request), + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + killers, + kill.get('killhouse_user__system_address__city__name'), + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + kill.get('add_car__driver__health_code'), + code, + quantity, + real_quantity, + net_weighte, + str(date_of_inner_bar), + factor_amount, + str(date_factor) + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + 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 + + +def killing_process_from_date_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + day_before_date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() - timedelta(days=1) + day_before_date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() - timedelta(days=1) + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + + excel_options = { + 'درخواست کشتار': [ + 'ردیف', + 'کد سفارش', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'نام و نام خانوادگی مرغدار', + 'نام فارم', + 'موبایل', + 'کشتارگاه های پیشنهادی', + 'آدرس', + 'سن مرغ', + 'تعداد درخواست کشتار', + 'مانده در سالن', + 'تایید شده', + ], + 'تخصیصات': [ + 'ردیف', + 'کد سفارش', + 'نوع درخواست', + 'نام فارم', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'شهر', + 'تاریخ کشتار', + 'تعداد کشتار', + 'زمان تخصیص', + 'نوع تخصیص', + 'خریدار', + 'تعداد تخصیص داده شده', + ' تلفن خریدار', + ' آدرس خریدار', + 'تایید تخصیص', + 'تخصیص ماشین', + + ], + 'مسئول فنی مزرعه': [ + 'ردیف', + 'کد بار', + 'مرغدار', + 'تلفن مرغدار', + 'کدسفارش مرغدار', + ' شهر مرغدار', + ' تاریخ کشتار', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'خریدار', + ' تلفن خریدار', + ' ماهیت خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تخصیصی', + 'تعداد تخلیه شده', + 'وزن بار', + 'تاریخ تخلیه (کشتارگاه)'], + + 'دامپزشک کشتارگاه': [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'کد رهگیری سامانه قرنطینه', + 'تعداد تخصیصی', + 'وزن تخصیصی', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده', + 'وزن بار تخلیه شده(کیلوگرم)', + + ] + , + 'اطلاعات کلی پخش به مباشر': [ + 'ردیف', + ' ماهیت خریدار', + 'خریدار', + 'تاریخ پخش', + 'موبایل خریدار', + 'شهر', + 'تعداد لاشه ها', + 'وزن لاشه ها(کیلوگرم)', + 'تعداد لاشه تخصیص داده شده', + 'وزن تخصیص داده شده(کیلوگرم)', + 'مانده لاشه قابل تخصیص(قطعه)', + ' مانده وزن قابل تخصیص(کیلوگرم)', + + ], + 'جزئیات پخش به مباشر': [ + 'ردیف', + 'خریدار', + 'شناسه صنف', + 'تاریخ ثبت', + 'ماهیت', + 'نوع تخصیص', + 'نام واحد صنفی', + 'نام شخص', + 'کد ملی', + 'موبایل', + 'نوع فعالیت', + 'حوزه فعالیت', + 'شماره مجوز', + 'شهرستان', + 'تعداد لاشه', + 'وزن لاشه', + 'کد احراز', + + ], + } + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + # date_one_day_ago = date - timedelta(days=1) + + province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), + kill_request__recive_date__date__gte=day_before_date1, + kill_request__recive_date__date__lte=day_before_date2).select_related( + 'killhouse_user') + kill_house_list = KillHouse.objects.filter( + pk__in=province_kill_requests.values('killhouse_user') + + ).select_related('kill_house_operator', 'kill_house_operator__user', 'kill_house_operator__address__city') + + kill_house_ware_houses = KillHouseWareHouse.objects.filter(kill_house__in=kill_house_list, date__date__gte=date1, + date__date__lte=date2).order_by('id') + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, trash=False, + date__date__gte=date1, date__date__lte=date2).select_related('guilds', 'guilds__user', 'guilds__address__city', + 'kill_house', + 'kill_house__kill_house_operator').order_by('id') + + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + allocated_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('allocated_total_number_of_carcasses'))['total'] + allocated_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('allocated_total_weight_of_carcasses'))['total'] + remain_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))['total'] + remain_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))['total'] + + filtered_kill_reqs = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + trash=False).order_by('-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry') + output = BytesIO() + workbook = Workbook() + + for name, options in excel_options.items(): + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + worksheet.column_dimensions[col_letter].height = len(option) + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 3 + m = 1 + if sheet_name == 'درخواست کشتار': + worksheet['A1'] = f'درخواست کشتار' + worksheet['A3'] = f'در تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:C2' + merge_range = 'A3:C3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + filtered_province_kill_reqs = PoultryRequest.objects.filter(send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False).select_related('poultry', + 'poultry__user', + 'poultry__address__province').order_by( + '-send_date') + if filtered_province_kill_reqs: + province = filtered_province_kill_reqs.first().poultry.address.province.name + worksheet['A2'] = f'استان {province}' + for filtered_poultry_kill_request in filtered_province_kill_reqs: + l += 1 + date_of_create = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.create_date.day, + month=filtered_poultry_kill_request.create_date.month, + year=filtered_poultry_kill_request.create_date.year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_kill_request.send_date.day, + month=filtered_poultry_kill_request.send_date.month, + year=filtered_poultry_kill_request.send_date.year + ) + state = 'تایید شده' + if filtered_poultry_kill_request.state == 'pending': + state = 'در انتظار تایید' + kill_house = '-' + if filtered_poultry_kill_request.kill_house_list is not None: + for name in filtered_poultry_kill_request.kill_house_list: + kill_house += name + '/' + age = ( + filtered_poultry_kill_request.send_date.date() - filtered_poultry_kill_request.hatching.date.date()).days + 1 + + list1 = [ + m, + filtered_poultry_kill_request.order_code, + str(date_of_create), + str(date_of_kill), + filtered_poultry_kill_request.poultry.user.fullname, + filtered_poultry_kill_request.poultry.unit_name, + filtered_poultry_kill_request.poultry.user.mobile, + kill_house, + filtered_poultry_kill_request.poultry.address.city.name, + str(age), + filtered_poultry_kill_request.quantity, + filtered_poultry_kill_request.hatching.left_over, + state + ] + m += 1 + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + elif sheet_name == 'تخصیصات': + filtered_province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__poultry_request__send_date__date__gte=date1, + province_request__poultry_request__send_date__date__lte=date2, trash=False).select_related( + 'province_request__poultry_request', 'province_request__poultry_request__poultry', + 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request__poultry__address').order_by('-create_date') + + worksheet['A1'] = f' مدیریت تخصیصات' + worksheet['A3'] = f'در تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + if filtered_province_kill_reqs.exists(): + province = filtered_province_kill_reqs.first().province_request.poultry_request.poultry.address.province.name + worksheet['A2'] = f'استان {province}' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:C2' + merge_range = 'A3:C3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + for filtered_province_kill_req in filtered_province_kill_reqs: + car = 'دارد' if KillHouseRequest.objects.filter(province_kill_request=filtered_province_kill_req, + trash=False).exists() else '-' + + l += 1 + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.province_request.poultry_request.send_date.day, + month=filtered_province_kill_req.province_request.poultry_request.send_date.month, + year=filtered_province_kill_req.province_request.poultry_request.send_date.year + ) + date_of_allocation = jdatetime.date.fromgregorian( + day=filtered_province_kill_req.create_date.day, + month=filtered_province_kill_req.create_date.month, + year=filtered_province_kill_req.create_date.year + ) + if filtered_province_kill_req.state == "accepted": + state = 'تایید شده' + elif filtered_province_kill_req.state == "pending": + state = 'در انتظار تایید' + else: + state = 'رد شده' + + automatic = 'خودکار' if filtered_province_kill_req.automatic else 'دستی' + if filtered_province_kill_req.province_request.poultry_request.union == True: + type = 'فروش آزاد' + elif filtered_province_kill_req.province_request.poultry_request.direct_buying == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + list1 = [ + m, + filtered_province_kill_req.province_request.poultry_request.order_code, + type, + filtered_province_kill_req.province_request.poultry_request.poultry.unit_name, + filtered_province_kill_req.province_request.poultry_request.poultry.user.fullname, + filtered_province_kill_req.province_request.poultry_request.poultry.user.mobile, + filtered_province_kill_req.province_request.poultry_request.poultry.address.city.name, + str(date_of_kill), + filtered_province_kill_req.province_request.poultry_request.quantity, + str(date_of_allocation), + automatic, + filtered_province_kill_req.killhouse_user.name, + filtered_province_kill_req.main_quantity, + filtered_province_kill_req.killhouse_user.kill_house_operator.user.mobile, + # filtered_province_kill_req.killhouse_user.kill_house_operator.address.city.name, + filtered_province_kill_req.kill_request.kill_house.system_address.city.name, + state, + car + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + elif sheet_name == 'مسئول فنی مزرعه': + worksheet['A1'] = f' مسئول فنی مزرعه' + worksheet['A3'] = f'در تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:C2' + merge_range = 'A3:C3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + # filtered_kill_reqs = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,kill_request__recive_date__date__lte=date2, + # trash=False).order_by( + # '-create_date').select_related( + # 'killhouse_user', 'province_request__poultry_request__poultry') + if filtered_kill_reqs.exists(): + province = filtered_kill_reqs.first().province_request.poultry_request.poultry.address.province.name + worksheet['A2'] = f'استان {province}' + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + vet_farm = VetFarm.objects.filter(poultry=kill.province_request.poultry_request.poultry, + trash=False).last() + vet_farm_name = vet_farm.vet.user.fullname if vet_farm else '-' + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.killhouse_user).last() + vet_checks = VetCheckRequest.objects.filter(kill_house_request=kill).only('create_date').last() + kill_house_vet_name = kil_house_vet.vet.user.fullname if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.vet.user.mobile if kil_house_vet else '-' + + code = kill.clearance_code if kill.clearance_code else '-' + quantity = kill.quantity if kill.quantity else '-' + date_of_poultry_request = jdatetime.date.fromgregorian( + day=kill.province_request.poultry_request.send_date.day, + month=kill.province_request.poultry_request.send_date.month, + year=kill.province_request.poultry_request.send_date.year + ) + killers = 'کشتارکن' + if kill.killhouse_user.killer == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill, trash=False).last() + net_weighte = assignment.net_weight if assignment else '-' + real_quantity = assignment.real_quantity if assignment else '-' + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_checks.create_date.day, + month=vet_checks.create_date.month, + year=vet_checks.create_date.year + ) if vet_checks else '-' + if kill.kill_request.slaughter_house != None: + kill_place = kill.kill_request.slaughter_house.name + else: + kill_place = kill.killhouse_user.name + if kill.clearance_code: + l += 1 + list1 = [ + m, + str(kill.bar_code), + kill.province_request.poultry_request.poultry.unit_name, + str(kill.province_request.poultry_request.poultry.user.mobile), + kill.province_request.poultry_request.order_code, + kill.province_request.poultry_request.poultry.user.city.name, + str(date_of_poultry_request), + kill.province_request.poultry_request.chicken_breed, + vet_farm_name, + vet_farm_mobile, + kill.kill_request.kill_house.name, + kill.killhouse_user.phone, + killers, + kill.killhouse_user.system_address.city.name, + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + code, + quantity, + real_quantity, + net_weighte, + str(date_of_inner_bar), + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + elif sheet_name == 'دامپزشک کشتارگاه': + + worksheet['A1'] = f'دامپزشک کشتارگاه' + worksheet['A3'] = f'در تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:C1' + merge_range2 = 'A2:C2' + merge_range = 'A3:C3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'vet_state').values( + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'vet_state', + ) + header_list = [ + 'تعداد بارایجاد شده', + 'مجموع تعداد قطعه تخصیصی', + 'مجموع وزن بار تخصیصی', + 'تعداد بار تخلیه شده', + 'مجموع تعداد قطعه تخلیه شده', + 'مجموع وزن بار تخلیه شده', + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_assigment = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + all_assigment += len(assignment) + vet_check_date = assignment.get('create_date') + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_check_date.day, + month=vet_check_date.month, + year=vet_check_date.year + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + + date_of_inner_bar = jdatetime.date.fromgregorian( + day=vet_check_date.day, + month=vet_check_date.month, + year=vet_check_date.year + ) + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + if kill.get('vet_state') == 'pending': + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + else: + + weight = kill.get('accepted_real_weight') + all_weighte += weight + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + kill.get('province_request__poultry_request__order_code'), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + kill.get('add_car__driver__health_code'), + code, + quantity, + weight, + str(date_of_inner_bar), + real_quantity, + net_weighte, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + all_assigment, + all_real_quantity, + all_net_weighte + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + elif sheet_name == 'اطلاعات کلی پخش به مباشر': + header_list = [ + 'تعداد خریداران', + 'تعداد مباشرین', + 'تعداد لاشه ها', + 'وزن لاشه ها (کیلوگرم)', + 'تعداد لاشه تخصیص داده شده', + 'وزن تخصیص داده شده (کیلوگرم)', + 'تعداد لاشه قابل تخصیص', + 'وزن قابل تخصیص (کیلوگرم)', + + ] + for col_num, option in enumerate(header_list, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 17 + worksheet.column_dimensions[col_letter].width = 21.01 + + value_header_list = [ + len(kill_house_ware_houses), + len(steward_allocations), + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + allocated_total_number_of_carcasses if allocated_total_number_of_carcasses != None else 0, + allocated_total_weight_of_carcasses if allocated_total_weight_of_carcasses != None else 0, + remain_total_number_of_carcasses if remain_total_number_of_carcasses != None else 0, + remain_total_weight_of_carcasses if remain_total_weight_of_carcasses != None else 0, + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 3, value=value_header_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=11) + m = 1 + + for kill_house in kill_house_list: + kill_house_ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house, + date__date__gte=date1, + date__date__lte=date2) + for kill_house_ware in kill_house_ware_house: + total_number_of_carcasses_temp = kill_house_ware.update_total_number_of_carcasses if kill_house_ware.update_total_number_of_carcasses > 0 else kill_house_ware.total_number_of_carcasses + total_weight_of_carcasses_temp = kill_house_ware.update_total_weight_of_carcasses if kill_house_ware.update_total_weight_of_carcasses > 0 else kill_house_ware.total_weight_of_carcasses + + date_of_create = jdatetime.date.fromgregorian( + day=kill_house_ware.date.day, + month=kill_house_ware.date.month, + year=kill_house_ware.date.year + ) + list1 = [ + m, + 'کشتار کن' if kill_house.killer == True else 'کشتارگاه', + f'{kill_house.name} ({kill_house.kill_house_operator.user.fullname})', + str(date_of_create), + kill_house.kill_house_operator.user.mobile, + kill_house.kill_house_operator.address.city.name, + total_number_of_carcasses_temp, + total_weight_of_carcasses_temp, + kill_house_ware.allocated_total_number_of_carcasses, + kill_house_ware.allocated_total_weight_of_carcasses, + kill_house_ware.remain_total_number_of_carcasses, + kill_house_ware.remain_total_weight_of_carcasses + + ] + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + + elif sheet_name == 'جزئیات پخش به مباشر': + for steward_allocation in steward_allocations: + killer = 'کشتارکن' if steward_allocation.kill_house.killer == True else 'کشتارگاه' + kill_house_name = steward_allocation.kill_house.name + + date = jdatetime.date.fromgregorian( + year=steward_allocation.date.year, + month=steward_allocation.date.month, + day=steward_allocation.date.day + ) + steward = 'مباشر' if steward_allocation.seller_type == 'steward' else 'صنف' + sell_type = 'اختصاصی' if steward_allocation.sell_type == 'exclusive' else 'آزاد' + type = 'دستی' if steward_allocation.type == 'manual' else 'اتوماتیک' + try: + guilds_name = steward_allocation.steward.guilds.guilds_name + guilds_id = steward_allocation.steward.guilds.guilds_id + fullname = steward_allocation.steward.guilds.user.fullname + national_id = steward_allocation.steward.guilds.user.national_id + mobile = steward_allocation.steward.guilds.user.mobile + type_activity = steward_allocation.steward.guilds.type_activity + area_activity = steward_allocation.steward.guilds.area_activity + license_number = steward_allocation.steward.guilds.license_number + city_name = steward_allocation.steward.guilds.address.city.name + except: + guilds_name = steward_allocation.guilds.guilds_name + guilds_id = steward_allocation.guilds.guilds_id + fullname = steward_allocation.guilds.user.fullname + national_id = steward_allocation.guilds.user.national_id + mobile = steward_allocation.guilds.user.mobile + type_activity = steward_allocation.guilds.type_activity + area_activity = steward_allocation.guilds.area_activity + license_number = steward_allocation.guilds.license_number + city_name = steward_allocation.guilds.address.city.name + register = steward_allocation.logged_registration_code if steward_allocation.logged_registration_code else '-' + list1 = [ + m, + f'{killer} {kill_house_name}({steward_allocation.kill_house.kill_house_operator.user.fullname})', + guilds_id, + str(date), + steward, + f'{sell_type}({type})', + guilds_name, + fullname, + national_id, + mobile, + type_activity, + area_activity, + license_number, + city_name, + steward_allocation.number_of_carcasses, + steward_allocation.weight_of_carcasses, + register, + ] + l += 1 + m += 1 + for col_num, option in enumerate(list1, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=l + 1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center') + + worksheet.row_dimensions[4].height = 19 + worksheet.column_dimensions[col_letter].width = 21.01 + + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + 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 + + +def discrepancy_report_excel(request): + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + poultry_reqs = PoultryRequest.objects.filter( + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + ).order_by('-send_date').annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')), + total_remain_quantity=Sum('remain_quantity'), + total_remain_weight=Sum(F('remain_quantity') * F('Index_weight')), + + ) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + poultry_requests = poultry_reqs.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultry_requests = poultry_reqs.filter(poultry__user__city=user.city) + else: + poultry_requests = poultry_reqs + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request__poultry_request__in=poultry_requests, trash=False, + state__in=('pending', 'accepted')).annotate( + total_quantity=Sum('main_quantity'), + total_weight=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight')), + ) + + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province), + trash=False).select_related( + 'user').first() + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + excel_options = { + 'مغایرت در تخصیص و ایجاد بار': [ + 'ردیف', + 'خریدار', + 'تلفن', + 'تاریخ کشتار', + 'فروشنده', + 'تلفن فروشنده', + 'سهم کشتار(قطعه)', + 'سهم کشتار(وزن)', + 'تعداد ماشین' + , 'تخصیص به ماشین(قطعه)' + , 'تخصیص به ماشین(وزن)' + , 'مانده قطعه قابل تخصیصی' + , 'مانده وزن قابل تخصیصی(کیلوگرم)' + , 'اپراتور' + , 'موبایل اپراتور' + ], + + 'بار های فاقد کد قرنطینه': ['ردیف', + 'کدبار', + 'خریدار', + 'تلفن خریدار', + 'فروشنده', + 'تلفن فروشنده', + 'تاریخ کشتار', + 'ماشین', + 'راننده', + 'نژاد', + 'تعداد(قطعه)', + 'وزن بار(کیلوگرم)', + 'میانگین وزن(کیلوگرم)', + 'محل کشتار', + 'دامپزشک', + 'موبایل دامپزشک'], + 'بارهای تخلیه نشده': [ + 'ردیف', + 'کد بار', + 'خریدار', + ' تلفن خریدار', + 'فروشنده', + ' تلفن فروشنده', + 'تاریخ کشتار', + 'ماشین', + 'راننده', + 'نژاد', + 'تعداد(قطعه)', + 'وزن بار(کیلوگرم)', + 'میانگین وزن(کیلوگرم)', + 'کد قرنطینه', + 'دامپزشک', + 'تلفن دامپزشک', + ], + 'بارهای تکمیل نشده': [ + 'ردیف', + 'کدبار', + 'خریدار', + ' تلفن خریدار', + 'فروشنده', + ' تلفن فروشنده', + 'تاریخ کشتار', + 'ماشین', + 'راننده', + 'نژاد', + 'تعداد(قطعه)', + 'وزن بار(کیلوگرم)', + 'میانگین وزن(کیلوگرم)', + 'کد قرنطینه', + 'تعداد تخلیه شده(دامپزشک)', + 'وزن تخلیه شده(دامپزشک)', + 'کاربر', + 'تلفن کاربر', + ], + 'مغایرت در اطلاعات بار': [ + 'ردیف', + 'کدبار', + 'خریدار', + ' تلفن خریدار', + 'فروشنده', + ' تلفن فروشنده', + 'تاریخ کشتار', + 'ماشین', + 'راننده', + 'کد قرنطینه', + 'تعداد اولیه(قطعه)', + 'وزن بار اولیه (کیلوگرم)', + 'تعداد تخلیه شده(دامپزشک)', + 'وزن تخلیه شده(دامپزشک)', + 'اطلاعات بار کشتارگاه(تعداد)', + 'اطلاعات بار کشتارگاه(وزن)', + + ] + + } + kill_house = KillHouseRequest.objects.filter( + province_kill_request__in=province_kill_requests, + trash=False) + output = BytesIO() + workbook = Workbook() + for name, options in excel_options.items(): + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + # worksheet.column_dimensions[col_letter].height = len(option) + worksheet.row_dimensions[5].height = 20 + + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 4 + m = 1 + if sheet_name == 'مغایرت در تخصیص و ایجاد بار': + worksheet['A4'] = f'مغایرت درتعداد تخصیصی به خریدار و ایجاد بار' + worksheet['A2'] = f'در تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['D1'] = f'مغایرت در درخواست کشتار و تخصیص' + worksheet['A4'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['D1'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:C2' + merge_range2 = 'D1:E1' + merge_range = 'A4:C4' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A4'].fill = PatternFill(start_color="C5D9F1", fill_type="solid") + worksheet['D1'].fill = PatternFill(start_color="C5D9F1", fill_type="solid") + province_kill_requests_with_left_over = (ProvinceKillRequest.objects.filter( + province_request__poultry_request__in=poultry_requests, trash=False, + state__in=('pending', 'accepted'), quantity__gt=0).select_related('killhouse_user', + 'killhouse_user__kill_house_operator__user', + 'province_request__poultry_request').only( + 'key', 'killhouse_user__name', 'killhouse_user__kill_house_operator__user__mobile', 'main_quantity', + 'province_request__poultry_request__Index_weight', 'quantity', + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', 'province_request__poultry_request__key') + .values('province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__unit_name', + 'key', 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'main_quantity', + 'province_request__poultry_request__Index_weight', + 'quantity', + 'killhouse_user__kill_house_operator__user__fullname' + , 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__key', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile')) + + poultry_request_total_quantity = poultry_requests.aggregate(total=Sum('total_quantity'))['total'] + poultry_request_total_weight = poultry_requests.aggregate(total=Sum('total_weight'))['total'] + province_kill_requests_total_weight = province_kill_requests.aggregate(total=Sum('total_weight'))['total'] + province_kill_requests_total_quantity = province_kill_requests.aggregate(total=Sum('total_quantity'))[ + 'total'] + poultry_request_total_remain_quantity = poultry_requests.aggregate(total=Sum('total_remain_quantity'))[ + 'total'] + poultry_request_remain_weight = poultry_requests.aggregate(total=Sum('total_remain_weight'))['total'] + + for province in province_kill_requests_with_left_over: + poultry_request = PoultryRequest.objects.get( + key=province['province_request__poultry_request__key']) + date_of_kill = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + kill_house_requests = kill_house.filter(province_kill_request__key=province[ + 'key']).annotate( + total_quantity=Sum('accepted_real_quantity'), + total_weight=Sum('accepted_real_weight'), + + ) + kill_house_request_quantity = kill_house_requests.aggregate(total=Sum('total_quantity'))['total'] + kill_house_request_weight = kill_house_requests.aggregate(total=Sum('total_weight'))['total'] + list1 = [ + m, + province['killhouse_user__name'], + province['killhouse_user__kill_house_operator__user__mobile'], + str(date_of_kill), + province['province_request__poultry_request__poultry__unit_name'], + province['province_request__poultry_request__poultry__user__mobile'], + province['main_quantity'], + int(province['main_quantity'] * province['province_request__poultry_request__Index_weight']), + kill_house_requests.count(), + kill_house_request_quantity if kill_house_request_quantity != None else 0, + kill_house_request_weight if kill_house_request_weight != None else 0, + province['quantity'], + int(province['quantity'] * province['province_request__poultry_request__Index_weight']), + province['killhouse_user__kill_house_operator__user__fullname'], + province['killhouse_user__kill_house_operator__user__mobile'], + ] + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + blue = Font(color="0070C0") + red = Font(color="C00000") + green = Font(color="00863D") + + if cell.column in [7, 8]: + cell.font = blue + + elif cell.column in [10, 11]: + cell.font = green + else: + if cell.column in [12, 13]: + cell.font = red + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + header_list = [ + 'تعداد درخواست', + 'مجموع درخواست کشتار (قطعه)', + 'مجموع درخواست کشتار (وزن)', + 'تعداد تخصیص به خریدار(قطعه)', + 'وزن تخصیص به خریدار(کیلوگرم)', + 'مانده قطعه قابل تخصیص', + 'وزن قابل تخصیص(کیلوگرم)', + 'اپراتور', + ' موبایل اپراتور', + ] + for col_num, option in enumerate(header_list, 4): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 17 + worksheet.column_dimensions[col_letter].width = 21.01 + + value_header_list = [ + poultry_requests.count(), + poultry_request_total_quantity if poultry_request_total_quantity != None else 0, + poultry_request_total_weight if poultry_request_total_weight != None else 0, + province_kill_requests_total_quantity if province_kill_requests_total_quantity != None else 0, + province_kill_requests_total_weight if province_kill_requests_total_weight != None else 0, + poultry_request_total_remain_quantity if poultry_request_total_remain_quantity != None else 0, + poultry_request_remain_weight if poultry_request_remain_weight != None else 0, + province_operator.user.fullname, + province_operator.user.mobile, + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 4, value=value_header_list[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=11) + worksheet['G3'].font = Font(color="0070C0", bold=True) + worksheet['H3'].font = Font(color="0070C0", bold=True) + worksheet['I3'].font = red_font + worksheet['J3'].font = red_font + value = value_header_list[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + + elif sheet_name == 'بار های فاقد کد قرنطینه': + worksheet['A2'] = f'بار های فاقد کد قرنطینه' + worksheet['A4'] = f'در تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['A4'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:C2' + merge_range = 'A4:C4' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet['A2'].fill = PatternFill(start_color="92CDDC", fill_type="solid") + + kill_house_request_without_clearance_code = (kill_house.filter( + clearance_code__isnull=True, + ).select_related('add_car__driver', + 'province_kill_request__province_request__poultry_request', + 'province_kill_request__province_request__poultry_request__poultry', + 'killhouse_user__kill_house_operator__user', 'kill_request') + .only( + 'province_kill_request__province_request__poultry_request__key', + 'province_kill_request__province_request__poultry_request__poultry', + 'bar_code', 'killhouse_user__kill_house_operator__user__mobile', + 'add_car__driver__type_car', + 'add_car__driver__driver_name', 'quantity', 'accepted_real_quantity', 'accepted_real_weight', + 'kill_request__slaughter_house__name', 'kill_request__slaughter_house', 'killhouse_user__name', + 'kill_request__kill_house__name') + .values( + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__unit_name', + 'province_kill_request__province_request__poultry_request__key', + 'province_kill_request__province_request__poultry_request__poultry', + 'bar_code', 'killhouse_user__kill_house_operator__user__mobile', + 'add_car__driver__type_car', + 'add_car__driver__driver_name', 'quantity', 'accepted_real_quantity', 'accepted_real_weight', + 'kill_request__slaughter_house__name', 'kill_request__slaughter_house', 'killhouse_user__name', + 'kill_request__kill_house__name', 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile')) + + for kill in kill_house_request_without_clearance_code: + + fullname = '-', + mobile = '-', + poultry_request = PoultryRequest.objects.get( + key=kill['province_kill_request__province_request__poultry_request__key']) + date_of_kill = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + vet_farm = (VetFarm.objects.filter( + poultry=kill['province_kill_request__province_request__poultry_request__poultry']) + .select_related('vet__user').only('vet__user__fullname', 'vet__user__mobile').last()) + if vet_farm: + fullname = vet_farm.vet.user.fullname + mobile = vet_farm.vet.user.mobile + else: + fullname = '-' + mobile = '-' + + list1 = [ + m, + str(kill['bar_code']), + kill['killhouse_user__name'], + kill['killhouse_user__kill_house_operator__user__mobile'], + kill['province_request__poultry_request__poultry__unit_name'], + kill['province_request__poultry_request__poultry__user__mobile'], + str(date_of_kill), + kill['add_car__driver__type_car'], + kill['add_car__driver__driver_name'], + poultry_request.chicken_breed, + kill['quantity'], + kill['accepted_real_weight'], + round(kill['accepted_real_weight'] / kill['accepted_real_quantity'], 1), + kill['kill_request__slaughter_house__name'] if kill['kill_request__slaughter_house'] != None else + kill['kill_request__kill_house__name'], + fullname, + mobile, + ] + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + elif sheet_name == 'بارهای تخلیه نشده': + worksheet['A2'] = f'بارهای تخلیه نشده' + worksheet['A4'] = f'در تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['A4'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:C2' + merge_range = 'A4:C4' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet['A2'].fill = PatternFill(start_color="E26B0A", fill_type="solid") + + kill_house_request_without_vet_check = kill_house.filter(vet_state='pending').select_related( + 'add_car__driver', + 'province_kill_request__province_request__poultry_request', + 'province_kill_request__province_request__poultry_request__poultry', + 'killhouse_user__kill_house_operator__user').only( + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__unit_name', + 'province_kill_request__province_request__poultry_request__key', + 'province_kill_request__province_request__poultry_request__poultry', + 'bar_code', 'killhouse_user__kill_house_operator__user__mobile', + 'add_car__driver__type_car', + 'add_car__driver__driver_name', 'quantity', 'accepted_real_quantity', 'accepted_real_weight', + 'kill_request__slaughter_house__name', 'kill_request__slaughter_house', 'kill_request__key', + 'clearance_code', 'killhouse_user__name').values( + 'province_kill_request__province_request__poultry_request__key', + 'province_kill_request__province_request__poultry_request__poultry', + 'bar_code', 'killhouse_user__kill_house_operator__user__mobile', + 'add_car__driver__type_car', + 'add_car__driver__driver_name', 'quantity', 'accepted_real_quantity', 'accepted_real_weight', + 'kill_request__slaughter_house__name', 'kill_request__slaughter_house', 'kill_request__key', + 'clearance_code', 'killhouse_user__name', 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__unit_name') + + for kill in kill_house_request_without_vet_check: + + poultry_request = PoultryRequest.objects.get( + key=kill['province_kill_request__province_request__poultry_request__key']) + date_of_kill = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + kill_request = KillRequest.objects.get(key=kill['kill_request__key']) + if kill_request.slaughter_house != None: + kill_house_vet = KillHouseVet.objects.filter( + kill_house=kill_request.slaughter_house).select_related( + 'vet__user').first() + else: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.kill_house).select_related( + 'vet__user').first() + if kill_house_vet: + fullname = kill_house_vet.vet.user.fullname + mobile = kill_house_vet.vet.user.mobile + else: + fullname = '-' + mobile = '-' + list1 = [ + m, + str(kill['bar_code']), + kill['killhouse_user__name'], + kill['killhouse_user__kill_house_operator__user__mobile'], + kill['province_request__poultry_request__poultry__unit_name'], + kill['province_request__poultry_request__poultry__user__mobile'], + str(date_of_kill), + kill['add_car__driver__type_car'], + kill['add_car__driver__driver_name'], + poultry_request.chicken_breed, + kill['quantity'], + kill['accepted_real_weight'], + round(kill['accepted_real_weight'] / kill['accepted_real_quantity'], 1), + kill['clearance_code'] if kill['clearance_code'] else '-', + fullname, + mobile, + + ] + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + elif sheet_name == 'بارهای تکمیل نشده': + worksheet['A2'] = f'بارهای تکمیل نشده(بارگزاری سند باسکول و مستندات وزنی)' + worksheet['A4'] = f'در تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['A4'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:E2' + merge_range = 'A4:C4' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet['A2'].fill = PatternFill(start_color="FFFF00", fill_type="solid") + + kill_house_request_without_bar_info = kill_house.filter( + vet_state='accepted', + assignment_state_archive='pending', + ).select_related('add_car__driver', + 'province_kill_request__province_request__poultry_request', + 'province_kill_request__province_request__poultry_request__poultry', + 'killhouse_user__kill_house_operator__user', 'kill_request').only( + 'province_kill_request__province_request__poultry_request__key', + 'province_kill_request__province_request__poultry_request__poultry', + 'bar_code', 'killhouse_user__kill_house_operator__user__mobile', + 'add_car__driver__type_car', + 'add_car__driver__driver_name', 'quantity', 'accepted_real_quantity', 'accepted_real_weight', + 'kill_request__slaughter_house__name', 'kill_request__slaughter_house', 'kill_request__key', + 'clearance_code', 'killhouse_user__name', 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__unit_name').values( + 'province_kill_request__province_request__poultry_request__key', + 'province_kill_request__province_request__poultry_request__poultry', + 'bar_code', 'killhouse_user__kill_house_operator__user__mobile', + 'add_car__driver__type_car', + 'add_car__driver__driver_name', 'quantity', 'accepted_real_quantity', 'accepted_real_weight', + 'kill_request__slaughter_house__name', 'kill_request__slaughter_house', 'kill_request__key', + 'clearance_code', 'killhouse_user__name', 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__unit_name') + + for kill in kill_house_request_without_bar_info: + poultry_request = PoultryRequest.objects.get( + key=kill['province_kill_request__province_request__poultry_request__key']) + date_of_kill = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + kill_request = KillRequest.objects.get(key=kill['kill_request__key']) + if kill_request.slaughter_house != None: + kill_house_vet = KillHouseVet.objects.filter( + kill_house=kill_request.slaughter_house).select_related( + 'vet__user').first() + else: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_request.kill_house).select_related( + 'vet__user').first() + if kill_house_vet: + fullname = kill_house_vet.vet.user.fullname + mobile = kill_house_vet.vet.user.mobile + else: + fullname = '-' + mobile = '-' + list1 = [ + m, + str(kill['bar_code']), + kill['killhouse_user__name'], + kill['killhouse_user__kill_house_operator__user__mobile'], + kill['province_request__poultry_request__poultry__unit_name'], + kill['province_request__poultry_request__poultry__user__mobile'], + str(date_of_kill), + kill['add_car__driver__type_car'], + kill['add_car__driver__driver_name'], + poultry_request.chicken_breed, + kill['quantity'], + kill['accepted_real_weight'], + round(kill['accepted_real_weight'] / kill['accepted_real_quantity'], 1), + kill['clearance_code'] if kill['clearance_code'] else '-', + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + fullname, + mobile + + ] + + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + blue = Font(color="0070C0") + red = Font(color="C00000") + if cell.column in [11, 12]: + cell.font = blue + else: + if cell.column in [15, 16]: + cell.font = red + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + elif sheet_name == 'مغایرت در اطلاعات بار': + worksheet['A2'] = f'بارهای تکمیل نشده(بارگزاری سند باسکول و مستندات وزنی)' + worksheet['A4'] = f'در تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['A4'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:E2' + merge_range = 'A4:C4' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet['A2'].fill = PatternFill(start_color="92D050", fill_type="solid") + + kill_house_request_diffrent_bar_info = kill_house.filter( + Q(quantity__gt=F('vet_accepted_real_quantity')) | Q(quantity__lt=F('vet_accepted_real_quantity')) | Q( + quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q( + vet_accepted_real_quantity__gt=F('accepted_real_quantity')) | Q( + vet_accepted_real_quantity__lt=F('accepted_real_quantity')), + vet_state='accepted', assignment_state_archive='True', + ).select_related('add_car__driver', + 'province_kill_request__province_request__poultry_request', + 'province_kill_request__province_request__poultry_request__poultry', + 'killhouse_user__kill_house_operator__user', 'kill_request').only( + 'province_kill_request__province_request__poultry_request__key', + 'province_kill_request__province_request__poultry_request__poultry', + 'bar_code', 'killhouse_user__kill_house_operator__user__mobile', + 'add_car__driver__type_car', + 'add_car__driver__driver_name', 'quantity', 'accepted_real_quantity', 'accepted_real_weight', + 'kill_request__slaughter_house__name', 'kill_request__slaughter_house', 'kill_request__key', + 'clearance_code', 'killhouse_user__name', 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__unit_name', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight').values( + 'key', + 'province_request__poultry_request__Index_weight', + 'province_kill_request__province_request__poultry_request__key', + 'province_kill_request__province_request__poultry_request__poultry', + 'bar_code', 'killhouse_user__kill_house_operator__user__mobile', + 'add_car__driver__type_car', + 'add_car__driver__driver_name', 'quantity', 'accepted_real_quantity', 'accepted_real_weight', + 'kill_request__slaughter_house__name', 'kill_request__slaughter_house', 'kill_request__key', + 'clearance_code', 'killhouse_user__name', 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__unit_name', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight') + + for kill in kill_house_request_diffrent_bar_info: + assignment_info = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill['key']).first() + if assignment_info: + assingment_quantity = assignment_info.real_quantity + assingment_weight = assignment_info.net_weight + else: + assingment_quantity = 0 + assingment_weight = 0 + kill_house_vet_quantity = kill['vet_accepted_real_quantity'] + kill_house_vet_weight = kill['vet_accepted_real_weight'] + quantity = kill['quantity'] + weight = int(kill['quantity'] * kill['province_request__poultry_request__Index_weight']) + + poultry_request = PoultryRequest.objects.get( + key=kill['province_kill_request__province_request__poultry_request__key']) + date_of_kill = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + list1 = [ + m, + str(kill['bar_code']), + kill['killhouse_user__name'], + kill['killhouse_user__kill_house_operator__user__mobile'], + kill['province_request__poultry_request__poultry__unit_name'], + kill['province_request__poultry_request__poultry__user__mobile'], + str(date_of_kill), + kill['add_car__driver__type_car'], + kill['add_car__driver__driver_name'], + kill['clearance_code'] if kill['clearance_code'] else '-', + quantity, + weight, + kill_house_vet_quantity, + int(kill_house_vet_weight), + assingment_quantity, + assingment_weight + ] + + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + blue = Font(color="0070C0") + red = Font(color="C00000") + orange = Font(color="F47914") + + if cell.column in [11, 12]: + cell.font = blue + + elif cell.column in [13, 14]: + cell.font = orange + else: + if cell.column in [15, 16]: + cell.font = red + value = list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + 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 + + +def bar_for_each_persion_excel(request): + # date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + + kill = KillHouseRequest.objects.filter(trash=False, bar_code=request.GET['code']).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity').values( + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + ).first() + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد وارد شده در قرنطینه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد (کشتارگاه)', + 'وزن بار (کشتارگاه)', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[4].height = 19 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + name = kill['killhouse_user__name'] + worksheet['B1'] = f'مدیریت بارهای کشتارگاه {name}' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + + l = 4 + m = 1 + + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + + real_quantity = assignment.get('real_quantity') + + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + quarantine_quantity = kill['quarantine_quantity'] if kill['quarantine_quantity'] != None else '-' + list1 = [ + '1', + str(kill.get('bar_code')), + str(date_of_poultry_request), + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('add_car__driver__health_code')), + quantity, + weight, + code, + quarantine_quantity, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای کشتارگاه {name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def poultry_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + filtered_poultry_reqs = PoultryRequest.objects.filter( + trash=False, + send_date__date__gte=date1, + send_date__date__lte=date2 + ).select_related('poultry', 'poultry__user', 'hatching', 'poultry__user__city').only('remain_quantity', 'amount', + 'key', 'poultry', + 'send_date', + 'hatching__date', + 'create_date', 'order_code', + 'poultry__unit_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__user__city__name', + 'hatching__quantity', + 'quantity', + 'hatching__left_over', + 'hatching__chicken_breed', + 'poultry__address__province__name', + 'Index_weight', + 'hatching__quantity').values( + 'key', 'poultry', 'remain_quantity', + 'send_date', + 'hatching__date', + 'create_date', 'order_code', + 'poultry__unit_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__user__city__name', + 'hatching__quantity', + 'quantity', + 'hatching__left_over', + 'hatching__chicken_breed', 'poultry__address__province__name', 'Index_weight', 'amount', + 'hatching__quantity').order_by( + '-send_date') + len_province_request = len(ProvinceKillRequest.objects.filter( + province_request__poultry_request__key__in=filtered_poultry_reqs.values('key'), trash=False, + state__in=('pending', 'accepted'))) + excel_options = [ + 'ردیف', + 'کد سفارش', + 'نام واحد', + 'نام و نام خانوادگی مرغدار', + 'موبایل', + 'آدرس', + 'تاریخ جوجه ریزی', + 'تعداد کل جوجه ریزی', + 'سن مرغ', + 'تعداد درخواست کشتار', + 'وزن درخواست کشتار', + 'میانگین وزنی', + 'قیمت مرغ زنده', + 'تعداد تخصیصی به خریدار', + 'مانده قابل تخصیص', + 'تعداد قطعه باقی مانده در سالن', + 'نژاد', + 'تاریخ درخواست کشتار', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'وضعیت درخواست', + 'خریدار', + 'تعداد تخصیصی قطعه', + 'وزن تخصیصی', + 'تاریخ تخصیص', + 'آدرس', + 'محل کشتار', + 'وضعییت تخصیص به خریدار', + 'تعداد بار ایجاد شده', + 'تعداد قطعه تخصیصی به بار', + 'وزن تخصیصی به بار', + 'مانده قطعه قابل تخصیص', + 'مانده وزن قابل تخصیص', + 'ماشین', + 'راننده', + 'تلفن', + 'کد بهداشتی حمل و نقل', + 'کد رهگیری سامانه قرنطینه', + 'تعداد ثبت شده در قرنطینه', + 'تعداد قطعه بار', + 'وزن بار', + 'وضعیت بار', + 'تعداد تخلیه', + 'وزن تخلیه', + 'تاریخ تخلیه کشتارگاه', + 'دامپزشک کشتارگاه', + 'تلفن دامپزشک کشتارگاه', + 'اطلاعات تکمیلی قطعه', + 'اطلاعات تکمیلی وزن', + 'کاربر کشتارگاه', + 'تلفن کاربرکشتارگاه', + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد درخواست های کشتار', + 'مجموع قطعه درخواست های کشتار', + 'مجموع وزن درخواست های کشتار', + 'تعداد تخصیص به خریداران', + 'تعداد قطعه تخصیصی به خریداران', + 'وزن تخصیصی به خریداران', + 'مانده قابل تخصیص', + 'تعداد بار ایجاد شده', + 'تعداد قطعه بار های ایجاد شده', + 'وزن بارهای ایجاد شده', + 'تعداد قطعه قابل تخصیص به بار', + 'تعداد بارهای تخلیه شده', + 'تعداد قطعه بارهای تخلیه شده', + 'وزن بارهای تخلیه شده', + 'تعداد بار های تکمیل شده', + 'تعداد قطعه بارهای تکمیل شده', + 'وزن بارهای تکمیل شده', + + ] + all_quantity = 0 + all_main_quantity = 0 + all_assignment_quantity = 0 + all_wight = 0 + all_wight_killer = 0 + sum_all_quantity_of_bar = 0 + sum_all_weight_of_bar = 0 + sum_all_remain_quantity_of_bar = 0 + vet_state_accepted = 0 + all_vet_quantity = 0 + all_vet_wight = 0 + all_assigment = 0 + all_assignment_weight = 0 + all_hatching = 0 + all_poultry_request_weight = 0 + all_hatching_left_over = 0 + all_reamin_province = 0 + all_qarantine = 0 + all_poultry_request = filtered_poultry_reqs.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_remain_quantity = filtered_poultry_reqs.aggregate( + total_quantity=Sum('remain_quantity')).get( + 'total_quantity', 0) + sum_province_to_kill_house = all_poultry_request - all_remain_quantity + # برای بالای هدر + for col_num, option in enumerate(header_list, 4): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 17 + if filtered_poultry_reqs.exists(): + province = filtered_poultry_reqs.first()['poultry__address__province__name'] + worksheet['A2'] = f' استان {province}' + + worksheet['A1'] = f'گزارش روند پرونده های کشتار مرغ گوشتی' + worksheet['A3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:B1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + m = 1 + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 21.01 + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 7 + bar_list = 0 + bar_list2 = 0 + for filtered_poultry_req in filtered_poultry_reqs: + # print(filtered_poultry_req.get('poultry__unit_name')) + all_poultry_request_weight += int( + filtered_poultry_req.get('quantity') * filtered_poultry_req.get('Index_weight')) + all_hatching += filtered_poultry_req['hatching__quantity'] + all_hatching_left_over += filtered_poultry_req['hatching__left_over'] + state_p = 'در انتظار تخصیص استان' + if filtered_poultry_req.get('quantity') != filtered_poultry_req.get('remain_quantity'): + state_p = 'تخصیص داده شد' + all_wight += int(filtered_poultry_req.get('quantity') * filtered_poultry_req.get('Index_weight')) + all_quantity += filtered_poultry_req.get('quantity') + try: + vet_farm = VetFarm.objects.get(poultry=filtered_poultry_req.get('poultry'), trash=False) + vet_farm_name = vet_farm.vet.user.fullname + vet_farm_mobile = vet_farm.vet.user.mobile + except: + vet_farm_name = '-' + vet_farm_mobile = '-' + + age = (filtered_poultry_req.get('send_date').date() - filtered_poultry_req.get( + "hatching__date").date()).days + 1 + gregorian_date = jdatetime.date.fromgregorian( + day=filtered_poultry_req.get("hatching__date").day, + month=filtered_poultry_req.get("hatching__date").month, + year=filtered_poultry_req.get("hatching__date").year + ) + date_of_kill = jdatetime.date.fromgregorian( + day=filtered_poultry_req.get('create_date').day, + month=filtered_poultry_req.get('create_date').month, + year=filtered_poultry_req.get('create_date').year + ) + + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__poultry_request__key=filtered_poultry_req.get('key'), + trash=False).select_related( + 'kill_request__kill_house', 'killhouse_user__kill_house_operator', + 'killhouse_user__kill_house_operator__user', 'killhouse_user__kill_house_operator__address', + 'killhouse_user').only('kill_request__slaughter_house', 'kill_request__slaughter_house__name', 'state', + 'key', 'create_date', + 'kill_request__kill_house', 'main_quantity', 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__address__city__name', 'killhouse_user__killer', + 'province_request__poultry_request__Index_weight', 'quantity').values( + 'kill_request__slaughter_house', 'kill_request__slaughter_house__name', 'key', 'create_date', + 'kill_request__kill_house', + 'main_quantity', + 'killhouse_user__name', + 'killhouse_user__killer', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__address__city__name', + 'province_request__poultry_request__Index_weight', + 'state', 'quantity') + + list1 = [ + m, + filtered_poultry_req.get('order_code'), + filtered_poultry_req.get('poultry__unit_name'), + filtered_poultry_req.get('poultry__user__fullname'), + filtered_poultry_req.get('poultry__user__mobile'), + filtered_poultry_req.get('poultry__user__city__name'), + str(gregorian_date), + filtered_poultry_req.get('hatching__quantity'), + str(age), + filtered_poultry_req.get('quantity'), + int(filtered_poultry_req.get('quantity') * filtered_poultry_req.get('Index_weight')), + filtered_poultry_req.get('Index_weight'), + filtered_poultry_req.get('amount'), + filtered_poultry_req.get('quantity') - filtered_poultry_req.get('remain_quantity'), + filtered_poultry_req.get('remain_quantity'), + filtered_poultry_req.get('hatching__left_over'), + + filtered_poultry_req.get('hatching__chicken_breed'), + str(date_of_kill), + vet_farm_name, + vet_farm_mobile, + state_p, + + ] + + for item in range(len(list1)): + cell = worksheet.cell(row=l, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + worksheet.row_dimensions[l + 1].height = 24 + + if m % 2 == 0: + cell.fill = PatternFill(start_color="D6F6FE", fill_type="solid") + state_s = 'در انتظار تخصیص استان' + m += 1 + + if province_kill_reqs.exists(): + quantity_kill_house_request = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__key= + filtered_poultry_req['key']) + + if len(province_kill_reqs) > 1: + if len(quantity_kill_house_request) <= 1: + s = len(province_kill_reqs) - 1 + for col in range(ord('A'), ord('U') + 1): + # rng = chr(col) + '7:{}'.format(r) + rng = f'{chr(col)}{l}:{chr(col)}{l + s}' + worksheet.merge_cells(rng) + worksheet[chr(col) + f'{l}'].alignment = Alignment(horizontal='center', vertical='center') + # TODO : جایی که باید انجام بشه + if quantity_kill_house_request.exists(): + if len(quantity_kill_house_request) > 1: + for col in range(ord('A'), ord('U') + 1): + # rng = chr(col) + '7:{}'.format(r) + s = len(quantity_kill_house_request) - 1 + rng = f'{chr(col)}{l}:{chr(col)}{l + s}' + worksheet.merge_cells(rng) + worksheet[chr(col) + f'{l}'].alignment = Alignment(horizontal='center', vertical='center') + + for province_kill_req in province_kill_reqs: + + if province_kill_req['state'] == 'pending': + state_s = 'درانتظار تایید' + + elif province_kill_req['state'] == 'accepted': + state_s = ' تایید شده' + elif province_kill_req['state'] == 'rejected': + state_s = 'رد شده' + all_wight_killer += int(province_kill_req.get('main_quantity') * province_kill_req.get( + 'province_request__poultry_request__Index_weight')) + # o += 1 + all_main_quantity += province_kill_req.get('main_quantity') + + date_of_inner_bar = '-' + + code = '-' + + time = jdatetime.date.fromgregorian( + day=province_kill_req.get('create_date').day, + month=province_kill_req.get('create_date').month, + year=province_kill_req.get('create_date').year + ) + assignment_quantity = '-' + assignment_weight = '-' + + if province_kill_req.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + else: + killers = 'کشتارکن' + + kill_house_requests = KillHouseRequest.objects.filter( + province_kill_request__key=province_kill_req['key'], + trash=False).select_related('add_car__driver', + 'killhouse_user').only( + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__user__fullname', 'killhouse_user', + 'province_kill_request__province_request__poultry_request__Index_weight', 'key', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'traffic_code', 'create_date', + 'clearance_code', + 'killhouse_user__killer', + 'accepted_real_quantity', 'accepted_real_weight', + 'quantity', 'province_request__poultry_request__Index_weight', 'vet_state', + 'assignment_state_archive', 'vet_accepted_real_weight', 'vet_accepted_real_quantity', + 'vet_state').values('vet_state', 'vet_accepted_real_weight', 'vet_accepted_real_quantity', + 'quarantine_quantity', 'vet_state', 'assignment_state_archive', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'key', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'traffic_code', + 'create_date', + 'clearance_code', + 'killhouse_user__killer', + 'accepted_real_quantity', + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user', + 'accepted_real_weight', + 'killhouse_user__kill_house_operator__user__mobile', + 'quantity', 'quarantine_quantity', + 'province_request__poultry_request__Index_weight') + bar_list += (len(kill_house_requests)) + all_quantity_of_bar = kill_house_requests.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + bar_weight = int(all_quantity_of_bar * province_kill_req[ + 'province_request__poultry_request__Index_weight']) if all_quantity_of_bar != None else 0 + remain_province = int(province_kill_req.get('quantity') * province_kill_req[ + 'province_request__poultry_request__Index_weight']) + all_reamin_province += int(province_kill_req.get('quantity') * province_kill_req[ + 'province_request__poultry_request__Index_weight']) + sum_all_quantity_of_bar += all_quantity_of_bar if all_quantity_of_bar != None else 0 + sum_all_weight_of_bar += bar_weight + sum_all_remain_quantity_of_bar += province_kill_req.get('quantity') + list1 = [ + killers + '(' + province_kill_req.get('killhouse_user__name') + ')', + province_kill_req.get('main_quantity'), + int(province_kill_req.get('main_quantity') * province_kill_req.get( + 'province_request__poultry_request__Index_weight')), + str(time), + province_kill_req.get('killhouse_user__kill_house_operator__address__city__name'), + province_kill_req.get('kill_request__slaughter_house__name') if province_kill_req.get( + 'kill_request__slaughter_house') is not None else '-', + state_s, + len(kill_house_requests), + all_quantity_of_bar if all_quantity_of_bar != None else 0, + bar_weight, + province_kill_req.get('quantity'), + remain_province, + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l, column=item + 22, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + if m % 2 != 0: + cell.fill = PatternFill(start_color="D6F6FE", fill_type="solid") + worksheet.row_dimensions[l + 1].height = 20 + + if kill_house_requests.exists(): + if len(kill_house_requests) > 1: + s = len(kill_house_requests) - 1 + + letters = ["V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG"] + for col in letters: + rng = f'{col}{l}:{col}{l + s}' + worksheet.merge_cells(rng) + worksheet[col + f'{l}'].alignment = Alignment(horizontal='center', vertical='center') + + for kill_house_request in kill_house_requests: + all_qarantine += kill_house_request['quarantine_quantity'] if kill_house_request[ + 'quarantine_quantity'] else 0 + if kill_house_request['vet_state'] == 'accepted': + vet_state_accepted += 1 + bar_list2 += 1 + kil_house_vet = KillHouseVet.objects.filter( + kill_house=kill_house_request.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + if (kill_house_request['assignment_state_archive'] == 'True' and kill_house_request[ + 'vet_state'] == 'pending') or kill_house_request[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + all_quantity_of_bar += kill_house_request['quantity'] + vet_quantity = kill_house_request['vet_accepted_real_quantity'] + vet_wight = kill_house_request['vet_accepted_real_weight'] + all_vet_quantity += vet_quantity + all_vet_wight += vet_wight + kill_house_driver_name = kill_house_request.get('add_car__driver__driver_name') + kill_house_driver_mobile = kill_house_request.get('add_car__driver__driver_mobile') + kill_house_driver_type_car = kill_house_request.get('add_car__driver__type_car') + kill_house_traffic_code = kill_house_request.get('traffic_code') + vet_checks = VetCheckRequest.objects.filter( + kill_house_request__key=kill_house_request.get('key')).only( + 'create_date').values('create_date').first() + + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill_house_request.get('key')).only('real_quantity', + 'net_weight', + 'create_date').values( + 'real_quantity', 'net_weight', 'create_date').first() + if assignment: + all_assigment += 1 + all_assignment_quantity += assignment.get('real_quantity') + assignment_quantity = assignment.get('real_quantity') + assignment_weight = assignment.get("net_weight") + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + all_assignment_weight += assignment_weight + if kill_house_request.get('clearance_code'): + code = kill_house_request.get('clearance_code') + + list1 = [ + kill_house_driver_type_car, + kill_house_driver_name, + kill_house_driver_mobile, + kill_house_traffic_code, + code, + kill_house_request['quarantine_quantity'] if kill_house_request[ + 'quarantine_quantity'] else '-', + kill_house_request['quantity'], + int(kill_house_request['quantity'] * kill_house_request[ + 'province_request__poultry_request__Index_weight']), + state, + vet_quantity, + vet_wight, + str(date_of_inner_bar), + kill_house_vet_name, + kill_house_vet_mobile, + assignment_quantity, + assignment_weight, + kill_house_request['killhouse_user__kill_house_operator__user__fullname'], + kill_house_request['killhouse_user__kill_house_operator__user__mobile'], + ] + + for item in range(len(list1)): + cell = worksheet.cell(row=l, column=item + 34, value=list1[item]) + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + if m % 2 != 0: + cell.fill = PatternFill(start_color="D6F6FE", fill_type="solid") + worksheet.row_dimensions[l + 1].height = 20 + + l += 1 + else: + list1 = [ + + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + + ] + # m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l, column=item + 34, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + if m % 2 != 0: + cell.fill = PatternFill(start_color="D6F6FE", fill_type="solid") + if province_kill_req['state'] == 'pending' or province_kill_req['state'] == 'rejected': + l += 1 + + + else: + list1 = [ + '-', + '-', + '-', + '-', + '-', + '-', + state_s, + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + + ] + # m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l, column=item + 22, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + if m % 2 != 0: + cell.fill = PatternFill(start_color="D6F6FE", fill_type="solid") + l += 1 + print(vet_state_accepted) + value_header_list = [ + len(filtered_poultry_reqs), + all_quantity, + all_wight, + len_province_request, + all_main_quantity, + all_wight_killer, + all_remain_quantity, + bar_list, + sum_all_quantity_of_bar, + sum_all_weight_of_bar, + sum_all_remain_quantity_of_bar, + vet_state_accepted, + all_vet_quantity, + all_vet_wight, + all_assigment, + all_assignment_quantity, + all_assignment_weight, + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 4, value=value_header_list[item]) + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value = value_header_list[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + all_hatching, + '', + all_poultry_request, + all_poultry_request_weight, + '', + '', + sum_province_to_kill_house, + all_remain_quantity, + all_hatching_left_over, + '', + '', + '', + '', + '', + '', + all_main_quantity, + all_wight_killer, + '', + '', + '', + '', + '', + sum_all_quantity_of_bar, + sum_all_weight_of_bar, + sum_all_remain_quantity_of_bar, + all_reamin_province, + '', + '', + '', + '', + '', + all_qarantine, + sum_all_quantity_of_bar, + sum_all_weight_of_bar, + '', + all_vet_quantity, + all_vet_wight, + '', + '', + '', + all_assignment_quantity, + all_assignment_weight, + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def bar_contradiction_of_quarantine_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')), trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, quarantine_quantity__isnull=False, + + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity').values( + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'مجموع تعداد قطعه ثبت شده در قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'گزارش مغایرت در بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if kill.get('quantity') != kill['quarantine_quantity']: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = kill['quarantine_quantity'] if kill['quarantine_quantity'] != None else '-' + age = (kill['province_request__poultry_request__send_date'].date() - kill[ + 'province_request__poultry_request__hatching__date'].date()).days + 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else 0, + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + else: + pass + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def detail_of_killing_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + now_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(now_date.split("-")) + separate = "-" + now_date_1 = separate.join(reversed_date) + + if 'role' in request.GET: + role = request.GET['role'] + else: + user = SystemUserProfile.objects.get(key=request.GET['key']) + user_token = ReportsUsers.objects.filter(user_token=request.GET['key']).first() + role = user_token.position + + if role == 'CityOperator': + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_poultry_hatch = PoultryHatching.objects.filter(archive=False, + allow_hatching='pending', + poultry__city_operator=city_operator.unit_name, + trash=False, left_over__gt=0, chicken_age__gt=50) + + hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, + poultry__city_operator=city_operator.unit_name, + left_over__gt=F('quantity') * percent_of_losses, + chicken_age__range=(55, 90)).order_by('id') + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(trash=False) | Q(trash=True, clearance_code__isnull=False), + kill_request__recive_date__date__gte=date1, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('killer', 'killer__kill_house_operator__user__mobile', + 'killer__name', 'province_request__poultry_request__freezing', + 'province_request', + 'province_request__poultry_request', + 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date', 'message').values( + 'killer', 'killer__kill_house_operator__user__mobile', 'killer__name', + 'message', + 'province_request__poultry_request__freezing', 'province_request', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + poultry_request = ( + PoultryRequest.objects.filter(trash=False, poultry__city_operator=city_operator.unit_name, + pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True, + poultry__city_operator=city_operator.unit_name, + out_province_request_cancel=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + province_state__in=('pending', 'accepted')) + else: + user = SystemUserProfile.objects.get(key=request.GET['key']) + city = ReportsUsers.objects.get(user_token=request.GET['key']) + filtered_poultry_hatch = PoultryHatching.objects.filter(archive=False, + allow_hatching='pending', + poultry__user__city__name=city.city, + trash=False, left_over__gt=0, chicken_age__gt=50) + + hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, + poultry__user__city__name=city.city, + left_over__gt=F('quantity') * percent_of_losses, + chicken_age__range=(55, 90)).order_by('id') + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(trash=False) | Q(trash=True, clearance_code__isnull=False), + kill_request__recive_date__date__gte=date1, + province_request__poultry_request__poultry__user__city__name=city.city, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('killer', 'killer__kill_house_operator__user__mobile', + 'killer__name', 'province_request__poultry_request__freezing', + 'province_request', + 'province_request__poultry_request', + 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date', 'message').values( + 'killer', 'killer__kill_house_operator__user__mobile', 'killer__name', + 'message', + 'province_request__poultry_request__freezing', 'province_request', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + poultry_request = ( + PoultryRequest.objects.filter(trash=False, poultry__user__city__name=city.city, + pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True, + poultry__user__city__name=city.city, + out_province_request_cancel=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + province_state__in=('pending', 'accepted')) + elif role in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(key=request.GET['key']) + filtered_poultry_hatch = PoultryHatching.objects.filter(archive=False, poultry__address__city=user.city, + allow_hatching='pending', + trash=False, left_over__gt=0, chicken_age__gt=50) + + hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, poultry__address__city=user.city, + left_over__gt=F('quantity') * percent_of_losses, + chicken_age__range=(55, 90)).order_by('id') + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(trash=False) | Q(trash=True, clearance_code__isnull=False), + kill_request__recive_date__date__gte=date1, + province_request__poultry_request__poultry__address__city=user.city, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('killer', 'killer__kill_house_operator__user__mobile', + 'killer__name', 'province_request__poultry_request__freezing', + 'province_request', + 'province_request__poultry_request', + 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date', 'message').values( + 'killer', 'killer__kill_house_operator__user__mobile', 'killer__name', + 'message', + 'province_request__poultry_request__freezing', 'province_request', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + poultry_request = (PoultryRequest.objects.filter(trash=False, poultry__address__city=user.city, + pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True, + poultry__address__city=user.city, + out_province_request_cancel=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + province_state__in=('pending', 'accepted')) + + else: + filtered_poultry_hatch = PoultryHatching.objects.filter(archive=False, + allow_hatching='pending', + trash=False, left_over__gt=0, chicken_age__gt=50) + + hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, + left_over__gt=F('quantity') * percent_of_losses, + chicken_age__range=(55, 90)).order_by('id') + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(trash=False) | Q(trash=True, clearance_code__isnull=False), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('killer', 'killer__kill_house_operator__user__mobile', + 'killer__name', 'province_request__poultry_request__freezing', + 'province_request', + 'province_request__poultry_request', + 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date', 'message').values( + 'killer', 'killer__kill_house_operator__user__mobile', 'killer__name', + 'message', + 'province_request__poultry_request__freezing', 'province_request', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__hatching__date', + 'province_request__poultry_request__send_date' + ) + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True, + out_province_request_cancel=False, + send_date__date__gte=date1, + send_date__date__lte=date2, + province_state__in=('pending', 'accepted')) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + all_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + filtered_kill_reqs_not_code_but_have_assigment = filtered_kill_reqs.filter( + Q(assignment_state_archive='True', vet_state='pending') + | Q(vet_state='accepted'), clearance_code__isnull=True) + all_age = [] + + excel_options = { + 'آمار کلی': [], + 'مدیریت بارها': [], + 'مانده در سالن بالای 50 روز': [], + 'بارهای احراز شده مغایرت دار': [], + 'بارهای فاقد قرنطینه تخلیه شده': [], + 'بارهای عدم احراز از قرنطینه': [], + 'بارهای تخلیه نشده با کد قرنطینه': [], + 'تخلیه نشده-تحویل گرفته شده': [], + 'تخلیه شده-عدم تکمیل': [], + 'بارهای تخلیه نشده-عدم تکمیل': [], + 'بارهای تخلیه شده- تکمیل شده': [], + } + output = BytesIO() + workbook = Workbook() + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + for name, options in excel_options.items(): + all_age1 = sorted(all_age) + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + + # worksheet.column_dimensions[col_letter].width = 20.01 + # worksheet.row_dimensions[1].height = 22 + + if sheet_name == 'مدیریت بارها': + + filterset_class = KillHouseRequestFilterSet + filterset_fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', 'document_status', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'province_kill_request__province_request__poultry_request__out', + 'province_kill_request__kill_house_price', + 'price', + 'killer__name', + 'killhouse_user__type', 'killer', 'bar_document_status', + 'bar_document_status__title').values( + 'province_request__poultry_request__poultry__user__fullname', 'province_kill_request__kill_house_price', + 'kill_request__export_country', + 'province_request__poultry_request__direct_buying', + 'province_request__poultry_request__export', + 'province_request__poultry_request__freezing', + 'document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'province_kill_request__province_request__poultry_request__out', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', 'bar_document_status', + 'province_kill_request__kill_house_price', + 'price', + 'bar_document_status__title' + ) + + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(key=request.GET['key']) + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(key=request.GET['key']) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__address__city=user.city) + elif request.GET['role'] == 'VetFarm': + user = SystemUserProfile.objects.get(key=request.GET['key']) + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(key=request.GET['key']) + filtered_kill_reqs = filtered_kill_request.filter(killhouse_user__kill_house_operator__user=user) + else: + filtered_kill_reqs = filtered_kill_request + + if request.GET['role'] == 'KillHouse': + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + + elif request.GET['role'] == 'KillHouseVet': + user = SystemUserProfile.objects.get(key=request.GET['key']) + kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house') + kill_house = kill_house_vets.values_list('kill_house', flat=True).distinct() + + else: + kill_house = KillHouse.objects.filter(out_province=False, trash=False) + + if 'state' in request.GET: + if request.GET['state'] == 'completed': + filtered_kill_reqs = filtered_kill_reqs.filter(assignment_state_archive='True') + elif request.GET['state'] == 'bar_pending': + filtered_kill_reqs = filtered_kill_reqs.filter( + (Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q( + killer__in=kill_house)), assignment_state_archive='pending') + else: + filtered_kill_reqs = filtered_kill_reqs + else: + filtered_kill_reqs = filtered_kill_reqs + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_kill_reqs + + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_kill_reqs) + filtered_kill_reqs = ps.filter() + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'نوع کشتار', + 'کدسفارش مرغدار', + 'نام و نام خانوادگی مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'نام فارم', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + 'قیمت پیشنهادی کشتارگاه(ریال)', + 'قیمت تعاونی(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'قیمت کشتارگاه(ریال)', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت در لحظه', + 'درصد افت ورود به انبار', + 'کشور مقصد', + 'اختلاف مجوز', + + ] + + from_date_1 = shamsi_date(date1) + + to_date_1 = shamsi_date(date2) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'حجم بارهای ایجاد شده', + 'وزن بارهای ایجاد شده', + 'میانگین وزن بارهای ایجاد شده', + 'کمترین سن', + 'بیشترین سن', + 'میانگین سنی', + 'تعداد بارهای دارای کد قرنطینه', + 'حجم بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد بار فاقد قرنطینه', + 'حجم بار فاقد قرنطینه', + ' تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'حجم بارها', + 'وزن بارها', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه ورود به انبار', + + ] + + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + header_list3 = [ + 'درصد بارهای دارای کد قرنطینه', + 'درصد تعداد بارهای احراز شده از قرنطینه', + 'درصد تعداد بارهای تکمیل شده کشتارگاه', + 'درصد وزن نهایی در کشتارگاه نسبت به وزن کل', + 'درصد بارهای فاقد کد قرنطینه', + 'درصد بارهای اختلاف دار در قرنطینه و رصدیار', + 'درصد تعداد بارهای ورودی به انبار', + 'درصد وزن لاشه ها در انبار نسبت به وزن کل', + 'درصد وزن لاشه در انبار نسبت به وزن نهایی در کشتارگاه', + + ] + create_header(worksheet, header_list, 9, 2, height=21.8) + + create_header(worksheet, header_list2, 6, 2, height=21.8, color='green') + + create_header(worksheet, header_list3, 6, 5, height=43, color='orange', text_color='0D0D0D') + create_header_freez(worksheet, excel_options, 1, 8, 9, height=21, len_with=True) + + excel_description(worksheet, 'B1', 'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی', color='red', + row2='D1') + + kill_keys = [kill.get('key') for kill in filtered_kill_reqs] + + vet_checks = VetCheckRequest.objects.filter( + trash=False, kill_house_request__key__in=kill_keys + ).only('create_date', 'kill_house_request__key').values( + 'create_date', 'kill_house_request__key') + + assignments = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key__in=kill_keys, trash=False + ).only('create_date', 'net_weight', 'real_quantity', 'kill_house_request__key') + + vet_check_mapping = {vc['kill_house_request__key']: vc['create_date'] for vc in vet_checks} + assignment_mapping = { + assignment.kill_house_request.key: ( + int(assignment.net_weight), assignment.real_quantity, assignment.create_date) + for assignment in assignments + } + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + excel_description(worksheet, 'B2', f'استان {name}', color='red', row2='D2') + excel_description(worksheet, 'B3', f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})', row2='D3') + + l = 8 + m = 1 + all_age = [] + + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + poultry_ids = [req.get('province_request__poultry_request__poultry') for req in filtered_kill_reqs] + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry_id: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + if age not in all_age: + all_age.append(age) + + if (kill['assignment_state_archive']) == 'True' or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + vet_farm_id = kill.get('province_request__poultry_request__poultry') + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = convert_to_shamsi(year=send_date.year, month=send_date.month, + day=send_date.day, ) + + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + key = kill.get('key') + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + if kill['assignment_state_archive'] == 'True' or kill['ware_house_confirmation'] == True: + net_weighte = kill['accepted_real_weight'] + real_quantity = kill['accepted_real_quantity'] + else: + net_weighte = 0 + real_quantity = 0 + net_weighte2, real_quantity2, vet_check_date = assignment_mapping.get(key, ('-', '-', None)) + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + vet_check_date = vet_check_mapping.get(key, vet_check_date) + date_of_inner_bar = convert_to_shamsi(datetime=vet_check_date) if vet_check_date else '-' + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + export_country = '-' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__out'] == True: + type = 'خارج از استان' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + elif kill['province_request__poultry_request__freezing'] == True: + type = 'انجماد' + elif kill['province_request__poultry_request__export'] == True: + type = 'صادرات' + export_country = kill['kill_request__export_country'] + else: + type = 'عادی' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_weighte += weight + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + + else: + state_ware_house_confirmation = '-' + + weight_loss1 = kill['accepted_real_weight'] - kill['ware_house_accepted_real_weight'] if kill[ + 'ware_house_accepted_real_weight'] > 0 else 0 + if weight_loss1 < 0: + weight_loss1 = weight_loss1 * -1 + total_weight_loss = (weight_loss1 / kill['accepted_real_weight']) * 100 if weight_loss1 != 0 else 0 + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + type, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__user__fullname'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + kill.get('province_request__poultry_request__poultry__unit_name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + + kill.get('province_kill_request__kill_house_price') if kill.get( + 'province_kill_request__kill_house_price') else '-', + + kill.get('price') if kill.get( + 'price') else '-', + + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + kill.get('province_kill_request__kill_house_price'), + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + round(kill['accepted_real_weight'], 1), + state_delete, + kill['bar_document_status__title'] if kill['bar_document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'%{round(total_weight_loss, 2)}', + f'%{weight_loss}', + export_country, + kill['accepted_real_quantity'] - quarantine_quantity if kill[ + 'quarantine_quantity'] != None else quarantine_quantity + + ] + m += 1 + create_value(worksheet, list1, l, 1, height=20, different_cell=40, different_value='بار حذف شده') + killer_exclusive = len(filtered_kill_reqs.filter(killer__isnull=False)) + all_state_ware_house_confirmation = len(filtered_kill_reqs.filter(ware_house_confirmation=True)) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + + aggregate_filtered_kill_reqs = filtered_kill_reqs.aggregate( + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity=Sum('quantity'), + total_vet_accepted_real_quantity=Sum('vet_accepted_real_quantity'), + total_vet_accepted_real_weight=Sum('vet_accepted_real_weight'), + total_quarantine_quantity=Sum('quarantine_quantity'), + total_ware_house_accepted_real_quantity=Sum('ware_house_accepted_real_quantity'), + total_ware_house_accepted_real_weight=Sum('ware_house_accepted_real_weight'), + total_weight_loss=Sum('weight_loss'), + + ) + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + + accepted_real_quantity = aggregate_filtered_kill_reqs['total_accepted_real_quantity'] or 0 + + accepted_real_wight = aggregate_filtered_kill_reqs['total_accepted_real_weight'] or 0 + all_kill_request_quantity = aggregate_filtered_kill_reqs['total_quantity'] or 0 + all_quarantine_quantity = aggregate_filtered_kill_reqs['total_quarantine_quantity'] or 0 + all_vet_accepted_real_quantity = aggregate_filtered_kill_reqs['total_vet_accepted_real_quantity'] or 0 + all_vet_accepted_real_weight = aggregate_filtered_kill_reqs['total_vet_accepted_real_weight'] or 0 + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_quantity'] or 0 + all_ware_house_accepted_real_weight = aggregate_filtered_kill_reqs[ + 'total_ware_house_accepted_real_weight'] or 0 + all_weight_loss = aggregate_filtered_kill_reqs['total_weight_loss'] or 0 + has_code1 = filtered_kill_reqs.filter(clearance_code__isnull=False).aggregate( + total_quantity=Sum('quantity'), + ) + all_quarantine_quantity_has_code = has_code1['total_quantity'] or 0 + hasnt_code1 = filtered_kill_reqs.filter(clearance_code__isnull=True) + hasnt_code = hasnt_code1.aggregate( + total_quantity=Sum('quantity') + ) + all_quarantine_quantity_hasnt_code = hasnt_code['total_quantity'] or 0 + difference_bar = len(filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')))) + all_weight_loss = round(int(all_weight_loss) / all_state_ware_house_confirmation, + 2) if all_weight_loss > 0 else 0 + + all_age1 = sorted(all_age) + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + + province_kill_request = ProvinceKillRequest.objects.filter( + pk__in=filtered_kill_reqs.values( + 'province_kill_request')).aggregate( + total_quantity_melak=Sum('total_killed_quantity'), + total_weight_melak=Sum('total_killed_weight'), + ) + + # province_kill_request = filtered_kill_reqs.values_list( + # 'province_kill_request',flat=True).distinct().aggregate( + # total_quantity_melak=Sum('total_killed_quantity'), + # total_weight_melak=Sum('total_killed_weight'), + # ) + accepted_real_quantity_melak = province_kill_request['total_quantity_melak'] or 0 + + accepted_real_wight_melak = province_kill_request['total_weight_melak'] or 0 + value_header_list = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight), + len(filtered_kill_reqs), + killer_exclusive, + all_kill_request_quantity, + int(all_weighte), + round(all_weighte / all_kill_request_quantity, + 1) if all_weighte > 0 and all_kill_request_quantity > 0 else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-', + has_code, + all_quarantine_quantity_has_code, + has_qarantine, + all_quarantine_quantity, + len(hasnt_code1), + all_quarantine_quantity_hasnt_code, + difference_bar, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity_melak, + accepted_real_wight_melak, + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + create_value(worksheet, value_header_list, 3, 6) + value_header_list2 = [ + f'%{round((has_code * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((has_qarantine * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((len(bar_complete) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_net_weighte) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((len(hasnt_code1) * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((difference_bar * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((all_state_ware_house_confirmation * 100) / len(filtered_kill_reqs), 2) if len(filtered_kill_reqs) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_weighte), 2) if int(all_weighte) > 0 else 0}', + f'%{round((int(all_ware_house_accepted_real_weight) * 100) / int(all_net_weighte), 2) if int(all_net_weighte) > 0 else 0}' + ] + create_value(worksheet, value_header_list2, 6, 6) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + '', + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + elif sheet_name == 'مانده در سالن بالای 50 روز': + excel_options = [ + 'ردیف', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'مانده در سالن از نود درصد', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + ] + date1 = datetime.datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + header_list = [ + 'تعداد فارم فعال', + 'مجموع جوجه ریزی', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان' + + ] + + for col_num, option in enumerate(header_list, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + # worksheet['A1'] = f' وضعیت پرونده ها' + worksheet['B2'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + # merge_range2 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range2) + worksheet['B2'].font = red_font + + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + for poultry_hatching in filtered_poultry_hatch: + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + age = (datetime.datetime.now().date() - poultry_hatching.date.date()).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) - poultry_hatching.killed_quantity + all_left_over_ninty_percent += left_over_ninty_percent + list1 = [ + m, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.mobile, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.poultry.system_code, + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.losses, + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + value_header_list = [ + len(filtered_poultry_hatch), + all_poultry_hatching_quantity, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'بارهای احراز شده مغایرت دار': + filtered_kill_reqs_qarantine = filtered_kill_reqs.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')) + , quarantine_quantity__isnull=False) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + ' کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای احراز شده دارای مغایرت', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارهای احراز شده دارای مغایرت', + 'مجموع وزن بارهای احراز شده دارای مغایرت', + 'تعداد بارهای احراز شده دارای مغایرت دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'بارهای احراز شده دارای مغایرت در قرنطینه' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ ({from_date_1}) تا تاریخ ({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_qarantine.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_qarantine.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_qarantine.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_qarantine.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_qarantine.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_qarantine.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_qarantine.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + if filtered_kill_reqs_qarantine: + for kill in filtered_kill_reqs_qarantine: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_qarantine.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_qarantine.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs_qarantine.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_qarantine), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'بارهای فاقد قرنطینه تخلیه شده': + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + ' کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای فاقد قرنطینه تخلیه شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارهای فاقد قرنطینه تخلیه شده', + 'مجموع وزن بارهای فاقد قرنطینه تخلیه شده', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'بارهای فاقد قرنطینه تخلیه شده' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_not_code_but_have_assigment.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_not_code_but_have_assigment.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + if filtered_kill_reqs_not_code_but_have_assigment: + for kill in filtered_kill_reqs_not_code_but_have_assigment: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_not_code_but_have_assigment.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len( + filtered_kill_reqs_not_code_but_have_assigment.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_code_but_have_assigment), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'بارهای عدم احراز از قرنطینه': + filtered_kill_reqs_havent_qarantine_quantity = filtered_kill_reqs.filter(quarantine_quantity__isnull=True, + clearance_code__isnull=False) + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + ' کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای عدم احراز از قرنطینه', + 'تعداد بارهای دارای کشتارکن اختصاصی', + + 'مجموع تعداد قطعه بارهای عدم احراز از قرنطینه', + 'مجموع وزن بارهای عدم احراز از قرنطینه', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'بارهای عدم احراز از قرنطینه' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_havent_qarantine_quantity.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_havent_qarantine_quantity.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_havent_qarantine_quantity.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_havent_qarantine_quantity.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_havent_qarantine_quantity.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_havent_qarantine_quantity.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_havent_qarantine_quantity.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + if filtered_kill_reqs_havent_qarantine_quantity: + for kill in filtered_kill_reqs_havent_qarantine_quantity: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_havent_qarantine_quantity.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_havent_qarantine_quantity.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs_havent_qarantine_quantity.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_havent_qarantine_quantity), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'بارهای تخلیه نشده با کد قرنطینه': + filtered_kill_reqs_not_assigment_but_have_code = filtered_kill_reqs.filter( + Q(assignment_state_archive='pending') + | Q(vet_state='pending'), clearance_code__isnull=False) + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + ' کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تخلیه نشده با کد قرنطینه', + 'تعداد بارهای دارای کشتارکن اختصاصی', + + 'مجموع تعداد قطعه بارهای تخلیه نشده با کد قرنطینه', + 'مجموع وزن بارهای تخلیه نشده با کد قرنطینه', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'بارهای تخلیه نشده با کد قرنطینه' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_not_assigment_but_have_code.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_not_assigment_but_have_code.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + if filtered_kill_reqs_not_assigment_but_have_code: + for kill in filtered_kill_reqs_not_assigment_but_have_code: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_not_assigment_but_have_code.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len( + filtered_kill_reqs_not_assigment_but_have_code.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_assigment_but_have_code), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'تخلیه نشده-تحویل گرفته شده': + filtered_kill_reqs_not_assigment_but_have_code = filtered_kill_reqs.filter( + vet_state='pending', assignment_state_archive='True') + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + ' کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تخلیه نشده با کد قرنطینه', + 'تعداد بارهای دارای کشتارکن اختصاصی', + + 'مجموع تعداد قطعه بارهای تخلیه نشده با کد قرنطینه', + 'مجموع وزن بارهای تخلیه نشده با کد قرنطینه', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'تخلیه نشده/تحویل گرفته شده' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_not_assigment_but_have_code.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_not_assigment_but_have_code.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + if filtered_kill_reqs_not_assigment_but_have_code: + for kill in filtered_kill_reqs_not_assigment_but_have_code: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_not_assigment_but_have_code.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len( + filtered_kill_reqs_not_assigment_but_have_code.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_assigment_but_have_code), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + elif sheet_name == 'تخلیه شده-عدم تکمیل': + filtered_kill_reqs_not_assigment = filtered_kill_reqs.filter(vet_state='accepted', + assignment_state_archive='pending') + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + ' کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تکمیل نشده توسط کشتارگاه', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارهای تکمیل نشده توسط کشتارگاه', + 'مجموع وزن بارهای تکمیل نشده توسط کشتارگاه', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'تخلیه شده/عدم تکمیل' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_not_assigment.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_not_assigment.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_not_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_not_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_not_assigment.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_not_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_not_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + if filtered_kill_reqs_not_assigment: + for kill in filtered_kill_reqs_not_assigment: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_not_assigment.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_not_assigment.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs_not_assigment.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_assigment), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'بارهای تخلیه نشده-عدم تکمیل': + filtered_kill_not_assigment = filtered_kill_reqs.filter(vet_state='pending', + assignment_state_archive='pending') + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + ' کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تخلیه نشده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارهای تخلیه نشده', + 'مجموع وزن بارهای تخلیه نشده', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'بارهای بارهای تخلیه نشده' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_not_assigment.filter(vet_state='accepted')) + bar_complete = filtered_kill_not_assigment.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_not_assigment.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + if filtered_kill_not_assigment: + for kill in filtered_kill_not_assigment: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_not_assigment.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_not_assigment.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_not_assigment), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'بارهای تخلیه شده- تکمیل شده': + filtered_kill_not_assigment = filtered_kill_reqs.filter(vet_state='accepted', + assignment_state_archive='True') + + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + ' کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تخلیه نشده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + + 'مجموع تعداد قطعه بارهای تخلیه نشده', + 'مجموع وزن بارهای تخلیه نشده', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'بارهای تخلیه شده/ تکمیل شده' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_not_assigment.filter(vet_state='accepted')) + bar_complete = filtered_kill_not_assigment.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_not_assigment.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + killer_exclusive = 0 + if filtered_kill_not_assigment: + for kill in filtered_kill_not_assigment: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_not_assigment.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_not_assigment.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_not_assigment.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_not_assigment), + killer_exclusive, + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + else: + worksheet[ + 'E2'] = 'گزارش کلی فارم های فعال و بایگانی شده مرغ گوشتی دارای مانده در سالن بیشتر از 11 درصد بین بازه سنی 55 روز تا 90 روز' + + worksheet['A2'] = f'این گزارش در مورخ {now_date_1} صادر شده است.' + + worksheet['E2'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'E2:K2' + merge_range2 = 'A2:C2' + # merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + # worksheet['B1'].font = red_font + # worksheet['B3'].font = Font(size=11) + worksheet['E2'].font = Font(size=10) + worksheet['A2'].font = Font(size=10, color="C00000") + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم بایگانی شده', + 'مجموع جوجه ریزی', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کشتارشده', + 'جمع کل مانده در سالن(قطعه)', + 'جمع مانده در سال فارم فعال(قطعه)', + 'جمع مانده در سالن فارم بایگانی(قطعه)', + 'کمترین سن ', + 'بیشترین سن ', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان' + + ] + + for col_num, option in enumerate(header_list, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FFFFFF", fill_type="solid") + cell.font = Font(size=8, bold=True, color='538135') + worksheet.row_dimensions[3].height = 28.8 + worksheet.column_dimensions[col_letter].width = 11.95 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium', color='A8D08D'), + right=openpyxl.styles.Side(style='medium', color='A8D08D'), + top=openpyxl.styles.Side(style='medium', color='A8D08D'), + bottom=openpyxl.styles.Side(style='medium', color='A8D08D') + ) + + min_list = [] + all_left_over_ninty_percent = 0 + len_archive_hatch = 0 + len_hatch = 0 + left_over_archive = 0 + left_over = 0 + for poultry_hatching in hatching_between_50_70: + if poultry_hatching.archive == True and poultry_hatching.allow_hatching == 'True': + len_archive_hatch += 1 + left_over_archive += poultry_hatching.left_over + if poultry_hatching.archive == False and poultry_hatching.allow_hatching == 'pending': + len_hatch += 1 + left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + left_over_ninty_percent = (( + poultry_hatching.quantity * 90) / 100) - poultry_hatching.killed_quantity + all_left_over_ninty_percent += left_over_ninty_percent + + min_list = sorted(min_list) + all_total_commitment = hatching_between_50_70.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_poultry_hatching_killed_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_poultry_hatching_quantity = hatching_between_50_70.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_poultry_hatching_left_over = hatching_between_50_70.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = hatching_between_50_70.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = hatching_between_50_70.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = hatching_between_50_70.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_age1 = sorted(all_age) + value_header_list = [ + len_hatch, + len_archive_hatch, + all_poultry_hatching_quantity, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + left_over_archive, + left_over, + + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=4, column=item + 1, value=value_header_list[item]) + cell.fill = PatternFill(start_color="E2EFD9", fill_type="solid") + + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', wrap_text=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium', color='A8D08D'), + right=openpyxl.styles.Side(style='medium', color='A8D08D'), + top=openpyxl.styles.Side(style='medium', color='A8D08D'), + bottom=openpyxl.styles.Side(style='medium', color='A8D08D') + ) + worksheet[ + 'A6'] = f'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی' + + worksheet['A7'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['F7'] = f'اطلاعات کلی بارها' + worksheet['G11'] = f'تفکیک بارهای دولتی,آزاد و خارج از استان' + worksheet['E15'] = f'اطلاعات بارهای تخلیه شده و تکمیل شده توسط کشتارگاه' + worksheet['F19'] = f'اطلاعات بارهای تخلیه نشده و تکمیل نشده توسط کشتارگاه' + worksheet['F23'] = f'تعداد قطعه نهایی کم شده از سالن مرغدار(ملاک کشتار)' + worksheet['M11'] = f'درمجموع بارها محاسبه نمیشود*' + + worksheet['A6'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A7'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['F7'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['G11'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['E15'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['F19'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['F23'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['M11'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A6:D6' + merge_range2 = 'A7:D7' + merge_range3 = 'F7:J7' + merge_range4 = 'G11:J11' + merge_range5 = 'E15:K15' + merge_range6 = 'F19:I19' + merge_range7 = 'F23:I23' + merge_range8 = 'M11:N11' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet['A6'].font = Font(size=10) + worksheet['A7'].font = Font(size=9) + worksheet['F7'].font = Font(size=11) + worksheet['F11'].font = Font(size=11) + worksheet['D15'].font = Font(size=11) + worksheet['F19'].font = Font(size=10) + worksheet['F23'].font = Font(size=8) + worksheet['M11'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + worksheet['M11'].fill = PatternFill(start_color="E9CFAF", fill_type="solid") + header_list3 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + 'کمترین سن کشتار', + 'بیشترین سن کشتار', + 'میانگین سنی کشتار', + + ] + for col_num, option in enumerate(header_list3, 2): + cell = worksheet.cell(row=8, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=8, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[8].height = 42.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + header_list2 = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارهای ایجاد شده', + 'مجموع وزن بارها ایجاد شده', + 'میانگین وزن', + + ] + for col_num, option in enumerate(header_list2, 8): + cell = worksheet.cell(row=8, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=8, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[8].height = 42.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + header_list4 = [ + + 'تعداد بارهای دارای کد قرنطینه', + 'مجموع قطعه بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list4, 12): + cell = worksheet.cell(row=8, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="C5E0B3", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[8].height = 42.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + header_list5 = [ + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + + ] + for col_num, option in enumerate(header_list5, 14): + cell = worksheet.cell(row=8, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="8EAADB", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[8].height = 42.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + header_list6 = [ + 'تعداد بارهای فاقد کد قرنطینه', + 'مجموع قطعه بارهای فاقد کد قرنطینه', + 'تعداد بارهایی که در قرنطینه و رصدیار اختلاف دارند', + ] + for col_num, option in enumerate(header_list6, 16): + cell = worksheet.cell(row=8, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FFF2CC", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[8].height = 42.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + header_list7 = [ + 'حجم بارها', + 'وزن بارها', + + ] + for col_num, option in enumerate(header_list7, 19): + cell = worksheet.cell(row=8, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=8, bold=True, color='FFFFFF') + worksheet.row_dimensions[8].height = 42.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + all_weighte = 0 + for kill in filtered_kill_reqs: + w = kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + weight = kill.get('quantity') * w + all_weighte += weight + + difference_bar = len(filtered_kill_reqs.filter(~Q(quantity=F('quarantine_quantity')))) + + hasnt_code = filtered_kill_reqs.filter(clearance_code__isnull=True) + all_quarantine_quantity_hasnt_code = hasnt_code.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + has_code = filtered_kill_reqs.filter(clearance_code__isnull=False) + all_quarantine_quantity_has_code = has_code.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + has_qarantine = filtered_kill_reqs.filter(quarantine_quantity__isnull=False) + all_has_qarantine = has_qarantine.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + value_header = [ + len(poultry_request), + total_requests_quantity if total_requests_quantity != None else 0, + total_requests_weight if total_requests_weight != None else 0, + all_age1[0] if len(all_age1) > 0 else '-', + all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-', + (sum(all_age1) / len(all_age1)) if len(all_age1) > 0 else '-', + len(filtered_kill_reqs), + all_quantity if all_quantity != None else 0, + all_weighte, + round(all_weighte / all_quantity, 1) if all_weighte > 0 and all_quantity > 0 else 0, + len(has_code), + all_quarantine_quantity_has_code if all_quarantine_quantity_has_code != None else 0, + len(has_qarantine), + all_has_qarantine if all_has_qarantine != None else 0, + len(hasnt_code), + all_quarantine_quantity_hasnt_code if all_quarantine_quantity_hasnt_code != None else 0, + difference_bar, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header)): + cell = worksheet.cell(row=9, column=item + 2, value=value_header[item]) + value = value_header[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + header_list7 = [ + 'تعداد بار دولتی', + 'مجموع قطعه بارهای دولتی', + 'مجموع وزن بارهای دولتی', + 'بارهای دولتی دارای احراز شده قرنطینه', + 'تعداد قطعه دولتی احراز شده از قرنطینه', + ] + + for col_num, option in enumerate(header_list7, 2): + cell = worksheet.cell(row=12, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=8, bold=True, color='FFFFFF') + worksheet.row_dimensions[12].height = 42.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + header_list8 = [ + 'تعداد بارهای آزاد', + 'مجموع قطعه بارهای آزاد', + 'مجموع وزن بارهای آزاد', + 'بارهای آزاد احراز شده از قرنطینه', + 'مجموع تعداد قطعه بارهای آزاد احراز شده از قرنطینه', + 'کل بارهای آزاد دارای کد قرنطینه', + + ] + header_listx = [ + 'تعداد بارهای خارج از استان', + 'مجموع قطعه بارهای خارج از استان', + ] + for col_num, option in enumerate(header_list8, 7): + cell = worksheet.cell(row=12, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FFE599", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[12].height = 42.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_listx, 13): + cell = worksheet.cell(row=12, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="E9CFAF", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[12].height = 42.8 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + bar_government = filtered_kill_reqs.filter( + province_request__poultry_request__free_sale_in_province=False) + + accepted_real_quantity_bar_government = bar_government.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight_bar_government = bar_government.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + bar_government_quarantine_quantity = bar_government.filter(quarantine_quantity__isnull=False) + + accepted_real_quantity_bar_government_quarantine_quantity = bar_government_quarantine_quantity.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + + bar_free = filtered_kill_reqs.filter(province_request__poultry_request__free_sale_in_province=True) + accepted_real_quantity_bar_free = bar_free.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight_bar_free = bar_free.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + bar_free_quarantine_quantity = bar_free.filter(quarantine_quantity__isnull=False) + + accepted_real_quantity_bar_free_quarantine_quantity = bar_free_quarantine_quantity.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + + bar_free_has_code = len(bar_free.filter(clearance_code__isnull=False)) + + quantity_out_true_poultry_request = out_true_poultry_request.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + value_header_free_and_goverment_bar = [ + len(bar_government), + accepted_real_quantity_bar_government if accepted_real_quantity_bar_government != None else 0, + accepted_real_wight_bar_government if accepted_real_wight_bar_government != None else 0, + len(bar_government_quarantine_quantity), + accepted_real_quantity_bar_government_quarantine_quantity if accepted_real_quantity_bar_government_quarantine_quantity != None else 0, + len(bar_free), + accepted_real_quantity_bar_free if accepted_real_quantity_bar_free != None else 0, + accepted_real_wight_bar_free if accepted_real_wight_bar_free != None else 0, + len(bar_free_quarantine_quantity), + accepted_real_quantity_bar_free_quarantine_quantity if accepted_real_quantity_bar_free_quarantine_quantity != None else 0, + bar_free_has_code, + len(out_true_poultry_request), + quantity_out_true_poultry_request if quantity_out_true_poultry_request != None else 0, + + ] + for item in range(len(value_header_free_and_goverment_bar)): + cell = worksheet.cell(row=13, column=item + 2, value=value_header_free_and_goverment_bar[item]) + value = value_header_free_and_goverment_bar[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + header_list_bar_complete = [ + + 'تعداد بارتخلیه شده دامپزشک', + 'مجموع تعداد قطعه تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + + ] + header_list_bar_completex2 = [f'وزن لاشه مرغ بعد از کسر {25} % افت', + ] + header_list_bar_completex = ['تعداد بار ورودی به کشتارگاه', + 'مجموع قطعه بارهای ورودی به کشتارگاه', + 'وزن بارهای ورودی به کشتارگاه', + 'میانگین وزن', + ] + for col_num, option in enumerate(header_list_bar_completex, 2): + cell = worksheet.cell(row=16, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="F3CC85", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[16].height = 42 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list_bar_completex2, 6): + cell = worksheet.cell(row=16, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FF7979", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[16].height = 42 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list_bar_complete, 7): + cell = worksheet.cell(row=16, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="F4B083", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[16].height = 42 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + header_list_bar_complete2 = [ + 'تعداد بارهای تکمیل شده کشتارگاه', + 'مجموع تعداد قطعه نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + + ] + header_list_bar_complete2x = ['بارهای تخلیه شده فاقد کد قرنطینه', + 'قطعه بارهای تخلیه شده فاقد کد قرنطینه', + 'وزن بارهای تخلیه شده فاقد کد قرنطینه', ] + for col_num, option in enumerate(header_list_bar_complete2, 10): + cell = worksheet.cell(row=16, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="BDD6EE", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[16].height = 42 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(header_list_bar_complete2x, 13): + cell = worksheet.cell(row=16, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="AEF8FE", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[16].height = 42 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + bar_complete_with_kill_house_and_vet = filtered_kill_reqs.filter( + ware_house_confirmation=True) + bar_complete_with_vet = filtered_kill_reqs.filter( + vet_state='accepted') + accepted_real_quantity_with_kill_house_and_vet = bar_complete_with_kill_house_and_vet.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight_with_kill_house_and_vet = bar_complete_with_kill_house_and_vet.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity_with_kill_house_and_vet = bar_complete_with_vet.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight_with_kill_house_and_vet = bar_complete_with_vet.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + bar_complete_with_kill_house = filtered_kill_reqs.filter(Q(ware_house_confirmation=True)| + Q(assignment_state_archive='True')) + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + accepted_real_quantity_no_code = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight_no_code = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + if accepted_real_wight_with_kill_house_and_vet != None: + less_25 = (accepted_real_wight_with_kill_house_and_vet * 75) / 100 + else: + less_25 = 0 + value_header_complete_bar = [ + len(bar_complete_with_kill_house_and_vet), + accepted_real_quantity_with_kill_house_and_vet if accepted_real_quantity_with_kill_house_and_vet != None else 0, + accepted_real_wight_with_kill_house_and_vet if accepted_real_wight_with_kill_house_and_vet != None else 0, + round(accepted_real_wight_with_kill_house_and_vet / accepted_real_quantity_with_kill_house_and_vet, + 1) if accepted_real_wight_with_kill_house_and_vet != None else 0, + less_25, + len(bar_complete_with_vet), + all_vet_accepted_real_quantity_with_kill_house_and_vet if all_vet_accepted_real_quantity_with_kill_house_and_vet != None else 0, + all_vet_accepted_real_weight_with_kill_house_and_vet if all_vet_accepted_real_weight_with_kill_house_and_vet != None else 0, + len(bar_complete_with_kill_house), + accepted_real_quantity_final if accepted_real_quantity_final != None else 0, + accepted_real_wight_final if accepted_real_wight_final != None else 0, + len(filtered_kill_reqs_not_code_but_have_assigment), + accepted_real_quantity_no_code if accepted_real_quantity_no_code != None else 0, + accepted_real_wight_no_code if accepted_real_wight_no_code != None else 0, + + ] + for item in range(len(value_header_complete_bar)): + cell = worksheet.cell(row=17, column=item + 2, value=value_header_complete_bar[item]) + value = value_header_complete_bar[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + filtered_kill_reqs_not_assigment_all = filtered_kill_reqs.filter( + assignment_state_archive='pending', vet_state='pending') + + accepted_real_quantity_not_assigment_all = filtered_kill_reqs_not_assigment_all.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight_not_assigment_all = filtered_kill_reqs_not_assigment_all.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + filtered_kill_reqs_havent_kill_house = filtered_kill_reqs.filter( + assignment_state_archive='pending' + , vet_state='accepted') + + accepted_real_quantity_havent_kill_house = filtered_kill_reqs_havent_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight_havent_kill_house = filtered_kill_reqs_havent_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + header_list_not_assigment = [ + 'تعداد بار تخلیه نشده', + 'مجموع قطعه بار های تخلیه نشده', + 'وزن بارهای تخلیه نشده', + ] + + for col_num, option in enumerate(header_list_not_assigment, 5): + cell = worksheet.cell(row=20, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="DA9694", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[20].height = 57 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + header_list_not_assigment2 = [ + 'بارهای تخلیه شده و عدم تکمیل توسط کشتارگاه', + 'قطعه بارهای تخلیه شده و عدم تکمیل توسط کشتارگاه', + 'وزن بارهای تخلیه شده و عدم تکمیل توسط کشتارگاه', + ] + + for col_num, option in enumerate(header_list_not_assigment2, 8): + cell = worksheet.cell(row=20, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FABF8F", fill_type="solid") + cell.font = Font(size=8, bold=True) + worksheet.row_dimensions[20].height = 57 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + value_header_list_not_assigment = [ + len(filtered_kill_reqs_not_assigment_all), + accepted_real_quantity_not_assigment_all if accepted_real_quantity_not_assigment_all != None else 0, + accepted_real_wight_not_assigment_all if accepted_real_wight_not_assigment_all != None else 0, + len(filtered_kill_reqs_havent_kill_house), + accepted_real_quantity_havent_kill_house if accepted_real_quantity_havent_kill_house != None else 0, + accepted_real_wight_havent_kill_house if accepted_real_wight_havent_kill_house != None else 0, + + ] + for item in range(len(value_header_list_not_assigment)): + cell = worksheet.cell(row=21, column=item + 5, value=value_header_list_not_assigment[item]) + value = value_header_list_not_assigment[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + accepted_real_quantity_final = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_weight_final = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + header_final = [ + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + ] + + for col_num, option in enumerate(header_final, 7): + cell = worksheet.cell(row=24, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=8, bold=True, color='FFFFFF') + worksheet.row_dimensions[24].height = 31 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + value_header_final = [ + accepted_real_quantity_final if accepted_real_quantity_final != None else 0, + accepted_real_weight_final if accepted_real_weight_final != None else 0, + + ] + for item in range(len(value_header_final)): + cell = worksheet.cell(row=25, column=item + 7, value=value_header_final[item]) + value = value_header_final[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + names_list = [] + tomorrow_date1 = date1 + timedelta(days=1) + tomorrow_date2 = date2 + timedelta(days=1) + from_date = jdatetime.date.fromgregorian( + year=tomorrow_date1.year, + month=tomorrow_date1.month, + day=tomorrow_date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + tommorow_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=tomorrow_date2.year, + month=tomorrow_date2.month, + day=tomorrow_date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + tomorrow_date_2 = separate.join(reversed_date) + kill_house_ware_houses = KillHouseWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q( + pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=tomorrow_date1, + date__date__lte=tomorrow_date2, trash=False) + for kill in kill_house_ware_houses: + if kill.kill_house.name not in names_list: + names_list.append(kill.kill_house.name) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, + trash=False) + number_of_steward = steward_allocations_for_number_of_steward.values( + 'steward').distinct().count() if steward_allocations_for_number_of_steward else 0 + + total_pre_cold_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[ + 'total'] + total_pre_cold_weight = \ + kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[ + 'total'] + total_number_of_free_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('free_weight_of_carcasses'))[ + 'total'] + total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + abc_list = ['A', 'B', 'D', 'F', 'H', 'J', 'L', 'N', 'P', 'S', 'R'] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + worksheet.row_dimensions[27].height = 47 + # worksheet.row_dimensions[3].height = 30 + # worksheet.row_dimensions[5].height = 19.04 + # worksheet.row_dimensions[8].height = 32 + + for abc in abc_list: + worksheet[f'{abc}28'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + withe_font = Font(size=10, color='D9FFFFFF') + blue = PatternFill(start_color="4472C4", fill_type="solid") + worksheet['A26'] = f'اطلاعات کلی توزیع و پخش مرغ از تاریخ {tommorow_date_1} تا {tomorrow_date_2}' + worksheet['G27'] = f'توزیع از کشتارگاه به مباشر و صنف' + worksheet['A28'] = f'تعداد خریداران' + worksheet['B28'] = f'ورودی از سردخانه' + worksheet['D28'] = f'پیش سرد' + worksheet['F28'] = f'خرید خارج از استان' + worksheet['H28'] = f'بارهای روزانه' + worksheet['J28'] = f'جمع کل انبار' + worksheet['L28'] = f'توزیع شده' + worksheet['N28'] = f'توزیع / تحویل شده' + worksheet['P28'] = f'مانده انبار' + worksheet['R28'] = f'تعداد مباشر تخصیص داده شده' + worksheet['S28'] = f'تعداد صنف تخصیص داده شده' + + worksheet['G27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A26'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['B28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['D28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['F28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['H28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['J28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['L28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['N28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['P28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['R28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['S28'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range12 = 'G27:L27' + merge_range0 = 'A26:D27' + merge_range1 = 'A28:A30' + merge_range2 = 'B28:C29' + merge_range3 = 'D28:E29' + merge_range4 = 'H28:I29' + merge_range5 = 'J28:K29' + merge_range6 = 'L28:M29' + merge_range7 = 'N28:O29' + merge_range8 = 'P28:Q29' + merge_range9 = 'R28:R30' + merge_range10 = 'S28:S30' + merge_range11 = 'F28:G29' + + worksheet.merge_cells(merge_range12) + worksheet.merge_cells(merge_range0) + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet.merge_cells(merge_range9) + worksheet.merge_cells(merge_range10) + worksheet.merge_cells(merge_range11) + + worksheet['A26'].font = red_font + worksheet['G27'].font = red_font + worksheet['A28'].font = withe_font + worksheet['B28'].font = withe_font + worksheet['D28'].font = withe_font + worksheet['F28'].font = withe_font + worksheet['H28'].font = withe_font + worksheet['J28'].font = withe_font + worksheet['L28'].font = withe_font + worksheet['N28'].font = withe_font + worksheet['P28'].font = withe_font + worksheet['R28'].font = withe_font + worksheet['S28'].font = withe_font + + worksheet['A28'].fill = blue + worksheet['B28'].fill = blue + worksheet['D28'].fill = blue + worksheet['F28'].fill = blue + worksheet['H28'].fill = blue + worksheet['J28'].fill = blue + worksheet['L28'].fill = blue + worksheet['N28'].fill = blue + worksheet['P28'].fill = blue + worksheet['R28'].fill = blue + worksheet['S28'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + + for item in range(len(list1)): + cell = worksheet.cell(row=30, column=item + 2, value=list1[item]) + worksheet.row_dimensions[30].height = 19 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + head_list1 = [len(names_list) + , 0, + 0, + total_pre_cold_quantity if total_pre_cold_quantity != None else 0, + total_pre_cold_weight if total_pre_cold_weight != None else 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + number_of_steward, + number_of_guild, + + ] + for item in range(len(head_list1)): + cell = worksheet.cell(row=31, column=item + 1, value=head_list1[item]) + worksheet.row_dimensions[31].height = 12 + value = head_list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + abc_list = ['A', 'B', 'D', 'F', 'H', 'J', 'L', 'N', 'P', 'R'] + + for abc in abc_list: + worksheet[f'{abc}36'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + withe_font = Font(size=10, color='D9FFFFFF') + blue = PatternFill(start_color="4472C4", fill_type="solid") + worksheet['A34'] = f'اطلاعات کلی توزیع و پخش مرغ از تاریخ {tommorow_date_1} تا {tomorrow_date_2}' + worksheet['G34'] = f'توزیع از مباشر به صنف' + worksheet['A36'] = f'تعداد خریداران' + worksheet['B36'] = f'ورودی از سردخانه' + worksheet['D36'] = f'پیش سرد' + worksheet['F36'] = f'خرید خارج از استان' + worksheet['H36'] = f'بارهای روزانه' + worksheet['J36'] = f'جمع کل انبار' + worksheet['L36'] = f'توزیع شده' + worksheet['N36'] = f'توزیع / تحویل شده' + worksheet['P36'] = f'مانده انبار' + worksheet['R36'] = f'تعداد صنف تخصیص داده شده' + + worksheet['G34'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A34'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['B36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['D36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['F36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['H36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['J36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['L36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['N36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['P36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['R36'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range12 = 'G34:L34' + merge_range0 = 'A34:D35' + merge_range1 = 'A36:A38' + merge_range2 = 'B36:C37' + merge_range3 = 'D36:E37' + merge_range4 = 'H36:I37' + merge_range5 = 'J36:K37' + merge_range6 = 'L36:M37' + merge_range7 = 'N36:O37' + merge_range8 = 'P36:Q37' + merge_range9 = 'R36:R38' + merge_range11 = 'F36:G37' + + worksheet.merge_cells(merge_range12) + worksheet.merge_cells(merge_range0) + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet.merge_cells(merge_range9) + worksheet.merge_cells(merge_range11) + + worksheet['A34'].font = red_font + worksheet['G34'].font = red_font + worksheet['A36'].font = withe_font + worksheet['B36'].font = withe_font + worksheet['D36'].font = withe_font + worksheet['F36'].font = withe_font + worksheet['H36'].font = withe_font + worksheet['J36'].font = withe_font + worksheet['L36'].font = withe_font + worksheet['N36'].font = withe_font + worksheet['P36'].font = withe_font + worksheet['R36'].font = withe_font + + worksheet['A36'].fill = blue + worksheet['B36'].fill = blue + worksheet['D36'].fill = blue + worksheet['F36'].fill = blue + worksheet['H36'].fill = blue + worksheet['J36'].fill = blue + worksheet['L36'].fill = blue + worksheet['N36'].fill = blue + worksheet['P36'].fill = blue + worksheet['R36'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + + for item in range(len(list1)): + cell = worksheet.cell(row=38, column=item + 2, value=list1[item]) + worksheet.row_dimensions[38].height = 19 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + steward_ware_houses = StewardWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(weight_of_free_carcasses__gt=0), date__date__gte=date1, + date__date__lte=date2, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + steward_ware_house__in=steward_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + total_number_of_free_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_free_carcasses'))[ + 'total'] + total_number_of_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + steward_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + steward_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + head_list1 = [number_of_steward, + 0, + 0, + 0, + 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + number_of_guild, + + ] + for item in range(len(head_list1)): + cell = worksheet.cell(row=39, column=item + 1, value=head_list1[item]) + worksheet.row_dimensions[39].height = 12 + value = head_list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + 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 + + +def pos_excel(request): + guilds = Guilds.objects.filter(trash=False, has_pos=False) + + if 'key' in request.GET: + poss = POSMachine.objects.filter(pos_company__user__key=request.GET['key'], trash=False).select_related('user', + 'guild', + 'user__province', + 'user__city') + else: + poss = POSMachine.objects.filter(trash=False).select_related('user', 'guild', 'user__province', 'user__city') + list1 = ['مشخصات کارتخوان ها', 'اصناف'] + + date1 = datetime.datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + output = BytesIO() + workbook = Workbook() + for name in list1: + min_list = [] + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000") + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + if sheet_name == 'مشخصات کارتخوان ها': + excel_options = [ + 'ردیف', + 'نام واحد صنفی', + 'نام شخص(موبایل)', + 'کد ملی', + 'نوع فعالیت', + 'حوزه فعالیت', + 'استان شهر', + 'مباشر', + 'شرکت', + 'آی دی', + 'شماره پذیرنده', + 'شماره ترمینال', + ] + + # برای بالای هدر + + worksheet['A1'] = f'گزارش مدیریت کارتخوان ها' + worksheet['A3'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:B1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 21.01 + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 7 + m = 1 + for pos in poss: + company_name = '-' + if pos.pos_company is not None: + company_name = pos.pos_company.name + + if pos.guild.steward == True: + state = 'می باشد' + else: + state = 'نمی باشد' + receiver_number = '-' + national_id = '-' + if pos.receiver_number is not None: + receiver_number = pos.receiver_number + if pos.user.national_id is not None: + national_id = pos.user.national_id + list1 = [ + m, + pos.guild.guilds_name, + pos.user.fullname + '(' + pos.user.mobile + ')', + national_id, + pos.guild.type_activity, + pos.guild.area_activity, + pos.user.province.name + '/' + pos.user.city.name, + state, + company_name, + pos.pos_id, + receiver_number, + pos.terminal_number + + ] + + for item in range(len(list1)): + cell = worksheet.cell(row=l, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + worksheet.row_dimensions[l + 1].height = 24 + l += 1 + m += 1 + else: + worksheet['A1'] = f'گزارش مدیریت اصناف فاقد کارتخوان' + worksheet['A3'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + + worksheet['A3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'A1:B1' + merge_range2 = 'A2:B2' + merge_range = 'A3:B3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['A1'].font = red_font + worksheet['A3'].font = Font(size=11) + excel_options = [ + 'ردیف', + 'شناسه صنف', + 'نام واحد صنفی', + 'نام شخص/شرکت', + 'موبایل', + 'کد ملی', + 'نوع فعالیت', + 'حوزه فعالیت', + 'کد پستی', + 'شماره مجوز', + 'استان/شهر', + 'آدرس', + 'مباشر', + 'حداکثر تخصیص', + 'محدودیت مباشر', + 'کشتارگاه انتخابی', + 'کارتخوان دارد/ندارد', + + ] + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[4].height = 25 + worksheet.freeze_panes = worksheet['A5'] + max_col = worksheet.max_column + range_str = f'A4:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 4 + m = 1 + for guild in guilds: + postal_code = guild.address.postal_code if guild.address.postal_code else '-' + national_code = guild.user.national_code if guild.user.national_code else '-' + steward = 'می باشد' if guild.steward == True else 'نمی باشد' + max_allocation = 0 + if guild.allocation_limit: + max_allocation = guild.allocation_limit + centers_allocations = '-' + kill_house_centers_allocations = '-' + if guild.centers_allocation != None: + for center_allocation in guild.centers_allocation: + centers_allocations = center_allocation['label'] + if guild.kill_house_centers_allocation != None: + for kill_house_centers_allocation in guild.kill_house_centers_allocation: + kill_house_centers_allocations = kill_house_centers_allocation['label'] + province = '-' + if guild.user.province: + province = guild.user.province.name + city = '-' + if guild.user.city: + city = guild.user.city.name + pos = 'دارد' if guild.has_pos == True else 'ندارد' + list1 = [ + m, + guild.guilds_id, + guild.guilds_name, + guild.user.fullname, + guild.user.mobile, + national_code, + guild.type_activity, + guild.area_activity, + postal_code, + guild.license_number, + province + '-' + city, + guild.address.address, + steward, + max_allocation, + centers_allocations, + kill_house_centers_allocations, + pos + + ] + l += 1 + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + worksheet.row_dimensions[l + 1].height = 24 + + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + 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 + + +def poultry_and_bar_daily_report_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + now_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(now_date.split("-")) + separate = "-" + now_fa_date = separate.join(reversed_date) + filtered_poultry_hatch = (PoultryHatching.objects.filter( + trash=False).select_related('poultry__user') + .only('quantity', 'killed_quantity', 'total_killed_weight', 'left_over', + 'total_commitment' + , 'governmental_quantity', 'governmental_killed_quantity', + 'losses', 'free_killed_quantity', 'free_quantity', 'out_province_killed_quantity', + 'out_province_killed_weight', 'create_date', + 'date', 'registrar', 'poultry__user__fullname', 'poultry__unit_name', + 'poultry__user__mobile', 'poultry__breeding_unique_id', 'poultry__system_code', + 'hall', 'period', 'chicken_breed', 'killed_quantity', 'total_average_killed_weight', + 'poultry__epidemiological_code', 'chicken_age', 'poultry__key') + .values('quantity', 'killed_quantity', 'total_killed_weight', 'left_over', + 'total_commitment' + , 'governmental_quantity', 'governmental_killed_quantity', + 'losses', 'free_killed_quantity', 'free_quantity', 'out_province_killed_quantity', + 'out_province_killed_weight', 'create_date', + 'date', 'registrar', 'poultry__user__fullname', 'poultry__unit_name', + 'poultry__user__mobile', 'poultry__breeding_unique_id', 'poultry__system_code', + 'hall', 'period', 'chicken_breed', 'killed_quantity', + 'total_average_killed_weight', + 'poultry__epidemiological_code', 'chicken_age', 'poultry__key')).order_by('-date') + + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', 'province_request', + 'province_request__poultry_request', + 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state').values( + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date', + 'province_request', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + ) + + header_list_gt_60_header = [ + 'تعداد فارم فعال', + 'مجموع جوجه ریزی', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان' + + ] + + header_list_between_50_60 = [ + 'تعداد فارم فعال', + 'مجموع جوجه ریزی', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان' + + ] + + header_list_between_40_50 = [ + 'تعداد فارم فعال', + 'مجموع جوجه ریزی', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان' + + ] + + header_list_no_license1 = [ + 'تعداد فارم فعال', + 'مجموع جوجه ریزی', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان' + + ] + + header_list = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + excel_options = { + 'آمار کشتار روزانه': [], + 'فارم بالای 60 روز': [], + 'فارم بین 50 تا 60 روز': [], + 'فارم بین 40 تا 50 روز': [], + 'تخلیه فارم بدون مجوز': [], + 'دامپزشکان فارم مغایرت قرنطینه': [], + 'عدم تخلیه دامپزشک کشتارگاه': [], + 'بار های تخلیه نشده کشتارگاه': [], + 'بار های تخلیه شده فاقد قرنطینه': [], + + } + output = BytesIO() + workbook = Workbook() + + gte_60 = filtered_poultry_hatch.filter(archive=False, + allow_hatching='pending', chicken_age__gt=60) + + between_50_60 = filtered_poultry_hatch.filter(archive=False, + allow_hatching='pending', chicken_age__gt=50, + chicken_age__lte=60) + between_40_50 = filtered_poultry_hatch.filter(archive=False, + allow_hatching='pending', chicken_age__gte=40, + chicken_age__lte=50) + + no_license1 = filtered_poultry_hatch.filter(archive=False, + allow_hatching='pending') + + filtered_kill_reqs_not_code_but_have_assigment = filtered_kill_reqs.filter( + Q(clearance_code__isnull=True) | Q(quantity__gt=F('quarantine_quantity')) | Q( + quantity__lt=F('quarantine_quantity'))) + + filtered_kill_reqs_not_assigment_but_have_code = filtered_kill_reqs.filter( + vet_state='pending') + + filtered_kill_reqs_not_assigment_but_have_code1 = filtered_kill_reqs.filter( + assignment_state_archive='pending', vet_state='pending') + + filtered_kill_reqs__assigment_but_havent_code = filtered_kill_reqs.filter(Q(assignment_state_archive='True', + vet_state='pending') | Q( + vet_state='accepted'), clearance_code__isnull=True) + + for name, options in excel_options.items(): + min_list = [] + + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000") + + for col_num, option in enumerate(options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=1, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + + # worksheet.column_dimensions[col_letter].width = 20.01 + # worksheet.row_dimensions[1].height = 22 + + if sheet_name == 'فارم بالای 60 روز': + + gt_60_header = [ + 'ردیف', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'مانده در سالن از نود درصد', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + ] + + for col_num, option in enumerate(header_list_gt_60_header, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + # worksheet['A1'] = f' وضعیت پرونده ها' + worksheet['B2'] = f'این گزارش در مورخ {now_fa_date} صادر شده است.' + + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + # merge_range2 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range2) + worksheet['B2'].font = red_font + + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(gt_60_header, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + all_left_over_ninty_percent = 0 + for poultry_hatching in gte_60: + l += 1 + + all_poultry_hatching_quantity += poultry_hatching['quantity'] + all_poultry_hatching_killed_quantity += poultry_hatching['killed_quantity'] + all_poultry_hatching_left_over += poultry_hatching['left_over'] + if poultry_hatching['chicken_age'] not in min_list: + min_list.append(poultry_hatching['chicken_age']) + + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching['create_date'].day, + month=poultry_hatching['create_date'].month, + year=poultry_hatching['create_date'].year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching['date'].day, + month=poultry_hatching['date'].month, + year=poultry_hatching['date'].year + ) + # date1 = datetime.datetime.strptime(str(poultry_hatching['date']), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now().date() - poultry_hatching['date'].date()).days + 1 + + creator = '-' + if poultry_hatching['registrar']: + if poultry_hatching['registrar']['fullname'] != '': + creator = poultry_hatching['registrar']['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching['quantity'] * 90) / 100) - poultry_hatching[ + 'killed_quantity'] + all_left_over_ninty_percent += left_over_ninty_percent + list1 = [ + m, + poultry_hatching['poultry__user__fullname'], + poultry_hatching['poultry__unit_name'], + poultry_hatching['poultry__user__mobile'], + poultry_hatching['poultry__breeding_unique_id'], + poultry_hatching['poultry__system_code'], + poultry_hatching['hall'], + poultry_hatching['period'], + str(create_date), + str(date), + poultry_hatching['chicken_breed'], + age, + poultry_hatching['quantity'], + poultry_hatching['losses'], + poultry_hatching['killed_quantity'], + poultry_hatching['total_killed_weight'], + poultry_hatching['left_over'], + left_over_ninty_percent, + poultry_hatching['total_commitment'], + poultry_hatching['governmental_quantity'], + poultry_hatching['governmental_killed_quantity'], + poultry_hatching['free_quantity'], + poultry_hatching['free_killed_quantity'], + str(poultry_hatching['total_average_killed_weight']), + creator, + poultry_hatching['poultry__epidemiological_code'] if poultry_hatching[ + 'poultry__epidemiological_code'] else '-', + poultry_hatching['out_province_killed_quantity'] if poultry_hatching[ + 'out_province_killed_quantity'] > 0 else '-', + poultry_hatching['out_province_killed_weight'] if poultry_hatching[ + 'out_province_killed_weight'] > 0 else '-', + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + min_list = sorted(min_list) + all_quantity = gte_60.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = gte_60.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_killed_quantity = gte_60.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = gte_60.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = gte_60.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = gte_60.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = gte_60.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = gte_60.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = gte_60.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = gte_60.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = gte_60.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = gte_60.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + value_header_list = [ + len(gte_60), + all_poultry_hatching_quantity, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'فارم بین 50 تا 60 روز': + + between_50_60_header = [ + 'ردیف', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'مانده در سالن از نود درصد', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + ] + + for col_num, option in enumerate(header_list_between_50_60, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + # worksheet['A1'] = f' وضعیت پرونده ها' + worksheet['B2'] = f'این گزارش در مورخ {now_fa_date} صادر شده است.' + + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + # merge_range2 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range2) + worksheet['B2'].font = red_font + + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(between_50_60_header, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + for poultry_hatching in between_50_60: + l += 1 + + all_poultry_hatching_quantity += poultry_hatching['quantity'] + all_poultry_hatching_killed_quantity += poultry_hatching['killed_quantity'] + all_poultry_hatching_left_over += poultry_hatching['left_over'] + if poultry_hatching['chicken_age'] not in min_list: + min_list.append(poultry_hatching['chicken_age']) + + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching['create_date'].day, + month=poultry_hatching['create_date'].month, + year=poultry_hatching['create_date'].year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching['date'].day, + month=poultry_hatching['date'].month, + year=poultry_hatching['date'].year + ) + # date1 = datetime.datetime.strptime(str(poultry_hatching['date']), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now().date() - poultry_hatching['date'].date()).days + 1 + + creator = '-' + if poultry_hatching['registrar']: + if poultry_hatching['registrar']['fullname'] != '': + creator = poultry_hatching['registrar']['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching['quantity'] * 90) / 100) - poultry_hatching[ + 'killed_quantity'] + all_left_over_ninty_percent += left_over_ninty_percent + list1 = [ + m, + poultry_hatching['poultry__user__fullname'], + poultry_hatching['poultry__unit_name'], + poultry_hatching['poultry__user__mobile'], + poultry_hatching['poultry__breeding_unique_id'], + poultry_hatching['poultry__system_code'], + poultry_hatching['hall'], + poultry_hatching['period'], + str(create_date), + str(date), + poultry_hatching['chicken_breed'], + age, + poultry_hatching['quantity'], + poultry_hatching['losses'], + poultry_hatching['killed_quantity'], + poultry_hatching['total_killed_weight'], + poultry_hatching['left_over'], + left_over_ninty_percent, + poultry_hatching['total_commitment'], + poultry_hatching['governmental_quantity'], + poultry_hatching['governmental_killed_quantity'], + poultry_hatching['free_quantity'], + poultry_hatching['free_killed_quantity'], + str(poultry_hatching['total_average_killed_weight']), + creator, + poultry_hatching['poultry__epidemiological_code'] if poultry_hatching[ + 'poultry__epidemiological_code'] else '-', + poultry_hatching['out_province_killed_quantity'] if poultry_hatching[ + 'out_province_killed_quantity'] > 0 else '-', + poultry_hatching['out_province_killed_weight'] if poultry_hatching[ + 'out_province_killed_weight'] > 0 else '-', + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + min_list = sorted(min_list) + all_quantity = between_50_60.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = between_50_60.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_killed_quantity = between_50_60.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = between_50_60.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = between_50_60.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = between_50_60.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = between_50_60.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = between_50_60.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = between_50_60.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = between_50_60.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = between_50_60.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = between_50_60.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + value_header_list = [ + len(between_50_60), + all_poultry_hatching_quantity, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'فارم بین 40 تا 50 روز': + + between_40_50_header = [ + 'ردیف', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'مانده در سالن از نود درصد', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + ] + + for col_num, option in enumerate(header_list_between_40_50, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + # worksheet['A1'] = f' وضعیت پرونده ها' + worksheet['B2'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + # merge_range2 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range2) + worksheet['B2'].font = red_font + + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(between_40_50_header, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + for poultry_hatching in between_40_50: + l += 1 + + all_poultry_hatching_quantity += poultry_hatching['quantity'] + all_poultry_hatching_killed_quantity += poultry_hatching['killed_quantity'] + all_poultry_hatching_left_over += poultry_hatching['left_over'] + if poultry_hatching['chicken_age'] not in min_list: + min_list.append(poultry_hatching['chicken_age']) + + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching['create_date'].day, + month=poultry_hatching['create_date'].month, + year=poultry_hatching['create_date'].year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching['date'].day, + month=poultry_hatching['date'].month, + year=poultry_hatching['date'].year + ) + # date1 = datetime.datetime.strptime(str(poultry_hatching['date']), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now().date() - poultry_hatching['date'].date()).days + 1 + + creator = '-' + if poultry_hatching['registrar']: + if poultry_hatching['registrar']['fullname'] != '': + creator = poultry_hatching['registrar']['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching['quantity'] * 90) / 100) - poultry_hatching[ + 'killed_quantity'] + all_left_over_ninty_percent += left_over_ninty_percent + list1 = [ + m, + poultry_hatching['poultry__user__fullname'], + poultry_hatching['poultry__unit_name'], + poultry_hatching['poultry__user__mobile'], + poultry_hatching['poultry__breeding_unique_id'], + poultry_hatching['poultry__system_code'], + poultry_hatching['hall'], + poultry_hatching['period'], + str(create_date), + str(date), + poultry_hatching['chicken_breed'], + age, + poultry_hatching['quantity'], + poultry_hatching['losses'], + poultry_hatching['killed_quantity'], + poultry_hatching['total_killed_weight'], + poultry_hatching['left_over'], + left_over_ninty_percent, + poultry_hatching['total_commitment'], + poultry_hatching['governmental_quantity'], + poultry_hatching['governmental_killed_quantity'], + poultry_hatching['free_quantity'], + poultry_hatching['free_killed_quantity'], + str(poultry_hatching['total_average_killed_weight']), + creator, + poultry_hatching['poultry__epidemiological_code'] if poultry_hatching[ + 'poultry__epidemiological_code'] else '-', + poultry_hatching['out_province_killed_quantity'] if poultry_hatching[ + 'out_province_killed_quantity'] > 0 else '-', + poultry_hatching['out_province_killed_weight'] if poultry_hatching[ + 'out_province_killed_weight'] > 0 else '-', + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + min_list = sorted(min_list) + all_quantity = between_40_50.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = between_40_50.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_killed_quantity = between_40_50.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = between_40_50.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = between_40_50.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = between_40_50.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = between_40_50.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = between_40_50.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = between_40_50.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = between_40_50.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = between_40_50.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = between_40_50.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + value_header_list = [ + len(between_40_50), + all_poultry_hatching_quantity, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'تخلیه فارم بدون مجوز': + + no_license1_header = [ + 'ردیف', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'مانده در سالن از نود درصد', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + ] + + for col_num, option in enumerate(header_list_no_license1, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + # worksheet['A1'] = f' وضعیت پرونده ها' + worksheet['B2'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + # merge_range2 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range2) + worksheet['B2'].font = red_font + + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(no_license1_header, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + no_license3 = [] + all_quantity = 0 + all_total_killed_weight = 0 + all_total_commitment = 0 + all_governmental_quantity = 0 + all_losses = 0 + all_governmental_killed_quantity = 0 + all_free_killed_quantity = 0 + all_free_quantity = 0 + all_out_province_killed_quantity = 0 + all_out_province_killed_weight = 0 + for no_license in no_license1: + if no_license['period'] > 1: + no_licence2 = (filtered_poultry_hatch.filter(left_over__gt=F('quantity') * 0.1, + poultry__key=no_license['poultry__key'] + , period=no_license['period'] - 1)) + no_license3.append(no_licence2) + + for p in no_license3: + for poultry_hatching in p: + + all_quantity += poultry_hatching['quantity'] + all_poultry_hatching_quantity += poultry_hatching['quantity'] + all_poultry_hatching_killed_quantity += poultry_hatching['killed_quantity'] + all_total_killed_weight += poultry_hatching['total_killed_weight'] + all_poultry_hatching_left_over += poultry_hatching['left_over'] + all_total_commitment += poultry_hatching['total_commitment'] + all_governmental_quantity += poultry_hatching['governmental_quantity'] + all_governmental_killed_quantity += poultry_hatching['governmental_killed_quantity'] + all_losses += poultry_hatching['losses'] + all_free_killed_quantity += poultry_hatching['free_killed_quantity'] + all_free_quantity += poultry_hatching['free_quantity'] + all_out_province_killed_quantity += poultry_hatching['out_province_killed_quantity'] + all_out_province_killed_weight += poultry_hatching['out_province_killed_weight'] + if poultry_hatching['chicken_age'] not in min_list: + min_list.append(poultry_hatching['chicken_age']) + + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching['create_date'].day, + month=poultry_hatching['create_date'].month, + year=poultry_hatching['create_date'].year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching['date'].day, + month=poultry_hatching['date'].month, + year=poultry_hatching['date'].year + ) + # date1 = datetime.datetime.strptime(str(poultry_hatching['date']), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now().date() - poultry_hatching['date'].date()).days + 1 + + creator = '-' + if poultry_hatching['registrar']: + if poultry_hatching['registrar']['fullname'] != '': + creator = poultry_hatching['registrar']['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching['quantity'] * 90) / 100) - poultry_hatching[ + 'killed_quantity'] + all_left_over_ninty_percent += left_over_ninty_percent + list1 = [ + m, + poultry_hatching['poultry__user__fullname'], + poultry_hatching['poultry__unit_name'], + poultry_hatching['poultry__user__mobile'], + poultry_hatching['poultry__breeding_unique_id'], + poultry_hatching['poultry__system_code'], + poultry_hatching['hall'], + poultry_hatching['period'], + str(create_date), + str(date), + poultry_hatching['chicken_breed'], + age, + poultry_hatching['quantity'], + poultry_hatching['losses'], + poultry_hatching['killed_quantity'], + poultry_hatching['total_killed_weight'], + poultry_hatching['left_over'], + left_over_ninty_percent, + poultry_hatching['total_commitment'], + poultry_hatching['governmental_quantity'], + poultry_hatching['governmental_killed_quantity'], + poultry_hatching['free_quantity'], + poultry_hatching['free_killed_quantity'], + str(poultry_hatching['total_average_killed_weight']), + creator, + poultry_hatching['poultry__epidemiological_code'] if poultry_hatching[ + 'poultry__epidemiological_code'] else '-', + poultry_hatching['out_province_killed_quantity'] if poultry_hatching[ + 'out_province_killed_quantity'] > 0 else '-', + poultry_hatching['out_province_killed_weight'] if poultry_hatching[ + 'out_province_killed_weight'] > 0 else '-', + ] + m += 1 + l += 1 + + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + min_list = sorted(min_list) + all_left_over = all_poultry_hatching_left_over + + value_header_list = [ + len(no_license3), + all_quantity, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + all_killed_quantity = all_poultry_hatching_killed_quantity + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'دامپزشکان فارم مغایرت قرنطینه': + + poultry_request = ( + PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs_not_code_but_have_assigment.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + all_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'دامپزشکان فارمی که گواهی قرنطینه ثبت نکرده اند یا مغایرت در تعداد قطعه دارند.' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:E1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_not_code_but_have_assigment.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_not_code_but_have_assigment.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs_not_code_but_have_assigment: + for kill in filtered_kill_reqs_not_code_but_have_assigment: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill['province_request__poultry_request__send_date'].date() - kill[ + 'province_request__poultry_request__hatching__date'].date()).days + 1 + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_not_code_but_have_assigment.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len( + filtered_kill_reqs_not_code_but_have_assigment.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_code_but_have_assigment), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'عدم تخلیه دامپزشک کشتارگاه': + + poultry_request = ( + PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs_not_assigment_but_have_code.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + all_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + worksheet['B1'] = f'بارهای تخلیه نشده با کد قرنطینه' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_not_assigment_but_have_code.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_not_assigment_but_have_code.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs_not_assigment_but_have_code: + for kill in filtered_kill_reqs_not_assigment_but_have_code: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + + age = (kill['province_request__poultry_request__send_date'].date() - kill[ + 'province_request__poultry_request__hatching__date'].date()).days + 1 + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_not_assigment_but_have_code.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_not_assigment_but_have_code.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len( + filtered_kill_reqs_not_assigment_but_have_code.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_assigment_but_have_code), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'بار های تخلیه نشده کشتارگاه': + + poultry_request = ( + PoultryRequest.objects.filter(trash=False, + pk__in=filtered_kill_reqs_not_assigment_but_have_code1.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + all_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + # worksheet['B1'] = f'بارهای تخلیه نشده با کد قرنطینه' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_not_assigment_but_have_code1.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_not_assigment_but_have_code1.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs_not_assigment_but_have_code1: + for kill in filtered_kill_reqs_not_assigment_but_have_code1: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + + age = (kill['province_request__poultry_request__send_date'].date() - kill[ + 'province_request__poultry_request__hatching__date'].date()).days + 1 + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs_not_assigment_but_have_code1.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_not_assigment_but_have_code1.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len( + filtered_kill_reqs_not_assigment_but_have_code1.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_assigment_but_have_code1), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'بار های تخلیه شده فاقد قرنطینه': + + poultry_request = ( + PoultryRequest.objects.filter(trash=False, + pk__in=filtered_kill_reqs__assigment_but_havent_code.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + all_quantity = filtered_kill_reqs__assigment_but_havent_code.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارها', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + # worksheet['B1'] = f'بارهای تخلیه نشده با کد قرنطینه' + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs__assigment_but_havent_code.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs__assigment_but_havent_code.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs__assigment_but_havent_code.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs__assigment_but_havent_code.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs__assigment_but_havent_code.aggregate( + total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs__assigment_but_havent_code.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs__assigment_but_havent_code.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs__assigment_but_havent_code: + for kill in filtered_kill_reqs__assigment_but_havent_code: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only( + 'vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user')).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + + age = (kill['province_request__poultry_request__send_date'].date() - kill[ + 'province_request__poultry_request__hatching__date'].date()).days + 1 + + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs__assigment_but_havent_code.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs__assigment_but_havent_code.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len( + filtered_kill_reqs__assigment_but_havent_code.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs__assigment_but_havent_code), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + elif sheet_name == 'آمار کشتار روزانه': + + worksheet['A2'] = f'این گزارش در مورخ {now_fa_date} صادر شده است.' + worksheet['G3'] = f'فارم های بالای 60 روز' + worksheet['G3'] = f'فارم بین 50 تا 60 روز' + worksheet['F8'] = f'فارم بین 50 تا 60 روز' + worksheet['F12'] = f'فارم بین 40 تا 50 روز' + worksheet['F17'] = f'تخلیه مرغداران بدون مجوز' + worksheet['B21'] = f' گزارش مغایرت در اطلاعات از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + worksheet['F22'] = 'بارهای دارای مغایرت یا فاقد کد قرنطینه (مسئول فنی فارم )' + worksheet['G27'] = 'بارهای تخلیه نشده توسط دامپزشک کشتارگاه' + worksheet['G32'] = 'بارهای تکمیل نشده توسط کشتارگاه' + worksheet['F37'] = 'بارهای تخلیه شده یا تکمیل شده فاقد کد قرنطینه' + + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['G3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['F8'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['F12'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['F17'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['B21'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['F22'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['G27'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['G32'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['F37'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:F2' + merge_range2 = 'G3:M3' + merge_range3 = 'F8:N8' + merge_range4 = 'F12:N12' + merge_range5 = 'F17:N17' + merge_range6 = 'B21:E22' + merge_range7 = 'F22:L22' + merge_range8 = 'G27:J27' + merge_range9 = 'G32:J32' + merge_range10 = 'F37:J37' + + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet.merge_cells(merge_range9) + worksheet.merge_cells(merge_range10) + worksheet['A2'].font = red_font + worksheet['B21'].font = red_font + + for col_num, option in enumerate(header_list_gt_60_header, 3): + cell = worksheet.cell(row=4, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FFFF00", fill_type="solid") + cell.font = Font(size=9, bold=True) + worksheet.row_dimensions[4].height = 36 + all_poultry_hatching_quantity_gte_60 = 0 + all_poultry_hatching_killed_quantity_gte_60 = 0 + all_poultry_hatching_left_over_gte_60 = 0 + all_left_over_ninty_percent_gte_60 = 0 + min_list_gte_60 = [] + + for poultry_hatching in gte_60: + + all_poultry_hatching_quantity_gte_60 += poultry_hatching['quantity'] + all_poultry_hatching_killed_quantity_gte_60 += poultry_hatching['killed_quantity'] + all_poultry_hatching_left_over_gte_60 += poultry_hatching['left_over'] + if poultry_hatching['chicken_age'] not in min_list_gte_60: + min_list_gte_60.append(poultry_hatching['chicken_age']) + left_over_ninty_percent = ((poultry_hatching['quantity'] * 90) / 100) - poultry_hatching[ + 'killed_quantity'] + all_left_over_ninty_percent_gte_60 += left_over_ninty_percent + min_list_gte_60 = sorted(min_list_gte_60) + all_total_commitment_gte_60 = gte_60.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity_gte_60 = gte_60.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity_gte_60 = gte_60.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight_gte_60 = gte_60.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity_gte_60 = gte_60.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity_gte_60 = gte_60.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity_gte_60 = gte_60.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight_gte_60 = gte_60.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + value_header_list1 = [ + len(gte_60), + all_poultry_hatching_quantity_gte_60, + all_poultry_hatching_killed_quantity_gte_60, + all_total_killed_weight_gte_60, + all_poultry_hatching_left_over_gte_60, + all_left_over_ninty_percent_gte_60, + min_list_gte_60[0] if len(min_list_gte_60) > 0 else '-', + min_list_gte_60[len(min_list) - 1] if len(min_list_gte_60) > 0 else '-', + all_total_commitment_gte_60, + all_governmental_quantity_gte_60, + all_governmental_killed_quantity_gte_60, + all_free_quantity_gte_60, + all_free_killed_quantity_gte_60, + all_out_province_killed_quantity_gte_60, + all_out_province_killed_weight_gte_60 + ] + for item in range(len(value_header_list1)): + cell = worksheet.cell(row=5, column=item + 3, value=value_header_list1[item]) + value = value_header_list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + for col_num, option in enumerate(header_list_between_50_60, 3): + cell = worksheet.cell(row=9, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="92CDDC", fill_type="solid") + cell.font = Font(size=9, bold=True) + worksheet.row_dimensions[9].height = 37 + + all_poultry_hatching_quantity_between_50_60 = 0 + all_poultry_hatching_killed_quantity_between_50_60 = 0 + all_poultry_hatching_left_over_between_50_60 = 0 + min_list_between_50_60 = [] + all_left_over_ninty_percent_between_50_60 = 0 + for poultry_hatching in between_50_60: + + all_poultry_hatching_quantity_between_50_60 += poultry_hatching['quantity'] + all_poultry_hatching_killed_quantity_between_50_60 += poultry_hatching['killed_quantity'] + all_poultry_hatching_left_over_between_50_60 += poultry_hatching['left_over'] + if poultry_hatching['chicken_age'] not in min_list_between_50_60: + min_list_between_50_60.append(poultry_hatching['chicken_age']) + + left_over_ninty_percent = ((poultry_hatching['quantity'] * 90) / 100) - poultry_hatching[ + 'killed_quantity'] + all_left_over_ninty_percent_between_50_60 += left_over_ninty_percent + + min_list_between_50_60 = sorted(min_list_between_50_60) + all_total_commitment_between_50_60 = between_50_60.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity_between_50_60 = between_50_60.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity_between_50_60 = between_50_60.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight_between_50_60 = between_50_60.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity_between_50_60 = between_50_60.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity_between_50_60 = between_50_60.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity_between_50_60 = between_50_60.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight_between_50_60 = between_50_60.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + value_header_list = [ + len(between_50_60), + all_poultry_hatching_quantity_between_50_60, + all_poultry_hatching_killed_quantity_between_50_60, + all_total_killed_weight_between_50_60, + all_poultry_hatching_left_over_between_50_60, + all_left_over_ninty_percent_between_50_60, + min_list_between_50_60[0] if len(min_list_between_50_60) > 0 else '-', + min_list_between_50_60[len(min_list) - 1] if len(min_list_between_50_60) > 0 else '-', + all_total_commitment_between_50_60, + all_governmental_quantity_between_50_60, + all_governmental_killed_quantity_between_50_60, + all_free_quantity_between_50_60, + all_free_killed_quantity_between_50_60, + all_out_province_killed_quantity_between_50_60, + all_out_province_killed_weight_between_50_60 + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=10, column=item + 3, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + for col_num, option in enumerate(header_list_between_40_50, 3): + cell = worksheet.cell(row=13, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="92D050", fill_type="solid") + cell.font = Font(size=9, bold=True) + worksheet.row_dimensions[13].height = 37 + + all_poultry_hatching_quantity_between_40_50 = 0 + all_poultry_hatching_killed_quantity_between_40_50 = 0 + all_poultry_hatching_left_over_between_40_50 = 0 + min_list_between_40_50 = [] + all_left_over_ninty_percent_between_40_50 = 0 + for poultry_hatching in between_40_50: + all_poultry_hatching_quantity_between_40_50 += poultry_hatching['quantity'] + all_poultry_hatching_killed_quantity_between_40_50 += poultry_hatching['killed_quantity'] + all_poultry_hatching_left_over_between_40_50 += poultry_hatching['left_over'] + if poultry_hatching['chicken_age'] not in min_list_between_40_50: + min_list_between_40_50.append(poultry_hatching['chicken_age']) + + left_over_ninty_percent = ((poultry_hatching['quantity'] * 90) / 100) - poultry_hatching[ + 'killed_quantity'] + all_left_over_ninty_percent_between_40_50 += left_over_ninty_percent + + min_list_between_40_50 = sorted(min_list_between_40_50) + + all_total_commitment_between_40_50 = between_40_50.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity_between_40_50 = between_40_50.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity_between_40_50 = between_40_50.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight_between_40_50 = between_40_50.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity_between_40_50 = between_40_50.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity_between_40_50 = between_40_50.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity_between_40_50 = between_40_50.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight_between_40_50 = between_40_50.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + value_header_list = [ + len(between_40_50), + all_poultry_hatching_quantity_between_40_50, + all_poultry_hatching_killed_quantity_between_40_50, + all_total_killed_weight_between_40_50, + all_poultry_hatching_left_over_between_40_50, + all_left_over_ninty_percent_between_40_50, + min_list_between_40_50[0] if len(min_list_between_40_50) > 0 else '-', + min_list_between_40_50[len(min_list) - 1] if len(min_list_between_40_50) > 0 else '-', + all_total_commitment_between_40_50, + all_governmental_quantity_between_40_50, + all_governmental_killed_quantity_between_40_50, + all_free_quantity_between_40_50, + all_free_killed_quantity_between_40_50, + all_out_province_killed_quantity_between_40_50, + all_out_province_killed_weight_between_40_50 + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=14, column=item + 3, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + for col_num, option in enumerate(header_list_no_license1, 3): + cell = worksheet.cell(row=18, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FCD5B4", fill_type="solid") + cell.font = Font(size=9, bold=True) + worksheet.row_dimensions[18].height = 37 + + all_poultry_hatching_quantity_no_license1 = 0 + all_poultry_hatching_killed_quantity_no_license1 = 0 + all_poultry_hatching_left_over_no_license1 = 0 + min_list_no_license1 = [] + all_left_over_ninty_percent_no_license1 = 0 + no_license3_no_license1 = [] + all_quantity_no_license1 = 0 + all_total_killed_weight_no_license1 = 0 + all_total_commitment_no_license1 = 0 + all_governmental_quantity_no_license1 = 0 + all_losses_no_license1 = 0 + all_governmental_killed_quantity_no_license1 = 0 + all_free_killed_quantity_no_license1 = 0 + all_free_quantity_no_license1 = 0 + all_out_province_killed_quantity_no_license1 = 0 + all_out_province_killed_weight_no_license1 = 0 + for no_license in no_license1: + if no_license['period'] > 1: + no_licence2_no_license1 = (filtered_poultry_hatch.filter(left_over__gt=F('quantity') * 0.1, + poultry__key=no_license['poultry__key'] + , period=no_license['period'] - 1)) + no_license3_no_license1.append(no_licence2_no_license1) + + for p in no_license3_no_license1: + for poultry_hatching in p: + + all_quantity_no_license1 += poultry_hatching['quantity'] + all_poultry_hatching_quantity_no_license1 += poultry_hatching['quantity'] + all_poultry_hatching_killed_quantity_no_license1 += poultry_hatching['killed_quantity'] + all_total_killed_weight_no_license1 += poultry_hatching['total_killed_weight'] + all_poultry_hatching_left_over_no_license1 += poultry_hatching['left_over'] + all_total_commitment_no_license1 += poultry_hatching['total_commitment'] + all_governmental_quantity_no_license1 += poultry_hatching['governmental_quantity'] + all_governmental_killed_quantity_no_license1 += poultry_hatching['governmental_killed_quantity'] + all_losses_no_license1 += poultry_hatching['losses'] + all_free_killed_quantity_no_license1 += poultry_hatching['free_killed_quantity'] + all_free_quantity_no_license1 += poultry_hatching['free_quantity'] + all_out_province_killed_quantity_no_license1 += poultry_hatching['out_province_killed_quantity'] + all_out_province_killed_weight_no_license1 += poultry_hatching['out_province_killed_weight'] + if poultry_hatching['chicken_age'] not in min_list_no_license1: + min_list_no_license1.append(poultry_hatching['chicken_age']) + + left_over_ninty_percent = ((poultry_hatching['quantity'] * 90) / 100) - poultry_hatching[ + 'killed_quantity'] + all_left_over_ninty_percent_no_license1 += left_over_ninty_percent + + min_list_no_license1 = sorted(min_list_no_license1) + + value_header_list = [ + len(no_license3_no_license1), + all_quantity_no_license1, + all_poultry_hatching_killed_quantity_no_license1, + all_total_killed_weight_no_license1, + all_poultry_hatching_left_over_no_license1, + all_left_over_ninty_percent_no_license1, + min_list_no_license1[0] if len(min_list_no_license1) > 0 else '-', + min_list_no_license1[len(min_list) - 1] if len(min_list_no_license1) > 0 else '-', + all_total_commitment_no_license1, + all_governmental_quantity_no_license1, + all_governmental_killed_quantity_no_license1, + all_free_quantity_no_license1, + all_free_killed_quantity_no_license1, + all_out_province_killed_quantity_no_license1, + all_out_province_killed_weight_no_license1 + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=19, column=item + 3, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + for col_num, option in enumerate(header_list, 4): + cell = worksheet.cell(row=23, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FFC000", fill_type="solid") + cell.font = Font(size=9, bold=True) + worksheet.row_dimensions[23].height = 48.8 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs_not_code_but_have_assigment.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs_not_code_but_have_assigment.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_vet_accepted_real_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs_not_code_but_have_assigment: + for kill in filtered_kill_reqs_not_assigment_but_have_code: + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + + has_code = len(filtered_kill_reqs_not_code_but_have_assigment.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs_not_code_but_have_assigment.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len( + filtered_kill_reqs_not_code_but_have_assigment.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_code_but_have_assigment), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=24, column=item + 4, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + for col_num, option in enumerate(header_list[:4], 7): + cell = worksheet.cell(row=28, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FFC000", fill_type="solid") + cell.font = Font(size=9, bold=True) + worksheet.row_dimensions[28].height = 48.8 + + all_quantity_2 = 0 + + all_weighte_2 = 0 + + if filtered_kill_reqs_not_assigment_but_have_code: + for kill in filtered_kill_reqs_not_assigment_but_have_code: + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity_2 += quantity + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte_2 += weight + + has_code_2 = len(filtered_kill_reqs_not_assigment_but_have_code.filter(clearance_code__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_assigment_but_have_code), + all_quantity_2, + all_weighte_2, + has_code_2, + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=29, column=item + 7, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + for col_num, option in enumerate(header_list[:4], 7): + cell = worksheet.cell(row=33, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FFC000", fill_type="solid") + cell.font = Font(size=9, bold=True) + worksheet.row_dimensions[33].height = 48.8 + all_quantity_3 = 0 + all_real_quantity_3 = 0 + all_net_weighte_3 = 0 + all_weighte_3 = 0 + if filtered_kill_reqs_not_assigment_but_have_code1: + for kill in filtered_kill_reqs_not_assigment_but_have_code1: + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity_3 += quantity + + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte_3 += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity_3 += real_quantity + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte_3 += weight + + has_code_3 = len(filtered_kill_reqs_not_assigment_but_have_code1.filter(clearance_code__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs_not_assigment_but_have_code1), + all_quantity_3, + all_weighte_3, + has_code_3, + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=34, column=item + 7, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + for col_num, option in enumerate(header_list[:3], 7): + cell = worksheet.cell(row=38, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="FFC000", fill_type="solid") + cell.font = Font(size=9, bold=True) + worksheet.row_dimensions[38].height = 48.8 + + all_quantity_4 = 0 + + all_weighte_4 = 0 + if filtered_kill_reqs__assigment_but_havent_code: + for kill in filtered_kill_reqs__assigment_but_havent_code: + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity_4 += quantity + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte_4 += weight + value_header_list = [ + len(filtered_kill_reqs__assigment_but_havent_code), + all_quantity_4, + all_weighte_4, + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=39, column=item + 7, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + 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 + + +def bar_free_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + + filterset_class = PoultryRequestFilterSet + filterset_fields = [ + 'order_code', + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__address__city__name', + + ] + + state = request.GET['state'] + + name_bar = '' + if request.GET['role'] == 'VetFarm': + user = SystemUserProfile.objects.get(key=request.GET['key']) + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False).order_by('-send_date') + + elif request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(key=request.GET['key']) + city_operator = CityOperator.objects.get(user=user) + if state == 'pending': + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'جدید' + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'تایید شده' + else: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + + name_bar = 'حذف/رد شده' + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'جدید' + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'تایید شده' + else: + name_bar = 'حذف/رد شده' + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + + + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']: + if request.GET['state'] == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'جدید' + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + name_bar = 'تایید شده' + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + trash=False).order_by('-send_date') + name_bar = 'رد شده' + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=poultry_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=poultry_requests) + poultry_requests = ps.filter() + + poultry_requests_accepted = poultry_requests.filter(province_state='accepted') + + excel_options = [ + 'ردیف', + 'وضعیت', + 'پرداخت کننده', + 'کدسفارش مرغدار', + ' تاریخ ثبت درخواست', + ' تاریخ کشتار', + ' کشتار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' استان مرغدار', + 'سن مرغ', + ' نژاد', + 'تعداد درخواست', + 'میانگین وزنی', + 'وزن درخواست', + 'مانده در سالن', + 'جوجه ریزی اولیه', + + ' ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + ' شهر خریدار', + 'استان خریدار', + 'محل کشتار', + 'کد یکتای کشتارگاه', + 'شهر محل کشتار', + + 'نوع خودرو', + 'پلاک', + + 'نام راننده', + 'موبایل راننده', + 'کد بهداشتی حمل و نقل', + + 'کد رهگیری سامانه قرنطینه', + 'تعداد در قرنطینه', + 'ثبت کننده کد قرنطینه', + 'تاریخ ثبت کد قرنطینه', + 'سازنده', + + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تایید شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای {name_bar} خارج از استان' + if poultry_requests.exists(): + name = poultry_requests.first().poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_weighte = 0 + all_chicken_quantity = 0 + all_age = [] + all_quantity = poultry_requests_accepted.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + all_weighte = poultry_requests_accepted.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] + + has_code = 0 + if poultry_requests: + for poultry_request in poultry_requests: + + # if ProvinceKillRequest.objects.filter( + # province_request__city_request_Poultry__poultry_request=poultry_request, + # state='accepted').exists(): + # age = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + # else: + age = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + all_age.append(age) + all_chicken_quantity += poultry_request.hatching.quantity + create_date_of_poultry_request = jdatetime.date.fromgregorian( + day=poultry_request.create_date.day, + month=poultry_request.create_date.month, + year=poultry_request.create_date.year + ) + date_of_kill_request = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + if poultry_request.quarantine_code_registrar is not None: + date_code = poultry_request.quarantine_code_registrar['date'].split('-') + + date_of_create_code = jdatetime.date.fromgregorian( + day=int(date_code[2]), + month=int(date_code[1]), + year=int(date_code[0]) + ) + full_name = poultry_request.quarantine_code_registrar['fullname'] + mobile = poultry_request.quarantine_code_registrar['mobile'] + else: + date_of_create_code = '-' + full_name = '-' + mobile = '-' + + killing_place = '-' + killing_place_city = '-' + uniq_id = '-' + if poultry_request.out_province_poultry_request_buyer: + if poultry_request.out_province_poultry_request_buyer.type == 'killhouse': + is_killer = 'کشتارگاه' + uniq_id = poultry_request.out_province_poultry_request_buyer.kill_house_unique_id if poultry_request.out_province_poultry_request_buyer.kill_house_unique_id else '-' + + else: + is_killer = 'کشتارکن' + killing_place = poultry_request.killer_kill_house_unit_name \ + if poultry_request.killer_kill_house_unit_name is not None \ + else '-' + killing_place_city = poultry_request.killer_kill_house_province \ + + '(' + poultry_request.killer_kill_house_city \ + + ')' if poultry_request.killer_kill_house_province \ + and poultry_request.killer_kill_house_city is not None \ + else '-' + uniq_id = poultry_request.kill_house_unique_id if poultry_request.kill_house_unique_id else '-' + else: + is_killer = 'کشتارگاه' if poultry_request.buyer is not None and poultry_request.buyer[ + 'buyerType'] == 'killhouse' else 'کشتارکن' + if PoultryRequestQuarantineCode.objects.filter(trash=False,poultry_request=poultry_request).exists(): + all_quanrantine=PoultryRequestQuarantineCode.objects.filter(trash=False,poultry_request=poultry_request) + quaranatine_quantity=all_quanrantine.aggregate(total=Sum('system_quarantine_quantity'))['total'] or 0 + all_code=all_quanrantine.values_list('quarantine_code',flat=True) + code='-'.join(all_code) + elif poultry_request.quarantine_code: + code = poultry_request.quarantine_code + quaranatine_quantity = poultry_request.quarantine_quantity + has_code += 1 + else: + code = '-' + quaranatine_quantity=0 + + freez_state = 'منجمد' if poultry_request.freezing == True else 'عادی' + + if poultry_request.out_province_poultry_request_buyer is not None: + full_name_buyer = poultry_request.out_province_poultry_request_buyer.fullname + mobile_buyer = poultry_request.out_province_poultry_request_buyer.user.mobile + city_buyer = poultry_request.out_province_poultry_request_buyer.user.city.name + province_buyer = poultry_request.out_province_poultry_request_buyer.user.province.name + + else: + full_name_buyer = poultry_request.buyer['firstName'] + mobile_buyer = poultry_request.buyer['mobile'] + city_buyer = poultry_request.buyer['city'] + province_buyer = poultry_request.buyer['province'] + + if poultry_request.province_state == 'rejected': + state1 = 'رد شده' + elif poultry_request.province_state == 'pending' and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار تایید' + + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'در انتظار پرداخت' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == False and poultry_request.wage_pay == False and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'تایید شده' + elif poultry_request.province_state == 'accepted' and poultry_request.has_wage == True and poultry_request.wage_pay == True and poultry_request.out_province_request_cancel == False and poultry_request.out_province_request_cancel == False: + state1 = 'پرداخت شده' + else: + state1 = 'لغو شده' + + list1 = [ + m, + state1, + poultry_request.payer_fullname if poultry_request.payer_fullname else '-', + str(poultry_request.order_code), + str(create_date_of_poultry_request), + str(date_of_kill_request), + freez_state, + poultry_request.poultry.user.fullname, + poultry_request.poultry.user.mobile, + poultry_request.poultry.user.city.name, + poultry_request.poultry.user.province.name, + age, + poultry_request.hatching.chicken_breed, + poultry_request.quantity, + poultry_request.Index_weight, + int(poultry_request.quantity * poultry_request.Index_weight), + poultry_request.hatching.left_over, + poultry_request.hatching.quantity, + is_killer, + full_name_buyer, + mobile_buyer, + city_buyer, + province_buyer, + killing_place, + uniq_id, + killing_place_city, + poultry_request.out_province_driver_info[ + 'driverCar'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverPelak'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverName'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverMobile'] if poultry_request.out_province_driver_info != None else '-', + poultry_request.out_province_driver_info[ + 'driverhealthCode'] if poultry_request.out_province_driver_info != None else '-', + code, + quaranatine_quantity, + full_name + '(' + mobile + ')', + str(date_of_create_code), + poultry_request.registrar['fullname'] if poultry_request.registrar else '-' + ] + + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(poultry_requests_accepted), + all_quantity if all_quantity != None else 0, + all_weighte if all_weighte != None else 0, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity if all_quantity != None else 0, + '', + all_weighte, + '', + all_chicken_quantity, + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def steward_ware_house_total_report_daily_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + names_list = {'اطلاعات کلی': '0'} + + steward_ware_houses = StewardWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(weight_of_free_carcasses__gt=0), date__date__gte=date1, + date__date__lte=date2, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + steward_ware_house__in=steward_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + for kill in steward_allocations: + if kill.steward_ware_house: + if kill.steward_ware_house.steward.guilds.key not in names_list.values(): + names_list.update( + {kill.steward_ware_house.steward.guilds.guilds_name: kill.steward_ware_house.steward.key}) + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + total_number_of_free_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_free_carcasses'))[ + 'total'] + total_number_of_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + steward_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + steward_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + abc_list = ['A', 'B', 'C', 'D', 'E', 'G', 'I', 'K', 'M', 'O', 'Q', 'S'] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + number_of_steward = Steward.objects.filter( + pk__in=steward_ware_houses.values('steward') + ) + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + for name, key in names_list.items(): + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + if sheet_name == 'اطلاعات کلی': + worksheet.row_dimensions[2].height = 24 + worksheet.row_dimensions[3].height = 30 + worksheet.row_dimensions[5].height = 19.04 + worksheet.row_dimensions[8].height = 32 + + worksheet['A2'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + worksheet['G2'] = f'اطلاعات کلی توزیع و پخش مرغ گرم از تاریخ {from_date_1} تا {to_date_1}' + + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['G2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range122 = 'A2:D2' + merge_range123 = 'G2:N2' + worksheet.merge_cells(merge_range122) + worksheet.merge_cells(merge_range123) + + worksheet['G2'].font = Font(size=12, color='FF0000') + + for abc in abc_list: + worksheet[f'{abc}8'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + for abc in abc_list[1:]: + worksheet[f'{abc}3'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + withe_font = Font(size=10, color='D9FFFFFF') + blue = PatternFill(start_color="4472C4", fill_type="solid") + green = PatternFill(start_color="00B050", fill_type="solid") + worksheet['B3'] = f'تعداد خریداران' + worksheet['C3'] = f'ورودی از سردخانه' + worksheet['E3'] = f'پیش سرد' + worksheet['G3'] = f'خرید خارج از استان' + worksheet['I3'] = f'بارهای روزانه' + worksheet['K3'] = f'جمع کل انبار' + worksheet['M3'] = f'توزیع شده' + worksheet['O3'] = f'توزیع / تحویل شده' + worksheet['Q3'] = f'مانده انبار' + worksheet['S3'] = f'تعداد صنف تخصیص داده شده' + + worksheet['C3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['E3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['G3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['I3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['K3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['M3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['O3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['Q3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['S3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range1 = 'C3:D4' + merge_range2 = 'E3:F4' + merge_range3 = 'G3:H4' + merge_range4 = 'I3:J4' + merge_range5 = 'K3:L4' + merge_range6 = 'M3:N4' + merge_range7 = 'O3:P4' + merge_range8 = 'Q3:R4' + merge_range9 = 'B3:B5' + merge_range10 = 'S3:S5' + + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet.merge_cells(merge_range9) + worksheet.merge_cells(merge_range10) + + worksheet['C3'].font = withe_font + worksheet['B3'].font = withe_font + worksheet['E3'].font = withe_font + worksheet['G3'].font = withe_font + worksheet['I3'].font = withe_font + worksheet['K3'].font = withe_font + worksheet['M3'].font = withe_font + worksheet['O3'].font = withe_font + worksheet['Q3'].font = withe_font + worksheet['S3'].font = withe_font + + worksheet['B3'].fill = blue + worksheet['C3'].fill = blue + worksheet['E3'].fill = blue + worksheet['G3'].fill = blue + worksheet['I3'].fill = blue + worksheet['K3'].fill = blue + worksheet['M3'].fill = blue + worksheet['O3'].fill = blue + worksheet['Q3'].fill = blue + worksheet['S3'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + + for item in range(len(list1)): + cell = worksheet.cell(row=5, column=item + 3, value=list1[item]) + worksheet.row_dimensions[5].height = 19 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + worksheet['A8'] = f'ردیف' + worksheet['B8'] = f'خریدار' + worksheet['C8'] = f'شهرستان' + worksheet['D8'] = f'تعداد صنف تخصیصی' + worksheet['E8'] = f'ورودی از سردخانه' + worksheet['G8'] = f'پیش سرد' + worksheet['I8'] = f'خرید خارج از استان' + worksheet['K8'] = f'بارهای روزانه' + worksheet['M8'] = f'جمع کل انبار' + worksheet['O8'] = f'توزیع شده' + worksheet['Q8'] = f'توزیع / تحویل شده' + worksheet['S8'] = f'مانده انبار' + + worksheet['A8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['C8'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['D8'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['E8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['G8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['I8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['K8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['M8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['O8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['Q8'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['S8'].alignment = Alignment(horizontal='center', vertical='center') + + merge_range11 = 'A8:A10' + merge_range12 = 'B8:B10' + merge_range13 = 'C8:C10' + merge_range14 = 'D8:D10' + merge_range1 = 'E8:F9' + merge_range2 = 'G8:H9' + merge_range3 = 'I8:J9' + merge_range4 = 'K8:L9' + merge_range5 = 'M8:N9' + merge_range6 = 'O8:P9' + merge_range7 = 'Q8:R9' + merge_range8 = 'S8:T9' + + worksheet.merge_cells(merge_range11) + worksheet.merge_cells(merge_range12) + worksheet.merge_cells(merge_range13) + worksheet.merge_cells(merge_range14) + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + + worksheet['A8'].font = withe_font + worksheet['B8'].font = withe_font + worksheet['C8'].font = withe_font + worksheet['D8'].font = withe_font + worksheet['E8'].font = withe_font + worksheet['G8'].font = withe_font + worksheet['I8'].font = withe_font + worksheet['K8'].font = withe_font + worksheet['M8'].font = withe_font + worksheet['O8'].font = withe_font + worksheet['Q8'].font = withe_font + worksheet['S8'].font = withe_font + + worksheet['A8'].fill = green + worksheet['B8'].fill = green + worksheet['C8'].fill = green + worksheet['D8'].fill = green + worksheet['E8'].fill = blue + worksheet['G8'].fill = blue + worksheet['I8'].fill = blue + worksheet['K8'].fill = blue + worksheet['M8'].fill = blue + worksheet['O8'].fill = blue + worksheet['Q8'].fill = blue + worksheet['S8'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + for item in range(len(list1)): + cell = worksheet.cell(row=10, column=item + 5, value=list1[item]) + worksheet.row_dimensions[5].height = 28 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + head_list1 = [len(number_of_steward), + 0, + 0, + 0, + 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + number_of_guild, + + ] + for item in range(len(head_list1)): + cell = worksheet.cell(row=6, column=item + 2, value=head_list1[item]) + worksheet.row_dimensions[6].height = 12 + value = head_list1[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + l = 11 + m = 1 + for steward in number_of_steward: + steward_ware_houses = StewardWareHouse.objects.filter( + Q(weight_of_carcasses__gt=0) | Q(weight_of_free_carcasses__gt=0), date__date__gte=date1, + date__date__lte=date2, steward=steward, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + steward_ware_house__in=steward_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + total_number_of_free_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_free_carcasses'))[ + 'total'] + total_number_of_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + steward_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + steward_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + list2 = [ + m, + steward.guilds.guilds_name, + steward.guilds.address.city.name, + number_of_guild, + 0, + 0, + 0, + 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + l += 1 + m += 1 + else: + worksheet['F2'] = f'اطلاعات کلی توزیع و پخش از مباشر به صنف از تاریخ {from_date_1} تا {to_date_1}' + + worksheet['F2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range122 = 'F2:N2' + worksheet.merge_cells(merge_range122) + + worksheet['F2'].font = Font(size=10) + + for abc in abc_list[2:]: + worksheet[f'{abc}3'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + withe_font = Font(size=12, bold=True, color='D9FFFFFF') + withe_font1 = Font(size=10, color='D9FFFFFF') + blue = PatternFill(start_color="4472C4", fill_type="solid") + worksheet['C3'] = f'ورودی از سردخانه' + worksheet['E3'] = f'پیش سرد' + worksheet['G3'] = f'خرید خارج از استان' + worksheet['I3'] = f'مجموع بارها' + worksheet['K3'] = f'جمع کل انبار' + worksheet['M3'] = f'توزیع شده' + worksheet['O3'] = f'توزیع / تحویل شده' + worksheet['Q3'] = f'مانده انبار' + worksheet['S3'] = f'تعداد صنف تخصیص داده شده' + + worksheet['C3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['E3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['G3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['I3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['K3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['M3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['O3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['Q3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + worksheet['S3'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + merge_range1 = 'C3:D4' + merge_range2 = 'E3:F4' + merge_range3 = 'G3:H4' + merge_range4 = 'I3:J4' + merge_range5 = 'K3:L4' + merge_range6 = 'M3:N4' + merge_range7 = 'O3:P4' + merge_range8 = 'Q3:R4' + merge_range9 = 'S3:S5' + + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + worksheet.merge_cells(merge_range9) + + worksheet['C3'].font = withe_font + worksheet['E3'].font = withe_font + worksheet['G3'].font = withe_font + worksheet['I3'].font = withe_font + worksheet['K3'].font = withe_font + worksheet['M3'].font = withe_font + worksheet['O3'].font = withe_font + worksheet['Q3'].font = withe_font + worksheet['S3'].font = withe_font1 + + worksheet['C3'].fill = blue + worksheet['E3'].fill = blue + worksheet['G3'].fill = blue + worksheet['I3'].fill = blue + worksheet['K3'].fill = blue + worksheet['M3'].fill = blue + worksheet['O3'].fill = blue + worksheet['Q3'].fill = blue + worksheet['S3'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + + for item in range(len(list1)): + cell = worksheet.cell(row=5, column=item + 3, value=list1[item]) + worksheet.row_dimensions[5].height = 19 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + steward = Steward.objects.get(key=key, trash=False) + + steward_ware_houses = StewardWareHouse.objects.filter(date__date__gte=date1, date__date__lte=date2, + steward=steward, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + steward_ware_house__in=steward_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + total_number_of_free_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_free_carcasses'))[ + 'total'] + total_number_of_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + steward_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + steward_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + list2 = [ + 0, + 0, + 0, + 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + number_of_guild, + + ] + + for item in range(len(list2)): + cell = worksheet.cell(row=6, column=item + 3, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + excel_options = [ + 'ردیف', + 'شناسه صنف', + 'تاریخ ثبت', + 'ماهیت', + 'نوع تخصیص', + 'نام واحد صنفی', + 'نام شخص', + 'کد ملی', + 'موبایل', + 'نوع فعالیت', + 'حوزه فعالیت', + 'شماره مجوز', + 'شهرستان', + 'تعداد لاشه تخصیص', + 'وزن لاشه تخصیصی', + 'تعداد لاشه تحویلی', + 'وزن لاشه تحویلی', + 'وضعیت', + 'کد احراز', + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=9, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[9].height = 26 + worksheet.freeze_panes = worksheet['A10'] + max_col = worksheet.max_column - 1 + range_str = f'A9:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + m = 1 + l = 10 + + steward = Steward.objects.get(key=key, trash=False) + + steward_ware_house = steward_ware_houses.filter(steward=steward) + + for s in steward_ware_house: + stewards = (StewardAllocation.objects.filter(trash=False, + steward_ware_house=s, + date__date__gte=date1, + date__date__lte=date2).select_related('guilds', + 'guilds__user', + 'guilds__address__city', + 'kill_house', + 'kill_house__kill_house_operator').order_by( + 'id')) + + if stewards.exists(): + for steward_allocation in stewards: + create_date = jdatetime.date.fromgregorian( + day=steward_allocation.create_date.day, + month=steward_allocation.create_date.month, + year=steward_allocation.create_date.year + ) + steward = 'مباشر' if steward_allocation.seller_type == 'steward' else 'صنف' + sell_type = 'اختصاصی' if steward_allocation.sell_type == 'exclusive' else 'آزاد' + type = 'دستی' if steward_allocation.type == 'manual' else 'اتوماتیک' + try: + guilds_name = steward_allocation.steward.guilds.guilds_name + guilds_id = steward_allocation.steward.guilds.guilds_id + fullname = steward_allocation.steward.guilds.user.fullname + national_id = steward_allocation.steward.guilds.user.national_id + mobile = steward_allocation.steward.guilds.user.mobile + type_activity = steward_allocation.steward.guilds.type_activity + area_activity = steward_allocation.steward.guilds.area_activity + license_number = steward_allocation.steward.guilds.license_number + city_name = steward_allocation.steward.guilds.address.city.name + except: + guilds_name = steward_allocation.guilds.guilds_name + guilds_id = steward_allocation.guilds.guilds_id + fullname = steward_allocation.guilds.user.fullname + national_id = steward_allocation.guilds.user.national_id + mobile = steward_allocation.guilds.user.mobile + type_activity = steward_allocation.guilds.type_activity + area_activity = steward_allocation.guilds.area_activity + license_number = steward_allocation.guilds.license_number + city_name = steward_allocation.guilds.address.city.name + if steward_allocation.receiver_state == 'pending': + reciver_type = 'در انتظار تحویل' + register = '-' + elif steward_allocation.receiver_state == 'accepted': + reciver_type = 'تحویل گرفته شد' + register = steward_allocation.logged_registration_code if steward_allocation.logged_registration_code else 'وارد نشده' + + else: + reciver_type = 'رد شده' + register = '-' + + list2 = [ + m, + guilds_id, + str(create_date), + steward, + f'{sell_type}({type})', + guilds_name, + fullname, + national_id, + mobile, + type_activity, + area_activity, + license_number, + city_name, + steward_allocation.number_of_carcasses, + steward_allocation.weight_of_carcasses, + steward_allocation.receiver_real_number_of_carcasses, + steward_allocation.receiver_real_weight_of_carcasses, + reciver_type, + register, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + m += 1 + l += 1 + 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 + + +def steward_ware_house_total_report_daily_detail_excel(request): + abc_list = ['A', 'B', 'C', 'D', 'E', 'G', 'I', 'K', 'M', 'O', 'Q', 'S'] + + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + + steward = Steward.objects.get(key=request.GET['key'], trash=False) + + steward_ware_houses = StewardWareHouse.objects.filter(date__date__gte=date1, date__date__lte=date2, + steward=steward, trash=False) + + steward_allocations = StewardAllocation.objects.filter( + Q(type='manual') | Q(type='auto', system_registration_code=True), + steward_ware_house__in=steward_ware_houses, receiver_state__in=('pending', 'accepted'), + trash=False).order_by( + 'id') + name = steward.guilds.guilds_name + + guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False) + number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0 + + total_number_of_free_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[ + 'total'] + total_free_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_free_carcasses'))[ + 'total'] + total_number_of_carcasses = steward_ware_houses.aggregate(total=Sum('number_of_carcasses'))[ + 'total'] + total_weight_of_carcasses = steward_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[ + 'total'] + + final_total_number_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + final_total_weight_of_carcasses = \ + steward_ware_houses.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_remain_quantity = \ + steward_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[ + 'total'] + + total_remain_weight = \ + steward_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[ + 'total'] + + total_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[ + 'total'] + + total_allocated_weight = \ + steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[ + 'total'] + + total_accepted_allocated_quantity = \ + steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[ + 'total'] + + total_accepted_allocated_weight = \ + steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[ + 'total'] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + names_list = [steward.guilds.guilds_name] + output = BytesIO() + workbook = Workbook() + for name in names_list: + sheet_name = name + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + worksheet['F2'] = f'اطلاعات کلی توزیع و پخش مرغ گرم از تاریخ {from_date_1} تا {to_date_1}' + + worksheet['F2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range122 = 'F2:N2' + worksheet.merge_cells(merge_range122) + + worksheet['F2'].font = Font(size=10) + + for abc in abc_list[2:11]: + worksheet[f'{abc}3'].border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + withe_font = Font(size=12, bold=True, color='D9FFFFFF') + blue = PatternFill(start_color="4472C4", fill_type="solid") + worksheet['C3'] = f'ورودی از سردخانه' + worksheet['E3'] = f'پیش سرد' + worksheet['G3'] = f'خرید خارج از استان' + worksheet['I3'] = f'بارهای روزانه' + worksheet['K3'] = f'جمع کل انبار' + worksheet['M3'] = f'توزیع شده' + worksheet['O3'] = f'توزیع / تحویل شده' + worksheet['Q3'] = f'مانده انبار' + + worksheet['C3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['E3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['G3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['I3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['K3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['M3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['O3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['Q3'].alignment = Alignment(horizontal='center', vertical='center') + + merge_range1 = 'C3:D4' + merge_range2 = 'E3:F4' + merge_range3 = 'G3:H4' + merge_range4 = 'I3:J4' + merge_range5 = 'K3:L4' + merge_range6 = 'M3:N4' + merge_range7 = 'O3:P4' + merge_range8 = 'Q3:R4' + + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range2) + worksheet.merge_cells(merge_range3) + worksheet.merge_cells(merge_range4) + worksheet.merge_cells(merge_range5) + worksheet.merge_cells(merge_range6) + worksheet.merge_cells(merge_range7) + worksheet.merge_cells(merge_range8) + + worksheet['C3'].font = withe_font + worksheet['E3'].font = withe_font + worksheet['G3'].font = withe_font + worksheet['I3'].font = withe_font + worksheet['K3'].font = withe_font + worksheet['M3'].font = withe_font + worksheet['O3'].font = withe_font + worksheet['Q3'].font = withe_font + + worksheet['C3'].fill = blue + worksheet['E3'].fill = blue + worksheet['G3'].fill = blue + worksheet['I3'].fill = blue + worksheet['K3'].fill = blue + worksheet['M3'].fill = blue + worksheet['O3'].fill = blue + worksheet['Q3'].fill = blue + + list1 = [' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن', ' تعداد', + 'وزن', ' تعداد', 'وزن', ' تعداد', 'وزن'] + + for item in range(len(list1)): + cell = worksheet.cell(row=5, column=item + 3, value=list1[item]) + worksheet.row_dimensions[5].height = 19 + + cell.fill = PatternFill(start_color="FFD966", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + list2 = [ + 0, + 0, + 0, + 0, + total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0, + total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0, + total_number_of_carcasses if total_number_of_carcasses != None else 0, + total_weight_of_carcasses if total_weight_of_carcasses != None else 0, + final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0, + final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0, + total_allocated_quantity if total_allocated_quantity != None else 0, + total_allocated_weight if total_allocated_weight != None else 0, + total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0, + total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0, + total_remain_quantity if total_remain_quantity != None else 0, + total_remain_weight if total_remain_weight != None else 0, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=6, column=item + 3, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.fill = PatternFill(start_color="E9EBF5", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.font = Font(size=10, bold=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='medium'), + right=openpyxl.styles.Side(style='medium'), + top=openpyxl.styles.Side(style='medium'), + bottom=openpyxl.styles.Side(style='medium') + ) + + excel_options = [ + 'ردیف', + 'شناسه صنف', + 'تاریخ ثبت', + 'ماهیت', + 'نوع تخصیص', + 'نام واحد صنفی', + 'نام شخص', + 'کد ملی', + 'موبایل', + 'نوع فعالیت', + 'حوزه فعالیت', + 'شماره مجوز', + 'شهرستان', + 'تعداد لاشه تخصیص', + 'وزن لاشه تخصیصی', + 'تعداد لاشه تحویلی', + 'وزن لاشه تحویلی', + 'وضعیت', + 'کد احراز', + ] + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=9, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[9].height = 26 + worksheet.freeze_panes = worksheet['A10'] + max_col = worksheet.max_column + range_str = f'A9:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + m = 1 + l = 10 + + stewards = (StewardAllocation.objects.filter(trash=False, + steward_ware_house__in=steward_ware_houses, + date__date__gte=date1, date__date__lte=date2).select_related( + 'guilds', + 'guilds__user', + 'guilds__address__city', + 'kill_house', + 'kill_house__kill_house_operator').order_by( + 'id')) + + if stewards.exists(): + for steward_allocation in stewards: + create_date = jdatetime.date.fromgregorian( + day=steward_allocation.create_date.day, + month=steward_allocation.create_date.month, + year=steward_allocation.create_date.year + ) + steward = 'مباشر' if steward_allocation.seller_type == 'steward' else 'صنف' + sell_type = 'اختصاصی' if steward_allocation.sell_type == 'exclusive' else 'آزاد' + type = 'دستی' if steward_allocation.type == 'manual' else 'اتوماتیک' + try: + guilds_name = steward_allocation.steward.guilds.guilds_name + guilds_id = steward_allocation.steward.guilds.guilds_id + fullname = steward_allocation.steward.guilds.user.fullname + national_id = steward_allocation.steward.guilds.user.national_id + mobile = steward_allocation.steward.guilds.user.mobile + type_activity = steward_allocation.steward.guilds.type_activity + area_activity = steward_allocation.steward.guilds.area_activity + license_number = steward_allocation.steward.guilds.license_number + city_name = steward_allocation.steward.guilds.address.city.name + except: + guilds_name = steward_allocation.guilds.guilds_name + guilds_id = steward_allocation.guilds.guilds_id + fullname = steward_allocation.guilds.user.fullname + national_id = steward_allocation.guilds.user.national_id + mobile = steward_allocation.guilds.user.mobile + type_activity = steward_allocation.guilds.type_activity + area_activity = steward_allocation.guilds.area_activity + license_number = steward_allocation.guilds.license_number + city_name = steward_allocation.guilds.address.city.name + if steward_allocation.receiver_state == 'pending': + reciver_type = 'در انتظار تحویل' + register = '-' + elif steward_allocation.receiver_state == 'accepted': + reciver_type = 'تحویل گرفته شد' + register = steward_allocation.logged_registration_code if steward_allocation.logged_registration_code else 'وارد نشده' + + else: + reciver_type = 'رد شده' + register = '-' + + list2 = [ + m, + guilds_id, + str(create_date), + steward, + f'{sell_type}({type})', + guilds_name, + fullname, + national_id, + mobile, + type_activity, + area_activity, + license_number, + city_name, + steward_allocation.number_of_carcasses, + steward_allocation.weight_of_carcasses, + steward_allocation.receiver_real_number_of_carcasses, + steward_allocation.receiver_real_weight_of_carcasses, + reciver_type, + register, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + m += 1 + l += 1 + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="{name} در تاریخ {str(now)}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def hatching_by_age_range(request): + min_age = request.GET.get('min_age') + max_age = request.GET.get('max_age') + + # فیلتر اولیه برای تمام داده‌ها + base_filtered_poultry_hatch = PoultryHatching.objects.filter( + Q(left_over__gt=F('quantity') * percent_of_losses) | Q(violation=True), + trash=False + ).select_related('poultry', 'poultry__user') + + # تفکیک فعال‌ها: فیلتر براساس now_age (سن روز) + active_poultry_hatch = base_filtered_poultry_hatch.filter( + archive=False, + allow_hatching='pending' + ) + if min_age and max_age: + # محاسبه now_age برای هر رکورد و فیلتر + active_list = [] + for hatching in active_poultry_hatch: + now_age = (datetime.datetime.now().date() - hatching.date.date()).days + 1 + if int(min_age) <= now_age <= int(max_age): + active_list.append(hatching.id) + active_poultry_hatch = active_poultry_hatch.filter(id__in=active_list) + active_poultry_hatch = active_poultry_hatch.order_by('-date') + + # تفکیک بایگانی‌ها: فیلتر براساس chicken_age (سن بایگانی) با همان min_age و max_age + archive_poultry_hatch = base_filtered_poultry_hatch.filter( + archive=True, + allow_hatching='True' + ) + if min_age and max_age: + archive_poultry_hatch = archive_poultry_hatch.filter( + chicken_age__gte=int(min_age), + chicken_age__lte=int(max_age) + ) + archive_poultry_hatch = archive_poultry_hatch.order_by('-archive_date') + + excel_options = [ + 'ردیف', + 'وضعیت فارم', + 'وضعیت تخلف', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'شهرستان', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن بایگانی', + 'سن روز', + 'تعداد جوجه ریزی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'یازده درصد جوجه ریزی', + 'تعداد تخلف', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + 'دلیل تخلف', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(datetime.datetime.now().date()) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_names = ['فعال', 'بایگانی'] + sheets_data = [ + {'name': 'فعال', 'data': active_poultry_hatch, 'is_archive': False}, + {'name': 'بایگانی', 'data': archive_poultry_hatch, 'is_archive': True} + ] + + for sheet_info in sheets_data: + sheet_name = sheet_info['name'] + filtered_data = sheet_info['data'] + is_archive = sheet_info['is_archive'] + + worksheet = workbook.create_sheet(sheet_name) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد فارم', + 'تعداد فارم فعال', + 'تعداد فارم بایگانی شده', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کشتارشده', + 'جمع کل مانده در سالن(قطعه)', + 'جمع مانده در سال فارم فعال(قطعه)', + 'جمع مانده در سالن فارم بایگانی(قطعه)', + 'کمترین سن ', + 'بیشترین سن ', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های فعال متخلف', + 'تعداد فارم های بایگانی متخلف', + ] + + create_header(worksheet, header_list, 5, 2, height=20) + worksheet['B2'] = f'این گزارش در مورخ {from_date_1} صادر شده است. بین بازه سنی {min_age} تا {max_age}' + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + worksheet.merge_cells(merge_range1) + worksheet['B2'].font = red_font + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22, width=20.1, different_cell='تعداد تخلف') + + l = 6 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation_count = 0 + len_archive_hatch = 0 + len_hatch = 0 + left_over_archive = 0 + left_over_active = 0 + all_eleven_percent = 0 + + for poultry_hatching in filtered_data: + now_age = (datetime.datetime.now().date() - poultry_hatching.date.date()).days + 1 + + reason = 'مانده بیش از حد مجاز در سالن' + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + + age = poultry_hatching.chicken_age + if age not in min_list: + min_list.append(age) + + if now_age not in min_list: + min_list.append(now_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + + if is_archive: + state = 'بایگانی' + len_archive_hatch += 1 + left_over_archive += poultry_hatching.left_over + else: + state = 'فعال' + len_hatch += 1 + left_over_active += poultry_hatching.left_over + creator = 'پنجره واحد' + left_over_ninty_percent = (poultry_hatching.quantity * percent_of_losses) + eleven_percent = (poultry_hatching.left_over - (poultry_hatching.quantity * percent_of_losses)) + all_left_over_ninty_percent += left_over_ninty_percent + all_eleven_percent += eleven_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + violation_count += 1 + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + + list1 = [ + m, + state, + farm_state, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.mobile, + poultry_hatching.poultry.user.city.name, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.poultry.system_code, + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.chicken_breed, + age, + now_age, + poultry_hatching.quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + left_over_ninty_percent, + eleven_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + reason, + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[2] == 'متخلف': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + + min_list = sorted(min_list) + all_quantity = filtered_data.aggregate(total_quantity=Sum('quantity')).get('total_quantity', 0) + all_losses = filtered_data.aggregate(total_quantity=Sum('losses')).get('total_quantity', 0) + all_direct_losses = filtered_data.aggregate(total_quantity=Sum('direct_losses')).get('total_quantity', 0) + all_total_losses = filtered_data.aggregate(total_quantity=Sum('total_losses')).get('total_quantity', 0) + all_killed_quantity = filtered_data.aggregate(total_quantity=Sum('killed_quantity')).get('total_quantity', 0) + all_left_over_total = filtered_data.aggregate(total_quantity=Sum('left_over')).get('total_quantity', 0) + all_total_commitment = filtered_data.aggregate(total_quantity=Sum('total_commitment')).get('total_quantity', 0) + all_governmental_killed_quantity = filtered_data.aggregate(total_quantity=Sum('governmental_killed_quantity')).get('total_quantity', 0) + all_free_killed_quantity = filtered_data.aggregate(total_quantity=Sum('free_killed_quantity')).get('total_quantity', 0) + all_total_killed_weight = filtered_data.aggregate(total_quantity=Sum('total_killed_weight')).get('total_quantity', 0) + all_governmental_quantity = filtered_data.aggregate(total_quantity=Sum('governmental_quantity')).get('total_quantity', 0) + all_free_quantity = filtered_data.aggregate(total_quantity=Sum('free_quantity')).get('total_quantity', 0) + all_out_province_killed_quantity = filtered_data.aggregate(total_quantity=Sum('out_province_killed_quantity')).get('total_quantity', 0) + all_out_province_killed_weight = filtered_data.aggregate(total_quantity=Sum('out_province_killed_weight')).get('total_quantity', 0) + + violation_count_in_filter = filtered_data.filter(violation=True).count() + + value_header_list = [ + len(filtered_data), + len_hatch, + len_archive_hatch, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + left_over_archive, + left_over_active, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + 0 if is_archive else violation_count_in_filter, + violation_count_in_filter if is_archive else 0 + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + all_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over_total, + all_left_over_ninty_percent, + all_eleven_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', '', '', '', + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' + else: + cell.value = value + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename=" جوجه ریزی های متخلف بین بازه سنی {min_age} تا {max_age}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def hatching_for_detail_killing_excel(request): + filtered_poultry_hatch = PoultryHatching.objects.filter(trash=False, + left_over__gt=F('quantity') * percent_of_losses, + chicken_age__range=(55, 90)).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + excel_options = [ + 'ردیف', + 'وضعیت فارم فعال/بایگانی', + 'وضعیت فارم', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'مانده در سالن از نود درصد', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + ] + date1 = datetime.datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد فارم', + 'تعداد فارم فعال', + 'تعداد فارم بایگانی شده', + 'مجموع جوجه ریزی', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کشتارشده', + 'جمع کل مانده در سالن(قطعه)', + 'جمع مانده در سال فارم فعال(قطعه)', + 'جمع مانده در سالن فارم بایگانی(قطعه)', + 'کمترین سن ', + 'بیشترین سن ', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های فعال متخلف', + 'تعداد فارم های بایگانی متخلف', + + ] + + for col_num, option in enumerate(header_list, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + # worksheet['A1'] = f' وضعیت پرونده ها' + worksheet['B2'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + # merge_range2 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range2) + worksheet['B2'].font = red_font + + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + len_archive_hatch = 0 + len_hatch = 0 + left_over_archive = 0 + left_over = 0 + for poultry_hatching in filtered_poultry_hatch: + age = '-' + if poultry_hatching.archive == True and poultry_hatching.allow_hatching == 'True': + if poultry_hatching.last_change: + date1 = datetime.datetime.strptime((poultry_hatching.last_change['date'].split(' ')[0]), + '%Y-%m-%d').date() + age = (date1 - poultry_hatching.date.date()).days + 1 + len_archive_hatch += 1 + left_over_archive += poultry_hatching.left_over + state = 'بایگانی' + elif poultry_hatching.archive == False and poultry_hatching.allow_hatching == 'pending': + age = (datetime.datetime.now().date() - poultry_hatching.date.date()).days + 1 + len_hatch += 1 + left_over += poultry_hatching.left_over + state = "فعال" + else: + state = '' + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) - poultry_hatching.killed_quantity + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'پیگیری' + violation += 1 + + list1 = [ + m, + state, + farm_state, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.mobile, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.poultry.system_code, + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.losses, + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[2] == 'متخلف': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + cell.alignment = Alignment(horizontal='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + violation_archive = len(filtered_poultry_hatch.filter(violation=True, archive=True, allow_hatching='True')) + violation_active = len( + filtered_poultry_hatch.filter(violation=True, archive=False, allow_hatching='pending')) + value_header_list = [ + len(filtered_poultry_hatch), + len_hatch, + len_archive_hatch, + all_poultry_hatching_quantity, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + left_over_archive, + left_over, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation_active, + violation_archive + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="فارم های متخلف بین 55تا 90 روز.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def bar_live_stock_support_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__freezing=True).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی منجمد' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def successful_transactions_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if "date1" in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if "date2" in request.GET else now + if 'key' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + kill_house_user=user, + status='completed', + transaction_type='wage-gateway', + trash=False).order_by('id') + else: + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + transaction_type='wage-gateway', + trash=False).order_by('id') + + excel_options = [ + 'ردیف', + 'تاریخ و زمان', + 'پرداخت کننده', + 'تعداد سفارشات', + 'تعداد کل(قطعه)', + 'وزن کل(کیلوگرم)', + 'شماره درخواست', + 'شماره پیگیری', + 'کد سفارش', + 'شماره کارت', + 'قیمت(ریال)', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + for transaction in transactions: + total_weight = 0 + total_quantity = 0 + total_request = 0 + wage_payment = WagePayment.objects.filter( + Q(orderId=transaction.orderId) | Q(tracking_code=transaction.saleReferenceId), + trash=False).first() + if wage_payment.province_kill_request != None: + total_request = len(wage_payment.province_kill_request) + for province_kill_req in wage_payment.province_kill_request: + province_kill = ProvinceKillRequest.objects.get(key=province_kill_req, trash=False) + total_weight += province_kill.total_killed_weight + total_quantity += province_kill.total_killed_quantity + date = transaction.date + date_create = convert_to_shamsi(datetime=date) + list1 = [ + m, + str(date_create), + transaction.payer, + total_request, + total_quantity, + total_weight, + str(transaction.refId) if transaction.refId != None else '-', + str(transaction.saleReferenceId) if transaction.saleReferenceId != None else '-', + str(transaction.orderId) if transaction.orderId != None else '-', + str(transaction.cardHolderPan) if transaction.cardHolderPan != None else '-', + transaction.amount + ] + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 29 + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + 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 + + +def unsuccessful_transactions_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if "date1" in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if "date2" in request.GET else now + if 'key' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + kill_house_user=user, + status='failed', + transaction_type='wage-gateway', + trash=False).order_by('id') + else: + transactions = ExternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='failed', + transaction_type='wage-gateway', + trash=False).order_by('id') + + excel_options = [ + 'ردیف', + 'تاریخ و زمان', + 'پرداخت کننده', + 'تعداد سفارشات', + 'تعداد کل(قطعه)', + 'وزن کل(کیلوگرم)', + 'شماره درخواست', + 'شماره پیگیری', + 'کد سفارش', + 'شماره کارت', + 'قیمت(ریال)', + 'متن خطا', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + for transaction in transactions: + total_weight = 0 + total_quantity = 0 + total_request = 0 + wage_payment = WagePayment.objects.filter( + Q(orderId=transaction.orderId) | Q(tracking_code=transaction.saleReferenceId), + trash=False).first() + if wage_payment.province_kill_request != None: + total_request = len(wage_payment.province_kill_request) + for province_kill_req in wage_payment.province_kill_request: + province_kill = ProvinceKillRequest.objects.get(key=province_kill_req, trash=False) + total_weight += province_kill.total_killed_weight + total_quantity += province_kill.total_killed_quantity + date = transaction.date + date_create = convert_to_shamsi(datetime=date) + message = transaction.message + if message == 'ﻛﺎرﺑﺮ_از_اﻧﺠﺎم_ﺗﺮاﻛﻨﺶ_ﻣﻨﺼﺮف_ﺷﺪه_اﺳﺖ': + message = 'ﻛﺎرﺑﺮ از اﻧﺠﺎم ﺗﺮاﻛﻨﺶ ﻣﻨﺼﺮف ﺷﺪه اﺳﺖ' + + list1 = [ + m, + str(date_create), + transaction.payer, + total_request, + total_quantity, + total_weight, + str(transaction.refId) if transaction.refId != None else '-', + str(transaction.saleReferenceId) if transaction.saleReferenceId != None else '-', + str(transaction.orderId) if transaction.orderId != None else '-', + str(transaction.cardHolderPan) if transaction.cardHolderPan != None else '-', + transaction.amount, + message + ] + m += 1 + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 29 + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + + 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 + + +def poultry_hatching_between_50age_70age_excel(request): + filtered_poultry_hatch = PoultryHatching.objects.filter(trash=False, left_over__gt=F('quantity') * 0.1, + chicken_age__range=(55, 90)).order_by('id') + + excel_options = [ + 'ردیف', + 'وضعیت فارم', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + ] + date1 = datetime.datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد فارم فعال', + 'مجموع جوجه ریزی', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + + ] + + for col_num, option in enumerate(header_list, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + # worksheet['A1'] = f' وضعیت پرونده ها' + worksheet['B2'] = f'این گزارش در مورخ {from_date_1} صادر شده است.' + + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B2:C3' + # merge_range2 = 'B2:C2' + + worksheet.merge_cells(merge_range1) + # worksheet.merge_cells(merge_range2) + worksheet['B2'].font = red_font + + # cell = worksheet.cell(row=1, column=1) + # cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + for poultry_hatching in filtered_poultry_hatch: + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + violation += 1 + + list1 = [ + m, + farm_state, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.mobile, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.poultry.system_code, + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.losses, + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[1] == 'متخلف': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + cell.alignment = Alignment(horizontal='center') + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + value_header_list = [ + len(filtered_poultry_hatch), + all_poultry_hatching_quantity, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="گزارش کلی فارم های فعال مرغ گوشتی دارای مانده در سالن بیشتر از 10 درصد و بازه سنی 55 تا 90 روزه.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def number_of_times_with_quarantine_code_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + clearance_code__isnull=False).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای دارای کد قرنطینه' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def the_burden_of_quarantine_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + quarantine_quantity__isnull=False).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای احراز شده از قرنطینه' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def bar_without_quarantine_code_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + clearance_code__isnull=True).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای فاقد کد قرنطینه' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def loads_that_differ_in_quarantine_and_cooperation_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')), trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهایی که در قرنطینه و رصدیار اختلاف دارند' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def government_burden_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + province_request__poultry_request__free_sale_in_province=False, trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بار دولتی' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def goverment_bar_state_with_a_certified_quarantine_code_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + province_request__poultry_request__free_sale_in_province=False, quarantine_quantity__isnull=False, trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بار دولتی دارای کد قرنطینه احراز شده' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def free_loads_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + province_request__poultry_request__free_sale_in_province=True, trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای آزاد' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def free_cargoes_obtained_from_quarantine_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + province_request__poultry_request__free_sale_in_province=True, quarantine_quantity__isnull=False, trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای آزاد احراز شده از قرنطینه' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def free_loads_with_quarantine_code_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + province_request__poultry_request__free_sale_in_province=True, clearance_code__isnull=False, trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای آزاد دارای کد قرنطینه' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def loads_outside_the_province_excel(request): + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() if 'date2' in request.GET else now + + poultry_requests = (PoultryRequest.objects.filter(trash=False, out=True, province_state='accepted', + out_province_request_cancel=False + , send_date__date__gte=date1 + , send_date__date__lte=date2).order_by( + '-send_date').select_related('poultry', 'poultry__user', 'hatching')) + + poultry_requests_accepted = poultry_requests.filter(province_state='accepted') + + excel_options = [ + 'ردیف', + 'کدسفارش مرغدار', + ' تاریخ ثبت درخواست', + ' تاریخ کشتار', + ' کشتار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + ' استان مرغدار', + 'سن مرغ', + ' نژاد', + 'تعداد درخواست', + 'میانگین وزنی', + 'وزن درخواست', + 'مانده در سالن', + 'جوجه ریزی اولیه', + + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' شهر خریدار', + ' استان خریدار', + + 'نوع خودرو', + 'پلاک', + + 'نام راننده', + 'موبایل راننده', + 'کد بهداشتی حمل و نقل', + + 'کد رهگیری سامانه قرنطینه', + 'ثبت کننده کد قرنطینه', + 'تاریخ ثبت کد قرنطینه', + 'وضعیت', + 'سازنده', + + ] + + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای تایید شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'کمترین سن مرغ', + 'بیشترین سن مرغ', + 'تعداد بارهای دارای کد قرنطینه', + + ] + for col_num, option in enumerate(header_list, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای خارج از استان' + if poultry_requests.exists(): + name = poultry_requests.first().poultry.user.province.name + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 6 + m = 1 + + all_weighte = 0 + all_chicken_quantity = 0 + all_age = [] + all_quantity = poultry_requests_accepted.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + + all_weighte = poultry_requests_accepted.aggregate( + total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] + + has_code = 0 + if poultry_requests: + for poultry_request in poultry_requests: + age = (poultry_request.send_date.date() - poultry_request.hatching.date.date()).days + 1 + all_age.append(age) + all_chicken_quantity += poultry_request.hatching.quantity + create_date_of_poultry_request = jdatetime.date.fromgregorian( + day=poultry_request.create_date.day, + month=poultry_request.create_date.month, + year=poultry_request.create_date.year + ) + date_of_kill_request = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + if poultry_request.quarantine_code_registrar is not None: + date_code = poultry_request.quarantine_code_registrar['date'].split('-') + + date_of_create_code = jdatetime.date.fromgregorian( + day=int(date_code[2]), + month=int(date_code[1]), + year=int(date_code[0]) + ) + full_name = poultry_request.quarantine_code_registrar['fullname'] + mobile = poultry_request.quarantine_code_registrar['mobile'] + else: + date_of_create_code = '-' + full_name = '-' + mobile = '-' + is_killer = 'کشتارگاه' if poultry_request.buyer is not None and poultry_request.buyer[ + 'buyerType'] == 'killhouse' else 'کشتارکن' + if poultry_request.quarantine_code: + code = poultry_request.quarantine_code + has_code += 1 + else: + code = '-' + + if poultry_request.province_state == 'pending': + state = 'در انتظار تایید' + elif poultry_request.province_state == 'accepted': + state = 'تایید شده' + else: + state = 'حذف شده' + freez_state = 'منجمد' if poultry_request.freezing == True else 'عادی' + list1 = [ + m, + str(poultry_request.order_code), + str(create_date_of_poultry_request), + str(date_of_kill_request), + freez_state, + poultry_request.poultry.user.fullname, + poultry_request.poultry.user.mobile, + poultry_request.poultry.user.city.name, + poultry_request.poultry.user.province.name, + age, + poultry_request.hatching.chicken_breed, + poultry_request.quantity, + poultry_request.Index_weight, + int(poultry_request.quantity * poultry_request.Index_weight), + poultry_request.hatching.left_over, + poultry_request.hatching.quantity, + is_killer, + poultry_request.buyer['firstName'], + poultry_request.buyer['mobile'], + poultry_request.buyer['city'], + poultry_request.buyer['province'], + poultry_request.out_province_driver_info['driverCar'], + poultry_request.out_province_driver_info['driverPelak'], + poultry_request.out_province_driver_info['driverName'], + poultry_request.out_province_driver_info['driverMobile'], + poultry_request.out_province_driver_info['driverhealthCode'], + code, + full_name + '(' + mobile + ')', + str(date_of_create_code), + state, + poultry_request.registrar['fullname'] if poultry_request.registrar else '-' + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + l += 1 + + # last_age=sorted(reversed(all_age)) + all_age = sorted(all_age) + value_header_list2 = [ + len(poultry_requests_accepted), + all_quantity if all_quantity != None else 0, + all_weighte if all_weighte != None else 0, + all_age[0] if len(all_age) > 0 else None, + all_age[len(all_age) - 1] if len(all_age) > 0 else None, + has_code, + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity if all_quantity != None else 0, + '', + all_weighte, + '', + all_chicken_quantity, + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def loads_entering_the_slaughterhouse_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + ware_house_confirmation=True, trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای ورودی به کشتارگاه' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def veterinarian_unloaded_load_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + vet_state='accepted', trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای تخلیه شده دامپزشک' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def completed_slaughterhouse_loads_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + assignment_state_archive='True', trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای تکمیل شده کشتارگاه' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def unloaded_cargo_without_quarantine_code_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + Q(assignment_state_archive='True', vet_state='pending') + | Q(vet_state='accepted'), clearance_code__isnull=True, trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای تخلیه شده فاقد کد قرنطینه ' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def unloaded_load_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + assignment_state_archive='pending', vet_state='pending', trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای تخلیه نشده' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def loads_unloaded_and_not_completed_by_the_slaughterhouse_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + filtered_kill_reqs = KillHouseRequest.objects.filter( + assignment_state_archive='pending' + , vet_state='accepted', trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2 + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values( + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', 'province_request__poultry_request__hatching__date' + ) + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای تخلیه شده و عدم تکمیل توسط کشتارگاه' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] != None else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] != None else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + 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 + + +def hatching_date_range_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + filtered_poultry_hatch = PoultryHatching.objects.filter(date__date__gte=date1, date__date__lte=date2, archive=False, + allow_hatching='pending', + trash=False).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + excel_options = [ + 'ردیف', + 'وضعیت فارم', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + + from_date_1 = shamsi_date(date1) + from_date_2 = shamsi_date(date2) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'جوجه ریزی های فعال از تاریخ {from_date_1} تا {from_date_2}', color='red', + row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = poultry_hatching.chicken_age + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(وجود فارم فعال دیگر)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + + list1 = [ + m, + farm_state, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.mobile, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.poultry.system_code, + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def wallete_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(key=request.GET['key']) + transactions = ExternalTransaction.objects.filter(type__isnull=False, + date__date__gte=date1, + date__date__lte=date2, + kill_house_user=user, + status__in=('completed', 'failed'), + transaction_type='wallet', + trash=False).order_by('id') + + excel_options = [ + 'ردیف', + 'وضعیت پرداختی', + 'تاریخ و زمان', + 'پرداخت کننده', + 'شماره درخواست', + 'شماره پیگیری', + 'کدسفارش', + 'شماره کارت', + 'مبلغ', + 'متن خطا', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + from_date2 = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date2.split("-")) + separate = "-" + from_date_2 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد تراکنش ها', + 'تعداد تراکنش های موفق', + 'مبلغ تراکنش های موفق', + 'تعداد تراکنش های ناموفق', + 'مبلغ تراکنش های ناموفق', + + ] + + for col_num, option in enumerate(header_list, 5): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20 + + worksheet['B2'] = f'گزارش کیف پول کشتارگاه از تاریخ {from_date_1} تا {from_date_2}' + + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'B2:D3' + worksheet.merge_cells(merge_range1) + worksheet['B2'].font = red_font + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[6].height = 22 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + l = 5 + m = 1 + + for transaction in transactions: + l += 1 + state = 'موفق' if transaction.status == 'completed' else 'ناموفق' + date = convert_to_shamsi( + datetime=transaction.date + ) + list1 = [ + m, + state, + date, + transaction.payer, + transaction.orderId, + transaction.saleReferenceId if transaction.saleReferenceId is not None else '-', + transaction.orderId, + transaction.cardHolderPan if transaction.cardHolderPan is not None else '-', + transaction.amount, + transaction.message if transaction.message is not None else '-', + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[1] == 'ناموفق': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + complete_trans = transactions.filter(status='completed') + complete_trans_amount = complete_trans.aggregate( + total_quantity=Sum('amount')).get( + 'total_quantity') or 0 + failed_trans = transactions.filter(status='failed') + failed_trans_amount = failed_trans.aggregate( + total_quantity=Sum('amount')).get( + 'total_quantity') or 0 + value_header_list = [ + m - 1, + len(complete_trans), + complete_trans_amount, + len(failed_trans), + failed_trans_amount, + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 5, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + 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 + + +def kill_house_request_suspended_load_excel(request): + date1 = datetime.datetime.strptime(str(request.GET['start']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['end']), '%Y-%m-%d').date() + filtered_kill_request = KillHouseRequest.objects.filter( + Q(trash=False) | Q(trash=True, clearance_code__isnull=False), + + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, vet_state='pending', assignment_state_archive='pending').order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('message', 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date').values('message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date' + ) + if 'key' in request.GET: + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__user__city=user.city) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + filtered_kill_reqs = filtered_kill_request.filter( + province_request__poultry_request__poultry__in=poultries) + + elif request.GET['role'] == 'KillHouse': + filtered_kill_reqs = filtered_kill_request.filter(killhouse_user=user) + else: + filtered_kill_reqs = filtered_kill_request + else: + filtered_kill_reqs = filtered_kill_request + else: + filtered_kill_reqs = filtered_kill_request + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + ' محل کشتار ', + 'نوع تخصیص', + + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + + ] + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + to_date = jdatetime.date.fromgregorian( + year=date2.year, + month=date2.month, + day=date2.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(to_date.split("-")) + separate = "-" + to_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای معلق در فرآیند کشتار مرغ گوشتی' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate(total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter(poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + all_quantity += quantity + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = assignment.get('net_weight') + all_net_weighte += net_weighte + real_quantity = assignment.get('real_quantity') + all_real_quantity += real_quantity + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = kill['vet_accepted_real_weight'] if kill['vet_accepted_real_weight'] else '-' + + weight = kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight') + all_weighte += weight + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + elif kill['quarantine_code_state'] == 'merge': + quarantine_quantity = 'ادغام' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + kill['accepted_real_weight'], + state_delete, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + + value_header_list = [ + len(filtered_kill_reqs), + all_quantity, + all_weighte, + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + len(bar_complete), + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0 + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + total_requests_weight + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + all_weighte, + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + all_vet_accepted_real_weight, + all_real_quantity, + all_net_weighte, + accepted_real_quantity if accepted_real_quantity != None else 0, + accepted_real_wight if accepted_real_wight != None else 0, + '' + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int, float)): + cell.number_format = '#,##0' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + + if 'role' in request.GET: + if request.GET['role'] == 'KillHouse': + name = filtered_kill_request.first()['killhouse_user__name'] + response[ + 'Content-Disposition'] = f'attachment; filename="مدیریت بارهای کشتارگاه {name}.xlsx"'.encode( + 'utf-8') + else: + response[ + 'Content-Disposition'] = f'attachment; filename=" مدیریت بارها معلق.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def chain_excel(request): + chain = ChainCompany.objects.filter(trash=False) + + excel_options = [ + 'ردیف', + 'نام شرکت', + 'نام مدیرعامل', + 'نام خانوادگی مدیرعامل', + 'موبایل', + 'شهر', + 'آدرس', + 'کد پستی', + + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 26.01 + worksheet.row_dimensions[3].height = 25 + worksheet.freeze_panes = worksheet['A4'] + max_col = worksheet.max_column + range_str = f'A3:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + worksheet['A2'] = f'مدیریت شرکت های استان {chain.first().address.province.name}' + + worksheet['A2'].font = Font(color="C00000", bold=True) + worksheet['A2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + merge_range1 = 'A2:B2' + + worksheet.merge_cells(merge_range1) + l = 2 + m = 1 + + for user in chain: + + list1 = [ + m, + user.name, + user.user.first_name, + user.user.last_name, + user.user.mobile, + user.address.city.name, + user.address.address, + user.address.postal_code, + + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + m += 1 + 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 + + +def test_excel(request): + start_excel() + return close_excel('nima') + + +def test_all_excel_functions(request): + from panel.VetFarm.excel_processing import technical_responsible_performance_excel, totoal_technical_responsible_performance_excel + from panel.ProvinceOperator.excel_processing import ( + kill_house_total_transactions_wage_payid_super_admin_excel, kill_house_total_transactions_wage_payid_excel, + payment_transactions_province_excel, general_free_bar_excel, out_province_poultry_request_buyers_excel, + chain_company_buyers_excel, bar_chain_excel, kill_house_total_transactions_wage_payid_admin_x_excel, + buy_outside_the_province_excel, poultry_request_report_excel, transacion_out_request_excel, + from_allocation_to_distribution_excel, login_user_excel, city_operator_for_sub_sector_excel, + vet_for_sub_sector_excel, guild_for_sub_sector_excel, all_guilds_transaction_excel, + detail_guilds_transaction_excel, management_hatching_excel, user_without_role_excel, + sub_section_of_cooperative_share_detail_with_date_excel, vet_for_sub_sector_with_date_excel, + dashboard_monitoring_bar_and_killing_excel, steward_allocation_excel, + sevrence_kill_house_steward_allocation_excel, free_sale_out_province_excel, + steward_free_sale_out_province_excel, total_steward_dashboard_excel, + detail_of_killing_and_warehouse_excel, market_requests_excel, return_province_request_excel, + guilds_without_allocation_excel + ) + from panel.poultry.excel_processing import ( + hatching_excel, archive_hatching_excel, hatching_age_range_excel, poultry_monitoring_excel, + poultry_hatching_prediction_chart_excel, hatching_report_from_age_excel, + poultry_hatching_prediction_excel, bar_difference_reques_excel + ) + from panel.KillHouse.excel_processing import ( + direct_purchase_excel, direct_purchase_archive_excel, kill_house_assignment_information_excel, + kill_house_user_excel, bar_excel, kill_house_total_wage_excel, slaughterhouse_export_excel, + export_kill_house_excel, monitor_loads_excel, kill_house_free_bar_excel, + comprehensive_report_of_the_slaughterhouse_excel, out_province_carcasses_buyer_kill_house_excel, + kill_house_free_sale_bar_information_for_excel_excel, kill_house_free_sale_bar_information_excel, + notentered_bars_for_kill_house_excel, entered_bars_for_kill_house_excel, + kill_house_free_bar_entered_for_warehouse_excel, kill_house_free_bar_carcasses_for_warehouse_excel, + steward_allocation_for_warehouse_excel, cold_house_excel, management_cold_house_excel, + create_guilds_or_stewards_from_excel, non_receipt_request_excel, return_kill_house_request_excel, + warehouse_archive_combined_excel + ) + from helper_eata import token, chat_id + from django.http import QueryDict + + class MockRequest: + def __init__(self, get_params=None): + if get_params: + self.GET = QueryDict(get_params) + else: + self.GET = QueryDict() + self.FILES = {} + self.data = {} + if adminx_user: + self.user = adminx_user.user + else: + self.user = None + + adminx_user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + adminx_key = adminx_user.key if adminx_user else None + adminx_token = None + if adminx_user: + access_token = AccessToken.objects.filter(user=adminx_user.user).first() + adminx_token = access_token.token if access_token else None + + today = datetime.datetime.now().date() + date1 = today - timedelta(days=1) + date2 = today + + date1_str = date1.strftime('%Y-%m-%d') + date2_str = date2.strftime('%Y-%m-%d') + + def add_params(base_params, use_start_end=False, use_date1_date2=False, use_token=False): + params = base_params.copy() if base_params else {} + if adminx_key: + params['key'] = adminx_key + params['role'] = 'AdminX' + if use_token and adminx_token: + params['token'] = adminx_token + if use_start_end: + params['start'] = date1_str + params['end'] = date2_str + elif use_date1_date2: + params['date1'] = date1_str + params['date2'] = date2_str + else: + params['date1'] = date1_str + params['date2'] = date2_str + return params + + excel_functions = [ + # (vet_check_excel, add_params({}, use_start_end=True)), + (kill_house_request_excel, add_params({}, use_start_end=True)), + # (request_report_excel, add_params({}, use_date1_date2=True)), + (allocated_excel, add_params({}, use_start_end=True)), + (allocated_trash_true_excel, add_params({}, use_start_end=True)), + (poultry_kill_request_excel, add_params({'token': adminx_token} if adminx_token else {}, use_start_end=True)), + (car_allocation_excel, add_params({}, use_start_end=True)), + (guilds_excel, add_params({})), + # (commerce_report_excel, add_params({}, use_start_end=True)), + # (commerce_bar_excel, add_params({}, use_start_end=True)), + (number_of_kills_weight_excel, add_params({'day': 1})), + (number_of_kills_excel, add_params({'day': 1})), + (single_hatching_age_range_excel, add_params({})), + # (total_poultry_request_dashboard_excel, add_params({})), + (total_poultry_hatching_dashboard_excel, add_params({})), + # (doughnut_left_hatching_excel, add_params({}, use_token=True)), + # (doughnut_hatching_excel, add_params({}, use_token=True)), + (forecast_hatching_left_over_excel, add_params({'age': 60})), + (manager_of_farm_excel, add_params({})), + (kill_house__request_vet_killing_process_excel, add_params({})), + (kill_house_percent_excel, add_params({})), + # (poultry_request_out_excel, add_params({'date': date1_str})), + (get_all_user_excel, add_params({})), + (stewards_excel, add_params({})), + (all_kill_house_total_wage_excel, add_params({'token': adminx_token})), + (kill_house_total_wage_not_payid_excel, add_params({'token': adminx_token})), + (slaughterhouse_fee_excel, add_params({})), + (slaughterhouse_fee_not_paid_excel, add_params({})), + (car_province_excel, add_params({})), + (kill_house_wage_archive_excel, add_params({})), + (kill_house_total_wage_archive_excel, add_params({})), + (bar_management_kill_house_excel, add_params({})), + (all_inventory_excel, add_params({})), + (daily_process_excel, add_params({})), + (daily_process_klling_proccess_excel, add_params({'date': date1_str})), + (killing_process_from_date_excel, add_params({}, use_start_end=True)), + (discrepancy_report_excel, add_params({})), + # (bar_for_each_persion_excel, add_params({'code': 'test_code'})), + # (poultry_excel, add_params({}, use_start_end=True)), + (bar_contradiction_of_quarantine_excel, add_params({}, use_start_end=True)), + (detail_of_killing_excel, add_params({})), + # (pos_excel, add_params({})), + (poultry_and_bar_daily_report_excel, add_params({})), + (bar_free_excel, add_params({'state': 'pending'})), + (steward_ware_house_total_report_daily_excel, add_params({})), + # (steward_ware_house_total_report_daily_detail_excel, add_params({}, use_date1_date2=True)), + (hatching_for_detail_killing_excel, add_params({})), + (bar_live_stock_support_excel, add_params({}, use_start_end=True)), + (successful_transactions_excel, add_params({})), + (unsuccessful_transactions_excel, add_params({})), + (poultry_hatching_between_50age_70age_excel, add_params({})), + (number_of_times_with_quarantine_code_excel, add_params({})), + (the_burden_of_quarantine_excel, add_params({})), + (bar_without_quarantine_code_excel, add_params({})), + (loads_that_differ_in_quarantine_and_cooperation_excel, add_params({})), + (government_burden_excel, add_params({})), + (goverment_bar_state_with_a_certified_quarantine_code_excel, add_params({})), + (free_loads_excel, add_params({})), + (free_cargoes_obtained_from_quarantine_excel, add_params({})), + (free_loads_with_quarantine_code_excel, add_params({})), + # (loads_outside_the_province_excel, add_params({})), + (loads_entering_the_slaughterhouse_excel, add_params({})), + (veterinarian_unloaded_load_excel, add_params({})), + (completed_slaughterhouse_loads_excel, add_params({})), + (unloaded_cargo_without_quarantine_code_excel, add_params({})), + (unloaded_load_excel, add_params({})), + (loads_unloaded_and_not_completed_by_the_slaughterhouse_excel, add_params({})), + (hatching_date_range_excel, add_params({}, use_date1_date2=True)), + (wallete_excel, add_params({})), + (kill_house_request_suspended_load_excel, add_params({}, use_start_end=True)), + # (chain_excel, add_params({})), + # (technical_responsible_performance_excel, add_params({})), + # (totoal_technical_responsible_performance_excel, add_params({}, use_date1_date2=True)), + (kill_house_total_transactions_wage_payid_super_admin_excel, add_params({})), + (kill_house_total_transactions_wage_payid_excel, add_params({})), + (payment_transactions_province_excel, add_params({})), + (general_free_bar_excel, add_params({})), + (out_province_poultry_request_buyers_excel, add_params({})), + (chain_company_buyers_excel, add_params({})), + (bar_chain_excel, add_params({'state': 'accepted'}, use_date1_date2=True)), + (kill_house_total_transactions_wage_payid_admin_x_excel, add_params({})), + (buy_outside_the_province_excel, add_params({})), + (poultry_request_report_excel, add_params({}, use_start_end=True)), + (transacion_out_request_excel, add_params({'type': 'poultry'}, use_date1_date2=True)), + (from_allocation_to_distribution_excel, add_params({})), + (login_user_excel, add_params({})), + (city_operator_for_sub_sector_excel, add_params({'type': 'city'})), + (vet_for_sub_sector_excel, add_params({'type': 'vet'})), + (guild_for_sub_sector_excel, add_params({'type': 'guild'}, use_date1_date2=True)), + (all_guilds_transaction_excel, add_params({})), + # (detail_guilds_transaction_excel, add_params({}, use_date1_date2=True)), + (management_hatching_excel, add_params({})), + (user_without_role_excel, add_params({})), + # (sub_section_of_cooperative_share_detail_with_date_excel, add_params({}, use_date1_date2=True)), + (vet_for_sub_sector_with_date_excel, add_params({}, use_date1_date2=True)), + (dashboard_monitoring_bar_and_killing_excel, add_params({})), + (steward_allocation_excel, add_params({})), + # (sevrence_kill_house_steward_allocation_excel, add_params({'type':'KillHouse'})), + (free_sale_out_province_excel, add_params({'type': 1})), + (steward_free_sale_out_province_excel, add_params({})), + (total_steward_dashboard_excel, add_params({})), + (detail_of_killing_and_warehouse_excel, add_params({})), + (market_requests_excel, add_params({})), + (return_province_request_excel, add_params({})), + (guilds_without_allocation_excel, add_params({})), + (hatching_excel, add_params({})), + (archive_hatching_excel, add_params({})), + (hatching_age_range_excel, add_params({})), + # (poultry_monitoring_excel, add_params({})), + # (poultry_hatching_prediction_chart_excel, add_params({})), + (hatching_report_from_age_excel, add_params({'age1': 50, 'age2': 60})), + # (poultry_hatching_prediction_excel, add_params({})), + # (bar_difference_reques_excel, add_params({'state':'pending'})), + (direct_purchase_excel, add_params({}, use_date1_date2=True)), + (direct_purchase_archive_excel, add_params({}, use_date1_date2=True)), + # (kill_house_assignment_information_excel, add_params({}, use_start_end=True)), + (kill_house_user_excel, add_params({})), + (bar_excel, add_params({}, use_start_end=True)), + (kill_house_total_wage_excel, add_params({})), + # (slaughterhouse_export_excel, add_params({}, use_date1_date2=True)), + (export_kill_house_excel, add_params({})), + (monitor_loads_excel, add_params({})), + (kill_house_free_bar_excel, add_params({'type': 'all'}, use_date1_date2=True)), + (comprehensive_report_of_the_slaughterhouse_excel, add_params({})), + # (out_province_carcasses_buyer_kill_house_excel, add_params({})), + # (kill_house_free_sale_bar_information_for_excel_excel, add_params({})), + # (kill_house_free_sale_bar_information_excel, add_params({}, use_date1_date2=True)), + (notentered_bars_for_kill_house_excel, add_params({})), + (entered_bars_for_kill_house_excel, add_params({})), + (kill_house_free_bar_entered_for_warehouse_excel, add_params({'type': 'all', 'bar_state': 'entered'})), + (kill_house_free_bar_carcasses_for_warehouse_excel, add_params({'type': 'all', 'bar_state': 'carcasses'})), + (steward_allocation_for_warehouse_excel, add_params({})), + # (cold_house_excel, add_params({}, use_date1_date2=True)), + (management_cold_house_excel, add_params({})), + (non_receipt_request_excel, add_params({})), + (return_kill_house_request_excel, add_params({})), + (warehouse_archive_combined_excel, add_params({})), + ] + + failed_functions = [] + + for func, params in excel_functions: + try: + if params: + query_string = '&'.join([f'{k}={v}' for k, v in params.items()]) + mock_request = MockRequest(query_string) + else: + mock_request = MockRequest() + response = func(mock_request) + if not response or not isinstance(response, HttpResponse): + failed_functions.append(func.__name__) + except Exception as e: + failed_functions.append(func.__name__) + + if failed_functions: + url = f'https://eitaayar.ir/api/{token}/sendMessage' + message = f'❌ توابع اکسل که خطا داشتند:\n\n' + message += f'❌ استان:{base_url_for_sms_report}\n\n' + for func_name in failed_functions: + + message += f'• {func_name}\n' + + data = { + 'chat_id': 10046800, + 'text': message, + } + requests.post(url, data=data, verify=False) + + return HttpResponse(f'تست انجام شد. تعداد توابع با خطا: {len(failed_functions)}') + + +def test_all_excel_functions_cron(): + from panel.VetFarm.excel_processing import technical_responsible_performance_excel, totoal_technical_responsible_performance_excel + from panel.ProvinceOperator.excel_processing import ( + kill_house_total_transactions_wage_payid_super_admin_excel, kill_house_total_transactions_wage_payid_excel, + payment_transactions_province_excel, general_free_bar_excel, out_province_poultry_request_buyers_excel, + chain_company_buyers_excel, bar_chain_excel, kill_house_total_transactions_wage_payid_admin_x_excel, + buy_outside_the_province_excel, poultry_request_report_excel, transacion_out_request_excel, + from_allocation_to_distribution_excel, login_user_excel, city_operator_for_sub_sector_excel, + vet_for_sub_sector_excel, guild_for_sub_sector_excel, all_guilds_transaction_excel, + detail_guilds_transaction_excel, management_hatching_excel, user_without_role_excel, + sub_section_of_cooperative_share_detail_with_date_excel, vet_for_sub_sector_with_date_excel, + dashboard_monitoring_bar_and_killing_excel, steward_allocation_excel, + sevrence_kill_house_steward_allocation_excel, free_sale_out_province_excel, + steward_free_sale_out_province_excel, total_steward_dashboard_excel, + detail_of_killing_and_warehouse_excel, market_requests_excel, return_province_request_excel, + guilds_without_allocation_excel + ) + from panel.poultry.excel_processing import ( + hatching_excel, archive_hatching_excel, hatching_age_range_excel, poultry_monitoring_excel, + poultry_hatching_prediction_chart_excel, hatching_report_from_age_excel, + poultry_hatching_prediction_excel, bar_difference_reques_excel + ) + from panel.KillHouse.excel_processing import ( + direct_purchase_excel, direct_purchase_archive_excel, kill_house_assignment_information_excel, + kill_house_user_excel, bar_excel, kill_house_total_wage_excel, slaughterhouse_export_excel, + export_kill_house_excel, monitor_loads_excel, kill_house_free_bar_excel, + comprehensive_report_of_the_slaughterhouse_excel, out_province_carcasses_buyer_kill_house_excel, + kill_house_free_sale_bar_information_for_excel_excel, kill_house_free_sale_bar_information_excel, + notentered_bars_for_kill_house_excel, entered_bars_for_kill_house_excel, + kill_house_free_bar_entered_for_warehouse_excel, kill_house_free_bar_carcasses_for_warehouse_excel, + steward_allocation_for_warehouse_excel, cold_house_excel, management_cold_house_excel, + create_guilds_or_stewards_from_excel, non_receipt_request_excel, return_kill_house_request_excel, + warehouse_archive_combined_excel + ) + from helper_eata import token, chat_id + from django.http import QueryDict + + class MockRequest: + def __init__(self, get_params=None): + if get_params: + self.GET = QueryDict(get_params) + else: + self.GET = QueryDict() + self.FILES = {} + self.data = {} + if adminx_user: + self.user = adminx_user.user + else: + self.user = None + + adminx_user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + adminx_key = adminx_user.key if adminx_user else None + adminx_token = None + if adminx_user: + access_token = AccessToken.objects.filter(user=adminx_user.user).first() + adminx_token = access_token.token if access_token else None + + today = datetime.datetime.now().date() + date1 = today - timedelta(days=1) + date2 = today + + date1_str = date1.strftime('%Y-%m-%d') + date2_str = date2.strftime('%Y-%m-%d') + + def add_params(base_params, use_start_end=False, use_date1_date2=False, use_token=False): + params = base_params.copy() if base_params else {} + if adminx_key: + params['key'] = adminx_key + params['role'] = 'AdminX' + if use_token and adminx_token: + params['token'] = adminx_token + if use_start_end: + params['start'] = date1_str + params['end'] = date2_str + elif use_date1_date2: + params['date1'] = date1_str + params['date2'] = date2_str + else: + params['date1'] = date1_str + params['date2'] = date2_str + return params + + excel_functions = [ + # (vet_check_excel, add_params({}, use_start_end=True)), + (kill_house_request_excel, add_params({}, use_start_end=True)), + # (request_report_excel, add_params({}, use_date1_date2=True)), + (allocated_excel, add_params({}, use_start_end=True)), + (allocated_trash_true_excel, add_params({}, use_start_end=True)), + (poultry_kill_request_excel, add_params({'token': adminx_token} if adminx_token else {}, use_start_end=True)), + (car_allocation_excel, add_params({}, use_start_end=True)), + (guilds_excel, add_params({})), + # (commerce_report_excel, add_params({}, use_start_end=True)), + # (commerce_bar_excel, add_params({}, use_start_end=True)), + (number_of_kills_weight_excel, add_params({'day': 1})), + (number_of_kills_excel, add_params({'day': 1})), + (single_hatching_age_range_excel, add_params({})), + # (total_poultry_request_dashboard_excel, add_params({})), + (total_poultry_hatching_dashboard_excel, add_params({})), + # (doughnut_left_hatching_excel, add_params({}, use_token=True)), + # (doughnut_hatching_excel, add_params({}, use_token=True)), + (forecast_hatching_left_over_excel, add_params({'age': 60})), + (manager_of_farm_excel, add_params({})), + (kill_house__request_vet_killing_process_excel, add_params({})), + (kill_house_percent_excel, add_params({})), + # (poultry_request_out_excel, add_params({'date': date1_str})), + (get_all_user_excel, add_params({})), + (stewards_excel, add_params({})), + (all_kill_house_total_wage_excel, add_params({'token': adminx_token})), + (kill_house_total_wage_not_payid_excel, add_params({'token': adminx_token})), + (slaughterhouse_fee_excel, add_params({})), + (slaughterhouse_fee_not_paid_excel, add_params({})), + (car_province_excel, add_params({})), + (kill_house_wage_archive_excel, add_params({})), + (kill_house_total_wage_archive_excel, add_params({})), + (bar_management_kill_house_excel, add_params({})), + (all_inventory_excel, add_params({})), + (daily_process_excel, add_params({})), + (daily_process_klling_proccess_excel, add_params({'date': date1_str})), + (killing_process_from_date_excel, add_params({}, use_start_end=True)), + (discrepancy_report_excel, add_params({})), + # (bar_for_each_persion_excel, add_params({'code': 'test_code'})), + # (poultry_excel, add_params({}, use_start_end=True)), + (bar_contradiction_of_quarantine_excel, add_params({}, use_start_end=True)), + (detail_of_killing_excel, add_params({})), + # (pos_excel, add_params({})), + (poultry_and_bar_daily_report_excel, add_params({})), + (bar_free_excel, add_params({'state': 'pending'})), + (steward_ware_house_total_report_daily_excel, add_params({})), + # (steward_ware_house_total_report_daily_detail_excel, add_params({}, use_date1_date2=True)), + (hatching_for_detail_killing_excel, add_params({})), + (bar_live_stock_support_excel, add_params({}, use_start_end=True)), + (successful_transactions_excel, add_params({})), + (unsuccessful_transactions_excel, add_params({})), + (poultry_hatching_between_50age_70age_excel, add_params({})), + (number_of_times_with_quarantine_code_excel, add_params({})), + (the_burden_of_quarantine_excel, add_params({})), + (bar_without_quarantine_code_excel, add_params({})), + (loads_that_differ_in_quarantine_and_cooperation_excel, add_params({})), + (government_burden_excel, add_params({})), + (goverment_bar_state_with_a_certified_quarantine_code_excel, add_params({})), + (free_loads_excel, add_params({})), + (free_cargoes_obtained_from_quarantine_excel, add_params({})), + (free_loads_with_quarantine_code_excel, add_params({})), + # (loads_outside_the_province_excel, add_params({})), + (loads_entering_the_slaughterhouse_excel, add_params({})), + (veterinarian_unloaded_load_excel, add_params({})), + (completed_slaughterhouse_loads_excel, add_params({})), + (unloaded_cargo_without_quarantine_code_excel, add_params({})), + (unloaded_load_excel, add_params({})), + (loads_unloaded_and_not_completed_by_the_slaughterhouse_excel, add_params({})), + (hatching_date_range_excel, add_params({}, use_date1_date2=True)), + (wallete_excel, add_params({})), + (kill_house_request_suspended_load_excel, add_params({}, use_start_end=True)), + # (chain_excel, add_params({})), + # (technical_responsible_performance_excel, add_params({})), + # (totoal_technical_responsible_performance_excel, add_params({}, use_date1_date2=True)), + (kill_house_total_transactions_wage_payid_super_admin_excel, add_params({})), + (kill_house_total_transactions_wage_payid_excel, add_params({})), + (payment_transactions_province_excel, add_params({})), + (general_free_bar_excel, add_params({})), + (out_province_poultry_request_buyers_excel, add_params({})), + (chain_company_buyers_excel, add_params({})), + (bar_chain_excel, add_params({'state': 'accepted'}, use_date1_date2=True)), + (kill_house_total_transactions_wage_payid_admin_x_excel, add_params({})), + (buy_outside_the_province_excel, add_params({})), + (poultry_request_report_excel, add_params({}, use_start_end=True)), + (transacion_out_request_excel, add_params({'type': 'poultry'}, use_date1_date2=True)), + (from_allocation_to_distribution_excel, add_params({})), + (login_user_excel, add_params({})), + (city_operator_for_sub_sector_excel, add_params({'type': 'city'})), + (vet_for_sub_sector_excel, add_params({'type': 'vet'})), + (guild_for_sub_sector_excel, add_params({'type': 'guild'}, use_date1_date2=True)), + (all_guilds_transaction_excel, add_params({})), + # (detail_guilds_transaction_excel, add_params({}, use_date1_date2=True)), + (management_hatching_excel, add_params({})), + (user_without_role_excel, add_params({})), + # (sub_section_of_cooperative_share_detail_with_date_excel, add_params({}, use_date1_date2=True)), + (vet_for_sub_sector_with_date_excel, add_params({}, use_date1_date2=True)), + (dashboard_monitoring_bar_and_killing_excel, add_params({})), + (steward_allocation_excel, add_params({})), + # (sevrence_kill_house_steward_allocation_excel, add_params({'type':'KillHouse'})), + (free_sale_out_province_excel, add_params({'type': 1})), + (steward_free_sale_out_province_excel, add_params({})), + (total_steward_dashboard_excel, add_params({})), + (detail_of_killing_and_warehouse_excel, add_params({})), + (market_requests_excel, add_params({})), + (return_province_request_excel, add_params({})), + (guilds_without_allocation_excel, add_params({})), + (hatching_excel, add_params({})), + (archive_hatching_excel, add_params({})), + (hatching_age_range_excel, add_params({})), + # (poultry_monitoring_excel, add_params({})), + # (poultry_hatching_prediction_chart_excel, add_params({})), + (hatching_report_from_age_excel, add_params({'age1': 50, 'age2': 60})), + # (poultry_hatching_prediction_excel, add_params({})), + # (bar_difference_reques_excel, add_params({'state':'pending'})), + (direct_purchase_excel, add_params({}, use_date1_date2=True)), + (direct_purchase_archive_excel, add_params({}, use_date1_date2=True)), + # (kill_house_assignment_information_excel, add_params({}, use_start_end=True)), + (kill_house_user_excel, add_params({})), + (bar_excel, add_params({}, use_start_end=True)), + (kill_house_total_wage_excel, add_params({})), + # (slaughterhouse_export_excel, add_params({}, use_date1_date2=True)), + (export_kill_house_excel, add_params({})), + (monitor_loads_excel, add_params({})), + (kill_house_free_bar_excel, add_params({'type': 'all'}, use_date1_date2=True)), + (comprehensive_report_of_the_slaughterhouse_excel, add_params({})), + # (out_province_carcasses_buyer_kill_house_excel, add_params({})), + # (kill_house_free_sale_bar_information_for_excel_excel, add_params({})), + # (kill_house_free_sale_bar_information_excel, add_params({}, use_date1_date2=True)), + (notentered_bars_for_kill_house_excel, add_params({})), + (entered_bars_for_kill_house_excel, add_params({})), + (kill_house_free_bar_entered_for_warehouse_excel, add_params({'type': 'all', 'bar_state': 'entered'})), + (kill_house_free_bar_carcasses_for_warehouse_excel, add_params({'type': 'all', 'bar_state': 'carcasses'})), + (steward_allocation_for_warehouse_excel, add_params({})), + # (cold_house_excel, add_params({}, use_date1_date2=True)), + (management_cold_house_excel, add_params({})), + (non_receipt_request_excel, add_params({})), + (return_kill_house_request_excel, add_params({})), + (warehouse_archive_combined_excel, add_params({})), + ] + + failed_functions = [] + + for func, params in excel_functions: + try: + if params: + query_string = '&'.join([f'{k}={v}' for k, v in params.items()]) + mock_request = MockRequest(query_string) + else: + mock_request = MockRequest() + response = func(mock_request) + if not response or not isinstance(response, HttpResponse): + failed_functions.append(func.__name__) + except Exception as e: + failed_functions.append(func.__name__) + + if failed_functions: + url = f'https://eitaayar.ir/api/{token}/sendMessage' + message = f'❌ توابع اکسل که خطا داشتند:\n\n' + message += f'❌ استان:{base_url_for_sms_report}\n\n' + for func_name in failed_functions: + + message += f'• {func_name}\n' + + data = { + 'chat_id': 10046800, + 'text': message, + } + requests.post(url, data=data, verify=False) diff --git a/panel/filterset.py b/panel/filterset.py new file mode 100644 index 0000000..e7038eb --- /dev/null +++ b/panel/filterset.py @@ -0,0 +1,646 @@ +from url_filter.filtersets import ModelFilterSet +from django_filters import rest_framework as filters + +from django.contrib.auth.models import User + +from LiveStock.models import Cooperative +from authentication.models import UserProfile, SystemUserProfile +from panel.models import (CityOperatorCheckRequest, PoultryRequestExchange, Poultry, ProvinceOperator, + KillHouse, Vet, KillHouseOperator, CityOperator, KillHouseDriver, InspectorOperator, + PoultryHatching, Guilds, KillHouseRequest, ProvinceKillRequest, PoultryRequest, KillRequest, + WagePayment, ChainAllocation, InternalTransaction, ChainCompany, KillHouseFreeBarInformation, + OutProvincePoultryRequestBuyer, ReportsUsers, Dispenser, StewardAllocation, + OutProvinceCarcassesBuyer, KillHouseFreeSaleBarInformation, BaseOutProvinceCarcassesBuyer, + ColdHouseAllocations, ColdHouse, SubSectorTransactions, StewardFreeBarInformation, + PosSegmentation, PosMachineTransactions, BarDifferenceRequest, POSDeviceSession, + HatchingIncreaseRequest, CommonlyUsed, StewardFreeSaleBarInformation, DirectBuyingPayment, + PoultryScience, PoultryScienceReport, WarehouseArchive, POSMachine, EvacuationHatchingDetail, + DispenserInformation, Representative) +from authentication.models import City + +# test +from ticket.models import TicketSupport + + +class CityOperatorRequestFilterSet(ModelFilterSet): + class Meta: + model = CityOperatorCheckRequest + + +class CityOperatorFilterSet(ModelFilterSet): + class Meta: + model = CityOperator + + +class PoultryRequestExchangeFilterSet(ModelFilterSet): + class Meta: + model = PoultryRequestExchange + + +class PoultryRequestFilterSet(ModelFilterSet): + class Meta: + model = PoultryRequest + + +class OutProvincePoultryRequestBuyerFilterSet(ModelFilterSet): + class Meta: + model = OutProvincePoultryRequestBuyer + + +class PoultryFilterSet(ModelFilterSet): + class Meta: + model = Poultry + + +class ChainCompanyFilterSet(ModelFilterSet): + class Meta: + model = ChainCompany + + +class ChainAllocationFilterSet(ModelFilterSet): + class Meta: + model = ChainAllocation + + +class InternalTransactionFilterSet(ModelFilterSet): + class Meta: + model = InternalTransaction + + +class DispenserAllocationFilterSet(ModelFilterSet): + class Meta: + model = StewardAllocation + + +class StewardAllocationFilterSet(ModelFilterSet): + class Meta: + model = StewardAllocation + + +class StewardAllocationDashboardFilterSet(filters.FilterSet): + class Meta: + model = StewardAllocation + fields = [ + 'guilds__user__first_name', + 'guilds__user__last_name', + 'guilds__user__fullname', + 'guilds__user__mobile', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__fullname', + 'steward__user__mobile', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'to_guilds__user__first_name', + 'to_guilds__user__last_name', + 'to_guilds__user__fullname', + 'to_guilds__user__mobile', + 'to_steward__user__first_name', + 'to_steward__user__last_name', + 'to_steward__user__fullname', + 'to_steward__user__mobile', + 'to_kill_house__kill_house_operator__user__first_name', + 'to_kill_house__kill_house_operator__user__last_name', + 'to_kill_house__kill_house_operator__user__fullname', + 'to_kill_house__kill_house_operator__user__mobile', + 'to_kill_house__name', + ] + + +class StewardFreeBarInformationFilterSet(ModelFilterSet): + class Meta: + model = StewardFreeBarInformation + + +class StewardFreeSaleBarInformationFilterSet(ModelFilterSet): + class Meta: + model = StewardFreeSaleBarInformation + fields = [ + 'steward__user__fullname', + 'steward__user__first_name', + 'steward__user__last_name', + 'steward__user__mobile', + 'buyer__user__fullname', + 'buyer__user__first_name', + 'buyer__user__last_name', + 'buyer__user__mobile', + 'province', + 'city', + 'province' + 'buyer_name' + 'buyer_mobile' + + ] + + +class PosSegmentationFilterSet(ModelFilterSet): + class Meta: + model = PosSegmentation + + +class PosMachineTransactionsFilterSet(ModelFilterSet): + class Meta: + model = PosMachineTransactions + + +class POSMachineFilterSet(ModelFilterSet): + class Meta: + model = POSMachine + + +class ColdHouseFilterSet(ModelFilterSet): + class Meta: + model = ColdHouse + + +class ColdHouseAllocationsFilterSet(ModelFilterSet): + class Meta: + model = ColdHouseAllocations + + +class DispenserFilterSet(ModelFilterSet): + class Meta: + model = Dispenser + + +class RepresentativeFilterSet(ModelFilterSet): + class Meta: + model = Representative + + +class DispenserInformationFilterSet(ModelFilterSet): + class Meta: + model = DispenserInformation + + +class ReportsUsersFilterSet(ModelFilterSet): + class Meta: + model = ReportsUsers + + +class CooperativeFilterSet(ModelFilterSet): + class Meta: + model = Cooperative + fields = [ + 'user__fullname', + 'user__mobile', + 'name', + 'mobile', + ] + + +class GuildsFilterSet(filters.FilterSet): + kill_house = filters.ModelMultipleChoiceFilter( + queryset=KillHouse.objects.all(), + field_name='kill_house', + to_field_name='id' + ) + + # stewards = filters.ModelMultipleChoiceFilter( + # queryset=Guilds.objects.all(), + # field_name='stewards', + # to_field_name='id' + # ) + + class Meta: + model = Guilds + fields = [ + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'user__city__name', + 'user__national_code', + 'user__national_id', + 'user__province__name', + 'address__city__name', + 'guilds_name', + 'type_activity', + 'area_activity', + 'guilds_id', + 'license_number', + 'kill_house__name', + 'stewards__user__mobile', + 'stewards__user__first_name', + 'stewards__user__last_name', + ] + + +class TestGuildsFilterSet(filters.FilterSet): + kill_house = filters.ModelMultipleChoiceFilter( + queryset=KillHouse.objects.all(), + field_name='kill_house', + to_field_name='id' + ) + + class Meta: + model = Guilds + fields = [ + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__city__name', + 'user__province__name', + 'address__city__name', + 'guilds_name', + 'type_activity', + 'area_activity', + 'kill_house__name', + ] + + +class ProvinceKillRequestFilterSet(ModelFilterSet): + class Meta: + model = ProvinceKillRequest + + +class UserProfileFilterSet(ModelFilterSet): + class Meta: + model = UserProfile + + +class ProvinceOperatorFilterSet(ModelFilterSet): + class Meta: + model = ProvinceOperator + + +class InspectorOperatorFilterSet(ModelFilterSet): + class Meta: + model = InspectorOperator + + +class KillHouseFilterSet(ModelFilterSet): + class Meta: + model = KillHouse + + +class KillHouseFreeSaleBarInformationFilterSet(ModelFilterSet): + class Meta: + model = KillHouseFreeSaleBarInformation + + +class DirectBuyingPaymentFilterSet(ModelFilterSet): + class Meta: + model = DirectBuyingPayment + + +class KillHouseOperatorFilterSet(ModelFilterSet): + class Meta: + model = KillHouseOperator + + +class KillHouseDriverFilterSet(ModelFilterSet): + class Meta: + model = KillHouseDriver + + +class VetFilterSet(ModelFilterSet): + class Meta: + model = Vet + + +class KillHouseFreeBarInformationFilterSet(ModelFilterSet): + class Meta: + model = KillHouseFreeBarInformation + + +class PoultryHatchingFilterSet(ModelFilterSet): + class Meta: + model = PoultryHatching + fields = [ + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__unit_name', + 'poultry__address__city__name', + 'chicken_age', + 'licence_number', + 'poultry__breeding_unique_id', + 'CertId', + 'PersonTypeName', + 'InteractTypeName', + 'UnionTypeName', + 'poultry__city_operator', + + ] + + +class EvacuationHatchingDetailFilterSet(ModelFilterSet): + class Meta: + model = EvacuationHatchingDetail + + +class KillHouseRequestFilterSet(ModelFilterSet): + class Meta: + model = KillHouseRequest + + +class BarDifferenceRequestFilterSet(ModelFilterSet): + class Meta: + model = BarDifferenceRequest + + +class KillRequestFilterSet(ModelFilterSet): + class Meta: + model = KillRequest + + +class WagePaymentFilterSet(ModelFilterSet): + class Meta: + model = WagePayment + + +class DashboardEnterLoadInformationFilterSet(filters.FilterSet): + class Meta: + model = KillHouseRequest + fields = [ + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__order_code', + 'bar_code', + ] + + +class DashboardPoultryRequestFilterSet(filters.FilterSet): + class Meta: + model = PoultryRequest + fields = [ + 'order_code', + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__address__city__name', + + ] + + +class DashboardKillHouseFreeBarInformationFilterSet(filters.FilterSet): + class Meta: + model = KillHouseFreeBarInformation + fields = [ + 'kill_house__name', + 'poultry_name', + 'poultry_mobile', + 'province', + 'city', + 'driver_name', + 'driver_mobile', + 'bar_clearance_code', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__kill_house_operator__user__fullname', + + ] + + +class VetFarmAndKillHouseFilterSet(ModelFilterSet): + class Meta: + model = Vet + fields = [ + 'user__national_id', + 'user__base_order', + 'user__mobile', + 'user__fullname' + + ] + + +class ProvinceKillRequestNewFilterSet(filters.FilterSet): + class Meta: + model = ProvinceKillRequest + fields = [ + 'province_request__poultry_request__order_code', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__fullname', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__kill_house_operator__address__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__fullname', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__poultry__address__city__name', + ] + + +class ReturnProvinceKillRequestFilterSet(ModelFilterSet): + class Meta: + model = ProvinceKillRequest + + +class PoultryManageFilterSet(filters.FilterSet): + class Meta: + model = Poultry + fields = [ + 'breeding_unique_id', + 'user__national_id', + 'user__base_order', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'address__city__name', + 'unit_name', + + ] + + +class DashboardKillRequestFilterSet(filters.FilterSet): + class Meta: + model = KillRequest + fields = [ + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__first_name', + 'kill_house__kill_house_operator__user__last_name', + 'kill_house__kill_house_operator__user__mobile', + 'kill_house__name', + 'slaughter_house__name', + 'export_country', + 'export_code', + 'direct_buying_code', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__unit_name', + + ] + + +# class TicketsFilterSet(filters.FilterSet): +# to_user = filters.ModelMultipleChoiceFilter( +# queryset=SystemUserProfile.objects.all(), +# field_name='to_user', +# to_field_name='id' +# ) +# +# class Meta: +# model = TicketSupport +# fields = [ +# 'user__fullname', +# 'user__mobile', +# 'title', +# 'ticket_id', +# 'to_user__fullname', +# 'to_user__mobile', +# +# ] + + +class BaseOutProvinceCarcassesBuyerFilterSet(ModelFilterSet): + class Meta: + model = BaseOutProvinceCarcassesBuyer + + +class OutProvinceCarcassesBuyerFilterSet(ModelFilterSet): + class Meta: + model = OutProvinceCarcassesBuyer + + +class SubSectorTransactionsFilterSet(ModelFilterSet): + class Meta: + model = SubSectorTransactions + + +class CommonlyUsedFilterSet(ModelFilterSet): + class Meta: + model = CommonlyUsed + + +class TicketsFilterSet(filters.FilterSet): + class Meta: + model = TicketSupport + fields = [ + 'ticket_id', + 'user__fullname', + 'title', + + ] + + +class GuildsForPostationFilterSet(ModelFilterSet): + class Meta: + model = Guilds + fields = [ + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'user__mobile', + 'guilds_name' + ] + + +class GuildsForArchiveFilterSet(ModelFilterSet): + class Meta: + model = Guilds + fields = [ + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'user__mobile', + 'guilds_name' + ] + + +class GuildsForGeneralConfigsFilterSet(ModelFilterSet): + class Meta: + model = Guilds + + fields = [ + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__city__name', + 'user__province__name', + 'address__city__name', + 'guilds_name', + 'type_activity', + 'area_activity', + ] + + +class POSDeviceSessionForCompanyFilterSet(ModelFilterSet): + class Meta: + model = POSDeviceSession + fields = [ + 'pos__terminal_number', + 'pos__pos_id', + 'pos__pos_company__name', + 'pos__guild__guilds_name', + 'pos__guild__user__fullname', + 'pos__guild__user__national_code', + + ] + + +class WarehouseArchiveFilterSet(ModelFilterSet): + class Meta: + model = WarehouseArchive + fields = [ + 'kill_house__kill_house_operator__user__fullname' + 'kill_house__kill_house_operator__user__mobile' + 'steward__user__fullname' + 'steward__user__mobile' + 'guild__user__fullname' + 'guild__user__mobile' + + ] + + +class HatchingIncreaseRequestFilterSet(ModelFilterSet): + class Meta: + model = HatchingIncreaseRequest + fields = [ + 'hatching__poultry__unit_name', + 'hatching__poultry__user__fullname', + 'hatching__poultry__user__mobile', + 'hatching__poultry__breeding_unique_id', + 'hatching__licence_number', + 'registerer_name', + 'registerer_mobile', + ] + + +class PoultryRequestDirectBuyingFilterSet(ModelFilterSet): + class Meta: + model = PoultryRequest + fields = [ + 'poultry__unit_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__breeding_unique_id', + 'hatching__licence_number' + ] + + +class PoultryScienceFilterSet(ModelFilterSet): + class Meta: + model = PoultryScience + fields = [ + 'poultry__unit_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__breeding_unique_id', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname', + ] + + +class PoultryScienceReportFilterSet(ModelFilterSet): + class Meta: + model = PoultryScienceReport + fields = [ + 'hatching__poultry__unit_name', + 'hatching__poultry__user__fullname', + 'hatching__poultry__user__mobile', + 'hatching__poultry__breeding_unique_id', + 'hatching__licence_number', + 'poultry_science__user__mobile', + 'poultry_science__user__first_name', + 'poultry_science__user__last_name', + 'poultry_science__user__fullname', + ] diff --git a/panel/helper.py b/panel/helper.py new file mode 100644 index 0000000..c36bb37 --- /dev/null +++ b/panel/helper.py @@ -0,0 +1,255 @@ +import re +from django.db.models import Q +from django.http import HttpResponse +from django.views.decorators.csrf import csrf_exempt +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import AllowAny + +from authentication.models import SystemUserProfile, Province, BankCard, City, Group, SystemAddress +from authentication.serializer.serializer import BankCardSerializer +from authentication.serializers import SystemAddressSerializer +from rest_framework.response import Response +from rest_framework import status +from panel.models import Wallet + +COMPANY_NUMBER='09011110919' +COMPANY_NUMBER2='09169726704' +UNION_NUMBER='09011110919' +GUILD_NUMBER='09011110919' +UNION_SECOND_NUMBER=None +SUPPORTER_NUMBER='09165597588' +UNION_THIRD_NUMBER=None +UNION_FOURTH_NUMBER=None +UNION_NUMBER_2=None +UNION_FIFTH_NUMBER=None +UNION_SIXTH_NUMBER=None + +LIARA_STORAGE_URL='https://storage.c2.liara.space/ticket-rasadyar/' + +# Remove Null Fields From Request Body +def remove_null_fields(type=None, request=None, item=None): + if type == 'req': + null_fields = [] + for key, value in request.data.items(): + if value is None: + null_fields.append(key) + for item in null_fields: + request.data.pop(item) + elif type == 'item': + null_fields = [] + for key, value in request.data[item].items(): + if value is None: + null_fields.append(key) + for field in null_fields: + request.data[item].pop(field) + return request + + +def create_except_profile(request, queryset, serializer, role): + # get user profile object + userprofile = SystemUserProfile.objects.get(key=request.data['userprofile_key']) + request.data.pop('userprofile_key') + + # if not queryset.objects.filter(user=userprofile).exists(): + + # get group and set role for user + group = Group.objects.get(name=role) + userprofile.role.add(group) + + # get province object + province = Province.objects.get(key=request.data['province']) + request.data.pop("province") + + # get city object + city = City.objects.get(key=request.data['city']) + request.data.pop('city') + + # get user banking information + if 'user_bank_info' in request.data.keys(): + bank_card = BankCard.objects.create(**request.data['user_bank_info']) + request.data.pop('user_bank_info') + else: + bank_card = None + wallet = Wallet() + wallet.save() + + # create address object & operator object with serializers + address_serializer = SystemAddressSerializer(data=request.data) + if address_serializer.is_valid(): + address_obj = address_serializer.create(validated_data=request.data) + address_obj.province = province + address_obj.city = city + address_obj.save() + operator_object = queryset( + user=userprofile, + address=address_obj, + user_bank_info=bank_card, + wallet=wallet + ) + operator_object.save() + operator_serializer = serializer(operator_object) + return operator_serializer.data, status.HTTP_201_CREATED, operator_object + return address_serializer.errors, status.HTTP_400_BAD_REQUEST + # else: + # return "operator exists", status.HTTP_403_FORBIDDEN + + +def update_except_profile(model, serializer, request): + # remove null fields in address body + request = remove_null_fields(type='item', request=request, item='address') + # remove null fields in user bank info body + request = remove_null_fields(type='item', request=request, item='user_bank_info') + + userprofile = SystemUserProfile.objects.get(user=request.user) + operator = model.objects.get(user=userprofile) + + if 'address' in request.data.keys() or request.data['address'] is not None: + address_serializer = SystemAddressSerializer(data=request.data['address']) + if address_serializer.is_valid(): + addr_object = address_serializer.update( + instance=operator.address, + validated_data=request.data['address'] + ) + operator.address = addr_object + + if 'user_bank_info' in request.data.keys() or request.data['user_bank_info'] is not None: + bank_serializer = BankCardSerializer(data=request.data['user_bank_info']) + if bank_serializer.is_valid(): + bank_object = bank_serializer.update( + instance=operator.user_bank_info, + validated_data=request.data['user_bank_info'] + ) + operator.user_bank_info = bank_object + operator.save() + response_serializer = serializer(operator) + return response_serializer + + +def operator_update_except_profile(model, serializer, request): + # remove null fields in address body + request = remove_null_fields(type='item', request=request, item='address') + # remove null fields in user bank info body + request = remove_null_fields(type='item', request=request, item='user_bank_info') + + userprofile = SystemUserProfile.objects.get(key=request.data['userprofile_key']) + request.data.pop('userprofile_key') + if 'poultry_key' in request.data.keys(): + if 'unit_name' in request.data.keys(): + unit_name = request.data['unit_name'] + request.data.pop('unit_name') + + else: + unit_name = None + + if 'halls' in request.data.keys(): + halls = int(request.data['halls']) + request.data.pop('halls') + + else: + halls = None + + if 'breeding_unique_id' in request.data.keys(): + breeding_unique_id = request.data['breeding_unique_id'] + request.data.pop('breeding_unique_id') + + else: + breeding_unique_id = None + + operator = model.objects.get(key=request.data['poultry_key']) + + request.data.pop('poultry_key') + if halls != None: + operator.number_of_halls = halls + operator.save() + if unit_name != None: + operator.unit_name = unit_name + operator.save() + if breeding_unique_id != None: + operator.breeding_unique_id = breeding_unique_id + operator.save() + + + else: + operator = model.objects.get(user=userprofile) + + if 'address' in request.data.keys() or request.data['address'] is not None: + data = request.data['address'] + if 'city' in request.data['address']: + city = City.objects.get(key=request.data['address']['city']) # contains city object + data.pop('city') + else: + city = None + + if 'province' in request.data['address']: + province = Province.objects.get(key=request.data['address']['province']) # contains province object + data.pop('province') + else: + province = None + + address = SystemAddress.objects.get(key=operator.address.key) + if province != None: + address.province = province + if city != None: + address.city = city + address.save() + + address_serializer = SystemAddressSerializer(data=data) + if address_serializer.is_valid(): + addr_object = address_serializer.update( + instance=operator.address, + validated_data=request.data['address'] + ) + if city != None: + addr_object.city = city + if province != None: + addr_object.province = province + addr_object.save() + operator.address = addr_object + + if 'user_bank_info' in request.data.keys() or request.data['user_bank_info'] != "": + if operator.user_bank_info is not None: + bank_serializer = BankCardSerializer(data=request.data['user_bank_info']) + if bank_serializer.is_valid(): + bank_object = bank_serializer.update( + instance=operator.user_bank_info, + validated_data=request.data['user_bank_info'] + ) + operator.user_bank_info = bank_object + else: + bank_serializer = BankCardSerializer(data=request.data['user_bank_info']) + if bank_serializer.is_valid(): + bank_object = bank_serializer.create( + validated_data=request.data['user_bank_info'] + ) + operator.user_bank_info = bank_object + operator.save() + response_serializer = serializer(operator) + return response_serializer + + + +def check_mobile_number(s): + pattern = r'^09\d{9}$' + return bool(re.match(pattern, s)) + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def get_country(request): + asian_countries = { + 'Iraq': 'عراق', + 'Afghanistan': 'افغانستان', + 'Turkey': 'ترکیه', + + } + + persian_country_details = [{'en': eng_name, 'fa': persian_name} for eng_name, persian_name in + asian_countries.items()] + + return Response(persian_country_details) + +def build_query(filterset_class, value): + query = Q() + for field in filterset_class.Meta.fields: + query |= Q(**{f"{field}__icontains": value}) + return query diff --git a/panel/helper_excel.py b/panel/helper_excel.py new file mode 100644 index 0000000..3a0a94a --- /dev/null +++ b/panel/helper_excel.py @@ -0,0 +1,538 @@ +from datetime import datetime +from io import BytesIO + +import jdatetime +import openpyxl +from django.db.models import Q, Sum +from django.http import HttpResponse +from openpyxl import Workbook +from openpyxl.chart import LineChart, Reference, BarChart +from openpyxl.styles import PatternFill, Alignment, Font +from openpyxl.utils import get_column_letter + +from deposit_id import wage_counting_type +from panel.models import WageType, ProvinceKillRequest, KillHouseRequest, KillHouseFreeBarInformation, \ + KillHouseFreeSaleBarInformation, InternalTransaction, KillHouse, StewardAllocation + +blue_fill = PatternFill(start_color="277358", fill_type="solid") +Alignment_CELL = Alignment(horizontal='center', vertical='center', wrap_text=True) +red_font = Font(color="C00000", bold=True) +GREEN_CELL = PatternFill(start_color="00B050", fill_type="solid") +RED_CELL = PatternFill(start_color="FCDFDC", fill_type="solid") +YELLOW_CELL = PatternFill(start_color="FFFF00", fill_type="solid") +ORANGE_CELL = PatternFill(start_color="FFC000", fill_type="solid") +BLUE_CELL = PatternFill(start_color="538DD5", fill_type="solid") +LIGHT_GREEN_CELL = PatternFill(start_color="92D050", fill_type="solid") +VERY_LIGHT_GREEN_CELL = PatternFill(start_color="5AFC56", fill_type="solid") + +percent_of_losses = 0.11 + + +def shamsi_date(date, in_value=None, set_datetime=None): + if set_datetime: + sh_dt = jdatetime.datetime.fromgregorian(datetime=date) + return sh_dt.strftime('%Y/%m/%d (%H:%M)') + + if in_value: + sh_date = jdatetime.date.fromgregorian( + year=date.year, + month=date.month, + day=date.day + ) + else: + gh_date = jdatetime.date.fromgregorian( + year=date.year, + month=date.month, + day=date.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(gh_date.split("-")) + separate = "-" + sh_date = separate.join(reversed_date) + return sh_date + + +def create_header(worksheet, list, num, row, height=None, width=None, color=None, text_color=None, border_style=None): + for col_num, option in enumerate(list, num): + cell = worksheet.cell(row=row, column=col_num, value=option) + col_letter = get_column_letter(col_num) + cell.alignment = Alignment_CELL + if color is not None: + if color == 'green': + cell.fill = GREEN_CELL + elif color == 'orange': + cell.fill = ORANGE_CELL + elif color == 'blue': + cell.fill = BLUE_CELL + else: + cell.fill = PatternFill(start_color=color, fill_type="solid") + else: + cell.fill = blue_fill + if text_color is not None: + cell.font = Font(size=9, bold=True, color=text_color) + else: + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + if height is not None: + worksheet.row_dimensions[row].height = height + if width is not None: + worksheet.column_dimensions[col_letter].width = width + if border_style is not None: + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style=border_style), + right=openpyxl.styles.Side(style=border_style), + top=openpyxl.styles.Side(style=border_style), + bottom=openpyxl.styles.Side(style=border_style) + ) + + +def create_header_freez(worksheet, list, num, row, header_row, height=None, width=None, len_with=None, + different_cell=None): + for col_num, option in enumerate(list, num): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=row, column=col_num, value=option) + cell.alignment = Alignment_CELL + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + + if height is not None: + worksheet.row_dimensions[row].height = height + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 2 + if width is not None: + worksheet.column_dimensions[col_letter].width = width + if len_with is not None: + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + if different_cell is not None: + if option == different_cell: + cell.fill = PatternFill(start_color="C00000", fill_type="solid") + worksheet.freeze_panes = worksheet[f'A{header_row}'] + max_col = worksheet.max_column + range_str = f'A{header_row - 1}:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + +def excel_description(worksheet, row1, description, size=None, color=None, my_color=None, row2=None): + worksheet[row1] = description + worksheet[row1].alignment = Alignment_CELL + if size is not None: + worksheet[row1].font = Font(size=size) + if color is not None: + worksheet[row1].font = red_font + if my_color is not None: + worksheet[row1].font = PatternFill(start_color=my_color, fill_type="solid") + + if row2 is not None: + merge_range = f'{row1}:{row2}' + worksheet.merge_cells(merge_range) + + +def create_value(worksheet, list, l, num, border_style=None, m=None, height=None, color=None, width=None, + different_cell=None, different_value=None, item_num=None, item_color=None): + color_dict = { + 'green': GREEN_CELL, + 'yellow': YELLOW_CELL, + 'blue': BLUE_CELL, + 'red': RED_CELL, + 'light_green': LIGHT_GREEN_CELL, + 'very_light_green': VERY_LIGHT_GREEN_CELL + } + + for item in range(len(list)): + cell = worksheet.cell(row=l, column=item + num, value=list[item]) + cell.alignment = Alignment_CELL + + if border_style: + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style=border_style), + right=openpyxl.styles.Side(style=border_style), + top=openpyxl.styles.Side(style=border_style), + bottom=openpyxl.styles.Side(style=border_style) + ) + + value = list[item] + if isinstance(value, (int, float)) and value != 0: + cell.number_format = '#,###' + else: + cell.value = value + + cell.font = Font(size=10, bold=True) + + if m is not None and m % 2 != 0: + cell.fill = PatternFill(start_color="D6F6FE", fill_type="solid") + + if height is not None: + worksheet.row_dimensions[l + 1].height = height + + if item_num is not None and item == item_num: + if item_color: + cell.fill = item_color + elif color in color_dict: + cell.fill = color_dict[color] + + if different_cell is not None and list[different_cell] == different_value: + cell.fill = RED_CELL + + if width is not None: + worksheet.column_dimensions[openpyxl.utils.get_column_letter(item + num)].width = width + + +def merge_cells(worksheet, l, s, cell1=None, cell2=None, lst=None): + if lst is not None: + for col in lst: + rng = f'{col}{l}:{col}{l + s}' + worksheet.merge_cells(rng) + worksheet[col + f'{l}'].alignment = Alignment_CELL + else: + for col in range(ord(f'{cell1}'), ord(f'{cell2}') + 1): + rng = f'{chr(col)}{l}:{chr(col)}{l + s}' + worksheet.merge_cells(rng) + worksheet[chr(col) + f'{l}'].alignment = Alignment_CELL + + +def add_header(worksheet): + worksheet.oddHeader.center.text = "سامانه رصدیار" + worksheet.oddHeader.center.size = 14 # تنظیم اندازه فونت + worksheet.oddHeader.center.font = "Arial,Bold" # تنظیم فونت و ضخامت + + # همچنین می‌توانید از هدرهای چپ و راست هم استفاده کنید + # worksheet.oddHeader.right.text = f"تاریخ: {shamsi_now_date}" + + +def cell_color_changer(worksheet, row, start_index, end_index, custom_color): + for item in range(start_index, end_index): + cell = worksheet.cell(row=row, column=item) + cell.fill = PatternFill(start_color=custom_color, fill_type="solid") + + +def get_kill_house_finance_info_by_date(kill_house, date1, date2): + 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 + + 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, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2).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)) + kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter( + Q(kill_house=kill_house, exclusive_killer__isnull=True) | Q(exclusive_killer=kill_house), date__date__gte=date1, + date__date__lte=date2, + archive_wage=False, + calculate_status=True, + trash=False) + kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, + kill_house=kill_house, + archive_wage=False, + calculate_status=True, + trash=False) + slaughter_transactions = InternalTransaction.objects.filter(date__date__gte=date1, + date__date__lte=date2, + kill_house=kill_house, status='completed', + trash=False) + + 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 + if wage_counting_type == 'live': + total_province_carcasses_weight = total_province_live_weight + total_pure_province_carcasses_weight = total_province_carcasses_weight + else: + total_province_carcasses_weight = total_province_live_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 + 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 + total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_wage_type_amount + 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 + + 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": 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, + + } + + +def start_excel(): + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + return workbook, worksheet, output + + +def close_excel(name): + workbook, worksheet, output = start_excel() + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="{name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def get_kill_house_distribution_info(city, date1=None, date2=None): + kill_house_name = KillHouse.objects.filter(trash=False, out_province=False).order_by('id') + list1 = [city.name] + for kill_house in kill_house_name: + if date1: + allocations = StewardAllocation.objects.filter( + Q(to_steward__user__city=city) | Q(to_guilds__user__city=city), + allocation_type__in=('killhouse_steward', 'killhouse_guild'), + trash=False, date__date__gte=date1, receiver_state__in=('pending', 'accepted'), + date__date__lte=date2, calculate_status=True, kill_house=kill_house).order_by('id') + + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward__user__city=city) | Q(to_guilds__user__city=city), + allocation_type__in=('killhouse_steward', 'killhouse_guild'), + receiver_state__in=('pending', 'accepted'), + trash=False, calculate_status=True, kill_house=kill_house).order_by('id') + + weight = allocations.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + list1.append(weight + + ) + return list1 + + +def get_kill_house_distribution_out_province_info(date1=None, date2=None): + kill_house_name = KillHouse.objects.filter(trash=False, out_province=False).order_by('id') + list1 = ['خارج استان'] + for kill_house in kill_house_name: + if date1: + + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + trash=False, calculate_status=True, date__date__gte=date1, + date__date__lte=date2) + else: + + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( + kill_house=kill_house, + trash=False, calculate_status=True) + + weight_kill_house_free_sale_bars = kill_house_free_sale_bars.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + list1.append(weight_kill_house_free_sale_bars + ) + if date1: + + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( + trash=False, calculate_status=True, date__date__gte=date1, + date__date__lte=date2) + else: + + kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter( + trash=False, calculate_status=True) + + weight_kill_house_free_sale_bars = kill_house_free_sale_bars.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + + list1.append(weight_kill_house_free_sale_bars + ) + return list1 + + +def all_get_kill_house_distribution_info(city, date1=None, date2=None): + if date1: + allocations = StewardAllocation.objects.filter( + Q(to_steward__user__city=city) | Q(to_guilds__user__city=city), + allocation_type__in=('killhouse_steward', 'killhouse_guild'), + trash=False, date__date__gte=date1, receiver_state__in=('pending', 'accepted'), + date__date__lte=date2, calculate_status=True).order_by('id') + + else: + allocations = StewardAllocation.objects.filter( + Q(to_steward__user__city=city) | Q(to_guilds__user__city=city), + allocation_type__in=('killhouse_steward', 'killhouse_guild'), + receiver_state__in=('pending', 'accepted'), + trash=False, calculate_status=True).order_by('id') + + weight = allocations.aggregate( + total_quantity=Sum('real_weight_of_carcasses')).get( + 'total_quantity') or 0 + return weight + + +def add_chart( + worksheet, + chart_type, + data_columns, + category_column, + start_row, + end_row, + chart_position, + chart_title, + x_axis_title, + y_axis_title, + chart_width=25, # عرض نمودار پیش‌فرض (واحد: cm) + chart_height=15 +): + """ + افزودن نمودار به صفحه اکسل. + + ورودی: + worksheet (openpyxl.Worksheet): صفحه اکسل. + chart_type (str): نوع نمودار ("line" یا "bar"). + data_columns (list): لیستی از ستون‌های داده. + category_column (int): ستون دسته‌بندی‌ها. + start_row (int): ردیف شروع داده‌ها. + end_row (int): ردیف پایان داده‌ها. + chart_position (str): محل قرار گرفتن نمودار. + chart_title (str): عنوان نمودار. + x_axis_title (str): عنوان محور X. + y_axis_title (str): عنوان محور Y. + chart_width (float): عرض نمودار (واحد: cm). + chart_height (float): ارتفاع نمودار (واحد: cm). + """ + + if chart_type == 'line': + chart = LineChart() + chart.style = 20 + elif chart_type == 'bar': + chart = BarChart() + else: + raise ValueError("chart_type باید 'line' یا 'bar' باشد.") + + chart.title = chart_title + chart.y_axis.title = y_axis_title + chart.x_axis.title = x_axis_title + chart.width = chart_width + chart.height = chart_height + + categories = Reference(worksheet, min_col=category_column, min_row=start_row, max_row=end_row) + data = Reference(worksheet, min_col=data_columns, min_row=start_row - 1, max_row=end_row) + chart.add_data(data, titles_from_data=True) + chart.set_categories(categories) + for series in chart.series: + series.graphicalProperties.line.solidFill = "277358" + series.graphicalProperties.line.width = 30000 + + worksheet.add_chart(chart, chart_position) + # example + # add_chart( + # worksheet=worksheet, + # chart_type='line', + # data_columns=7, # ستون وزن وارد شده + # category_column=2, # ستون نام سردخانه‌ها + # start_row=7, + # end_row=l + 1, + # chart_position="A12", + # chart_title="نمودار تغییرات وزن در سردخانه‌ها", + # x_axis_title="سردخانه‌ها", + # y_axis_title="وزن (کیلوگرم)" + # ) + + +def to_locale_str(a): + return "{:,}".format(int(a)) + + +def convert_str_to_date(string, with_datetime=None): + """ + Convert a string to a datetime.date object. + + This function tries multiple common date formats, including ISO 8601 with or + without milliseconds, and plain 'YYYY-MM-DD'. If the string cannot be parsed, + it returns None. + + Parameters: + ----------- + string : str + The date string to convert. + + Returns: + -------- + datetime.date or None + A datetime.date object if conversion succeeds, otherwise None. + + Supported formats: + ------------------ + - 'YYYY-MM-DDTHH:MM:SS.sssZ' (ISO 8601 with milliseconds) + - 'YYYY-MM-DDTHH:MM:SSZ' (ISO 8601 without milliseconds) + - 'YYYY-MM-DD' (Simple date) + """ + string = str(string).strip() + + # فرمت‌های مختلف تاریخ + date_formats = [ + '%Y-%m-%dT%H:%M:%S.%fZ', + '%Y-%m-%dT%H:%M:%SZ', + '%Y-%m-%dT%H:%M:%S.%f%z', # ✅ با میلی‌ثانیه و تایم‌زون + '%Y-%m-%dT%H:%M:%S%z', # ✅ مثل: 2025-02-26T03:30:00+03:30 + '%Y-%m-%dT%H:%M:%S.%f', + '%Y-%m-%dT%H:%M:%S', + '%Y-%m-%d %H:%M:%S.%f', + '%Y-%m-%d %H:%M:%S', + '%Y-%m-%d' + ] + + for fmt in date_formats: + try: + if with_datetime: + date = datetime.strptime(string, fmt) + else: + date = datetime.strptime(string, fmt).date() + return date + except ValueError: + continue + + return None + diff --git a/panel/management/__init__.py b/panel/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/management/commands/__init__.py b/panel/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/management/commands/function_executor.py b/panel/management/commands/function_executor.py new file mode 100644 index 0000000..df6fc9c --- /dev/null +++ b/panel/management/commands/function_executor.py @@ -0,0 +1,215 @@ +from django.core.management.base import BaseCommand, CommandError +from notification.models import ( + NotificationToken, + NotificationType, +) +from notification.najva.send_notif_to_segments import send_notification_to_specific_segment +from authentication.models import UserMessageType +from authentication.sahandsms.sms import sms_reminder +from panel.models import OperatorLastTimeEnter +from panel.models import FunctionExecutor +from panel.models import * +import schedule +import time +import datetime + +from panel.poultry.views import Check_Poultry_Auction_request + +TITLE = "" +BODY = "" +CONTENT = "" +LINK_TEXT = "" +LINK = "" + + +def send_request_notification_to_city_operator(): + if CheckState.objects.filter(state__exact=True): + for item in CheckState.objects.filter(state__exact=True): + city_operator_user = UserProfile.objects.get(role__name__exact="CityOperator") + city_user_token = NotificationToken.objects.get(user__exact=city_operator_user).token + send_notification_to_specific_segment( + title=TITLE, + body=BODY, + content=CONTENT, + icon=None, + image=None, + subscriber_tokens=[city_user_token], + ) + notification = Notification( + title=TITLE, + content=CONTENT + ) + notification.notif_type = NotificationType.objects.get(name='poultry') + notification.notification_user = city_operator_user + notification.save() + item.notification = notification + item.state = False + item.city_state_notification = True + item.main_check = "pending" + item.save() + if CheckState.objects.filter(state__exact=False): + for item in CheckState.objects.filter(state__exact=False): + if item.city_state_notification is True and item.main_check == "pending": + city_operator_user = UserProfile.objects.get(role__name__exact="CityOperator") + last_enter_obj = OperatorLastTimeEnter.objects.get(operator__exact=city_operator_user) + if item.notification.create_date < last_enter_obj.city_operator_last_time_check < item.notification.create_date + datetime.timedelta( + hours=5): + item.notification.status = "read" + item.main_check = "city_end" + item.notification.save() + else: + user_message = UserMessage( + heading=TITLE, + message=CONTENT, + link_text=LINK_TEXT, + link=LINK, + ) + user_message.message_type = UserMessageType.objects.get(name="modal") + user_message.save() + user_message.users.add(city_operator_user) + item.user_message = user_message + item.city_state_notification = False + item.city_state_modal = True + item.main_check = 'pending' + item.save() + if CheckState.objects.filter(city_state_modal=True, main_check="pending"): + for item in CheckState.objects.filter(city_state_modal=True, main_check="pending"): + city_operator_user = UserProfile.objects.get(role__name__exact="CityOperator") + last_enter_obj = OperatorLastTimeEnter.objects.get(operator__exact=city_operator_user) + if item.user_message.create_date < last_enter_obj.city_operator_last_time_check < item.user_message.create_date + datetime.timedelta( + hours=5): + item.user_message.state = "read" + item.main_check = "city_end" + item.notification.save() + else: + sms_reminder( + receptor=city_operator_user.mobile, + title=TITLE, + content=CONTENT, + link_text=LINK_TEXT, + link=LINK, + time=datetime.datetime.now() + ) + user_message = UserMessage( + heading=TITLE, + message=CONTENT, + link_text=LINK_TEXT, + link=LINK, + ) + user_message.message_type = UserMessageType.objects.get(name="sms") + user_message.save() + user_message.users.add(city_operator_user) + item.user_message = user_message + item.city_state_modal = False + item.city_state_sms = True + item.city_state = True + item.main_check = "city_end" + item.save() + + +def send_request_notification_to_province_operator(): + if CheckState.objects.filter(city_state=True): + for item in CheckState.objects.filter(city_state=True): + province_operator_user = UserProfile.objects.get(role__name__exact="ProvinceOperator") + province_user_token = NotificationToken.objects.get(user__exact=province_operator_user).token + send_notification_to_specific_segment( + title=TITLE, + body=BODY, + content=CONTENT, + icon=None, + image=None, + subscriber_tokens=[province_user_token], + ) + notification = Notification( + title=TITLE, + content=CONTENT + ) + notification.notif_type = NotificationType.objects.get(name='poultry') + notification.notification_user = province_operator_user + notification.save() + item.notification = notification + item.province_state_notification = True + item.main_check = "pending" + item.save() + if CheckState.objects.filter(city_state=True): + for item in CheckState.objects.filter(city_state=True): + if item.province_state_notification is True and item.main_check == "pending": + province_operator_user = UserProfile.objects.get(role__name__exact="ProvinceOperator") + last_enter_obj = OperatorLastTimeEnter.objects.get(operator__exact=province_operator_user) + if item.notification.create_date < last_enter_obj.province_operator_last_time_check < item.notification.create_date + datetime.timedelta( + hours=5): + item.notification.status = "read" + item.main_check = "province_end" + item.notification.save() + else: + user_message = UserMessage( + heading=TITLE, + message=CONTENT, + link_text=LINK_TEXT, + link=LINK, + ) + user_message.message_type = UserMessageType.objects.get(name="modal") + user_message.save() + user_message.users.add(province_operator_user) + item.user_message = user_message + item.province_state_notification = False + item.province_state_modal = True + item.main_check = 'pending' + item.save() + if CheckState.objects.filter(province_state_modal=True, main_check="pending"): + for item in CheckState.objects.filter(province_state_modal=True, main_check="pending"): + province_operator_user = UserProfile.objects.get(role__name__exact="ProvinceOperator") + last_enter_obj = OperatorLastTimeEnter.objects.get(operator__exact=province_operator_user) + if item.user_message.create_date < last_enter_obj.province_operator_last_time_check < item.user_message.create_date + datetime.timedelta( + hours=5): + item.user_message.state = "read" + item.main_check = "province_end" + item.notification.save() + else: + sms_reminder( + receptor=province_operator_user.mobile, + title=TITLE, + content=CONTENT, + link_text=LINK_TEXT, + link=LINK, + time=datetime.datetime.now() + ) + user_message = UserMessage( + heading=TITLE, + message=CONTENT, + link_text=LINK_TEXT, + link=LINK, + ) + user_message.message_type = UserMessageType.objects.get(name="sms") + user_message.save() + user_message.users.add(province_operator_user) + item.user_message = user_message + item.province_state_modal = False + item.province_state_sms = True + item.province_state = True + item.main_check = "province_end" + item.save() + + +def send_request_notification_to_poultry_from_killhouse(): + pass + + +class Command(BaseCommand): + help = 'Closes the specified poll for voting' + + def add_arguments(self, parser): + pass + + def handle(self, *args, **options): + # schedule.every(2).hours.do() + # schedule.every(5).hours.do() + # schedule.every(10).minutes.do(job) + # schedule.every().hour.do(job) + # schedule.every().day.at("10:30").do(job) + # schedule.every().monday.do(job) + # schedule.every().wednesday.at("13:15").do(job) + while (True): + schedule.every(1).minutes.do(Check_Poultry_Auction_request) + schedule.run_pending() + print("function run !!!") diff --git a/panel/management/timing_function.py b/panel/management/timing_function.py new file mode 100644 index 0000000..5c6b9b8 --- /dev/null +++ b/panel/management/timing_function.py @@ -0,0 +1,26 @@ +from panel.models import FunctionExecutor +from datetime import timezone +import datetime +import jdatetime +import schedule + + +def timing_function(function_name): + func_obj = FunctionExecutor.objects.get( + function_name=function_name + ) + func_dict = { + + } + if func_obj.time_type == "year": + func_dict['']() + elif func_obj.time_type == "month": + func_dict['']() + elif func_obj.time_type == "day": + func_dict['']() + elif func_obj.time_type == "hour": + func_dict['']() + elif func_obj.time_type == "minute": + func_dict['']() + elif func_obj.time_type == "second": + func_dict['']() diff --git a/panel/merge_database.py b/panel/merge_database.py new file mode 100644 index 0000000..cc83fa0 --- /dev/null +++ b/panel/merge_database.py @@ -0,0 +1,402 @@ +from authentication.models import Province, City, CityUnit, SystemAddress, SystemUserProfile +from panel.models import Poultry, PoultryHatching, CityOperator, PoultryRequest, KillHouseOperator, \ + KillHouseAllowVet, KillHousePercentage, KillHouseDriver, CityOperatorCheckRequest, KillHouseADDCAR, \ + ProvinceOperator, ProvinceCheckOperatorOutRequest, ProvinceCheckOperatorRequest, ShareOfAllocation, KillRequest, \ + KillRequestFactor, KillRequestFactorPayment, ProvinceKillRequest, KillHouseRequest, KillHouseCheckRequest, \ + KillHouseAssignmentInformation, ProvinceCheckInformation, ProvinceFactorToKillHouse, KillHouseFactorToProvince, \ + ProvinceCheckKillHouseFactor, DepositAllocation, InspectorOperator, PovinceInspector, Vet, KillHouseVet, \ + VetCheckRequest, VetFarm, VetFarmInspection, Admin, Jahad, CityJahad, ProvincialGovernment, VetSupervisor, \ + ProvinceAllowKillHouseRegisterCar, ProvinceAllowPoultryChooseKillHouse, ProvinceAllowPoultrySellFree, \ + KillHouseDailyQuota, ProvinceAutoAllocation + + +def update_database(): + from panel.models import KillHouse + provinces = Province.objects.all() + cities = City.objects.all() + city_units = CityUnit.objects.all() + adresses = SystemAddress.objects.all() + profiles = SystemUserProfile.objects.all() + poultries = Poultry.objects.all() + hatchings = PoultryHatching.objects.all() + city_operators = CityOperator.objects.all() + poultry_requests = PoultryRequest.objects.all() + kill_house_operators = KillHouseOperator.objects.all() + KillHouses = KillHouse.objects.all() + killhouseallowvets = KillHouseAllowVet.objects.all() + killhousepercentages = KillHousePercentage.objects.all() + drivers = KillHouseDriver.objects.all() + add_cars = KillHouseADDCAR.objects.all() + city_check_requests = CityOperatorCheckRequest.objects.all() + province_operators = ProvinceOperator.objects.all() + province_check_out_requests = ProvinceCheckOperatorOutRequest.objects.all() + province_check_requests = ProvinceCheckOperatorRequest.objects.all() + share_of_allocations = ShareOfAllocation.objects.all() + kill_requests = KillRequest.objects.all() + kill_request_factors = KillRequestFactor.objects.all() + kill_request_payment_factors = KillRequestFactorPayment.objects.all() + province_kill_requests = ProvinceKillRequest.objects.all() + kill_house_requests = KillHouseRequest.objects.all() + kill_house_check_requests = KillHouseCheckRequest.objects.all() + assignment_informations = KillHouseAssignmentInformation.objects.all() + province_check_informations = ProvinceCheckInformation.objects.all() + province_factors = ProvinceFactorToKillHouse.objects.all() + kill_house_factors = KillHouseFactorToProvince.objects.all() + province_check_kill_house_factors = ProvinceCheckKillHouseFactor.objects.all() + deposit_allocations = DepositAllocation.objects.all() + inspectors = InspectorOperator.objects.all() + inspector_checks = PovinceInspector.objects.all() + vets = Vet.objects.all() + kill_house_vets = KillHouseVet.objects.all() + vet_check_requests = VetCheckRequest.objects.all() + vet_farms = VetFarm.objects.all() + vet_farm_inspections = VetFarmInspection.objects.all() + admins = Admin.objects.all() + jahads = Jahad.objects.all() + city_jahads = CityJahad.objects.all() + goverments = ProvincialGovernment.objects.all() + vet_supervisers = VetSupervisor.objects.all() + province_allow_kill_house_registers = ProvinceAllowKillHouseRegisterCar.objects.all() + province_allow_poultry_choose_kill_houses = ProvinceAllowPoultryChooseKillHouse.objects.all() + province_allow_poultry_auto_sell = ProvinceAllowPoultrySellFree.objects.all() + kill_house_daily_quotas = KillHouseDailyQuota.objects.all() + province_auto_allocations = ProvinceAutoAllocation.objects.all() + + for province in provinces: + province.province_number = province.id + province.province_name = province.name + province.save() + + for city in cities: + city.province_number = city.province.id + city.province_name = city.province.name + city.city_number = city.id + city.city_name = city.name + city.save() + + for cityunit in city_units: + cityunit.province_number = cityunit.city.province.id + cityunit.province_name = cityunit.city.province.name + cityunit.city_number = cityunit.city.id + cityunit.city_name = cityunit.city.name + cityunit.save() + + for address in adresses: + address.province_number = address.province.id + address.province_name = address.province.name + address.city_number = address.city.id + address.city_name = address.city.name + address.save() + + for profile in profiles: + profile.province_number = profile.province.id + profile.province_name = profile.province.name + profile.city_number = profile.city.id + profile.city_name = profile.city.name + profile.save() + + for poultry in poultries: + poultry.city_number = poultry.address.city.id + poultry.city_name = poultry.address.city.name + poultry.province_number = poultry.address.province.id + poultry.province_name = poultry.address.province.name + poultry.save() + + for hatching in hatchings: + hatching.city_number = hatching.poultry.address.city.id + hatching.city_name = hatching.poultry.address.city.name + hatching.province_number = hatching.poultry.address.province.id + hatching.province_name = hatching.poultry.address.province.name + hatching.save() + + for city_operator in city_operators: + city_operator.city_number = city_operator.address.city.id + city_operator.city_name = city_operator.address.city.name + city_operator.province_number = city_operator.address.province.id + city_operator.province_name = city_operator.address.province.name + city_operator.save() + + for poultry_request in poultry_requests: + poultry_request.city_number = poultry_request.poultry.address.city.id + poultry_request.city_name = poultry_request.poultry.address.city.name + poultry_request.province_number = poultry_request.poultry.address.province.id + poultry_request.province_name = poultry_request.poultry.address.province.name + poultry_request.save() + + for kill_house_operator in kill_house_operators: + kill_house_operator.city_number = kill_house_operator.address.city.id + kill_house_operator.city_name = kill_house_operator.address.city.name + kill_house_operator.province_number = kill_house_operator.address.province.id + kill_house_operator.province_name = kill_house_operator.address.province.name + kill_house_operator.save() + + for KillHouse in KillHouses: + KillHouse.city_number = KillHouse.system_address.city.id + KillHouse.city_name = KillHouse.system_address.city.name + KillHouse.province_number = KillHouse.system_address.province.id + KillHouse.province_name = KillHouse.system_address.province.name + KillHouse.save() + + for killhouseallowvet in killhouseallowvets: + killhouseallowvet.city_number = killhouseallowvet.kill_house.system_address.city.id + killhouseallowvet.city_name = killhouseallowvet.kill_house.system_address.city.name + killhouseallowvet.province_number = killhouseallowvet.kill_house.system_address.province.id + killhouseallowvet.province_name = killhouseallowvet.kill_house.system_address.province.name + killhouseallowvet.save() + + for killhousepercentage in killhousepercentages: + killhousepercentage.city_number = killhousepercentage.kill_house.system_address.city.id + killhousepercentage.city_name = killhousepercentage.kill_house.system_address.city.name + killhousepercentage.province_number = killhousepercentage.kill_house.system_address.province.id + killhousepercentage.province_name = killhousepercentage.kill_house.system_address.province.name + killhousepercentage.save() + + for driver in drivers: + driver.city_number = driver.user.city.id + driver.city_name = driver.user.city.name + driver.province_number = driver.user.province.id + driver.province_name = driver.user.province.name + driver.save() + + for add_car in add_cars: + add_car.city_number = add_car.driver.user.city.id + add_car.city_name = add_car.driver.user.city.name + add_car.province_number = add_car.driver.user.province.id + add_car.province_name = add_car.driver.user.province.name + add_car.save() + + for city_check_request in city_check_requests: + city_check_request.city_number = city_check_request.city_operator_system.user.city.id + city_check_request.city_name = city_check_request.city_operator_system.user.city.name + city_check_request.province_number = city_check_request.city_operator_system.user.province.id + city_check_request.province_name = city_check_request.city_operator_system.user.province.name + city_check_request.save() + + for province_operator in province_operators: + province_operator.city_number = province_operator.user.city.id + province_operator.city_name = province_operator.user.city.name + province_operator.province_number = province_operator.user.province.id + province_operator.province_name = province_operator.user.province.name + province_operator.save() + + for province_check_out_request in province_check_out_requests: + province_check_out_request.city_number = province_check_out_request.province_operator_system.user.city.id + province_check_out_request.city_name = province_check_out_request.province_operator_system.user.city.name + province_check_out_request.province_number = province_check_out_request.province_operator_system.user.province.id + province_check_out_request.province_name = province_check_out_request.province_operator_system.user.province.name + province_check_out_request.save() + + for province_check_request in province_check_requests: + province_check_request.city_number = province_check_request.province_operator_system.user.city.id + province_check_request.city_name = province_check_request.province_operator_system.user.city.name + province_check_request.province_number = province_check_request.province_operator_system.user.province.id + province_check_request.province_name = province_check_request.province_operator_system.user.province.name + province_check_request.save() + + for share_of_allocation in share_of_allocations: + share_of_allocation.province_number = share_of_allocation.province.id + share_of_allocation.province_name = share_of_allocation.province.name + share_of_allocation.save() + + for kill_request in kill_requests: + kill_request.city_number = kill_request.kill_house.system_address.city.id + kill_request.city_name = kill_request.kill_house.system_address.city.name + kill_request.province_number = kill_request.kill_house.system_address.province.id + kill_request.province_name = kill_request.kill_house.system_address.province.name + kill_request.save() + + for kill_request_factor in kill_request_factors: + kill_request_factor.city_number = kill_request_factor.kill_request.kill_house.system_address.city.id + kill_request_factor.city_name = kill_request_factor.kill_request.kill_house.system_address.city.name + kill_request_factor.province_number = kill_request_factor.kill_request.kill_house.system_address.province.id + kill_request_factor.province_name = kill_request_factor.kill_request.kill_house.system_address.province.name + kill_request_factor.save() + + for kill_request_payment_factor in kill_request_payment_factors: + kill_request_payment_factor.city_number = kill_request_payment_factor.kill_request_factor.kill_request.kill_house.system_address.city.id + kill_request_payment_factor.city_name = kill_request_payment_factor.kill_request_factor.kill_request.kill_house.system_address.city.name + kill_request_payment_factor.province_number = kill_request_payment_factor.kill_request_factor.kill_request.kill_house.system_address.province.id + kill_request_payment_factor.province_name = kill_request_payment_factor.kill_request_factor.kill_request.kill_house.system_address.province.name + kill_request_payment_factor.save() + + for province_kill_request in province_kill_requests: + province_kill_request.city_number = province_kill_request.kill_request.kill_house.system_address.city.id + province_kill_request.city_name = province_kill_request.kill_request.kill_house.system_address.city.name + province_kill_request.province_number = province_kill_request.kill_request.kill_house.system_address.province.id + province_kill_request.province_name = province_kill_request.kill_request.kill_house.system_address.province.name + province_kill_request.save() + + for kill_house_request in kill_house_requests: + kill_house_request.city_number = kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.id + kill_house_request.city_name = kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.name + kill_house_request.province_number = kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.id + kill_house_request.province_name = kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.name + kill_house_request.save() + + for kill_house_check_request in kill_house_check_requests: + kill_house_check_request.city_number = kill_house_check_request.province_kill_request.kill_request.kill_house.system_address.city.id + kill_house_check_request.city_name = kill_house_check_request.province_kill_request.kill_request.kill_house.system_address.city.name + kill_house_check_request.province_number = kill_house_check_request.province_kill_request.kill_request.kill_house.system_address.province.id + kill_house_check_request.province_name = kill_house_check_request.province_kill_request.kill_request.kill_house.system_address.province.name + kill_house_check_request.save() + + for assignment_information in assignment_informations: + assignment_information.city_number = assignment_information.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.id + assignment_information.city_name = assignment_information.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.name + assignment_information.province_number = assignment_information.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.id + assignment_information.province_name = assignment_information.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.name + assignment_information.save() + + for province_check_information in province_check_informations: + province_check_information.city_number = province_check_information.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.id + province_check_information.city_name = province_check_information.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.name + province_check_information.province_number = province_check_information.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.id + province_check_information.province_name = province_check_information.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.name + province_check_information.save() + + for province_factor in province_factors: + province_factor.city_number = province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.id + province_factor.city_name = province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.name + province_factor.province_number = province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.id + province_factor.province_name = province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.name + province_factor.save() + + for kill_house_factor in kill_house_factors: + kill_house_factor.city_number = kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.id + kill_house_factor.city_name = kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.name + kill_house_factor.province_number = kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.id + kill_house_factor.province_name = kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.name + kill_house_factor.save() + + for province_check_kill_house_factor in province_check_kill_house_factors: + province_check_kill_house_factor.city_number = province_check_kill_house_factor.kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.id + province_check_kill_house_factor.city_name = province_check_kill_house_factor.kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.city.name + province_check_kill_house_factor.province_number = province_check_kill_house_factor.kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.id + province_check_kill_house_factor.province_name = province_check_kill_house_factor.kill_house_factor.province_factor.province_check_info.kill_house_assignment.kill_house_request.province_kill_request.kill_request.kill_house.system_address.province.name + province_check_kill_house_factor.save() + + for deposit_allocation in deposit_allocations: + deposit_allocation.city_number = deposit_allocation.poultry.poultry.address.city.id + deposit_allocation.city_name = deposit_allocation.poultry.poultry.address.city.name + deposit_allocation.province_number = deposit_allocation.poultry.poultry.address.province.id + deposit_allocation.province_name = deposit_allocation.poultry.poultry.address.province.name + deposit_allocation.save() + + for inspector in inspectors: + inspector.city_number = inspector.address.city.id + inspector.city_name = inspector.address.city.name + inspector.province_number = inspector.address.province.id + inspector.province_name = inspector.address.province.name + inspector.save() + + for inspector_check in inspector_checks: + inspector_check.city_number = inspector_check.poultry_request.poultry.address.city.id + inspector_check.city_name = inspector_check.poultry_request.poultry.address.city.name + inspector_check.province_number = inspector_check.poultry_request.poultry.address.province.id + inspector_check.province_name = inspector_check.poultry_request.poultry.address.province.name + inspector_check.save() + + for vet in vets: + vet.city_number = vet.user.city.id + vet.city_name = vet.user.city.name + vet.province_number = vet.user.province.id + vet.province_name = vet.user.province.name + vet.save() + + for kill_house_vet in kill_house_vets: + kill_house_vet.city_number = kill_house_vet.vet.user.city.id + kill_house_vet.city_name = kill_house_vet.vet.user.city.name + kill_house_vet.province_number = kill_house_vet.vet.user.province.id + kill_house_vet.province_name = kill_house_vet.vet.user.province.name + kill_house_vet.save() + + for vet_check_request in vet_check_requests: + vet_check_request.city_number = vet_check_request.kill_house_vet.vet.user.city.id + vet_check_request.city_name = vet_check_request.kill_house_vet.vet.user.city.name + vet_check_request.province_number = vet_check_request.kill_house_vet.vet.user.province.id + vet_check_request.province_name = vet_check_request.kill_house_vet.vet.user.province.name + vet_check_request.save() + + for vet_farm in vet_farms: + vet_farm.city_number = vet_farm.poultry.address.city.id + vet_farm.city_name = vet_farm.poultry.address.city.name + vet_farm.province_number = vet_farm.poultry.address.province.id + vet_farm.province_name = vet_farm.poultry.address.province.name + vet_farm.save() + + for vet_farm_inspection in vet_farm_inspections: + vet_farm_inspection.city_number = vet_farm_inspection.poultry_hatching.poultry.address.city.id + vet_farm_inspection.city_name = vet_farm_inspection.poultry_hatching.poultry.address.city.name + vet_farm_inspection.province_number = vet_farm_inspection.poultry_hatching.poultry.address.province.id + vet_farm_inspection.province_name = vet_farm_inspection.poultry_hatching.poultry.address.province.name + vet_farm_inspection.save() + + for admin in admins: + admin.city_number = admin.user.city.id + admin.city_name = admin.user.city.name + admin.province_number = admin.user.province.id + admin.province_name = admin.user.province.name + admin.save() + + for jahad in jahads: + jahad.city_number = jahad.user.city.id + jahad.city_name = jahad.user.city.name + jahad.province_number = jahad.user.province.id + jahad.province_name = jahad.user.province.name + jahad.save() + + for city_jahad in city_jahads: + city_jahad.city_number = city_jahad.user.city.id + city_jahad.city_name = city_jahad.user.city.name + city_jahad.province_number = city_jahad.user.province.id + city_jahad.province_name = city_jahad.user.province.name + city_jahad.save() + + for goverment in goverments: + goverment.city_number = goverment.user.city.id + goverment.city_name = goverment.user.city.name + goverment.province_number = goverment.user.province.id + goverment.province_name = goverment.user.province.name + goverment.save() + + for vet_superviser in vet_supervisers: + vet_superviser.city_number = vet_superviser.user.city.id + vet_superviser.city_name = vet_superviser.user.city.name + vet_superviser.province_number = vet_superviser.user.province.id + vet_superviser.province_name = vet_superviser.user.province.name + vet_superviser.save() + + for province_allow_kill_house_register in province_allow_kill_house_registers: + province_allow_kill_house_register.city_number = province_allow_kill_house_register.kill_house.system_address.city.id + province_allow_kill_house_register.city_name = province_allow_kill_house_register.kill_house.system_address.city.name + province_allow_kill_house_register.province_number = province_allow_kill_house_register.kill_house.system_address.province.id + province_allow_kill_house_register.province_name = province_allow_kill_house_register.kill_house.system_address.province.name + province_allow_kill_house_register.save() + + for province_allow_poultry_choose_kill_house in province_allow_poultry_choose_kill_houses: + province_allow_poultry_choose_kill_house.city_number = province_allow_poultry_choose_kill_house.poultry.address.city.id + province_allow_poultry_choose_kill_house.city_name = province_allow_poultry_choose_kill_house.poultry.address.city.name + province_allow_poultry_choose_kill_house.province_number = province_allow_poultry_choose_kill_house.poultry.address.province.id + province_allow_poultry_choose_kill_house.province_name = province_allow_poultry_choose_kill_house.poultry.address.province.name + province_allow_poultry_choose_kill_house.save() + + for province_allow_poultry_auto in province_allow_poultry_auto_sell: + province_allow_poultry_auto.city_number = province_allow_poultry_auto.poultry.address.city.id + province_allow_poultry_auto.city_name = province_allow_poultry_auto.poultry.address.city.name + province_allow_poultry_auto.province_number = province_allow_poultry_auto.poultry.address.province.id + province_allow_poultry_auto.province_name = province_allow_poultry_auto.poultry.address.province.name + province_allow_poultry_auto.save() + + for kill_house_daily_quota in kill_house_daily_quotas: + kill_house_daily_quota.city_number = kill_house_daily_quota.kill_house.system_address.city.id + kill_house_daily_quota.city_name = kill_house_daily_quota.kill_house.system_address.city.name + kill_house_daily_quota.province_number = kill_house_daily_quota.kill_house.system_address.province.id + kill_house_daily_quota.province_name = kill_house_daily_quota.kill_house.system_address.province.name + kill_house_daily_quota.save() + + for province_auto_allocation in province_auto_allocations: + province_auto_allocation.city_number = province_auto_allocation.daily_quota.kill_house.system_address.city.id + province_auto_allocation.city_name = province_auto_allocation.daily_quota.kill_house.system_address.city.name + province_auto_allocation.province_number = province_auto_allocation.daily_quota.kill_house.system_address.province.id + province_auto_allocation.province_name = province_auto_allocation.daily_quota.kill_house.system_address.province.name + province_auto_allocation.save() diff --git a/panel/migrations/0001_initial.py b/panel/migrations/0001_initial.py new file mode 100644 index 0000000..f01c322 --- /dev/null +++ b/panel/migrations/0001_initial.py @@ -0,0 +1,3101 @@ +# Generated by Django 3.2.13 on 2023-09-18 19:32 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('notification', '0001_initial'), + ('auth', '0012_alter_user_first_name_max_length'), + ('authentication', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='CityOperator', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('city_operator_id_key', models.IntegerField(null=True)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('identity_documents', models.JSONField(null=True)), + ('phone', models.CharField(max_length=20, null=True)), + ('unit_name', models.CharField(max_length=50, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_system_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityoperator_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityoperator_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_operator_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_operator_bank_info', to='authentication.bankcard')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CityOperatorCheckRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('city_operator_system_id_foreign_key', models.IntegerField(null=True)), + ('poultry_request_id_foreign_key', models.IntegerField(null=True)), + ('city_operator_check_request_id_key', models.IntegerField(null=True)), + ('state', models.CharField(max_length=20, null=True)), + ('message', models.CharField(max_length=500, null=True)), + ('allow_hatching', models.BooleanField(null=True)), + ('show_province', models.BooleanField(default=True)), + ('province_accept', models.BooleanField(default=False)), + ('province_state', models.CharField(default='pending', max_length=20)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('city_operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_city_operator', to='authentication.userprofile')), + ('city_operator_system', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_city_operator', to='panel.cityoperator')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityoperatorcheckrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityoperatorcheckrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Guilds', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('provincial_government_id_key', models.IntegerField(null=True)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('guilds_id', models.CharField(max_length=50, null=True)), + ('license_number', models.CharField(max_length=50, null=True)), + ('guilds_name', models.CharField(max_length=100, null=True)), + ('type_activity', models.CharField(max_length=100, null=True)), + ('area_activity', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('steward', models.BooleanField(default=False)), + ('centers_allocation', models.JSONField(null=True)), + ('kill_house_centers_allocation', models.JSONField(null=True)), + ('allocation_limit', models.BigIntegerField(null=True)), + ('limitation_allocation', models.BooleanField(default=False)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guilds_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guilds_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guilds_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guilds_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guilds_bank_info', to='authentication.bankcard')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Hall', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('hall_number', models.IntegerField(default=1)), + ], + ), + migrations.CreateModel( + name='InspectorOperator', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('inspector_operator_id_key', models.IntegerField(null=True)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('active', models.BooleanField(default=True)), + ('identity_documents', models.JSONField(null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('id_number', models.IntegerField(default=1)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='inspector_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='inspectoroperator_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='inspectoroperator_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='inspector_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_inspector_bank_info', to='authentication.bankcard')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Itransaction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('transfer_amount', models.FloatField(null=True)), + ('transaction_type', models.CharField(max_length=20, null=True)), + ('payment_code', models.BigIntegerField(default=0, null=True)), + ('state', models.CharField(default='pending', max_length=20)), + ('make_location_state', models.CharField(max_length=20, null=True)), + ('file_id', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='itransaction_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='itransaction_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouse', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('system_address_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_operator_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_id_key', models.IntegerField(null=True)), + ('shift_work_from', models.CharField(max_length=50, null=True)), + ('shift_work_to', models.CharField(max_length=50, null=True)), + ('name', models.CharField(max_length=50, null=True)), + ('car', models.JSONField(default=dict, null=True)), + ('capacity', models.FloatField(default=0)), + ('killing_race', models.CharField(max_length=20, null=True)), + ('phone', models.CharField(max_length=20, null=True)), + ('killer', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouse_address', to='authentication.address')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouse_createdby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseADDCAR', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_id_foreign_key', models.IntegerField(null=True)), + ('driver_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_add_car_id_key', models.IntegerField(null=True)), + ('status', models.CharField(default='inactive', max_length=50)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseaddcar_createdby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseAssignmentInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_check_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_request_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_kill_house_assingment_information_id_key', models.IntegerField(null=True)), + ('car_weight_without_load', models.FloatField(default=0)), + ('car_weight_without_load_image', models.CharField(max_length=500, null=True)), + ('car_weight_with_load', models.FloatField(default=0)), + ('car_weight_with_load_image', models.CharField(max_length=500, null=True)), + ('message', models.CharField(max_length=200, null=True)), + ('net_weight', models.FloatField(default=0)), + ('exploited_carcass', models.FloatField(default=0)), + ('state', models.CharField(default='pending', max_length=15)), + ('poultry', models.BooleanField(default=False)), + ('city', models.BooleanField(default=False)), + ('province', models.BooleanField(default=False)), + ('unusual_casualties', models.BooleanField(default=False)), + ('real_quantity', models.IntegerField(default=0)), + ('importer', models.JSONField(default=dict, null=True)), + ('protest_time', models.DateTimeField(null=True)), + ('weight_withs_losses', models.FloatField(default=0, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseassignmentinformation_createdby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseDailyQuota', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_id_foreign_key', models.IntegerField(null=True)), + ('kill_request_id_foreign_key', models.IntegerField(null=True)), + ('killer_kill_house_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_daily_quota_id_key', models.IntegerField(null=True)), + ('percent', models.FloatField(default=0)), + ('quantity', models.BigIntegerField(default=0)), + ('remain_quantity', models.BigIntegerField(default=0)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousedailyquota_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percent_killhouse_daily_quota', to='panel.killhouse')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseFactorToPoultry', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('payment_code', models.CharField(max_length=100, null=True)), + ('state', models.CharField(default='pending', max_length=20)), + ('payment_state', models.CharField(max_length=50, null=True)), + ('payment_method', models.CharField(max_length=50, null=True)), + ('factor_image', models.CharField(max_length=500, null=True)), + ('message', models.CharField(max_length=500, null=True)), + ('importer', models.CharField(max_length=100, null=True)), + ('archive_state', models.CharField(default='pending', max_length=50)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousefactortopoultry_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousefactortopoultry_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseFactorToProvince', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('province_factor_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_factor_to_province_id_key', models.IntegerField(null=True)), + ('payment_code', models.CharField(max_length=100, null=True)), + ('state', models.CharField(default='pending', max_length=20)), + ('payment_state', models.CharField(max_length=50, null=True)), + ('payment_method', models.CharField(max_length=50, null=True)), + ('factor_image', models.CharField(max_length=500, null=True)), + ('message', models.CharField(max_length=500, null=True)), + ('importer', models.CharField(max_length=100, null=True)), + ('archive_state', models.CharField(default='pending', max_length=50)), + ('first_payment', models.BooleanField(default=False)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousefactortoprovince_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousefactortoprovince_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('killhouse_user_id_foreign_key', models.IntegerField(null=True)), + ('kill_request_id_foreign_key', models.IntegerField(null=True)), + ('province_request_id_foreign_key', models.IntegerField(null=True)), + ('province_kill_request_id_foreign_key', models.IntegerField(null=True)), + ('add_car_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_request_id_key', models.IntegerField(null=True)), + ('capacity', models.BigIntegerField(default=0)), + ('quantity', models.BigIntegerField(default=0)), + ('bar_code', models.BigIntegerField(null=True)), + ('fee', models.FloatField(default=0, null=True)), + ('time', models.CharField(max_length=20, null=True)), + ('state', models.CharField(max_length=20, null=True)), + ('vet_state', models.CharField(default='pending', max_length=20)), + ('active_state', models.CharField(default='active', max_length=20)), + ('assignment_state_archive', models.CharField(default='pending', max_length=20)), + ('show_kill_house', models.CharField(default='pending', max_length=20)), + ('car', models.JSONField(default=dict, null=True)), + ('kill_house_message', models.TextField(max_length=1000, null=True)), + ('allocation_state', models.CharField(max_length=20, null=True)), + ('auction', models.BooleanField(default=False)), + ('role', models.JSONField(null=True)), + ('clearance_code', models.CharField(max_length=200, null=True)), + ('traffic_code', models.CharField(max_length=200, null=True)), + ('registrar_clearance_code', models.JSONField(null=True)), + ('editor_traffic_code', models.JSONField(null=True)), + ('bar_remover', models.JSONField(null=True)), + ('accepted_real_quantity', models.BigIntegerField(default=0)), + ('accepted_real_weight', models.FloatField(default=0)), + ('message', models.CharField(max_length=200, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('add_car', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_add_car', to='panel.killhouseaddcar')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequest_createdby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseRequestAction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('fee', models.FloatField(default=0, null=True)), + ('date', models.DateTimeField(null=True)), + ('state', models.CharField(default='pending', max_length=15)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestaction_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_auction_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestaction_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseRequestExchangeReserve', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.CharField(default='pending', max_length=15)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestexchangereserve_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_exchange_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestexchangereserve_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseVet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('vet_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_vet_id_key', models.IntegerField(null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousevet_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_vet', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousevet_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseWareHouse', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('bar_quantity', models.BigIntegerField(default=0)), + ('allocated_quantity', models.BigIntegerField(default=0)), + ('bar_live_weight', models.FloatField(default=0)), + ('number_of_carcasses', models.BigIntegerField(default=0)), + ('updated_number_of_carcasses', models.BigIntegerField(default=0)), + ('weight_of_carcasses', models.FloatField(default=0)), + ('updated_weight_of_carcasses', models.FloatField(default=0)), + ('ave_weight_of_carcasses', models.FloatField(default=0)), + ('update_ave_weight_of_carcasses', models.FloatField(default=0)), + ('free_bar_quantity', models.BigIntegerField(default=0)), + ('number_of_free_carcasses', models.BigIntegerField(default=0)), + ('free_weight_of_carcasses', models.FloatField(default=0)), + ('total_bar_quantity', models.BigIntegerField(default=0)), + ('total_number_of_carcasses', models.BigIntegerField(default=0)), + ('update_total_number_of_carcasses', models.BigIntegerField(default=0)), + ('total_weight_of_carcasses', models.FloatField(default=0)), + ('update_total_weight_of_carcasses', models.FloatField(default=0)), + ('allocated_total_number_of_carcasses', models.BigIntegerField(default=0)), + ('allocated_total_weight_of_carcasses', models.FloatField(default=0)), + ('remain_total_number_of_carcasses', models.BigIntegerField(default=0)), + ('remain_total_weight_of_carcasses', models.FloatField(default=0)), + ('final_registration', models.BooleanField(default=False)), + ('date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousewarehouse_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ware_house_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousewarehouse_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_id_foreign_key', models.IntegerField(null=True)), + ('slaughter_house_id_foreign_key', models.IntegerField(null=True)), + ('kill_request_id_key', models.IntegerField(null=True)), + ('kill_capacity', models.IntegerField(null=True)), + ('remain_quantity_for_poultry', models.IntegerField(default=0)), + ('remain_quantity', models.IntegerField(null=True)), + ('recive_time', models.CharField(max_length=50, null=True)), + ('recive_date', models.DateTimeField(null=True)), + ('state', models.CharField(default='pending', max_length=20)), + ('province_state', models.CharField(default='pending', max_length=20)), + ('province_quantity', models.IntegerField(null=True)), + ('cars', models.JSONField(default=dict)), + ('buy_type', models.JSONField(default=dict, null=True)), + ('weight', models.CharField(max_length=200, null=True)), + ('weight_type', models.JSONField(default=dict, null=True)), + ('chicken_breed', models.CharField(max_length=200, null=True)), + ('old_chicken_breed', models.CharField(max_length=200, null=True)), + ('message', models.CharField(max_length=200, null=True)), + ('Index_weight', models.FloatField(null=True)), + ('first_average_weight', models.FloatField(default=0)), + ('second_average_weight', models.FloatField(default=0)), + ('factor_amount', models.FloatField(default=0)), + ('allocated_number', models.FloatField(default=0)), + ('factor_deposit', models.FloatField(default=0)), + ('debt', models.BooleanField(default=False)), + ('priority', models.BooleanField(default=False)), + ('debt_amount', models.FloatField(default=0)), + ('sms_payment', models.BooleanField(default=False)), + ('automatic', models.BooleanField(default=False)), + ('automatic_debt', models.BooleanField(default=False)), + ('payment_info', models.JSONField(null=True)), + ('registrar', models.JSONField(null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ('slaughter_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='slaughter_kill_req', to='panel.killhouse')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillRequestFactor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_request_id_foreign_key', models.IntegerField(null=True)), + ('kill_request_factor_id_key', models.IntegerField(null=True)), + ('state', models.CharField(default='pending', max_length=20)), + ('amount', models.FloatField(default=0)), + ('minimum_amount', models.FloatField(default=0)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killrequestfactor_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='factor_kill_req', to='panel.killrequest')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killrequestfactor_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='LastUpdate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('poultry_hatching', models.JSONField(null=True)), + ], + ), + migrations.CreateModel( + name='Poultry', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('owner_id_foreign_key', models.IntegerField(null=True)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('city_operator', models.CharField(max_length=150, null=True)), + ('unit_name', models.CharField(max_length=100, null=True)), + ('password', models.CharField(max_length=100, null=True)), + ('gis_code', models.CharField(max_length=30, null=True)), + ('operating_licence_capacity', models.BigIntegerField(default=0)), + ('number_of_halls', models.IntegerField(default=0)), + ('tenant', models.BooleanField(default=False, null=True)), + ('has_tenant', models.BooleanField(default=False, null=True)), + ('person_type', models.CharField(max_length=10, null=True)), + ('economic_code', models.CharField(max_length=30, null=True)), + ('system_code', models.CharField(max_length=20, null=True)), + ('epidemiological_code', models.CharField(max_length=20, null=True)), + ('breeding_unique_id', models.CharField(max_length=20, null=True)), + ('total_capacity', models.BigIntegerField(default=0)), + ('licence_number', models.CharField(max_length=20, null=True)), + ('health_certificate_number', models.CharField(max_length=20, null=True)), + ('number_of_requests', models.BigIntegerField(default=0)), + ('hatching_date', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 605532))), + ('last_party_date', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 605532))), + ('number_of_incubators', models.BigIntegerField(default=0)), + ('herd_age_by_day', models.IntegerField(default=0)), + ('herd_age_by_week', models.IntegerField(default=0)), + ('number_of_party', models.IntegerField(default=0)), + ('communication_type', models.CharField(max_length=30, null=True)), + ('cooperative', models.CharField(max_length=50, null=True)), + ('date_of_register', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 605532))), + ('unit_status', models.CharField(max_length=20, null=True)), + ('active', models.BooleanField(default=True)), + ('identity_documents', models.JSONField(null=True)), + ('samasat_user_code', models.CharField(max_length=20, null=True)), + ('base_order', models.BigIntegerField(null=True)), + ('incubation_date', models.DateTimeField(null=True)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('city', models.IntegerField(default=0)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('wallet_id_foreign_key', models.IntegerField(default=1)), + ('poultry_id_key', models.IntegerField(default=1)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_system_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_modifiedby', to=settings.AUTH_USER_MODEL)), + ('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_owner', to='panel.poultry')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_bank_info', to='authentication.bankcard')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PoultryAssignmentInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('car_weight_without_load', models.FloatField(default=0)), + ('car_weight_without_load_image', models.CharField(max_length=500, null=True)), + ('car_weight_with_load', models.FloatField(default=0)), + ('car_weight_with_load_image', models.CharField(max_length=500, null=True)), + ('net_weight', models.FloatField(default=0)), + ('state', models.CharField(default='pending', max_length=15)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryassignmentinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryassignmentinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PoultryHatching', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('poultry_id_foreign_key', models.IntegerField(null=True)), + ('poultry_hatching_id_key', models.IntegerField(null=True)), + ('quantity', models.BigIntegerField(default=0)), + ('losses', models.BigIntegerField(default=0)), + ('left_over', models.BigIntegerField(null=True)), + ('request_left_over', models.BigIntegerField(default=0)), + ('hall', models.IntegerField(default=0)), + ('date', models.DateTimeField(null=True)), + ('chicken_breed', models.CharField(max_length=200, null=True)), + ('period', models.BigIntegerField(default=0, null=True)), + ('allow_hatching', models.CharField(default='pending', max_length=20)), + ('state', models.CharField(default='pending', max_length=50)), + ('archive', models.BooleanField(default=False)), + ('message', models.CharField(max_length=500, null=True)), + ('registrar', models.JSONField(null=True)), + ('breed', models.JSONField(null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('last_change', models.JSONField(null=True)), + ('chicken_age', models.IntegerField(default=1)), + ('latest_hatching_change', models.JSONField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryhatching_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryhatching_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_hatching_user', to='panel.poultry')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PoultryRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('city_operator_id_foreign_key', models.IntegerField(null=True)), + ('poultry_id_foreign_key', models.IntegerField(null=True)), + ('poultry_hatching_id_foreign_key', models.IntegerField(null=True)), + ('poultry_request_id_key', models.IntegerField(null=True)), + ('quantity', models.BigIntegerField(default=0)), + ('previous_quantity', models.BigIntegerField(default=0)), + ('remain_quantity', models.BigIntegerField(default=0)), + ('first_quantity', models.BigIntegerField(default=0)), + ('losses', models.BigIntegerField(default=0)), + ('send_date', models.DateTimeField(null=True)), + ('chicken_breed', models.CharField(max_length=200, null=True)), + ('Index_weight', models.FloatField(null=True)), + ('state', models.JSONField(default=dict, null=True)), + ('state_process', models.CharField(default='pending', max_length=50)), + ('province_state', models.CharField(default='pending', max_length=50)), + ('order_code', models.BigIntegerField(null=True)), + ('general_order_code', models.BigIntegerField(null=True)), + ('message', models.CharField(max_length=500, null=True)), + ('inspector', models.CharField(max_length=30, null=True)), + ('union', models.BooleanField(default=False)), + ('awaiting_payment', models.BooleanField(default=False)), + ('assignment', models.BooleanField(default=False)), + ('auction', models.BooleanField(default=False)), + ('fee', models.FloatField(default=0)), + ('final_state', models.CharField(default='pending', max_length=50)), + ('cell_type', models.JSONField(default=dict, null=True)), + ('kill_house_list', models.JSONField(null=True)), + ('registrar', models.JSONField(null=True)), + ('buyer', models.JSONField(null=True)), + ('out', models.BooleanField(default=False)), + ('vet', models.BooleanField(default=False)), + ('archive', models.BooleanField(default=False)), + ('selling_without_city', models.BooleanField(default=False)), + ('clearance_code', models.BigIntegerField(null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('city_operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_city_operator', to='panel.cityoperator')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('hatching', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_hatching', to='panel.poultryhatching')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_poultry', to='panel.poultry')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request', to='authentication.userprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PoultryRequestExchange', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('quantity', models.BigIntegerField(default=0, null=True)), + ('send_date', models.DateTimeField(null=True)), + ('hatching_date', models.DateTimeField(null=True)), + ('chicken_breed', models.CharField(max_length=20, null=True)), + ('Index_weight', models.FloatField(null=True)), + ('fee', models.FloatField(null=True)), + ('order_code', models.IntegerField(null=True)), + ('longitude', models.FloatField(default=0)), + ('latitude', models.FloatField(default=0)), + ('address', models.TextField()), + ('age', models.IntegerField(default=0, null=True)), + ('inspector', models.CharField(max_length=30, null=True)), + ('state', models.CharField(default='pending', max_length=15)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequestexchange_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequestexchange_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_exchange', to='authentication.userprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PriceAnalysis', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('corn_percent', models.FloatField(default=0, null=True)), + ('corn_free_price', models.FloatField(default=0, null=True)), + ('corn_Ration_free_price', models.FloatField(default=0, null=True)), + ('corn_total_free_price', models.FloatField(default=0, null=True)), + ('Soy_free_price', models.FloatField(default=0, null=True)), + ('Soy_total_free_price', models.FloatField(default=0, null=True)), + ('Soy_Ration_free_price', models.FloatField(default=0, null=True)), + ('Soy_percent', models.FloatField(default=0, null=True)), + ('Oil_percent', models.FloatField(default=0, null=True)), + ('Oil_free_price', models.FloatField(default=0, null=True)), + ('Oil_total_free_price', models.FloatField(default=0, null=True)), + ('Oil_Ration_free_price', models.FloatField(default=0, null=True)), + ('Dicalcium_free_price', models.FloatField(default=0, null=True)), + ('Dicalcium_total_free_price', models.FloatField(default=0, null=True)), + ('Dicalcium_Ration_free_price', models.FloatField(default=0, null=True)), + ('Dicalcium_percent', models.FloatField(default=0, null=True)), + ('Carbonate_free_price', models.FloatField(default=0, null=True)), + ('Carbonate_total_free_price', models.FloatField(default=0, null=True)), + ('Carbonate_Ration_free_price', models.FloatField(default=0, null=True)), + ('Carbonate_percent', models.FloatField(default=0, null=True)), + ('mineral_supplement_percent', models.FloatField(default=0, null=True)), + ('mineral_Ration_supplement_free_price', models.FloatField(default=0, null=True)), + ('mineral_supplement_free_price', models.FloatField(default=0, null=True)), + ('mineral_supplement_total_free_price', models.FloatField(default=0, null=True)), + ('vitamin_supplement_free_price', models.FloatField(default=0, null=True)), + ('vitamin_supplement_total_free_price', models.FloatField(default=0, null=True)), + ('vitamin_supplement_percent', models.FloatField(default=0, null=True)), + ('vitamin_Ration_free_supplement_percent', models.FloatField(default=0, null=True)), + ('baking_soda_free_price', models.FloatField(default=0, null=True)), + ('baking_soda_total_free_price', models.FloatField(default=0, null=True)), + ('baking_Ration_soda_free_price', models.FloatField(default=0, null=True)), + ('baking_soda_percent', models.FloatField(default=0, null=True)), + ('Salt_Ration_free_price', models.FloatField(default=0, null=True)), + ('Salt_Ration_total_free_price', models.FloatField(default=0, null=True)), + ('Salt_free_total_price', models.FloatField(default=0, null=True)), + ('Salt_free_price', models.FloatField(default=0, null=True)), + ('Salt_percent', models.FloatField(default=0, null=True)), + ('metiunin_Ration_free_price', models.FloatField(default=0, null=True)), + ('metiunin_free_price', models.FloatField(default=0, null=True)), + ('metiunin_total_free_price', models.FloatField(default=0, null=True)), + ('metiunin_percent', models.FloatField(default=0, null=True)), + ('Lysine_Ration_free_price', models.FloatField(default=0, null=True)), + ('Lysine_free_price', models.FloatField(default=0, null=True)), + ('Lysine_total_free_price', models.FloatField(default=0, null=True)), + ('Lysine_percent', models.FloatField(default=0, null=True)), + ('threonine_free_price', models.FloatField(default=0, null=True)), + ('threonine_total_free_price', models.FloatField(default=0, null=True)), + ('threonine_Ration_free_price', models.FloatField(default=0, null=True)), + ('threonine_percent', models.FloatField(default=0, null=True)), + ('Antifungal_free_price', models.FloatField(default=0, null=True)), + ('Antifungal_total_free_price', models.FloatField(default=0, null=True)), + ('Antifungal_Ration_free_price', models.FloatField(default=0, null=True)), + ('Antifungal_percent', models.FloatField(default=0, null=True)), + ('inulin_free_price', models.FloatField(default=0, null=True)), + ('inulin_total_free_price', models.FloatField(default=0, null=True)), + ('inulin_Ration_free_price', models.FloatField(default=0, null=True)), + ('inulin_percent', models.FloatField(default=0, null=True)), + ('Fire_emulsion_free_price', models.FloatField(default=0, null=True)), + ('Fire_total_emulsion_free_price', models.FloatField(default=0, null=True)), + ('Fire_emulsion_Ration_free_price', models.FloatField(default=0, null=True)), + ('Fire_emulsion_percent', models.FloatField(default=0, null=True)), + ('Colleen_free_price', models.FloatField(default=0, null=True)), + ('Colleen_total_free_price', models.FloatField(default=0, null=True)), + ('Colleen_Ration_free_price', models.FloatField(default=0, null=True)), + ('Colleen_percent', models.FloatField(default=0, null=True)), + ('total_price', models.FloatField(default=0, null=True)), + ('total_Ration_free_price', models.FloatField(default=0, null=True)), + ('Vaccination_period', models.FloatField(default=0, null=True)), + ('Multivitamin_course', models.FloatField(default=0, null=True)), + ('period_chicken', models.FloatField(default=0, null=True)), + ('directors_office', models.FloatField(default=0, null=True)), + ('Water_gas_electricity_period', models.FloatField(default=0, null=True)), + ('Water_gas_the_current_cost_of_the_period_unit', models.FloatField(default=0, null=True)), + ('Course_repairs', models.FloatField(default=0, null=True)), + ('Course_loss', models.FloatField(default=0, null=True)), + ('motfar_ga_durah', models.FloatField(default=0, null=True)), + ('Paper_reel', models.FloatField(default=0, null=True)), + ('Course_disinfection', models.FloatField(default=0, null=True)), + ('Lamp', models.FloatField(default=0, null=True)), + ('total_percent', models.FloatField(default=0, null=True)), + ('total_ration', models.FloatField(default=0, null=True)), + ('chicken_price', models.FloatField(default=0, null=True)), + ], + ), + migrations.CreateModel( + name='ProvinceCheckInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_assignment_id_foreign_key', models.IntegerField(null=True)), + ('province_operator_id_foreign_key', models.IntegerField(null=True)), + ('province_check_information_id_key', models.IntegerField(null=True)), + ('state', models.CharField(max_length=20, null=True)), + ('message', models.CharField(max_length=200, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincecheckinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_assignment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_assign', to='panel.killhouseassignmentinformation')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincecheckinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_assignment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_assign', to='panel.poultryassignmentinformation')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceCheckOperatorRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('province_operator_system_id_foreign_key', models.IntegerField(null=True)), + ('poultry_request_id_foreign_key', models.IntegerField(null=True)), + ('city_request_poultry_id_foreign_key', models.IntegerField(null=True)), + ('province_operator_check_request_id_key', models.IntegerField(null=True)), + ('state', models.CharField(max_length=50, null=True)), + ('quantity', models.BigIntegerField(default=0, null=True)), + ('fee', models.FloatField(null=True)), + ('total_weight_at_end', models.FloatField(default=0, null=True)), + ('total_cost_at_end', models.FloatField(null=True)), + ('paid_state', models.CharField(default='pending', max_length=20)), + ('province_show_kill_house', models.CharField(default='pending', max_length=20)), + ('factor_state', models.CharField(default='pending', max_length=20)), + ('message', models.CharField(max_length=200, null=True)), + ('financial_archive', models.CharField(default='pending', max_length=20)), + ('deposit_allocation_archive', models.CharField(default='pending', max_length=20)), + ('end_state', models.CharField(default='active', max_length=20)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('city_request_Poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='Poultry_city_request_to_province', to='panel.cityoperatorcheckrequest')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincecheckoperatorrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincecheckoperatorrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_poultry_request', to='panel.poultryrequest')), + ('province_operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_province_operator', to='authentication.userprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceFactorToKillHouse', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('total_weight', models.FloatField(default=0)), + ('weight', models.FloatField(default=0)), + ('factor_fee', models.FloatField(default=0)), + ('factor_bar_code', models.BigIntegerField(null=True)), + ('factor_date', models.DateTimeField(null=True)), + ('total_price', models.FloatField(default=0)), + ('province_input_amount', models.FloatField(default=0)), + ('province_input_amount_type', models.CharField(max_length=20, null=True)), + ('province_wage', models.FloatField(default=0)), + ('previous_amount', models.FloatField(default=0)), + ('decreasing_amount', models.FloatField(default=0)), + ('today_price', models.FloatField(default=0)), + ('kill_house_factor_payment_remain', models.FloatField(default=0)), + ('real_weight', models.FloatField(default=0)), + ('shares', models.JSONField(default=dict, null=True)), + ('paid_state', models.CharField(default='pending', max_length=20)), + ('pay_for', models.CharField(max_length=20, null=True)), + ('kill_house_factor_info', models.CharField(default='pending', max_length=20)), + ('reason', models.TextField(null=True)), + ('sum_state', models.CharField(default='pending', max_length=20)), + ('factor_person_type', models.CharField(default='pending', max_length=20)), + ('province_check_info_id_foreign_key', models.IntegerField(null=True)), + ('province_check_req_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('province_factor_to_kill_house_id_key', models.IntegerField(null=True)), + ('out', models.BooleanField(default=False)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('bank', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bank_card_province', to='authentication.bankcard')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincefactortokillhouse_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincefactortokillhouse_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceFactorToKillHouseForPoultry', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('total_weight', models.FloatField(default=0)), + ('weight', models.FloatField(default=0)), + ('factor_fee', models.FloatField(default=0)), + ('factor_bar_code', models.BigIntegerField(null=True)), + ('factor_date', models.DateTimeField(null=True)), + ('total_price', models.FloatField(default=0)), + ('today_price', models.FloatField(default=0)), + ('real_weight', models.FloatField(default=0)), + ('shares', models.JSONField(default=dict, null=True)), + ('paid_state', models.CharField(default='pending', max_length=20)), + ('pay_for', models.CharField(max_length=20, null=True)), + ('kill_house_factor_info', models.CharField(default='pending', max_length=20)), + ('sum_state', models.CharField(default='pending', max_length=20)), + ('out', models.BooleanField(default=False)), + ('bank', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bank_card_poultry', to='authentication.bankcard')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincefactortokillhouseforpoultry_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincefactortokillhouseforpoultry_modifiedby', to=settings.AUTH_USER_MODEL)), + ('province_check_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_info_poultry', to='panel.provincecheckinformation')), + ('province_check_req', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_check_poultry', to='panel.provincecheckoperatorrequest')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceOperator', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('province_operator_id_key', models.IntegerField(null=True)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('identity_documents', models.JSONField(null=True)), + ('phone', models.CharField(max_length=20, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_system_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceoperator_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceoperator_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_operator_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_operator_bank_info', to='authentication.bankcard')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Steward', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=True)), + ('allocation_limit', models.BigIntegerField(null=True)), + ('limitation_allocation', models.BooleanField(default=False)), + ('centers_allocation', models.JSONField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_createdby', to=settings.AUTH_USER_MODEL)), + ('guilds', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_guilds', to='panel.guilds')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Vet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('vet_id_key', models.IntegerField(null=True)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_profile_vet', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_bank_info', to='authentication.bankcard')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='VetFarm', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('vet_id_foreign_key', models.IntegerField(null=True)), + ('poultry_id_foreign_key', models.IntegerField(null=True)), + ('vet_farm_id_key', models.IntegerField(null=True)), + ('hall', models.IntegerField(default=0)), + ('vetfarm_losses', models.BigIntegerField(default=0)), + ('state', models.CharField(default='pending', max_length=20)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetfarm_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetfarm_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_farm_poultry', to='panel.poultry')), + ('vet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_farm_vet', to='panel.vet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='WareHouseFactor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('customer', models.CharField(max_length=50, null=True)), + ('national_code', models.CharField(max_length=20, null=True)), + ('letter_number', models.BigIntegerField(null=True)), + ('letter_number_jahad', models.BigIntegerField(null=True)), + ('date', models.DateTimeField(null=True)), + ('mobile', models.CharField(max_length=11, null=True)), + ('product_type', models.JSONField(default=dict, null=True)), + ('weight', models.FloatField(default=0, null=True)), + ('fee', models.FloatField(default=0, null=True)), + ('wage', models.FloatField(default=0, null=True)), + ('total_wage', models.FloatField(default=0, null=True)), + ('total_fee', models.FloatField(default=0, null=True)), + ('total_cost', models.FloatField(default=0, null=True)), + ('Complications', models.FloatField(default=0, null=True)), + ('tax', models.FloatField(default=0, null=True)), + ('discount', models.FloatField(default=0, null=True)), + ('name_of_bank_user', models.CharField(max_length=200, null=True)), + ('card', models.CharField(max_length=16, null=True)), + ('shaba', models.CharField(max_length=100, null=True)), + ('state', models.CharField(default='pending', max_length=100)), + ('account', models.CharField(max_length=100, null=True)), + ('mark', models.CharField(default='pending', max_length=100)), + ('considerations', models.TextField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='warehousefactor_createdby', to=settings.AUTH_USER_MODEL)), + ('first_operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_first_operator', to='authentication.userprofile')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='warehousefactor_modifiedby', to=settings.AUTH_USER_MODEL)), + ('second_operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_second_operator', to='authentication.userprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Wallet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('inventory', models.FloatField(default=0)), + ('state', models.CharField(default='active', max_length=120)), + ('province_name', models.CharField(max_length=50, null=True)), + ('id_number', models.IntegerField(default=1)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wallet_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wallet_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='WagePayment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('province_kill_request', models.JSONField(null=True)), + ('payment_type', models.CharField(max_length=50, null=True)), + ('total_amount', models.BigIntegerField(default=0)), + ('payer', models.JSONField(null=True)), + ('tracking_code', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wagepayment_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wagepayment_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='VetSupervisor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('vet_id_foreign_key', models.IntegerField(null=True)), + ('vet_superviser_id_key', models.IntegerField(null=True)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supervisor_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetsupervisor_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetsupervisor_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supervisor_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supervisor_bank_info', to='authentication.bankcard')), + ('vet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_supervisor', to='panel.vet')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supervisor_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='VetFarmInspection', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('vet_farm_id_foreign_key', models.IntegerField(null=True)), + ('poultry_hatching_id_foreign_key', models.IntegerField(null=True)), + ('vet_farm_inspection_id_key', models.IntegerField(null=True)), + ('hall', models.IntegerField(default=0)), + ('topic', models.CharField(max_length=500, null=True)), + ('description', models.TextField(null=True)), + ('Losses', models.BigIntegerField(default=0)), + ('image', models.JSONField(null=True)), + ('longitude', models.FloatField(default=0)), + ('latitude', models.FloatField(default=0)), + ('state', models.CharField(default='pending', max_length=20)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetfarminspection_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetfarminspection_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_hatching', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_farm_inspection_poultry_hatching', to='panel.poultryhatching')), + ('vet_farm', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_farm_inspection', to='panel.vetfarm')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='VetCheckRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_vet_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_request_id_foreign_key', models.IntegerField(null=True)), + ('vet_check_request_id_key', models.IntegerField(null=True)), + ('state', models.CharField(max_length=20, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetcheckrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_vet', to='panel.killhouserequest')), + ('kill_house_vet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_user_vet', to='panel.killhousevet')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetcheckrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='VetCheckAllocations', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('vet_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_request_id_foreign_key', models.IntegerField(null=True)), + ('vet_chick_allocations_id_key', models.IntegerField(null=True)), + ('state', models.CharField(default='pending', max_length=50)), + ('reviewer', models.JSONField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetcheckallocations_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='check_kill_house_request', to='panel.killhouserequest')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetcheckallocations_modifiedby', to=settings.AUTH_USER_MODEL)), + ('vet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_check', to='panel.vet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='vet', + name='wallet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_wallet', to='panel.wallet'), + ), + migrations.CreateModel( + name='TotalPoultryRequestQuantity', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('quantity', models.BigIntegerField(default=0)), + ('accepted_quantity', models.BigIntegerField(default=0)), + ('first_quantity', models.BigIntegerField(default=0)), + ('city_accepted_quantity', models.BigIntegerField(default=0)), + ('allocated_quantity', models.BigIntegerField(default=0)), + ('number_of_poultry', models.BigIntegerField(default=0)), + ('rejected_quantity', models.BigIntegerField(default=0)), + ('waiting_quantity', models.BigIntegerField(default=0)), + ('number_of_kill_house', models.BigIntegerField(default=0)), + ('input_quantity', models.BigIntegerField(default=0)), + ('assignableQuantity', models.BigIntegerField(default=0)), + ('kill_requests_quantity', models.BigIntegerField(default=0)), + ('date', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 612526))), + ('age_up_45', models.BigIntegerField(default=0, null=True)), + ('total_poultry_request_quantity_id_key', models.IntegerField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='totalpoultryrequestquantity_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='totalpoultryrequestquantity_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='StewardWareHouse', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('bar_quantity', models.BigIntegerField(default=0)), + ('allocated_quantity', models.BigIntegerField(default=0)), + ('number_of_carcasses', models.BigIntegerField(default=0)), + ('real_number_of_carcasses', models.BigIntegerField(default=0)), + ('weight_of_carcasses', models.FloatField(default=0)), + ('real_weight_of_carcasses', models.FloatField(default=0)), + ('ave_weight_of_carcasses', models.FloatField(default=0)), + ('allocated_total_number_of_carcasses', models.BigIntegerField(default=0)), + ('allocated_total_weight_of_carcasses', models.FloatField(default=0)), + ('remain_total_number_of_carcasses', models.BigIntegerField(default=0)), + ('remain_total_weight_of_carcasses', models.FloatField(default=0)), + ('final_registration', models.BooleanField(default=False)), + ('date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardwarehouse_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardwarehouse_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ware_house_steward', to='panel.steward')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='StewardAllocation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('number_of_carcasses', models.BigIntegerField(default=0)), + ('real_number_of_carcasses', models.BigIntegerField(default=0)), + ('weight_of_carcasses', models.FloatField(default=0)), + ('real_weight_of_carcasses', models.FloatField(default=0)), + ('sell_type', models.CharField(max_length=100, null=True)), + ('seller_type', models.CharField(max_length=100, null=True)), + ('final_registration', models.BooleanField(default=False)), + ('system_registration_code', models.BooleanField(default=False)), + ('registration_code', models.IntegerField(null=True)), + ('logged_registration_code', models.IntegerField(null=True)), + ('state', models.CharField(default='pending', max_length=50)), + ('date', models.DateTimeField(null=True)), + ('role', models.JSONField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardallocation_createdby', to=settings.AUTH_USER_MODEL)), + ('guilds', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_allocation_guilds', to='panel.guilds')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardallocation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_steward_allocation', to='panel.steward')), + ('ware_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ware_house_steward_allocation', to='panel.killhousewarehouse')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SmsLicense', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('hatching', models.BooleanField(default=False)), + ('poultry_request', models.BooleanField(default=False)), + ('city_approval', models.BooleanField(default=False)), + ('province_approval', models.BooleanField(default=False)), + ('kill_request', models.BooleanField(default=False)), + ('province_kill_request', models.BooleanField(default=False)), + ('farm_veterinarian_approval', models.BooleanField(default=False)), + ('kill_house_request', models.BooleanField(default=False)), + ('kill_house_house_veterinarian_approval', models.BooleanField(default=False)), + ('assingment_information', models.BooleanField(default=False)), + ('confirmation_of_assingment_information', models.BooleanField(default=False)), + ('invoicing', models.BooleanField(default=False)), + ('invoice_payment', models.BooleanField(default=False)), + ('invoice_payment_confirmation', models.BooleanField(default=False)), + ('inspector_approval', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='smslicense_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='smslicense_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ShareOfAllocation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('province_id_foreign_key', models.IntegerField(null=True)), + ('share_of_allocation_id_key', models.IntegerField(null=True)), + ('central_union', models.FloatField(default=0, null=True)), + ('province_union', models.FloatField(default=0, null=True)), + ('city_union', models.FloatField(default=0, null=True)), + ('fanava', models.FloatField(default=0, null=True)), + ('central_control_system', models.FloatField(default=0, null=True)), + ('company', models.FloatField(default=0, null=True)), + ('vet', models.FloatField(default=0, null=True)), + ('total', models.FloatField(default=0, null=True)), + ('state', models.CharField(max_length=20, null=True)), + ('date', models.DateTimeField(null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='shareofallocation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='shareofallocation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('province', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='share_province', to='authentication.province')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SearchFields', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('type', models.CharField(max_length=100, null=True)), + ('field_name', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='searchfields_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='searchfields_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ReportingFieldRoleLimitation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('fields', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reportingfieldrolelimitation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reportingfieldrolelimitation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('role_name', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='report_role', to='auth.group')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvincialGovernment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('provincial_government_id_key', models.IntegerField(null=True)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='government_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincialgovernment_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincialgovernment_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='government_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='government_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='government_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceRequestAction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.CharField(default='pending', max_length=15)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincerequestaction_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincerequestaction_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_request_auction_poultry', to='panel.poultryrequest')), + ('province_operator_system', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_province_operator_auction', to='panel.provinceoperator')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvincePercentLeftOver', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('percent', models.FloatField(default=0, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincepercentleftover_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincepercentleftover_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='provinceoperator', + name='wallet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_wallet', to='panel.wallet'), + ), + migrations.CreateModel( + name='ProvinceKillRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('killhouse_user_id_foreign_key', models.IntegerField(null=True)), + ('kill_request_id_foreign_key', models.IntegerField(null=True)), + ('province_request_id_foreign_key', models.IntegerField(null=True)), + ('province_kill_request_id_key', models.IntegerField(null=True)), + ('quantity', models.BigIntegerField(default=0)), + ('main_quantity', models.BigIntegerField(default=0)), + ('fee', models.FloatField(default=0, null=True)), + ('state', models.CharField(default='pending', max_length=20)), + ('vet_state', models.CharField(default='pending', max_length=20)), + ('payment_type', models.CharField(max_length=20, null=True)), + ('payment_dead_line', models.DateTimeField(null=True)), + ('message', models.CharField(max_length=200, null=True)), + ('clearance_code', models.BigIntegerField(null=True)), + ('automatic', models.BooleanField(default=False)), + ('dont_show_kill_house', models.BooleanField(default=False)), + ('reviewer', models.JSONField(null=True)), + ('delete_message', models.CharField(max_length=200, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('wage_pay', models.BooleanField(default=False)), + ('depositor', models.JSONField(null=True)), + ('archive_by_province', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincekillrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_request', to='panel.killrequest')), + ('killhouse_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_user', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincekillrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ('province_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_province', to='panel.provincecheckoperatorrequest')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceImportKillHouseOutFactors', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('image', models.CharField(max_length=500, null=True)), + ('amount', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceimportkillhouseoutfactors_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_check_factor_out', to='panel.provincefactortokillhouse')), + ('kill_house_factor_poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_check_factor_poultry_out', to='panel.provincefactortokillhouseforpoultry')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceimportkillhouseoutfactors_modifiedby', to=settings.AUTH_USER_MODEL)), + ('province_check', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_check_request', to='panel.provincecheckoperatorrequest')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='provincefactortokillhouse', + name='poultry_factor', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_factor_poultry', to='panel.provincefactortokillhouseforpoultry'), + ), + migrations.AddField( + model_name='provincefactortokillhouse', + name='province_check_info', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_info', to='panel.provincecheckinformation'), + ), + migrations.AddField( + model_name='provincefactortokillhouse', + name='province_check_req', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_check_province', to='panel.provincecheckoperatorrequest'), + ), + migrations.AddField( + model_name='provincecheckoperatorrequest', + name='province_operator_system', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_province_operator', to='panel.provinceoperator'), + ), + migrations.CreateModel( + name='ProvinceCheckOperatorOutRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('province_operator_system_id_foreign_key', models.IntegerField(null=True)), + ('poultry_request_id_foreign_key', models.IntegerField(null=True)), + ('province_operator_check_out_request_id_key', models.IntegerField(null=True)), + ('state', models.CharField(max_length=50, null=True)), + ('message', models.CharField(max_length=200, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincecheckoperatoroutrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincecheckoperatoroutrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_poultry_out_request', to='panel.poultryrequest')), + ('province_operator_system', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_province_operator_out', to='panel.provinceoperator')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceCheckKillHouseFactor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_factor_id_foreign_key', models.IntegerField(null=True)), + ('province_check_kill_house_factor_id_key', models.IntegerField(null=True)), + ('state', models.CharField(max_length=20, null=True)), + ('message', models.CharField(max_length=500, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincecheckkillhousefactor_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_check_factor', to='panel.killhousefactortoprovince')), + ('kill_house_factor_poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_check_factor_poultry', to='panel.killhousefactortopoultry')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincecheckkillhousefactor_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='provincecheckinformation', + name='province_operator', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinc_operator_check_info', to='panel.provinceoperator'), + ), + migrations.CreateModel( + name='ProvinceAutoAllocation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('daily_quota_id_foreign_key', models.IntegerField(null=True)), + ('poultry_request_id_foreign_key', models.IntegerField(null=True)), + ('province_kill_request_id_foreign_key', models.IntegerField(null=True)), + ('province_auto_allocation_id_key', models.IntegerField(null=True)), + ('unauthorized_number', models.BooleanField(default=False)), + ('quantity', models.BigIntegerField(default=0)), + ('allocation_order_code', models.BigIntegerField(default=0)), + ('state', models.CharField(default='temporary', max_length=50)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceautoallocation_createdby', to=settings.AUTH_USER_MODEL)), + ('daily_quota', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percent_auto_killhouse_daily_quota_province', to='panel.killhousedailyquota')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceautoallocation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_auto_quantity_province', to='panel.poultryrequest')), + ('province_kill_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_kill_request_auto_quantity_province', to='panel.provincekillrequest')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceAllowPoultrySellFreeTotal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowpoultrysellfreetotal_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowpoultrysellfreetotal_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceAllowPoultrySellFree', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('poultry_id_foreign_key', models.IntegerField(null=True)), + ('province_allow_poultry_sell_free_id_key', models.IntegerField(null=True)), + ('allow', models.BooleanField(default=False)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowpoultrysellfree_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowpoultrysellfree_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_allow_poultry_sell_free', to='panel.poultry')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceAllowPoultryChooseKillHouseTotal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('mandatory', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowpoultrychoosekillhousetotal_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowpoultrychoosekillhousetotal_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceAllowPoultryChooseKillHouse', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('poultry_id_foreign_key', models.IntegerField(null=True)), + ('province_allow_poultry_choose_kill_house_id_key', models.IntegerField(null=True)), + ('allow', models.BooleanField(default=False)), + ('mandatory', models.BooleanField(default=False)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowpoultrychoosekillhouse_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowpoultrychoosekillhouse_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_allow_kill_house_register', to='panel.poultry')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceAllowKillHouseRegisterCar', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_id_foreign_key', models.IntegerField(null=True)), + ('province_allow_kill_house_register_car_id_key', models.IntegerField(null=True)), + ('allow', models.BooleanField(default=False)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhouseregistercar_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_allow_kill_house_register', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhouseregistercar_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceAllowKillHouseChooseStewardGuilds', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('steward', models.BooleanField(default=False)), + ('guilds', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhousechoosestewardguilds_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allow_kill_house_steward_guilds', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhousechoosestewardguilds_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Pricing', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('date', models.DateTimeField(null=True)), + ('live_chicken_price', models.FloatField(null=True)), + ('dead_chicken_price', models.FloatField(null=True)), + ('major_seller_price', models.FloatField(null=True)), + ('retail_seller_price', models.FloatField(null=True)), + ('floor_price', models.FloatField(null=True)), + ('ceiling_price', models.FloatField(null=True)), + ('role', models.CharField(max_length=20, null=True)), + ('lock', models.BooleanField(default=False)), + ('pricing_id_key', models.IntegerField(null=True)), + ('operator_id_foreign_key', models.IntegerField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pricing_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pricing_modifiedby', to=settings.AUTH_USER_MODEL)), + ('operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pricing_operator', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PovinceInspector', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('inspector_operator_id_foreign_key', models.IntegerField(null=True)), + ('poultry_request_id_foreign_key', models.IntegerField(null=True)), + ('province_inspector_id_key', models.IntegerField(null=True)), + ('state', models.CharField(default='pending', max_length=20)), + ('message', models.CharField(max_length=500, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='povinceinspector_createdby', to=settings.AUTH_USER_MODEL)), + ('inspector_operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='inspector', to='panel.inspectoroperator')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='povinceinspector_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_inspector', to='panel.poultryrequest')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PoultryTenant', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('fullname', models.CharField(max_length=150, null=True)), + ('first_name', models.CharField(max_length=200, null=True)), + ('last_name', models.CharField(max_length=200, null=True)), + ('natinal_id', models.CharField(max_length=10, null=True)), + ('mobile', models.CharField(default='', max_length=11, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultrytenant_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultrytenant_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_tenant', to='panel.poultry')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_tenant_bank_info', to='authentication.bankcard')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PoultryRequestExchangeAccept', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.CharField(default='pending', max_length=15)), + ('message', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequestexchangeaccept_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_request_exchange_reserve', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_exchange_kill_house_accept', to='panel.killhouserequestexchangereserve')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequestexchangeaccept_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_request_exchange', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_exchange_accept', to='panel.poultryrequestexchange')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PoultryRequestAuction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('fee', models.FloatField(default=0, null=True)), + ('hour', models.CharField(max_length=10, null=True)), + ('auction_date', models.DateTimeField(null=True)), + ('state', models.CharField(default='inactive', max_length=10)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequestauction_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequestauction_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_auction', to='panel.poultryrequest')), + ('pricing', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_auction_pricing', to='panel.pricing')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PoultryHallProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start_date', models.DateTimeField(null=True)), + ('end_date', models.DateTimeField(null=True)), + ('hall', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hall_poultry_profile', to='panel.hall')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_poultry_profile', to='authentication.systemuserprofile')), + ], + ), + migrations.AddField( + model_name='poultryassignmentinformation', + name='poultry_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_assignment', to='panel.poultryrequest'), + ), + migrations.CreateModel( + name='PoultryAllowCityProvince', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('poultry_id_foreign_key', models.IntegerField(null=True)), + ('poultry_allow_city_province_id_key', models.IntegerField(null=True)), + ('city', models.BooleanField(default=False)), + ('province', models.BooleanField(default=False)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryallowcityprovince_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryallowcityprovince_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_allow', to='panel.poultry')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='poultry', + name='wallet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_wallet', to='panel.wallet'), + ), + migrations.CreateModel( + name='PercentageOfLosses', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('houre', models.IntegerField(default=0)), + ('percent', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percentageoflosses_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percentageoflosses_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Penalty', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('cost', models.IntegerField(null=True)), + ('description', models.TextField(null=True)), + ('image', models.CharField(max_length=300, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='penalty_createdby', to=settings.AUTH_USER_MODEL)), + ('itransaction', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='penalty_itransaction', to='panel.itransaction')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='penalty_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PaymentDeadLine', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('days', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='paymentdeadline_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='paymentdeadline_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='OperatorLastTimeEnter', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('city_operator_last_time_check', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 603532))), + ('province_operator_last_time_check', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 603532))), + ('kill_house_last_time_check', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 603532))), + ('assignment_last_time_check', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 603532))), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='operatorlasttimeenter_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='operatorlasttimeenter_modifiedby', to=settings.AUTH_USER_MODEL)), + ('operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='operator_last_time_check', to='authentication.userprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='MostSearch', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('searched_items', models.CharField(max_length=200, null=True)), + ('count', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='mostsearch_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='mostsearch_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='MonthlyProfitPercentage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('days', models.IntegerField(default=0)), + ('percent', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='monthlyprofitpercentage_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='monthlyprofitpercentage_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillRequestFactorPayment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_request_factor_id_foreign_key', models.IntegerField(null=True)), + ('kill_request_factor_payment_id_key', models.IntegerField(null=True)), + ('state', models.CharField(default='pending', max_length=20)), + ('image', models.CharField(max_length=200, null=True)), + ('payment_code', models.BigIntegerField(default=0)), + ('amount', models.FloatField(default=0)), + ('remain_amount', models.FloatField(default=0)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killrequestfactorpayment_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_request_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_req_factor', to='panel.killrequestfactor')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killrequestfactorpayment_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='killhousevet', + name='vet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_vet_user', to='panel.vet'), + ), + migrations.CreateModel( + name='KillHouseRequestExchangeAddCar', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('cars', models.JSONField(default=dict, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestexchangeaddcar_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_reserve', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_accept_reserve', to='panel.killhouserequestexchangereserve')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestexchangeaddcar_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseRequestExchange', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('quantity', models.BigIntegerField(default=0, null=True)), + ('send_date1', models.DateTimeField(null=True)), + ('send_date2', models.DateTimeField(null=True)), + ('chicken_breed', models.JSONField(default=[], null=True)), + ('Index_weight', models.FloatField(default=0, null=True)), + ('fee', models.FloatField(default=0, null=True)), + ('longitude', models.FloatField(default=0)), + ('latitude', models.FloatField(default=0)), + ('address', models.TextField()), + ('age1', models.IntegerField(default=0, null=True)), + ('age2', models.IntegerField(default=0, null=True)), + ('state', models.CharField(default='pending', max_length=15)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestexchange_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_exchange_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestexchange_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_exchange', to='authentication.userprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseRequestActionWinner', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('fee', models.FloatField(default=0, null=True)), + ('quantity', models.BigIntegerField(default=0, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestactionwinner_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_request_auction', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_auction_kill_house', to='panel.killhouserequestaction')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequestactionwinner_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='killhouserequestaction', + name='poultry_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_auction_poultry', to='panel.poultryrequest'), + ), + migrations.AddField( + model_name='killhouserequest', + name='kill_house_request_auction_winner', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_winner', to='panel.killhouserequestactionwinner'), + ), + migrations.AddField( + model_name='killhouserequest', + name='kill_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_request_kill_house', to='panel.killrequest'), + ), + migrations.AddField( + model_name='killhouserequest', + name='killhouse_user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_user', to='panel.killhouse'), + ), + migrations.AddField( + model_name='killhouserequest', + name='modified_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouserequest_modifiedby', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='killhouserequest', + name='province_kill_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_kill_house_request', to='panel.provincekillrequest'), + ), + migrations.AddField( + model_name='killhouserequest', + name='province_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_province_request', to='panel.provincecheckoperatorrequest'), + ), + migrations.CreateModel( + name='KillHousePercentageOfLosses', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('percent', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousepercentageoflosses_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousepercentageoflosses_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHousePercentage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_for_killer_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_percentage_id_key', models.IntegerField(null=True)), + ('percent', models.FloatField(default=0)), + ('last_guilds_update_date', models.CharField(max_length=100, null=True)), + ('guilds_quantity', models.IntegerField(default=0)), + ('guilds_weight', models.FloatField(default=0)), + ('quantity', models.BigIntegerField(default=0)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousepercentage_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percent_killhouse', to='panel.killhouse')), + ('kill_house_for_killer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killer_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousepercentage_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseOperator', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_operator_id_key', models.IntegerField(null=True)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('killer', models.BooleanField(default=False)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_system_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseoperator_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseoperator_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_operator_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseFreeBarInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('poultry_name', models.CharField(max_length=100, null=True)), + ('poultry_mobile', models.CharField(max_length=11, null=True)), + ('province', models.CharField(max_length=50, null=True)), + ('city', models.CharField(max_length=50, null=True)), + ('vet_farm_name', models.CharField(max_length=100, null=True)), + ('vet_farm_mobile', models.CharField(max_length=11, null=True)), + ('driver_name', models.CharField(max_length=100, null=True)), + ('driver_mobile', models.CharField(max_length=11, null=True)), + ('car', models.JSONField(null=True)), + ('clearance_code', models.JSONField(null=True)), + ('quantity', models.BigIntegerField(default=0)), + ('number_of_carcasses', models.BigIntegerField(default=0)), + ('weight_of_carcasses', models.FloatField(default=0)), + ('live_weight', models.FloatField(default=0)), + ('bar_image', models.CharField(max_length=200, null=True)), + ('date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousefreebarinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousefreebarinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='killhousefactortoprovince', + name='province_factor', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_factor_info', to='panel.provincefactortokillhouse'), + ), + migrations.AddField( + model_name='killhousefactortopoultry', + name='province_factor', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_factor_info_poultry', to='panel.provincefactortokillhouseforpoultry'), + ), + migrations.CreateModel( + name='KillHouseDriver', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('driver_name', models.CharField(max_length=500, null=True)), + ('driver_mobile', models.CharField(max_length=11, null=True)), + ('type_car', models.CharField(max_length=50, null=True)), + ('type', models.CharField(max_length=50, null=True)), + ('pelak', models.CharField(max_length=200, null=True)), + ('capocity', models.CharField(max_length=50, null=True)), + ('weight_without_load', models.CharField(max_length=50, null=True)), + ('health_code', models.CharField(max_length=100, null=True)), + ('status', models.CharField(default='inactive', max_length=50)), + ('active', models.BooleanField(default=True)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_driver_id_key', models.IntegerField(null=True)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('identity_documents', models.JSONField(null=True)), + ('phone', models.CharField(max_length=20, null=True)), + ('registrar', models.JSONField(null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousedriver_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousedriver_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_driver', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='driver_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='driver_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='killhousedailyquota', + name='kill_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percent_kill_request_daily_quota', to='panel.killrequest'), + ), + migrations.AddField( + model_name='killhousedailyquota', + name='killer_kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killer_kill_house_daily_quota', to='panel.killhouse'), + ), + migrations.AddField( + model_name='killhousedailyquota', + name='modified_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousedailyquota_modifiedby', to=settings.AUTH_USER_MODEL), + ), + migrations.CreateModel( + name='KillHouseCreditors', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('amount', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousecreditors_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_creditors', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousecreditors_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseComplaint', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(max_length=200, null=True)), + ('description', models.TextField()), + ('image', models.JSONField(null=True)), + ('percent', models.FloatField(default=0)), + ('state', models.CharField(default='pending', max_length=20)), + ('message', models.CharField(max_length=20, null=True)), + ('registrar', models.JSONField(null=True)), + ('bar', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bar_information', to='panel.killhouseassignmentinformation')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousecomplaint_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousecomplaint_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseCheckRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('province_kill_request_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_check_request_id_key', models.IntegerField(null=True)), + ('role', models.JSONField(null=True)), + ('state', models.CharField(max_length=20, null=True)), + ('message', models.CharField(max_length=200, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousecheckrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousecheckrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ('province_kill_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_kill_house_check', to='panel.provincekillrequest')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='killhouseassignmentinformation', + name='kill_house_check', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_check_req', to='panel.killhousecheckrequest'), + ), + migrations.AddField( + model_name='killhouseassignmentinformation', + name='kill_house_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_assignment', to='panel.killhouserequest'), + ), + migrations.AddField( + model_name='killhouseassignmentinformation', + name='modified_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseassignmentinformation_modifiedby', to=settings.AUTH_USER_MODEL), + ), + migrations.CreateModel( + name='KillHouseAssignmentImages', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('health_certificate_image', models.CharField(max_length=500, null=True)), + ('national_card_image', models.CharField(max_length=500, null=True)), + ('birth_certificate_image', models.CharField(max_length=500, null=True)), + ('police_clearance_image', models.CharField(max_length=500, null=True)), + ('no_addiction_image', models.CharField(max_length=500, null=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseassignmentimages_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_images', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseassignmentimages_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='KillHouseAllowVet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_id_foreign_key', models.IntegerField(null=True)), + ('kill_house_allow_vet_id_key', models.IntegerField(null=True)), + ('allow', models.BooleanField(default=False)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseallowvet_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_allow', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseallowvet_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='killhouseaddcar', + name='driver', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_add_car_driver', to='panel.killhousedriver'), + ), + migrations.AddField( + model_name='killhouseaddcar', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_add_car', to='panel.killhouse'), + ), + migrations.AddField( + model_name='killhouseaddcar', + name='modified_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouseaddcar_modifiedby', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='killhouse', + name='kill_house_operator', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_kill_house_operator', to='panel.killhouseoperator'), + ), + migrations.AddField( + model_name='killhouse', + name='modified_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouse_modifiedby', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='killhouse', + name='system_address', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhouse_system_address', to='authentication.systemaddress'), + ), + migrations.AddField( + model_name='killhouse', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_killhouse', to='authentication.userprofile'), + ), + migrations.AddField( + model_name='killhouse', + name='userprofile', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_user_kill_house', to='authentication.systemuserprofile'), + ), + migrations.CreateModel( + name='Jahad', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('jahad_id_key', models.IntegerField(null=True)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='itransaction', + name='wallet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='itranseaction_wallet', to='panel.wallet'), + ), + migrations.AddField( + model_name='inspectoroperator', + name='wallet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='inspector_wallet', to='panel.wallet'), + ), + migrations.CreateModel( + name='HourLimit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('hour', models.IntegerField(null=True)), + ('active', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hourlimit_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hourlimit_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='HatchingLossesPermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('percent', models.FloatField(default=0)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hatchinglossespermission_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hatchinglossespermission_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='hall', + name='poultry', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_hall', to='panel.poultry'), + ), + migrations.CreateModel( + name='GuildsWareHouse', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('bar_quantity', models.BigIntegerField(default=0)), + ('allocated_quantity', models.BigIntegerField(default=0)), + ('number_of_carcasses', models.BigIntegerField(default=0)), + ('real_number_of_carcasses', models.BigIntegerField(default=0)), + ('weight_of_carcasses', models.FloatField(default=0)), + ('real_weight_of_carcasses', models.FloatField(default=0)), + ('ave_weight_of_carcasses', models.FloatField(default=0)), + ('date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildswarehouse_createdby', to=settings.AUTH_USER_MODEL)), + ('guilds', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ware_house_guilds', to='panel.guilds')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildswarehouse_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='guilds', + name='wallet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guilds_wallet', to='panel.wallet'), + ), + migrations.CreateModel( + name='FunctionExecutor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('func_name', models.CharField(max_length=200, null=True)), + ('time_type', models.CharField(max_length=100, null=True)), + ('cycle', models.IntegerField(default=0)), + ('compare_time', models.DateTimeField(default=datetime.datetime(2023, 9, 18, 19, 32, 12, 656484))), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='functionexecutor_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='functionexecutor_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='FinancialTransaction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('type', models.CharField(max_length=50, null=True)), + ('cost', models.IntegerField(null=True)), + ('description', models.TextField(null=True)), + ('image', models.JSONField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='financialtransaction_createdby', to=settings.AUTH_USER_MODEL)), + ('itransaction', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='financial_transaction', to='panel.itransaction')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='financialtransaction_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='FinancialDocument', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('transaction_details', models.JSONField(null=True)), + ('type', models.CharField(max_length=30, null=True)), + ('cost', models.FloatField(null=True)), + ('description', models.TextField(null=True)), + ('payment_code', models.IntegerField(null=True)), + ('image', models.JSONField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='financialdocument_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='financialdocument_modifiedby', to=settings.AUTH_USER_MODEL)), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='financial_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='DriverRequestCancel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('message', models.TextField(null=True)), + ('Kill_house_add_car', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cancel_request_car', to='panel.killhouseaddcar')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='driverrequestcancel_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cancel_request', to='panel.killhouserequest')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='driverrequestcancel_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='DepositAllocation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('poultry_request_id_foreign_key', models.IntegerField(null=True)), + ('deposit_allocation_id_key', models.IntegerField(null=True)), + ('poultry_share', models.FloatField(default=0, null=True)), + ('poultry_share_payment', models.FloatField(default=0, null=True)), + ('poultry_share_payment_info', models.JSONField(default=list, null=True)), + ('city_share', models.FloatField(default=0, null=True)), + ('city_share_payment', models.FloatField(default=0, null=True)), + ('city_share_payment_info', models.JSONField(default=list, null=True)), + ('province_share', models.FloatField(default=0, null=True)), + ('province_share_payment', models.FloatField(default=0, null=True)), + ('province_share_payment_info', models.JSONField(default=list, null=True)), + ('poultry_bank', models.JSONField(default=dict, null=True)), + ('city_bank', models.JSONField(default=dict, null=True)), + ('poultry_image', models.CharField(max_length=200, null=True)), + ('city_image', models.CharField(max_length=200, null=True)), + ('company_share', models.FloatField(default=0, null=True)), + ('company_share_payment', models.FloatField(default=0, null=True)), + ('company_share_payment_info', models.JSONField(default=list, null=True)), + ('company_bank', models.JSONField(default=dict, null=True)), + ('central_union_share', models.FloatField(default=0, null=True)), + ('central_union_share_payment', models.FloatField(default=0, null=True)), + ('central_union_share_payment_info', models.JSONField(default=list, null=True)), + ('fanava_share', models.FloatField(default=0, null=True)), + ('fanava_share_payment', models.FloatField(default=0, null=True)), + ('fanava_share_payment_info', models.JSONField(default=list, null=True)), + ('deposit_allocation_state', models.CharField(default='pending', max_length=20)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='depositallocation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='depositallocation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocations_poultry', to='panel.poultryrequest')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Deposit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('cost', models.IntegerField(null=True)), + ('description', models.TextField(null=True)), + ('image', models.CharField(max_length=300, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='deposit_createdby', to=settings.AUTH_USER_MODEL)), + ('itransaction', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='deposit_itransaction', to='panel.itransaction')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='deposit_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Debt', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('cost', models.IntegerField(null=True)), + ('description', models.TextField(null=True)), + ('image', models.CharField(max_length=300, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='debt_createdby', to=settings.AUTH_USER_MODEL)), + ('itransaction', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='debtor_itransaction', to='panel.itransaction')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='debt_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Commerce', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commerce_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commerce_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commerce_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commerce_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commerce_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commerce_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='cityoperatorcheckrequest', + name='poultry_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_check', to='panel.poultryrequest'), + ), + migrations.AddField( + model_name='cityoperator', + name='wallet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_wallet', to='panel.wallet'), + ), + migrations.CreateModel( + name='CityJahad', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('city_jahad_id_key', models.IntegerField(null=True)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_jahad_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityjahad_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityjahad_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_jahad_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_jahad_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_jahad_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CityCommerce', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_commerce_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='citycommerce_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='citycommerce_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_commerce_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_commerce_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_commerce_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CheckUnusualCasualties', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.CharField(max_length=50, null=True)), + ('message', models.TextField(null=True)), + ('role', models.JSONField(null=True)), + ('complaint', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='losses', to='panel.killhousecomplaint')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checkunusualcasualties_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checkunusualcasualties_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CheckState', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.BooleanField(default=False)), + ('city_state', models.BooleanField(default=False)), + ('city_state_notification', models.BooleanField(default=False)), + ('city_state_modal', models.BooleanField(default=False)), + ('city_state_sms', models.BooleanField(default=False)), + ('province_state', models.BooleanField(default=False)), + ('province_state_notification', models.BooleanField(default=False)), + ('province_state_modal', models.BooleanField(default=False)), + ('province_state_sms', models.BooleanField(default=False)), + ('kill_house_state_notification', models.BooleanField(default=False)), + ('kill_house_state_modal', models.BooleanField(default=False)), + ('kill_house_state_sms', models.BooleanField(default=False)), + ('assignment_state_notification', models.BooleanField(default=False)), + ('assignment_state_modal', models.BooleanField(default=False)), + ('assignment_state_sms', models.BooleanField(default=False)), + ('main_check', models.CharField(max_length=50, null=True)), + ('city_operator_check', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_operator_check_state', to='panel.cityoperatorcheckrequest')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checkstate_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checkstate_modifiedby', to=settings.AUTH_USER_MODEL)), + ('notification', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='check_notification', to='notification.notification')), + ('poultry_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request', to='panel.poultryrequest')), + ('province_operator_check', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_operator_check_state', to='panel.provincecheckoperatorrequest')), + ('user_message', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='message_check', to='authentication.usermessage')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CheckKillHouseComplaint', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.CharField(max_length=20, null=True)), + ('message', models.CharField(max_length=20, null=True)), + ('camplaint', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='check_complaint', to='panel.killhousecomplaint')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checkkillhousecomplaint_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checkkillhousecomplaint_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AutomaticKillRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automatickillrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automatickillrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AutoMakeKillHouseRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automakekillhouserequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automakekillhouserequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AutoAcceptProvinceKillRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='autoacceptprovincekillrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='autoacceptprovincekillrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Admin', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('admin_id_key', models.IntegerField(null=True)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_profile_admin', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0002_auto_20230918_2031.py b/panel/migrations/0002_auto_20230918_2031.py new file mode 100644 index 0000000..7d2e45a --- /dev/null +++ b/panel/migrations/0002_auto_20230918_2031.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2023-09-18 20:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultry', + name='address_id_foreign_key', + ), + migrations.RemoveField( + model_name='poultry', + name='city', + ), + migrations.RemoveField( + model_name='poultry', + name='city_name', + ), + migrations.RemoveField( + model_name='poultry', + name='city_number', + ), + migrations.RemoveField( + model_name='poultry', + name='poultry_id_key', + ), + migrations.RemoveField( + model_name='poultry', + name='province_name', + ), + migrations.RemoveField( + model_name='poultry', + name='province_number', + ), + migrations.RemoveField( + model_name='poultry', + name='user_bank_id_foreign_key', + ), + migrations.RemoveField( + model_name='poultry', + name='user_id_foreign_key', + ), + migrations.RemoveField( + model_name='poultry', + name='wallet_id_foreign_key', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 31, 10, 577980)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 31, 10, 528026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 31, 10, 528026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 31, 10, 528026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 31, 10, 528026)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 31, 10, 529025)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 31, 10, 529025)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 31, 10, 529025)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 31, 10, 536019)), + ), + ] diff --git a/panel/migrations/0003_auto_20230918_2035.py b/panel/migrations/0003_auto_20230918_2035.py new file mode 100644 index 0000000..d6d1b10 --- /dev/null +++ b/panel/migrations/0003_auto_20230918_2035.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2023-09-18 20:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0002_auto_20230918_2031'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultry', + name='owner_id_foreign_key', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 35, 11, 757571)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 35, 11, 704621)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 35, 11, 704621)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 35, 11, 704621)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 35, 11, 704621)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 35, 11, 706619)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 35, 11, 706619)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 35, 11, 706619)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 20, 35, 11, 714612)), + ), + ] diff --git a/panel/migrations/0004_auto_20230918_2110.py b/panel/migrations/0004_auto_20230918_2110.py new file mode 100644 index 0000000..c7bfc35 --- /dev/null +++ b/panel/migrations/0004_auto_20230918_2110.py @@ -0,0 +1,114 @@ +# Generated by Django 3.2.13 on 2023-09-18 21:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0003_auto_20230918_2035'), + ] + + operations = [ + migrations.AddField( + model_name='poultry', + name='address_id_foreign_key', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='poultry', + name='city', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='city_name', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='poultry', + name='city_number', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='owner_id_foreign_key', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='poultry', + name='poultry_id_key', + field=models.IntegerField(default=1), + ), + migrations.AddField( + model_name='poultry', + name='province_name', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='poultry', + name='province_number', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='user_bank_id_foreign_key', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='poultry', + name='user_id_foreign_key', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='poultry', + name='wallet_id_foreign_key', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 21, 10, 45, 329099)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 21, 10, 45, 277148)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 21, 10, 45, 277148)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 21, 10, 45, 277148)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 21, 10, 45, 277148)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 21, 10, 45, 279147)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 21, 10, 45, 279147)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 21, 10, 45, 279147)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 18, 21, 10, 45, 287138)), + ), + ] diff --git a/panel/migrations/0005_auto_20230919_0035.py b/panel/migrations/0005_auto_20230919_0035.py new file mode 100644 index 0000000..94ea175 --- /dev/null +++ b/panel/migrations/0005_auto_20230919_0035.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-09-19 00:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0004_auto_20230918_2110'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 19, 0, 35, 16, 338656)), + ), + migrations.AlterField( + model_name='killrequest', + name='cars', + field=models.JSONField(default=dict, null=True), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 19, 0, 35, 16, 288701)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 19, 0, 35, 16, 288701)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 19, 0, 35, 16, 288701)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 19, 0, 35, 16, 288701)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 19, 0, 35, 16, 290700)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 19, 0, 35, 16, 290700)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 19, 0, 35, 16, 290700)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 19, 0, 35, 16, 297695)), + ), + ] diff --git a/panel/migrations/0006_auto_20230923_1311.py b/panel/migrations/0006_auto_20230923_1311.py new file mode 100644 index 0000000..b51220d --- /dev/null +++ b/panel/migrations/0006_auto_20230923_1311.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2023-09-23 13:11 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0005_auto_20230919_0035'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='direct_buying_state', + field=models.CharField(default='pending', max_length=20), + ), + migrations.AddField( + model_name='killrequest', + name='poultry', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_kill_req', to='panel.poultry'), + ), + migrations.AddField( + model_name='poultryrequest', + name='direct_buying', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 23, 13, 11, 16, 261372)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 23, 13, 11, 16, 126962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 23, 13, 11, 16, 126962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 23, 13, 11, 16, 126962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 23, 13, 11, 16, 126962)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 23, 13, 11, 16, 126962)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 23, 13, 11, 16, 126962)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 23, 13, 11, 16, 126962)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 23, 13, 11, 16, 155895)), + ), + ] diff --git a/panel/migrations/0007_auto_20230926_0954.py b/panel/migrations/0007_auto_20230926_0954.py new file mode 100644 index 0000000..db56b4d --- /dev/null +++ b/panel/migrations/0007_auto_20230926_0954.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-09-26 09:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0006_auto_20230923_1311'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='direct_buying_message', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 9, 54, 54, 115194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 9, 54, 54, 68321)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 9, 54, 54, 68321)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 9, 54, 54, 68321)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 9, 54, 54, 68321)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 9, 54, 54, 68321)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 9, 54, 54, 68321)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 9, 54, 54, 68321)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 9, 54, 54, 83946)), + ), + ] diff --git a/panel/migrations/0008_auto_20230926_1440.py b/panel/migrations/0008_auto_20230926_1440.py new file mode 100644 index 0000000..c71fe2e --- /dev/null +++ b/panel/migrations/0008_auto_20230926_1440.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-09-26 14:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0007_auto_20230926_0954'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='previous_kill_capacity', + field=models.IntegerField(default=0, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 14, 40, 28, 552927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 14, 40, 28, 499533)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 14, 40, 28, 499533)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 14, 40, 28, 499533)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 14, 40, 28, 499533)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 14, 40, 28, 499533)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 14, 40, 28, 499533)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 14, 40, 28, 499533)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 26, 14, 40, 28, 515161)), + ), + ] diff --git a/panel/migrations/0009_auto_20230927_1033.py b/panel/migrations/0009_auto_20230927_1033.py new file mode 100644 index 0000000..36ecea3 --- /dev/null +++ b/panel/migrations/0009_auto_20230927_1033.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-09-27 10:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0008_auto_20230926_1440'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='direct_buying_kill_place', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 33, 23, 575717)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 33, 23, 513217)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 33, 23, 513217)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 33, 23, 513217)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 33, 23, 513217)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 33, 23, 513217)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 33, 23, 513217)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 33, 23, 513217)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 33, 23, 528842)), + ), + ] diff --git a/panel/migrations/0010_auto_20230927_1047.py b/panel/migrations/0010_auto_20230927_1047.py new file mode 100644 index 0000000..df638c1 --- /dev/null +++ b/panel/migrations/0010_auto_20230927_1047.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-09-27 10:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0009_auto_20230927_1033'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='direct_buying_buyer_info', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 47, 42, 701654)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 47, 42, 654775)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 47, 42, 654775)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 47, 42, 654775)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 47, 42, 654775)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 47, 42, 654775)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 47, 42, 654775)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 47, 42, 654775)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 10, 47, 42, 654775)), + ), + ] diff --git a/panel/migrations/0011_auto_20230927_1416.py b/panel/migrations/0011_auto_20230927_1416.py new file mode 100644 index 0000000..2139bb4 --- /dev/null +++ b/panel/migrations/0011_auto_20230927_1416.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-09-27 14:16 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0010_auto_20230927_1047'), + ] + + operations = [ + migrations.AddField( + model_name='totalpoultryrequestquantity', + name='direct_buying_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 14, 16, 34, 791384)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 14, 16, 34, 744510)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 14, 16, 34, 744510)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 14, 16, 34, 744510)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 14, 16, 34, 744510)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 14, 16, 34, 744510)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 14, 16, 34, 744510)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 14, 16, 34, 744510)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 14, 16, 34, 744510)), + ), + ] diff --git a/panel/migrations/0012_auto_20230927_1554.py b/panel/migrations/0012_auto_20230927_1554.py new file mode 100644 index 0000000..66c0a39 --- /dev/null +++ b/panel/migrations/0012_auto_20230927_1554.py @@ -0,0 +1,96 @@ +# Generated by Django 3.2.13 on 2023-09-27 15:54 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0011_auto_20230927_1416'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 15, 54, 7, 625956)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 15, 54, 7, 563458)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 15, 54, 7, 563458)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 15, 54, 7, 563458)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 15, 54, 7, 563458)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 15, 54, 7, 563458)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 15, 54, 7, 563458)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 15, 54, 7, 563458)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 27, 15, 54, 7, 579081)), + ), + migrations.CreateModel( + name='ProvinceAllowKillHouseDirectBuyingTotal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhousedirectbuyingtotal_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhousedirectbuyingtotal_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceAllowKillHouseDirectBuying', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhousedirectbuying_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_allow_kill_house_direct_buying', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhousedirectbuying_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0013_auto_20230928_1502.py b/panel/migrations/0013_auto_20230928_1502.py new file mode 100644 index 0000000..5d528e1 --- /dev/null +++ b/panel/migrations/0013_auto_20230928_1502.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-09-28 15:02 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0012_auto_20230927_1554'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='direct_buying_code', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='killrequest', + name='input_direct_buying_code', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 28, 15, 2, 12, 218683)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 28, 15, 2, 12, 171807)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 28, 15, 2, 12, 171807)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 28, 15, 2, 12, 171807)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 28, 15, 2, 12, 171807)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 28, 15, 2, 12, 171807)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 28, 15, 2, 12, 171807)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 28, 15, 2, 12, 171807)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 9, 28, 15, 2, 12, 187435)), + ), + ] diff --git a/panel/migrations/0014_auto_20231002_1157.py b/panel/migrations/0014_auto_20231002_1157.py new file mode 100644 index 0000000..67e8b73 --- /dev/null +++ b/panel/migrations/0014_auto_20231002_1157.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-10-02 11:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0013_auto_20230928_1502'), + ] + + operations = [ + migrations.AddField( + model_name='killhouseaddcar', + name='active_state', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhousedriver', + name='active_state', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 11, 56, 57, 350958)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 11, 56, 57, 304086)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 11, 56, 57, 304086)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 11, 56, 57, 304086)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 11, 56, 57, 304086)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 11, 56, 57, 304086)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 11, 56, 57, 304086)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 11, 56, 57, 304086)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 11, 56, 57, 304086)), + ), + ] diff --git a/panel/migrations/0015_auto_20231002_1201.py b/panel/migrations/0015_auto_20231002_1201.py new file mode 100644 index 0000000..ff7ab1f --- /dev/null +++ b/panel/migrations/0015_auto_20231002_1201.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-10-02 12:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0014_auto_20231002_1157'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 12, 0, 55, 229711)), + ), + migrations.AlterField( + model_name='killhouseaddcar', + name='active_state', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='killhousedriver', + name='active_state', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 12, 0, 55, 167213)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 12, 0, 55, 167213)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 12, 0, 55, 167213)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 12, 0, 55, 167213)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 12, 0, 55, 167213)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 12, 0, 55, 167213)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 12, 0, 55, 167213)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 2, 12, 0, 55, 182837)), + ), + ] diff --git a/panel/migrations/0016_auto_20231004_1101.py b/panel/migrations/0016_auto_20231004_1101.py new file mode 100644 index 0000000..07df2cf --- /dev/null +++ b/panel/migrations/0016_auto_20231004_1101.py @@ -0,0 +1,96 @@ +# Generated by Django 3.2.13 on 2023-10-04 11:01 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0015_auto_20231002_1201'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 11, 1, 27, 182015)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 11, 1, 27, 135141)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 11, 1, 27, 135141)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 11, 1, 27, 135141)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 11, 1, 27, 135141)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 11, 1, 27, 135141)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 11, 1, 27, 135141)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 11, 1, 27, 135141)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 11, 1, 27, 150766)), + ), + migrations.CreateModel( + name='ProvinceAllowKillHouseRegisterGuildsTotal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhouseregisterguildstotal_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhouseregisterguildstotal_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProvinceAllowKillHouseRegisterGuilds', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhouseregisterguilds_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_allow_kill_house_register_guilds', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provinceallowkillhouseregisterguilds_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0017_auto_20231004_1452.py b/panel/migrations/0017_auto_20231004_1452.py new file mode 100644 index 0000000..b7f1680 --- /dev/null +++ b/panel/migrations/0017_auto_20231004_1452.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-10-04 14:52 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0016_auto_20231004_1101'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='province_accept', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='steward', + name='province_accept', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 14, 51, 58, 991184)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 14, 51, 58, 944316)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 14, 51, 58, 944316)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 14, 51, 58, 944316)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 14, 51, 58, 944316)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 14, 51, 58, 944316)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 14, 51, 58, 944316)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 14, 51, 58, 944316)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 14, 51, 58, 944316)), + ), + ] diff --git a/panel/migrations/0018_auto_20231004_1508.py b/panel/migrations/0018_auto_20231004_1508.py new file mode 100644 index 0000000..bc7c439 --- /dev/null +++ b/panel/migrations/0018_auto_20231004_1508.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-10-04 15:08 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0017_auto_20231004_1452'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='province_accept_state', + field=models.CharField(default='accepted', max_length=20), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 8, 44, 27001)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 8, 43, 964504)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 8, 43, 964504)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 8, 43, 964504)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 8, 43, 964504)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 8, 43, 964504)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 8, 43, 964504)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 8, 43, 964504)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 8, 43, 980131)), + ), + ] diff --git a/panel/migrations/0019_auto_20231004_1528.py b/panel/migrations/0019_auto_20231004_1528.py new file mode 100644 index 0000000..ac8fe75 --- /dev/null +++ b/panel/migrations/0019_auto_20231004_1528.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2023-10-04 15:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0018_auto_20231004_1508'), + ] + + operations = [ + migrations.RemoveField( + model_name='guilds', + name='province_accept', + ), + migrations.RemoveField( + model_name='steward', + name='province_accept', + ), + migrations.AddField( + model_name='guilds', + name='kill_house_register', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='steward', + name='kill_house_register', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='steward', + name='province_accept_state', + field=models.CharField(default='accepted', max_length=20), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 28, 7, 201644)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 28, 7, 154770)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 28, 7, 154770)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 28, 7, 154770)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 28, 7, 154770)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 28, 7, 154770)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 28, 7, 154770)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 28, 7, 154770)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 28, 7, 170396)), + ), + ] diff --git a/panel/migrations/0020_auto_20231004_1539.py b/panel/migrations/0020_auto_20231004_1539.py new file mode 100644 index 0000000..1632bee --- /dev/null +++ b/panel/migrations/0020_auto_20231004_1539.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2023-10-04 15:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0019_auto_20231004_1528'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 39, 39, 603497)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 39, 39, 556620)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 39, 39, 556620)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 39, 39, 556620)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 39, 39, 556620)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 39, 39, 556620)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 39, 39, 556620)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 39, 39, 556620)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 39, 39, 556620)), + ), + ] diff --git a/panel/migrations/0021_auto_20231004_1552.py b/panel/migrations/0021_auto_20231004_1552.py new file mode 100644 index 0000000..76a7750 --- /dev/null +++ b/panel/migrations/0021_auto_20231004_1552.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-10-04 15:52 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0020_auto_20231004_1539'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='province_message', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 52, 15, 368774)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 52, 15, 321899)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 52, 15, 321899)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 52, 15, 321899)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 52, 15, 321899)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 52, 15, 321899)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 52, 15, 321899)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 52, 15, 321899)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 4, 15, 52, 15, 337526)), + ), + ] diff --git a/panel/migrations/0022_auto_20231005_0439.py b/panel/migrations/0022_auto_20231005_0439.py new file mode 100644 index 0000000..5563659 --- /dev/null +++ b/panel/migrations/0022_auto_20231005_0439.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2023-10-05 04:39 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0002_auto_20231005_0439'), + ('panel', '0021_auto_20231004_1552'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 935289)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 888413)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 888413)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 888413)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 888413)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 888413)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 888413)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 888413)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 5, 4, 39, 40, 888413)), + ), + migrations.CreateModel( + name='CityVet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_vet_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityvet_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityvet_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_vet_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_vet_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_vet_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0023_auto_20231007_1338.py b/panel/migrations/0023_auto_20231007_1338.py new file mode 100644 index 0000000..cdcdce3 --- /dev/null +++ b/panel/migrations/0023_auto_20231007_1338.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-10-07 13:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0022_auto_20231005_0439'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='alternate_number', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 7, 13, 38, 17, 780858)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 7, 13, 38, 17, 615499)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 7, 13, 38, 17, 615499)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 7, 13, 38, 17, 615499)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 7, 13, 38, 17, 615499)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 7, 13, 38, 17, 631124)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 7, 13, 38, 17, 631124)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 7, 13, 38, 17, 631124)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 7, 13, 38, 17, 662370)), + ), + ] diff --git a/panel/migrations/0024_auto_20231009_1240.py b/panel/migrations/0024_auto_20231009_1240.py new file mode 100644 index 0000000..71387d4 --- /dev/null +++ b/panel/migrations/0024_auto_20231009_1240.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2023-10-09 12:40 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0023_auto_20231007_1338'), + ] + + operations = [ + migrations.AddField( + model_name='cityvet', + name='vet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_city_vet', to='panel.vet'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 9, 12, 40, 34, 822908)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 9, 12, 40, 34, 742983)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 9, 12, 40, 34, 742983)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 9, 12, 40, 34, 742983)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 9, 12, 40, 34, 742983)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 9, 12, 40, 34, 745980)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 9, 12, 40, 34, 745980)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 9, 12, 40, 34, 745980)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 9, 12, 40, 34, 756970)), + ), + ] diff --git a/panel/migrations/0025_auto_20231010_1249.py b/panel/migrations/0025_auto_20231010_1249.py new file mode 100644 index 0000000..a24c0dc --- /dev/null +++ b/panel/migrations/0025_auto_20231010_1249.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2023-10-10 12:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0024_auto_20231009_1240'), + ] + + operations = [ + migrations.AddField( + model_name='hourlimit', + name='kill_house_active', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='hourlimit', + name='kill_house_hour', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='hourlimit', + name='poultry_active', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='hourlimit', + name='poultry_hour', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 10, 12, 49, 54, 289962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 10, 12, 49, 54, 231019)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 10, 12, 49, 54, 230024)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 10, 12, 49, 54, 231019)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 10, 12, 49, 54, 231019)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 10, 12, 49, 54, 233016)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 10, 12, 49, 54, 233016)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 10, 12, 49, 54, 233016)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 10, 12, 49, 54, 243005)), + ), + ] diff --git a/panel/migrations/0026_auto_20231011_1337.py b/panel/migrations/0026_auto_20231011_1337.py new file mode 100644 index 0000000..b7520ba --- /dev/null +++ b/panel/migrations/0026_auto_20231011_1337.py @@ -0,0 +1,96 @@ +# Generated by Django 3.2.13 on 2023-10-11 13:37 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0025_auto_20231010_1249'), + ] + + operations = [ + migrations.RemoveField( + model_name='hourlimit', + name='kill_house_active', + ), + migrations.RemoveField( + model_name='hourlimit', + name='kill_house_hour', + ), + migrations.RemoveField( + model_name='hourlimit', + name='poultry_active', + ), + migrations.RemoveField( + model_name='hourlimit', + name='poultry_hour', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 11, 13, 37, 15, 249531)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 11, 13, 37, 15, 186592)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 11, 13, 37, 15, 186592)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 11, 13, 37, 15, 186592)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 11, 13, 37, 15, 186592)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 11, 13, 37, 15, 189589)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 11, 13, 37, 15, 189589)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 11, 13, 37, 15, 189589)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 11, 13, 37, 15, 198580)), + ), + migrations.CreateModel( + name='KillHouseHourLimit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('hour', models.IntegerField(null=True)), + ('active', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousehourlimit_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousehourlimit_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0027_auto_20231015_1349.py b/panel/migrations/0027_auto_20231015_1349.py new file mode 100644 index 0000000..d8db8bc --- /dev/null +++ b/panel/migrations/0027_auto_20231015_1349.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-10-15 13:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0026_auto_20231011_1337'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='prev_total_amount', + field=models.FloatField(default=0, null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='total_amount', + field=models.FloatField(default=0, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 15, 13, 49, 5, 896790)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 15, 13, 49, 5, 844839)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 15, 13, 49, 5, 844839)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 15, 13, 49, 5, 844839)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 15, 13, 49, 5, 844839)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 15, 13, 49, 5, 846837)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 15, 13, 49, 5, 846837)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 15, 13, 49, 5, 846837)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 15, 13, 49, 5, 854829)), + ), + ] diff --git a/panel/migrations/0028_auto_20231016_1211.py b/panel/migrations/0028_auto_20231016_1211.py new file mode 100644 index 0000000..268d190 --- /dev/null +++ b/panel/migrations/0028_auto_20231016_1211.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-10-16 12:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0027_auto_20231015_1349'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='total_amount_editor', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 16, 12, 11, 6, 280667)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 16, 12, 11, 6, 227714)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 16, 12, 11, 6, 227714)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 16, 12, 11, 6, 227714)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 16, 12, 11, 6, 227714)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 16, 12, 11, 6, 229712)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 16, 12, 11, 6, 229712)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 16, 12, 11, 6, 229712)), + ), + migrations.AlterField( + model_name='provincekillrequest', + name='prev_total_amount', + field=models.FloatField(null=True), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 16, 12, 11, 6, 237707)), + ), + ] diff --git a/panel/migrations/0029_auto_20231017_1511.py b/panel/migrations/0029_auto_20231017_1511.py new file mode 100644 index 0000000..941a9cc --- /dev/null +++ b/panel/migrations/0029_auto_20231017_1511.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-10-17 15:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0028_auto_20231016_1211'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='wage', + field=models.FloatField(default=0, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 17, 15, 11, 22, 197275)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 17, 15, 11, 21, 991467)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 17, 15, 11, 21, 991467)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 17, 15, 11, 21, 991467)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 17, 15, 11, 21, 991467)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 17, 15, 11, 21, 994465)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 17, 15, 11, 21, 994465)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 17, 15, 11, 21, 994465)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 17, 15, 11, 22, 9451)), + ), + ] diff --git a/panel/migrations/0030_auto_20231028_1327.py b/panel/migrations/0030_auto_20231028_1327.py new file mode 100644 index 0000000..8be132d --- /dev/null +++ b/panel/migrations/0030_auto_20231028_1327.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2023-10-28 13:27 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0029_auto_20231017_1511'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 28, 13, 27, 36, 441830)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 28, 13, 27, 36, 379334)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 28, 13, 27, 36, 379334)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 28, 13, 27, 36, 379334)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 28, 13, 27, 36, 379334)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 28, 13, 27, 36, 379334)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 28, 13, 27, 36, 379334)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 28, 13, 27, 36, 379334)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 28, 13, 27, 36, 394960)), + ), + migrations.CreateModel( + name='KillHousePurchaseRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=True)), + ('limitation', models.BooleanField(default=False)), + ('limitation_number', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousepurchaserequest_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_purchase_request', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousepurchaserequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0031_auto_20231031_1233.py b/panel/migrations/0031_auto_20231031_1233.py new file mode 100644 index 0000000..88abdb2 --- /dev/null +++ b/panel/migrations/0031_auto_20231031_1233.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2023-10-31 12:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0030_auto_20231028_1327'), + ] + + operations = [ + migrations.AddField( + model_name='wagepayment', + name='orderId', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='wagepayment', + name='refId', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='wagepayment', + name='state', + field=models.CharField(default='pending', max_length=20), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 12, 33, 27, 566059)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 12, 33, 27, 519185)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 12, 33, 27, 519185)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 12, 33, 27, 519185)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 12, 33, 27, 519185)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 12, 33, 27, 519185)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 12, 33, 27, 519185)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 12, 33, 27, 519185)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 12, 33, 27, 519185)), + ), + ] diff --git a/panel/migrations/0032_auto_20231031_1509.py b/panel/migrations/0032_auto_20231031_1509.py new file mode 100644 index 0000000..99fe7e8 --- /dev/null +++ b/panel/migrations/0032_auto_20231031_1509.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-10-31 15:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0031_auto_20231031_1233'), + ] + + operations = [ + migrations.AddField( + model_name='wagepayment', + name='cardHolderPan', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 15, 9, 19, 924368)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 15, 9, 19, 872421)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 15, 9, 19, 871420)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 15, 9, 19, 871420)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 15, 9, 19, 871420)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 15, 9, 19, 873418)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 15, 9, 19, 873418)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 15, 9, 19, 873418)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 10, 31, 15, 9, 19, 881411)), + ), + ] diff --git a/panel/migrations/0033_auto_20231101_1240.py b/panel/migrations/0033_auto_20231101_1240.py new file mode 100644 index 0000000..f7f27ab --- /dev/null +++ b/panel/migrations/0033_auto_20231101_1240.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-11-01 12:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0032_auto_20231031_1509'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='archive_message', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='archiver', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 1, 12, 40, 25, 880289)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 1, 12, 40, 25, 811352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 1, 12, 40, 25, 811352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 1, 12, 40, 25, 811352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 1, 12, 40, 25, 811352)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 1, 12, 40, 25, 814351)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 1, 12, 40, 25, 814351)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 1, 12, 40, 25, 814351)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 1, 12, 40, 25, 824340)), + ), + ] diff --git a/panel/migrations/0034_auto_20231103_1509.py b/panel/migrations/0034_auto_20231103_1509.py new file mode 100644 index 0000000..dc07de7 --- /dev/null +++ b/panel/migrations/0034_auto_20231103_1509.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-11-03 15:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0033_auto_20231101_1240'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='killed_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 3, 15, 8, 57, 208327)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 3, 15, 8, 57, 140869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 3, 15, 8, 57, 140869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 3, 15, 8, 57, 140869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 3, 15, 8, 57, 140869)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 3, 15, 8, 57, 140869)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 3, 15, 8, 57, 140869)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 3, 15, 8, 57, 140869)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 3, 15, 8, 57, 161453)), + ), + ] diff --git a/panel/migrations/0035_auto_20231104_1118.py b/panel/migrations/0035_auto_20231104_1118.py new file mode 100644 index 0000000..b804645 --- /dev/null +++ b/panel/migrations/0035_auto_20231104_1118.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-11-04 11:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0034_auto_20231103_1509'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='return_archive_message', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='returner', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 4, 11, 18, 30, 803443)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 4, 11, 18, 30, 748494)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 4, 11, 18, 30, 748494)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 4, 11, 18, 30, 748494)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 4, 11, 18, 30, 748494)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 4, 11, 18, 30, 750493)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 4, 11, 18, 30, 750493)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 4, 11, 18, 30, 750493)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 4, 11, 18, 30, 758485)), + ), + ] diff --git a/panel/migrations/0036_auto_20231105_1224.py b/panel/migrations/0036_auto_20231105_1224.py new file mode 100644 index 0000000..54de86b --- /dev/null +++ b/panel/migrations/0036_auto_20231105_1224.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-11-05 12:24 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0035_auto_20231104_1118'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='temp_killed_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 5, 12, 24, 31, 101805)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 5, 12, 24, 31, 49852)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 5, 12, 24, 31, 49852)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 5, 12, 24, 31, 49852)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 5, 12, 24, 31, 49852)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 5, 12, 24, 31, 51853)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 5, 12, 24, 31, 51853)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 5, 12, 24, 31, 51853)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 5, 12, 24, 31, 58846)), + ), + ] diff --git a/panel/migrations/0037_auto_20231106_1225.py b/panel/migrations/0037_auto_20231106_1225.py new file mode 100644 index 0000000..ea2f90e --- /dev/null +++ b/panel/migrations/0037_auto_20231106_1225.py @@ -0,0 +1,90 @@ +# Generated by Django 3.2.13 on 2023-11-06 12:25 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0036_auto_20231105_1224'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 12, 24, 53, 144644)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 12, 24, 52, 942831)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 12, 24, 52, 942831)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 12, 24, 52, 942831)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 12, 24, 52, 942831)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 12, 24, 52, 945828)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 12, 24, 52, 945828)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 12, 24, 52, 945828)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 12, 24, 52, 959815)), + ), + migrations.CreateModel( + name='AutomaticStewardAllocation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('number_of_carcasses', models.BigIntegerField(default=0)), + ('real_number_of_carcasses', models.BigIntegerField(default=0)), + ('weight_of_carcasses', models.FloatField(default=0)), + ('real_weight_of_carcasses', models.FloatField(default=0)), + ('final_registration', models.BooleanField(default=False)), + ('registration_code', models.IntegerField(null=True)), + ('logged_registration_code', models.IntegerField(null=True)), + ('state', models.CharField(default='pending', max_length=50)), + ('date', models.DateTimeField(null=True)), + ('role', models.JSONField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automaticstewardallocation_createdby', to=settings.AUTH_USER_MODEL)), + ('guilds', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automatic_guilds_allocation', to='panel.guilds')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automaticstewardallocation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automatic_steward_allocation', to='panel.steward')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0038_auto_20231106_1546.py b/panel/migrations/0038_auto_20231106_1546.py new file mode 100644 index 0000000..3a9518b --- /dev/null +++ b/panel/migrations/0038_auto_20231106_1546.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2023-11-06 15:46 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0037_auto_20231106_1225'), + ] + + operations = [ + migrations.AddField( + model_name='automaticstewardallocation', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_automatic_allocation', to='panel.killhouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 15, 45, 59, 195216)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 15, 45, 59, 145263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 15, 45, 59, 145263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 15, 45, 59, 145263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 15, 45, 59, 145263)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 15, 45, 59, 146262)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 15, 45, 59, 146262)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 15, 45, 59, 146262)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 6, 15, 45, 59, 154254)), + ), + ] diff --git a/panel/migrations/0039_auto_20231108_1156.py b/panel/migrations/0039_auto_20231108_1156.py new file mode 100644 index 0000000..9a4dfd5 --- /dev/null +++ b/panel/migrations/0039_auto_20231108_1156.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2023-11-08 11:56 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0038_auto_20231106_1546'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_steward_allocation', to='panel.killhouse'), + ), + migrations.AddField( + model_name='stewardallocation', + name='type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 8, 11, 56, 3, 771486)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 8, 11, 56, 3, 708986)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 8, 11, 56, 3, 708986)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 8, 11, 56, 3, 708986)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 8, 11, 56, 3, 708986)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 8, 11, 56, 3, 724610)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 8, 11, 56, 3, 724610)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 8, 11, 56, 3, 724610)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 8, 11, 56, 3, 724610)), + ), + ] diff --git a/panel/migrations/0040_auto_20231111_1426.py b/panel/migrations/0040_auto_20231111_1426.py new file mode 100644 index 0000000..6f1b21b --- /dev/null +++ b/panel/migrations/0040_auto_20231111_1426.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-11-11 14:26 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0039_auto_20231108_1156'), + ] + + operations = [ + migrations.AddField( + model_name='wagepayment', + name='message', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='wagepayment', + name='payer_info', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 11, 14, 26, 19, 655751)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 11, 14, 26, 19, 602802)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 11, 14, 26, 19, 602802)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 11, 14, 26, 19, 602802)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 11, 14, 26, 19, 602802)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 11, 14, 26, 19, 604801)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 11, 14, 26, 19, 604801)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 11, 14, 26, 19, 604801)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 11, 14, 26, 19, 611793)), + ), + ] diff --git a/panel/migrations/0041_auto_20231112_2305.py b/panel/migrations/0041_auto_20231112_2305.py new file mode 100644 index 0000000..f3570c9 --- /dev/null +++ b/panel/migrations/0041_auto_20231112_2305.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-11-12 23:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0040_auto_20231111_1426'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='allocation_state', + field=models.CharField(default='pending', max_length=50), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 23, 5, 43, 584619)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 23, 5, 43, 531896)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 23, 5, 43, 531896)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 23, 5, 43, 531896)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 23, 5, 43, 531896)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 23, 5, 43, 533894)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 23, 5, 43, 533894)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 23, 5, 43, 533894)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 12, 23, 5, 43, 540887)), + ), + ] diff --git a/panel/migrations/0042_auto_20231114_0930.py b/panel/migrations/0042_auto_20231114_0930.py new file mode 100644 index 0000000..4cf279d --- /dev/null +++ b/panel/migrations/0042_auto_20231114_0930.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2023-11-14 09:30 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0041_auto_20231112_2305'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 34, 983203)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 34, 915235)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 34, 915235)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 34, 915235)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 34, 915235)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 34, 915235)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 34, 915235)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 34, 915235)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 14, 9, 30, 34, 930881)), + ), + ] diff --git a/panel/migrations/0043_auto_20231122_1203.py b/panel/migrations/0043_auto_20231122_1203.py new file mode 100644 index 0000000..4e4a113 --- /dev/null +++ b/panel/migrations/0043_auto_20231122_1203.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-11-22 12:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0042_auto_20231114_0930'), + ] + + operations = [ + migrations.AddField( + model_name='killhousewarehouse', + name='final_total_number_of_carcasses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousewarehouse', + name='final_total_weight_of_carcasses', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 22, 12, 2, 59, 526302)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 22, 12, 2, 59, 473350)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 22, 12, 2, 59, 473350)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 22, 12, 2, 59, 473350)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 22, 12, 2, 59, 473350)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 22, 12, 2, 59, 475349)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 22, 12, 2, 59, 475349)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 22, 12, 2, 59, 475349)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 22, 12, 2, 59, 483344)), + ), + ] diff --git a/panel/migrations/0044_auto_20231126_1221.py b/panel/migrations/0044_auto_20231126_1221.py new file mode 100644 index 0000000..13ad1c7 --- /dev/null +++ b/panel/migrations/0044_auto_20231126_1221.py @@ -0,0 +1,104 @@ +# Generated by Django 3.2.13 on 2023-11-26 12:21 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0043_auto_20231122_1203'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultryhatching', + name='temp_killed_quantity', + ), + migrations.AddField( + model_name='poultryhatching', + name='free_killed_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='governmental_killed_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='total_commitment', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='free_sale_in_province', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 12, 21, 4, 570938)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 12, 21, 4, 501003)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 12, 21, 4, 501003)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 12, 21, 4, 501003)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 12, 21, 4, 501003)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 12, 21, 4, 505001)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 12, 21, 4, 504001)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 12, 21, 4, 505001)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 12, 21, 4, 514990)), + ), + migrations.CreateModel( + name='FreeSaleWithinprovince', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('weight', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='freesalewithinprovince_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='freesalewithinprovince_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0045_auto_20231126_2005.py b/panel/migrations/0045_auto_20231126_2005.py new file mode 100644 index 0000000..3a810c3 --- /dev/null +++ b/panel/migrations/0045_auto_20231126_2005.py @@ -0,0 +1,67 @@ +# Generated by Django 3.2.13 on 2023-11-26 20:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0044_auto_20231126_1221'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultryhatching', + name='free_killed_quantity', + ), + migrations.RemoveField( + model_name='poultryhatching', + name='governmental_killed_quantity', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 5, 30, 380554)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 5, 30, 308094)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 5, 30, 308094)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 5, 30, 308094)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 5, 30, 308094)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 5, 30, 308094)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 5, 30, 308094)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 5, 30, 308094)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 5, 30, 320170)), + ), + ] diff --git a/panel/migrations/0046_auto_20231126_2030.py b/panel/migrations/0046_auto_20231126_2030.py new file mode 100644 index 0000000..439fe5e --- /dev/null +++ b/panel/migrations/0046_auto_20231126_2030.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2023-11-26 20:30 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0045_auto_20231126_2005'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='free_killed_quantity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='governmental_killed_quantity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='total_killed_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 30, 13, 626120)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 30, 13, 562102)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 30, 13, 562102)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 30, 13, 562102)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 30, 13, 562102)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 30, 13, 562102)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 30, 13, 562102)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 30, 13, 562102)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 26, 20, 30, 13, 577734)), + ), + ] diff --git a/panel/migrations/0047_auto_20231127_1018.py b/panel/migrations/0047_auto_20231127_1018.py new file mode 100644 index 0000000..f7fd7fa --- /dev/null +++ b/panel/migrations/0047_auto_20231127_1018.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-11-27 10:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0046_auto_20231126_2030'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='total_average_killed_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 10, 18, 33, 934409)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 10, 18, 33, 828509)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 10, 18, 33, 828509)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 10, 18, 33, 828509)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 10, 18, 33, 828509)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 10, 18, 33, 832504)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 10, 18, 33, 831506)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 10, 18, 33, 831506)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 10, 18, 33, 847490)), + ), + ] diff --git a/panel/migrations/0048_auto_20231127_1404.py b/panel/migrations/0048_auto_20231127_1404.py new file mode 100644 index 0000000..9f159be --- /dev/null +++ b/panel/migrations/0048_auto_20231127_1404.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-11-27 14:04 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0047_auto_20231127_1018'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='receiver_state', + field=models.CharField(default='pending', max_length=50), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 14, 4, 25, 17643)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 14, 4, 24, 964693)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 14, 4, 24, 964693)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 14, 4, 24, 964693)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 14, 4, 24, 964693)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 14, 4, 24, 966691)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 14, 4, 24, 966691)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 14, 4, 24, 966691)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 14, 4, 24, 974684)), + ), + ] diff --git a/panel/migrations/0049_auto_20231127_1506.py b/panel/migrations/0049_auto_20231127_1506.py new file mode 100644 index 0000000..d1775b1 --- /dev/null +++ b/panel/migrations/0049_auto_20231127_1506.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-11-27 15:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0048_auto_20231127_1404'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='receiver_real_number_of_carcasses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='stewardallocation', + name='receiver_real_weight_of_carcasses', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 15, 6, 41, 546659)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 15, 6, 41, 435762)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 15, 6, 41, 435762)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 15, 6, 41, 435762)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 15, 6, 41, 435762)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 15, 6, 41, 439759)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 15, 6, 41, 438759)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 15, 6, 41, 438759)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 27, 15, 6, 41, 455744)), + ), + ] diff --git a/panel/migrations/0050_auto_20231129_1029.py b/panel/migrations/0050_auto_20231129_1029.py new file mode 100644 index 0000000..c2e8a23 --- /dev/null +++ b/panel/migrations/0050_auto_20231129_1029.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2023-11-29 10:29 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0049_auto_20231127_1506'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='allocation_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='stewardallocation', + name='steward_ware_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_ware_house_steward_guilds_allocation', to='panel.stewardwarehouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 10, 29, 36, 97087)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 10, 29, 36, 50216)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 10, 29, 36, 50216)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 10, 29, 36, 50216)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 10, 29, 36, 50216)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 10, 29, 36, 50216)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 10, 29, 36, 50216)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 10, 29, 36, 50216)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 10, 29, 36, 50216)), + ), + ] diff --git a/panel/migrations/0051_auto_20231129_1452.py b/panel/migrations/0051_auto_20231129_1452.py new file mode 100644 index 0000000..0d49a5a --- /dev/null +++ b/panel/migrations/0051_auto_20231129_1452.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2023-11-29 14:52 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0050_auto_20231129_1029'), + ] + + operations = [ + migrations.AddField( + model_name='freesalewithinprovince', + name='percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='freesalewithinprovince', + name='type', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='total_commitment_quantity', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 14, 52, 3, 881629)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 14, 52, 3, 819131)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 14, 52, 3, 819131)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 14, 52, 3, 819131)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 14, 52, 3, 819131)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 14, 52, 3, 819131)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 14, 52, 3, 819131)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 14, 52, 3, 819131)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 14, 52, 3, 834754)), + ), + ] diff --git a/panel/migrations/0052_auto_20231129_1539.py b/panel/migrations/0052_auto_20231129_1539.py new file mode 100644 index 0000000..59162a0 --- /dev/null +++ b/panel/migrations/0052_auto_20231129_1539.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-11-29 15:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0051_auto_20231129_1452'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='free_quantity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='governmental_quantity', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 15, 39, 28, 548717)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 15, 39, 28, 419838)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 15, 39, 28, 419838)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 15, 39, 28, 419838)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 15, 39, 28, 419838)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 15, 39, 28, 423833)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 15, 39, 28, 423833)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 15, 39, 28, 423833)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 11, 29, 15, 39, 28, 443815)), + ), + ] diff --git a/panel/migrations/0053_auto_20231201_1759.py b/panel/migrations/0053_auto_20231201_1759.py new file mode 100644 index 0000000..66b31e8 --- /dev/null +++ b/panel/migrations/0053_auto_20231201_1759.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-12-01 17:59 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0052_auto_20231129_1539'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='total_killed_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='total_killed_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 17, 59, 25, 471855)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 17, 59, 25, 409358)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 17, 59, 25, 409358)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 17, 59, 25, 409358)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 17, 59, 25, 409358)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 17, 59, 25, 409358)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 17, 59, 25, 409358)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 17, 59, 25, 409358)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 17, 59, 25, 424982)), + ), + ] diff --git a/panel/migrations/0053_auto_20231202_1108.py b/panel/migrations/0053_auto_20231202_1108.py new file mode 100644 index 0000000..025a069 --- /dev/null +++ b/panel/migrations/0053_auto_20231202_1108.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2023-12-02 11:08 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0010_auto_20231202_1108'), + ('panel', '0052_auto_20231129_1539'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 325032)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 282604)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 282604)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 282604)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 282604)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 283601)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 283601)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 283601)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 11, 8, 44, 290600)), + ), + migrations.CreateModel( + name='Observatory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='observatory_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='observatory_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='observatory_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='observatory_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='observatory_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='observatory_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0054_auto_20231201_2242.py b/panel/migrations/0054_auto_20231201_2242.py new file mode 100644 index 0000000..6d26d26 --- /dev/null +++ b/panel/migrations/0054_auto_20231201_2242.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2023-12-01 22:42 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0053_auto_20231201_1759'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='extra_killed_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='extra_killed_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='extra_killed_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 22, 42, 4, 998490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 22, 42, 4, 946537)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 22, 42, 4, 946537)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 22, 42, 4, 946537)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 22, 42, 4, 946537)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 22, 42, 4, 948535)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 22, 42, 4, 948535)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 22, 42, 4, 948535)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 1, 22, 42, 4, 956529)), + ), + ] diff --git a/panel/migrations/0055_merge_0053_auto_20231202_1108_0054_auto_20231201_2242.py b/panel/migrations/0055_merge_0053_auto_20231202_1108_0054_auto_20231201_2242.py new file mode 100644 index 0000000..f019563 --- /dev/null +++ b/panel/migrations/0055_merge_0053_auto_20231202_1108_0054_auto_20231201_2242.py @@ -0,0 +1,14 @@ +# Generated by Django 3.2.13 on 2023-12-02 11:19 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0053_auto_20231202_1108'), + ('panel', '0054_auto_20231201_2242'), + ] + + operations = [ + ] diff --git a/panel/migrations/0056_auto_20231202_2323.py b/panel/migrations/0056_auto_20231202_2323.py new file mode 100644 index 0000000..0c405cb --- /dev/null +++ b/panel/migrations/0056_auto_20231202_2323.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-12-02 23:23 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0055_merge_0053_auto_20231202_1108_0054_auto_20231201_2242'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='extra_killed_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhouserequest', + name='extra_killed_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 23, 23, 10, 175116)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 23, 23, 10, 123028)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 23, 23, 10, 123028)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 23, 23, 10, 123028)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 23, 23, 10, 123028)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 23, 23, 10, 123028)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 23, 23, 10, 123028)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 23, 23, 10, 123028)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 2, 23, 23, 10, 138655)), + ), + ] diff --git a/panel/migrations/0057_auto_20231205_1256.py b/panel/migrations/0057_auto_20231205_1256.py new file mode 100644 index 0000000..e4141e9 --- /dev/null +++ b/panel/migrations/0057_auto_20231205_1256.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2023-12-05 12:56 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0011_auto_20231205_1256'), + ('panel', '0056_auto_20231202_2323'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 967156)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 916204)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 916204)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 916204)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 916204)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 918202)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 918202)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 918202)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 5, 12, 56, 11, 925195)), + ), + migrations.CreateModel( + name='ProvinceSupervisor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_supervisor_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincesupervisor_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='provincesupervisor_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_supervisor_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_supervisor_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='province_supervisor_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0058_auto_20231210_1253.py b/panel/migrations/0058_auto_20231210_1253.py new file mode 100644 index 0000000..4f9797f --- /dev/null +++ b/panel/migrations/0058_auto_20231210_1253.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-12-10 12:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0057_auto_20231205_1256'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='amount', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 12, 53, 2, 789173)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 12, 53, 2, 736223)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 12, 53, 2, 735224)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 12, 53, 2, 735224)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 12, 53, 2, 735224)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 12, 53, 2, 737222)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 12, 53, 2, 737222)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 12, 53, 2, 737222)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 12, 53, 2, 745214)), + ), + ] diff --git a/panel/migrations/0059_auto_20231210_1400.py b/panel/migrations/0059_auto_20231210_1400.py new file mode 100644 index 0000000..bfe5463 --- /dev/null +++ b/panel/migrations/0059_auto_20231210_1400.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-12-10 14:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0058_auto_20231210_1253'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='financial_operation', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 14, 0, 53, 690711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 14, 0, 53, 638762)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 14, 0, 53, 638762)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 14, 0, 53, 638762)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 14, 0, 53, 638762)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 14, 0, 53, 640760)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 14, 0, 53, 640760)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 14, 0, 53, 640760)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 10, 14, 0, 53, 647754)), + ), + ] diff --git a/panel/migrations/0060_auto_20231211_0917.py b/panel/migrations/0060_auto_20231211_0917.py new file mode 100644 index 0000000..a8bc806 --- /dev/null +++ b/panel/migrations/0060_auto_20231211_0917.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2023-12-11 09:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0059_auto_20231210_1400'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='vet_accepted_real_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhouserequest', + name='vet_accepted_real_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='stewardallocation', + name='amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='stewardallocation', + name='total_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 9, 17, 42, 852727)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 9, 17, 42, 805854)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 9, 17, 42, 805854)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 9, 17, 42, 805854)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 9, 17, 42, 805854)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 9, 17, 42, 805854)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 9, 17, 42, 805854)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 9, 17, 42, 805854)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 9, 17, 42, 805854)), + ), + ] diff --git a/panel/migrations/0061_auto_20231211_1102.py b/panel/migrations/0061_auto_20231211_1102.py new file mode 100644 index 0000000..1153361 --- /dev/null +++ b/panel/migrations/0061_auto_20231211_1102.py @@ -0,0 +1,108 @@ +# Generated by Django 3.2.13 on 2023-12-11 11:02 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0012_auto_20231211_1102'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0060_auto_20231211_0917'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 914703)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 855757)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 855757)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 855757)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 855757)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 857755)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 857755)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 857755)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 11, 2, 7, 865750)), + ), + migrations.CreateModel( + name='Car', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('driver_name', models.CharField(max_length=500, null=True)), + ('driver_mobile', models.CharField(max_length=11, null=True)), + ('type_car', models.CharField(max_length=50, null=True)), + ('type', models.CharField(max_length=50, null=True)), + ('transport_type', models.CharField(max_length=50, null=True)), + ('pelak', models.CharField(max_length=200, null=True)), + ('capocity', models.CharField(max_length=50, null=True)), + ('weight_without_load', models.CharField(max_length=50, null=True)), + ('health_code', models.CharField(max_length=100, null=True)), + ('status', models.CharField(default='inactive', max_length=50)), + ('active', models.BooleanField(default=True)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('identity_documents', models.JSONField(null=True)), + ('phone', models.CharField(max_length=20, null=True)), + ('registrar', models.JSONField(null=True)), + ('active_state', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='car_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='car_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_car', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='car_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='car_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='guilds', + name='cars', + field=models.ManyToManyField(blank=True, null=True, related_name='guild_car', to='panel.Car'), + ), + migrations.AddField( + model_name='killhouse', + name='cars', + field=models.ManyToManyField(blank=True, null=True, related_name='kill_house_car', to='panel.Car'), + ), + ] diff --git a/panel/migrations/0062_auto_20231211_1209.py b/panel/migrations/0062_auto_20231211_1209.py new file mode 100644 index 0000000..1411711 --- /dev/null +++ b/panel/migrations/0062_auto_20231211_1209.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-12-11 12:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0061_auto_20231211_1102'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='steward_register', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 9, 50, 680878)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 9, 50, 625930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 9, 50, 625930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 9, 50, 625930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 9, 50, 625930)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 9, 50, 627928)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 9, 50, 627928)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 9, 50, 627928)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 11, 12, 9, 50, 634921)), + ), + ] diff --git a/panel/migrations/0063_auto_20231212_1000.py b/panel/migrations/0063_auto_20231212_1000.py new file mode 100644 index 0000000..6fbae13 --- /dev/null +++ b/panel/migrations/0063_auto_20231212_1000.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2023-12-12 10:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0062_auto_20231211_1209'), + ] + + operations = [ + migrations.AddField( + model_name='guildswarehouse', + name='allocated_total_number_of_carcasses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='guildswarehouse', + name='allocated_total_weight_of_carcasses', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guildswarehouse', + name='final_registration', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guildswarehouse', + name='remain_total_number_of_carcasses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='guildswarehouse', + name='remain_total_weight_of_carcasses', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 0, 45, 298255)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 0, 45, 182363)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 0, 45, 182363)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 0, 45, 182363)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 0, 45, 182363)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 0, 45, 186360)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 0, 45, 186360)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 0, 45, 186360)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 0, 45, 213334)), + ), + ] diff --git a/panel/migrations/0064_auto_20231212_1035.py b/panel/migrations/0064_auto_20231212_1035.py new file mode 100644 index 0000000..31601c4 --- /dev/null +++ b/panel/migrations/0064_auto_20231212_1035.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2023-12-12 10:35 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0063_auto_20231212_1000'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='car', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_allocation_car', to='panel.car'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 35, 46, 598566)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 35, 46, 545614)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 35, 46, 545614)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 35, 46, 545614)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 35, 46, 545614)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 35, 46, 547613)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 35, 46, 547613)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 35, 46, 547613)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 12, 10, 35, 46, 554608)), + ), + ] diff --git a/panel/migrations/0065_auto_20231214_1409.py b/panel/migrations/0065_auto_20231214_1409.py new file mode 100644 index 0000000..cf49a9c --- /dev/null +++ b/panel/migrations/0065_auto_20231214_1409.py @@ -0,0 +1,83 @@ +# Generated by Django 3.2.13 on 2023-12-14 14:09 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0064_auto_20231212_1035'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 9, 4, 725892)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 9, 4, 663950)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 9, 4, 662951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 9, 4, 663950)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 9, 4, 663950)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 9, 4, 664949)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 9, 4, 664949)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 9, 4, 664949)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 9, 4, 672941)), + ), + migrations.CreateModel( + name='POSMachine', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('pos_id', models.CharField(max_length=12, null=True)), + ('token', models.CharField(max_length=36, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posmachine_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_pos', to='panel.guilds')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_pos', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posmachine_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_pos', to='panel.steward')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0066_auto_20231214_1418.py b/panel/migrations/0066_auto_20231214_1418.py new file mode 100644 index 0000000..85b6c51 --- /dev/null +++ b/panel/migrations/0066_auto_20231214_1418.py @@ -0,0 +1,66 @@ +# Generated by Django 3.2.13 on 2023-12-14 14:18 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0013_auto_20231214_1418'), + ('panel', '0065_auto_20231214_1409'), + ] + + operations = [ + migrations.AddField( + model_name='posmachine', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_pos', to='authentication.systemuserprofile'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 739096)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 656175)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 656175)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 656175)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 656175)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 660171)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 660171)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 660171)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 14, 14, 18, 27, 673157)), + ), + ] diff --git a/panel/migrations/0067_auto_20231216_1015.py b/panel/migrations/0067_auto_20231216_1015.py new file mode 100644 index 0000000..6560632 --- /dev/null +++ b/panel/migrations/0067_auto_20231216_1015.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2023-12-16 10:15 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0066_auto_20231214_1418'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 15, 43, 141771)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 15, 43, 94896)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 15, 43, 94896)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 15, 43, 94896)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 15, 43, 94896)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 15, 43, 94896)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 15, 43, 94896)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 15, 43, 94896)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 15, 43, 110520)), + ), + migrations.CreateModel( + name='Product', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('quantity', models.BigIntegerField(default=0)), + ('name', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0068_auto_20231216_1030.py b/panel/migrations/0068_auto_20231216_1030.py new file mode 100644 index 0000000..1f40344 --- /dev/null +++ b/panel/migrations/0068_auto_20231216_1030.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2023-12-16 10:30 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0067_auto_20231216_1015'), + ] + + operations = [ + migrations.AddField( + model_name='guildswarehouse', + name='product', + field=models.ManyToManyField(blank=True, null=True, related_name='guilds_ware_house_product', to='panel.Product'), + ), + migrations.AddField( + model_name='killhousewarehouse', + name='product', + field=models.ManyToManyField(blank=True, null=True, related_name='kill_house_ware_house_product', to='panel.Product'), + ), + migrations.AddField( + model_name='stewardwarehouse', + name='product', + field=models.ManyToManyField(blank=True, null=True, related_name='steward_ware_house_product', to='panel.Product'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 30, 28, 519080)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 30, 28, 472205)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 30, 28, 472205)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 30, 28, 472205)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 30, 28, 472205)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 30, 28, 472205)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 30, 28, 472205)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 30, 28, 472205)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 10, 30, 28, 487828)), + ), + ] diff --git a/panel/migrations/0069_auto_20231216_1448.py b/panel/migrations/0069_auto_20231216_1448.py new file mode 100644 index 0000000..28282ac --- /dev/null +++ b/panel/migrations/0069_auto_20231216_1448.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2023-12-16 14:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0068_auto_20231216_1030'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='out_province_killed_quantity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='out_province_killed_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 14, 48, 26, 376009)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 14, 48, 26, 255680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 14, 48, 26, 255680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 14, 48, 26, 255680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 14, 48, 26, 255680)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 14, 48, 26, 259677)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 14, 48, 26, 259677)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 14, 48, 26, 259677)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 14, 48, 26, 274893)), + ), + ] diff --git a/panel/migrations/0070_auto_20231216_2041.py b/panel/migrations/0070_auto_20231216_2041.py new file mode 100644 index 0000000..ea0df40 --- /dev/null +++ b/panel/migrations/0070_auto_20231216_2041.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-12-16 20:41 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0069_auto_20231216_1448'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='first_car_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 20, 41, 23, 881001)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 20, 41, 23, 787252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 20, 41, 23, 787252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 20, 41, 23, 787252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 20, 41, 23, 787252)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 20, 41, 23, 787252)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 20, 41, 23, 787252)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 20, 41, 23, 787252)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 16, 20, 41, 23, 802880)), + ), + ] diff --git a/panel/migrations/0071_auto_20231225_1502.py b/panel/migrations/0071_auto_20231225_1502.py new file mode 100644 index 0000000..60c766a --- /dev/null +++ b/panel/migrations/0071_auto_20231225_1502.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-12-25 15:02 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0070_auto_20231216_2041'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='quarantine_quantity', + field=models.BigIntegerField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 25, 15, 1, 43, 254109)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 25, 15, 1, 42, 292004)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 25, 15, 1, 42, 238054)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 25, 15, 1, 42, 292004)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 25, 15, 1, 42, 238054)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 25, 15, 1, 42, 300995)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 25, 15, 1, 42, 300995)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 25, 15, 1, 42, 300995)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 25, 15, 1, 42, 436869)), + ), + ] diff --git a/panel/migrations/0072_auto_20231226_1543.py b/panel/migrations/0072_auto_20231226_1543.py new file mode 100644 index 0000000..01b6bfa --- /dev/null +++ b/panel/migrations/0072_auto_20231226_1543.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-12-26 15:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0071_auto_20231225_1502'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='return_to_province', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 26, 15, 43, 13, 623992)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 26, 15, 43, 13, 337259)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 26, 15, 43, 13, 337259)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 26, 15, 43, 13, 337259)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 26, 15, 43, 13, 337259)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 26, 15, 43, 13, 341256)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 26, 15, 43, 13, 340257)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 26, 15, 43, 13, 340257)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 26, 15, 43, 13, 357240)), + ), + ] diff --git a/panel/migrations/0073_auto_20231227_1020.py b/panel/migrations/0073_auto_20231227_1020.py new file mode 100644 index 0000000..158deda --- /dev/null +++ b/panel/migrations/0073_auto_20231227_1020.py @@ -0,0 +1,132 @@ +# Generated by Django 3.2.13 on 2023-12-27 10:20 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0072_auto_20231226_1543'), + ] + + operations = [ + migrations.RemoveField( + model_name='guildswarehouse', + name='product', + ), + migrations.RemoveField( + model_name='killhousewarehouse', + name='product', + ), + migrations.RemoveField( + model_name='stewardwarehouse', + name='product', + ), + migrations.AddField( + model_name='product', + name='extra_sale_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='product', + name='extra_sale_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='product', + name='guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_product', to='panel.guilds'), + ), + migrations.AddField( + model_name='product', + name='image', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='product', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_product', to='panel.killhouse'), + ), + migrations.AddField( + model_name='product', + name='remain_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='product', + name='remain_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='product', + name='sale_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='product', + name='sale_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='product', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_product', to='panel.steward'), + ), + migrations.AddField( + model_name='product', + name='unit_of_measurement', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='product', + name='weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 10, 20, 42, 361981)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 10, 20, 42, 315105)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 10, 20, 42, 315105)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 10, 20, 42, 315105)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 10, 20, 42, 315105)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 10, 20, 42, 315105)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 10, 20, 42, 315105)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 10, 20, 42, 315105)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 10, 20, 42, 315105)), + ), + ] diff --git a/panel/migrations/0074_auto_20231227_1520.py b/panel/migrations/0074_auto_20231227_1520.py new file mode 100644 index 0000000..b71053f --- /dev/null +++ b/panel/migrations/0074_auto_20231227_1520.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-12-27 15:20 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0073_auto_20231227_1020'), + ] + + operations = [ + migrations.AddField( + model_name='totalpoultryrequestquantity', + name='returned_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 15, 20, 31, 907802)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 15, 20, 31, 780920)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 15, 20, 31, 779922)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 15, 20, 31, 779922)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 15, 20, 31, 779922)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 15, 20, 31, 784917)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 15, 20, 31, 784917)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 15, 20, 31, 784917)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 27, 15, 20, 31, 802900)), + ), + ] diff --git a/panel/migrations/0075_auto_20231228_1158.py b/panel/migrations/0075_auto_20231228_1158.py new file mode 100644 index 0000000..ed25f60 --- /dev/null +++ b/panel/migrations/0075_auto_20231228_1158.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2023-12-28 11:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0074_auto_20231227_1520'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='product_name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 28, 11, 58, 12, 391890)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 28, 11, 58, 12, 329394)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 28, 11, 58, 12, 329394)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 28, 11, 58, 12, 329394)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 28, 11, 58, 12, 329394)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 28, 11, 58, 12, 329394)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 28, 11, 58, 12, 329394)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 28, 11, 58, 12, 329394)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 28, 11, 58, 12, 345019)), + ), + ] diff --git a/panel/migrations/0076_auto_20231230_0919.py b/panel/migrations/0076_auto_20231230_0919.py new file mode 100644 index 0000000..28e2a3b --- /dev/null +++ b/panel/migrations/0076_auto_20231230_0919.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2023-12-30 09:19 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0075_auto_20231228_1158'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 30, 9, 19, 39, 764921)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 30, 9, 19, 39, 718045)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 30, 9, 19, 39, 718045)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 30, 9, 19, 39, 718045)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 30, 9, 19, 39, 718045)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 30, 9, 19, 39, 718045)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 30, 9, 19, 39, 718045)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 30, 9, 19, 39, 718045)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2023, 12, 30, 9, 19, 39, 718045)), + ), + ] diff --git a/panel/migrations/0077_auto_20240102_0907.py b/panel/migrations/0077_auto_20240102_0907.py new file mode 100644 index 0000000..f13ca46 --- /dev/null +++ b/panel/migrations/0077_auto_20240102_0907.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2024-01-02 09:07 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0076_auto_20231230_0919'), + ] + + operations = [ + migrations.AddField( + model_name='product', + name='price', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='product', + name='selling_approved_price', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='product', + name='selling_free_price', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='product', + name='selling_more_than_inventory', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='product', + name='selling_other_products', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 9, 7, 18, 470433)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 9, 7, 17, 912953)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 9, 7, 17, 912953)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 9, 7, 17, 912953)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 9, 7, 17, 912953)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 9, 7, 17, 924942)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 9, 7, 17, 923943)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 9, 7, 17, 923943)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 9, 7, 18, 6865)), + ), + ] diff --git a/panel/migrations/0078_auto_20240102_1009.py b/panel/migrations/0078_auto_20240102_1009.py new file mode 100644 index 0000000..1bc3609 --- /dev/null +++ b/panel/migrations/0078_auto_20240102_1009.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-01-02 10:09 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0077_auto_20240102_0907'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='real_add_car', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_real_add_car', to='panel.killhouseaddcar'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 10, 8, 59, 700242)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 10, 8, 59, 345571)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 10, 8, 59, 345571)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 10, 8, 59, 345571)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 10, 8, 59, 345571)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 10, 8, 59, 352566)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 10, 8, 59, 352566)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 10, 8, 59, 352566)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 10, 8, 59, 400520)), + ), + ] diff --git a/panel/migrations/0079_auto_20240102_1253.py b/panel/migrations/0079_auto_20240102_1253.py new file mode 100644 index 0000000..4679b61 --- /dev/null +++ b/panel/migrations/0079_auto_20240102_1253.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-01-02 12:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0078_auto_20240102_1009'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='quarantine_code_state', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='ware_house_accepted_real_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhouserequest', + name='ware_house_accepted_real_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouserequest', + name='ware_house_confirmation', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 12, 53, 34, 752056)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 12, 53, 34, 594204)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 12, 53, 34, 593205)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 12, 53, 34, 593205)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 12, 53, 34, 593205)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 12, 53, 34, 599203)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 12, 53, 34, 599203)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 12, 53, 34, 599203)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 2, 12, 53, 34, 622177)), + ), + ] diff --git a/panel/migrations/0080_auto_20240103_1246.py b/panel/migrations/0080_auto_20240103_1246.py new file mode 100644 index 0000000..ba1ce7b --- /dev/null +++ b/panel/migrations/0080_auto_20240103_1246.py @@ -0,0 +1,97 @@ +# Generated by Django 3.2.13 on 2024-01-03 12:46 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0079_auto_20240102_1253'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 12, 46, 6, 238874)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 12, 46, 6, 182927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 12, 46, 6, 182927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 12, 46, 6, 182927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 12, 46, 6, 182927)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 12, 46, 6, 184926)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 12, 46, 6, 183926)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 12, 46, 6, 183926)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 12, 46, 6, 191919)), + ), + migrations.CreateModel( + name='PosVersion', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('build_id', models.BigIntegerField(default=0)), + ('latest_downloadlink', models.TextField()), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posversion_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posversion_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PosItem', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=100, null=True)), + ('value', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='positem_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='positem_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0081_auto_20240103_1417.py b/panel/migrations/0081_auto_20240103_1417.py new file mode 100644 index 0000000..12ff6f3 --- /dev/null +++ b/panel/migrations/0081_auto_20240103_1417.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-01-03 14:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0080_auto_20240103_1246'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='out_province_driver_info', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 17, 2, 360034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 17, 2, 305084)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 17, 2, 305084)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 17, 2, 305084)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 17, 2, 305084)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 17, 2, 307082)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 17, 2, 307082)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 17, 2, 307082)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 17, 2, 315077)), + ), + ] diff --git a/panel/migrations/0082_auto_20240103_1455.py b/panel/migrations/0082_auto_20240103_1455.py new file mode 100644 index 0000000..3244105 --- /dev/null +++ b/panel/migrations/0082_auto_20240103_1455.py @@ -0,0 +1,68 @@ +# Generated by Django 3.2.13 on 2024-01-03 14:55 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0081_auto_20240103_1417'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultryrequest', + name='clearance_code', + ), + migrations.AddField( + model_name='poultryrequest', + name='quarantine_code', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 55, 1, 153900)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 55, 1, 98951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 55, 1, 98951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 55, 1, 98951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 55, 1, 98951)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 55, 1, 100949)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 55, 1, 100949)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 55, 1, 100949)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 3, 14, 55, 1, 108943)), + ), + ] diff --git a/panel/migrations/0083_auto_20240107_1039.py b/panel/migrations/0083_auto_20240107_1039.py new file mode 100644 index 0000000..23d7cce --- /dev/null +++ b/panel/migrations/0083_auto_20240107_1039.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-01-07 10:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0082_auto_20240103_1455'), + ] + + operations = [ + migrations.AddField( + model_name='killhousewarehouse', + name='pre_cold_number_of_carcasses_self_ware_house', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousewarehouse', + name='pre_cold_number_of_carcasses_to_ware_house', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousewarehouse', + name='pre_cold_weight_of_carcasses_self_ware_house', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousewarehouse', + name='pre_cold_weight_of_carcasses_to_ware_house', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 10, 39, 44, 366821)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 10, 39, 44, 313869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 10, 39, 44, 313869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 10, 39, 44, 313869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 10, 39, 44, 313869)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 10, 39, 44, 315868)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 10, 39, 44, 315868)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 10, 39, 44, 315868)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 10, 39, 44, 322863)), + ), + ] diff --git a/panel/migrations/0084_auto_20240107_1133.py b/panel/migrations/0084_auto_20240107_1133.py new file mode 100644 index 0000000..0e9a23e --- /dev/null +++ b/panel/migrations/0084_auto_20240107_1133.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2024-01-07 11:33 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0014_auto_20240107_1133'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0083_auto_20240107_1039'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 331179)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 270869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 270869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 270869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 270869)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 272868)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 272868)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 272868)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 11, 32, 59, 281867)), + ), + migrations.CreateModel( + name='GuildRoom', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('city_jahad_id_key', models.IntegerField(null=True)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_room_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildroom_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildroom_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_room_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_room_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_room_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0085_auto_20240107_1325.py b/panel/migrations/0085_auto_20240107_1325.py new file mode 100644 index 0000000..001acdf --- /dev/null +++ b/panel/migrations/0085_auto_20240107_1325.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-01-07 13:25 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0084_auto_20240107_1133'), + ] + + operations = [ + migrations.RemoveField( + model_name='guildroom', + name='city_jahad_id_key', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 13, 25, 5, 242925)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 13, 25, 5, 189925)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 13, 25, 5, 189925)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 13, 25, 5, 189925)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 13, 25, 5, 189925)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 13, 25, 5, 191926)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 13, 25, 5, 191926)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 13, 25, 5, 191926)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 13, 25, 5, 199926)), + ), + ] diff --git a/panel/migrations/0086_auto_20240107_2228.py b/panel/migrations/0086_auto_20240107_2228.py new file mode 100644 index 0000000..17e247c --- /dev/null +++ b/panel/migrations/0086_auto_20240107_2228.py @@ -0,0 +1,81 @@ +# Generated by Django 3.2.13 on 2024-01-07 22:28 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0015_auto_20240107_2228'), + ('panel', '0085_auto_20240107_1325'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 608407)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 553455)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 553455)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 553455)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 553455)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 555453)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 555453)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 555453)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 28, 10, 562447)), + ), + migrations.CreateModel( + name='PosCompany', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poscompany_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poscompany_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pos_company_user', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0087_auto_20240107_2243.py b/panel/migrations/0087_auto_20240107_2243.py new file mode 100644 index 0000000..2704448 --- /dev/null +++ b/panel/migrations/0087_auto_20240107_2243.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2024-01-07 22:43 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0086_auto_20240107_2228'), + ] + + operations = [ + migrations.AddField( + model_name='posmachine', + name='pos_company', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='company_pos', to='panel.poscompany'), + ), + migrations.AddField( + model_name='posmachine', + name='receiver_number', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='posmachine', + name='terminal_number', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 43, 23, 498312)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 43, 23, 442365)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 43, 23, 442365)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 43, 23, 442365)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 43, 23, 442365)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 43, 23, 444366)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 43, 23, 444366)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 43, 23, 444366)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 7, 22, 43, 23, 452357)), + ), + ] diff --git a/panel/migrations/0088_auto_20240108_0954.py b/panel/migrations/0088_auto_20240108_0954.py new file mode 100644 index 0000000..5fb365f --- /dev/null +++ b/panel/migrations/0088_auto_20240108_0954.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-01-08 09:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0087_auto_20240107_2243'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='quarantine_code_registrar', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 9, 53, 54, 209664)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 9, 53, 54, 45818)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 9, 53, 54, 45818)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 9, 53, 54, 45818)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 9, 53, 54, 45818)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 9, 53, 54, 51812)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 9, 53, 54, 50813)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 9, 53, 54, 51812)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 9, 53, 54, 74790)), + ), + ] diff --git a/panel/migrations/0089_auto_20240108_1100.py b/panel/migrations/0089_auto_20240108_1100.py new file mode 100644 index 0000000..1fdfd28 --- /dev/null +++ b/panel/migrations/0089_auto_20240108_1100.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-01-08 11:00 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0088_auto_20240108_0954'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 0, 13, 455878)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 0, 13, 301023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 0, 13, 301023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 0, 13, 301023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 0, 13, 301023)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 0, 13, 306018)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 0, 13, 306018)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 0, 13, 306018)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 0, 13, 326999)), + ), + migrations.CreateModel( + name='POSId', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('pos_id', models.CharField(max_length=12, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posid_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posid_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0090_auto_20240108_1137.py b/panel/migrations/0090_auto_20240108_1137.py new file mode 100644 index 0000000..115c085 --- /dev/null +++ b/panel/migrations/0090_auto_20240108_1137.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-01-08 11:37 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0089_auto_20240108_1100'), + ] + + operations = [ + migrations.AddField( + model_name='posmachine', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 37, 2, 802242)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 37, 2, 610425)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 37, 2, 610425)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 37, 2, 610425)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 37, 2, 610425)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 37, 2, 616419)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 37, 2, 616419)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 37, 2, 616419)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 11, 37, 2, 639394)), + ), + ] diff --git a/panel/migrations/0091_auto_20240108_2134.py b/panel/migrations/0091_auto_20240108_2134.py new file mode 100644 index 0000000..8424b06 --- /dev/null +++ b/panel/migrations/0091_auto_20240108_2134.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-01-08 21:34 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0090_auto_20240108_1137'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='has_pos', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 21, 34, 40, 198740)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 21, 34, 40, 73746)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 21, 34, 40, 73746)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 21, 34, 40, 73746)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 21, 34, 40, 73746)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 21, 34, 40, 89370)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 21, 34, 40, 89370)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 21, 34, 40, 89370)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 21, 34, 40, 104992)), + ), + ] diff --git a/panel/migrations/0092_auto_20240108_2257.py b/panel/migrations/0092_auto_20240108_2257.py new file mode 100644 index 0000000..656b747 --- /dev/null +++ b/panel/migrations/0092_auto_20240108_2257.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-01-08 22:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0091_auto_20240108_2134'), + ] + + operations = [ + migrations.AddField( + model_name='product', + name='general', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 22, 57, 21, 656515)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 22, 57, 21, 550615)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 22, 57, 21, 550615)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 22, 57, 21, 550615)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 22, 57, 21, 550615)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 22, 57, 21, 553612)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 22, 57, 21, 553612)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 22, 57, 21, 553612)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 22, 57, 21, 568598)), + ), + ] diff --git a/panel/migrations/0093_auto_20240108_2352.py b/panel/migrations/0093_auto_20240108_2352.py new file mode 100644 index 0000000..7fda14e --- /dev/null +++ b/panel/migrations/0093_auto_20240108_2352.py @@ -0,0 +1,81 @@ +# Generated by Django 3.2.13 on 2024-01-08 23:52 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0092_auto_20240108_2257'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 23, 52, 35, 299730)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 23, 52, 35, 120897)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 23, 52, 35, 120897)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 23, 52, 35, 120897)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 23, 52, 35, 120897)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 23, 52, 35, 124893)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 23, 52, 35, 124893)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 23, 52, 35, 124893)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 8, 23, 52, 35, 140879)), + ), + migrations.CreateModel( + name='AdditionalProducts', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('image', models.CharField(max_length=500, null=True)), + ('unit_of_measurement', models.CharField(max_length=20, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='additionalproducts_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='additionalproducts_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0094_auto_20240109_1042.py b/panel/migrations/0094_auto_20240109_1042.py new file mode 100644 index 0000000..1e306b6 --- /dev/null +++ b/panel/migrations/0094_auto_20240109_1042.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2024-01-09 10:42 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0093_auto_20240108_2352'), + ] + + operations = [ + migrations.AddField( + model_name='additionalproducts', + name='price', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='additionalproducts', + name='selling_approved_price', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='additionalproducts', + name='selling_free_price', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='additionalproducts', + name='selling_more_than_inventory', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='additionalproducts', + name='selling_other_products', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='posmachine', + name='Lat', + field=models.FloatField(null=True), + ), + migrations.AddField( + model_name='posmachine', + name='Long', + field=models.FloatField(null=True), + ), + migrations.AddField( + model_name='product', + name='priority', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 9, 10, 42, 19, 101678)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 9, 10, 42, 19, 45728)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 9, 10, 42, 19, 45728)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 9, 10, 42, 19, 45728)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 9, 10, 42, 19, 45728)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 9, 10, 42, 19, 48728)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 9, 10, 42, 19, 47727)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 9, 10, 42, 19, 47727)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 9, 10, 42, 19, 55721)), + ), + ] diff --git a/panel/migrations/0095_auto_20240110_0238.py b/panel/migrations/0095_auto_20240110_0238.py new file mode 100644 index 0000000..0bf3b99 --- /dev/null +++ b/panel/migrations/0095_auto_20240110_0238.py @@ -0,0 +1,109 @@ +# Generated by Django 3.2.13 on 2024-01-10 02:38 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0016_auto_20240110_0238'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0094_auto_20240109_1042'), + ] + + operations = [ + migrations.AddField( + model_name='posid', + name='info', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 994126)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 939178)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 939178)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 939178)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 939178)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 941176)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 941176)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 941176)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 10, 2, 38, 17, 948169)), + ), + migrations.CreateModel( + name='POSTransactions', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('cart', models.CharField(max_length=20, null=True)), + ('mobile', models.CharField(max_length=20, null=True)), + ('terminal', models.CharField(max_length=100, null=True)), + ('posid', models.CharField(max_length=100, null=True)), + ('result', models.CharField(max_length=500, null=True)), + ('refnum', models.CharField(max_length=200, null=True)), + ('resnum', models.CharField(max_length=200, null=True)), + ('natcode', models.CharField(max_length=20, null=True)), + ('fullname', models.CharField(max_length=200, null=True)), + ('buy_date', models.BigIntegerField(null=True)), + ('date', models.BigIntegerField(null=True)), + ('product', models.JSONField(null=True)), + ('state', models.IntegerField(null=True)), + ('amount', models.FloatField(null=True)), + ('price', models.FloatField(null=True)), + ('lng', models.FloatField(null=True)), + ('lot', models.FloatField(null=True)), + ('checkout', models.BooleanField(null=True)), + ('registered', models.BooleanField(null=True)), + ('paid', models.BooleanField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='postransactions_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_pos_transaction', to='panel.guilds')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_pos_transaction', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='postransactions_modifiedby', to=settings.AUTH_USER_MODEL)), + ('pos_machine', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pos_machine_transaction', to='panel.posmachine')), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_pos_transaction', to='panel.steward')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_pos_transaction', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0096_auto_20240111_1559.py b/panel/migrations/0096_auto_20240111_1559.py new file mode 100644 index 0000000..99a2c5c --- /dev/null +++ b/panel/migrations/0096_auto_20240111_1559.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-01-11 15:59 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0095_auto_20240110_0238'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='phone', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 11, 15, 59, 1, 117356)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 11, 15, 59, 0, 905552)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 11, 15, 59, 0, 905552)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 11, 15, 59, 0, 905552)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 11, 15, 59, 0, 905552)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 11, 15, 59, 0, 909549)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 11, 15, 59, 0, 909549)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 11, 15, 59, 0, 909549)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 11, 15, 59, 0, 928532)), + ), + ] diff --git a/panel/migrations/0097_auto_20240114_1305.py b/panel/migrations/0097_auto_20240114_1305.py new file mode 100644 index 0000000..147a6a4 --- /dev/null +++ b/panel/migrations/0097_auto_20240114_1305.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-01-14 13:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0096_auto_20240111_1559'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='condition', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 5, 11, 796933)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 5, 11, 714012)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 5, 11, 714012)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 5, 11, 714012)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 5, 11, 714012)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 5, 11, 717006)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 5, 11, 717006)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 5, 11, 717006)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 5, 11, 730995)), + ), + ] diff --git a/panel/migrations/0098_auto_20240114_1343.py b/panel/migrations/0098_auto_20240114_1343.py new file mode 100644 index 0000000..9dc9ca8 --- /dev/null +++ b/panel/migrations/0098_auto_20240114_1343.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-01-14 13:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0097_auto_20240114_1305'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='description_condition', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='product', + name='show', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 43, 21, 567513)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 43, 20, 276719)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 43, 20, 276719)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 43, 20, 276719)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 43, 20, 276719)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 43, 20, 280713)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 43, 20, 280713)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 43, 20, 280713)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 14, 13, 43, 20, 376623)), + ), + ] diff --git a/panel/migrations/0099_auto_20240115_1039.py b/panel/migrations/0099_auto_20240115_1039.py new file mode 100644 index 0000000..ed4221b --- /dev/null +++ b/panel/migrations/0099_auto_20240115_1039.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-01-15 10:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0098_auto_20240114_1343'), + ] + + operations = [ + migrations.AddField( + model_name='additionalproducts', + name='priority', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 15, 10, 38, 50, 92083)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 15, 10, 38, 49, 747447)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 15, 10, 38, 49, 747447)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 15, 10, 38, 49, 747447)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 15, 10, 38, 49, 747447)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 15, 10, 38, 49, 749476)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 15, 10, 38, 49, 749476)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 15, 10, 38, 49, 749476)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 15, 10, 38, 49, 769020)), + ), + ] diff --git a/panel/migrations/0100_auto_20240118_1118.py b/panel/migrations/0100_auto_20240118_1118.py new file mode 100644 index 0000000..8273c64 --- /dev/null +++ b/panel/migrations/0100_auto_20240118_1118.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-01-18 11:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0099_auto_20240115_1039'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='violation', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 18, 11, 18, 22, 999815)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 18, 11, 18, 22, 950776)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 18, 11, 18, 22, 950776)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 18, 11, 18, 22, 950776)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 18, 11, 18, 22, 950776)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 18, 11, 18, 22, 952774)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 18, 11, 18, 22, 952774)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 18, 11, 18, 22, 952774)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 18, 11, 18, 22, 960773)), + ), + ] diff --git a/panel/migrations/0101_auto_20240121_1159.py b/panel/migrations/0101_auto_20240121_1159.py new file mode 100644 index 0000000..2472184 --- /dev/null +++ b/panel/migrations/0101_auto_20240121_1159.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-01-21 11:59 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0100_auto_20240118_1118'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='out_province_request_cancel', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='poultryrequest', + name='out_province_request_canceller', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 21, 11, 59, 41, 360992)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 21, 11, 59, 41, 306041)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 21, 11, 59, 41, 306041)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 21, 11, 59, 41, 306041)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 21, 11, 59, 41, 306041)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 21, 11, 59, 41, 308039)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 21, 11, 59, 41, 308039)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 21, 11, 59, 41, 308039)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 21, 11, 59, 41, 316032)), + ), + ] diff --git a/panel/migrations/0102_auto_20240123_1234.py b/panel/migrations/0102_auto_20240123_1234.py new file mode 100644 index 0000000..bcb85f7 --- /dev/null +++ b/panel/migrations/0102_auto_20240123_1234.py @@ -0,0 +1,108 @@ +# Generated by Django 3.2.13 on 2024-01-23 12:34 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0101_auto_20240121_1159'), + ] + + operations = [ + migrations.AddField( + model_name='stewardwarehouse', + name='free_bar_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='stewardwarehouse', + name='number_of_free_carcasses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='stewardwarehouse', + name='weight_of_free_carcasses', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 23, 12, 34, 18, 907240)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 23, 12, 34, 18, 796344)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 23, 12, 34, 18, 796344)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 23, 12, 34, 18, 796344)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 23, 12, 34, 18, 796344)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 23, 12, 34, 18, 800340)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 23, 12, 34, 18, 800340)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 23, 12, 34, 18, 800340)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 23, 12, 34, 18, 815326)), + ), + migrations.CreateModel( + name='StewardFreeBarInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_name', models.CharField(max_length=100, null=True)), + ('kill_house_mobile', models.CharField(max_length=11, null=True)), + ('kill_house_vet_name', models.CharField(max_length=100, null=True)), + ('kill_house_vet_mobile', models.CharField(max_length=11, null=True)), + ('province', models.CharField(max_length=50, null=True)), + ('city', models.CharField(max_length=50, null=True)), + ('driver_name', models.CharField(max_length=100, null=True)), + ('driver_mobile', models.CharField(max_length=11, null=True)), + ('car', models.CharField(max_length=100, null=True)), + ('pelak', models.CharField(max_length=100, null=True)), + ('number_of_carcasses', models.BigIntegerField(default=0)), + ('weight_of_carcasses', models.FloatField(default=0)), + ('bar_image', models.CharField(max_length=200, null=True)), + ('date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardfreebarinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardfreebarinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_steward', to='panel.steward')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0103_auto_20240127_0916.py b/panel/migrations/0103_auto_20240127_0916.py new file mode 100644 index 0000000..ba93622 --- /dev/null +++ b/panel/migrations/0103_auto_20240127_0916.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-01-27 09:16 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0102_auto_20240123_1234'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='accepted_assignment_real_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhouserequest', + name='accepted_assignment_real_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 27, 9, 16, 9, 200069)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 27, 9, 16, 9, 137574)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 27, 9, 16, 9, 137574)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 27, 9, 16, 9, 137574)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 27, 9, 16, 9, 137574)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 27, 9, 16, 9, 137574)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 27, 9, 16, 9, 137574)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 27, 9, 16, 9, 137574)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 27, 9, 16, 9, 153198)), + ), + ] diff --git a/panel/migrations/0104_auto_20240130_1008.py b/panel/migrations/0104_auto_20240130_1008.py new file mode 100644 index 0000000..1a91431 --- /dev/null +++ b/panel/migrations/0104_auto_20240130_1008.py @@ -0,0 +1,95 @@ +# Generated by Django 3.2.13 on 2024-01-30 10:08 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0103_auto_20240127_0916'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 30, 10, 8, 13, 988915)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 30, 10, 8, 13, 930968)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 30, 10, 8, 13, 930968)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 30, 10, 8, 13, 930968)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 30, 10, 8, 13, 930968)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 30, 10, 8, 13, 932965)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 30, 10, 8, 13, 932965)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 30, 10, 8, 13, 932965)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 1, 30, 10, 8, 13, 941957)), + ), + migrations.CreateModel( + name='TypeActivity', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='typeactivity_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='typeactivity_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AreaActivity', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('tilte', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='areaactivity_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='areaactivity_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0105_auto_20240205_1011.py b/panel/migrations/0105_auto_20240205_1011.py new file mode 100644 index 0000000..28441e2 --- /dev/null +++ b/panel/migrations/0105_auto_20240205_1011.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-02-05 10:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0104_auto_20240130_1008'), + ] + + operations = [ + migrations.AddField( + model_name='posmachine', + name='server_register', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 5, 10, 11, 40, 292479)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 5, 10, 11, 40, 238528)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 5, 10, 11, 40, 238528)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 5, 10, 11, 40, 238528)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 5, 10, 11, 40, 238528)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 5, 10, 11, 40, 240528)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 5, 10, 11, 40, 240528)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 5, 10, 11, 40, 240528)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 5, 10, 11, 40, 248520)), + ), + ] diff --git a/panel/migrations/0106_auto_20240206_1500.py b/panel/migrations/0106_auto_20240206_1500.py new file mode 100644 index 0000000..1053a6c --- /dev/null +++ b/panel/migrations/0106_auto_20240206_1500.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2024-02-06 15:00 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0105_auto_20240205_1011'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='guild_area_activity', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guilds_area_activity', to='panel.areaactivity'), + ), + migrations.AddField( + model_name='guilds', + name='guild_type_activity', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guilds_type_activity', to='panel.typeactivity'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 0, 34, 36868)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 0, 33, 973927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 0, 33, 973927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 0, 33, 973927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 0, 33, 973927)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 0, 33, 975925)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 0, 33, 975925)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 0, 33, 975925)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 0, 33, 983920)), + ), + ] diff --git a/panel/migrations/0107_auto_20240206_1510.py b/panel/migrations/0107_auto_20240206_1510.py new file mode 100644 index 0000000..0e1e3c9 --- /dev/null +++ b/panel/migrations/0107_auto_20240206_1510.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-02-06 15:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0106_auto_20240206_1500'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='guilds_room_register', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 9, 53, 772792)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 9, 53, 694865)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 9, 53, 694865)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 9, 53, 694865)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 9, 53, 694865)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 9, 53, 698862)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 9, 53, 697862)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 9, 53, 697862)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 6, 15, 9, 53, 711849)), + ), + ] diff --git a/panel/migrations/0108_auto_20240207_1006.py b/panel/migrations/0108_auto_20240207_1006.py new file mode 100644 index 0000000..378cfb7 --- /dev/null +++ b/panel/migrations/0108_auto_20240207_1006.py @@ -0,0 +1,73 @@ +# Generated by Django 3.2.13 on 2024-02-07 10:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0107_auto_20240206_1510'), + ] + + operations = [ + migrations.RemoveField( + model_name='areaactivity', + name='tilte', + ), + migrations.AddField( + model_name='areaactivity', + name='title', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='guilds', + name='pos_company_register', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 7, 10, 5, 53, 978338)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 7, 10, 5, 53, 919395)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 7, 10, 5, 53, 919395)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 7, 10, 5, 53, 919395)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 7, 10, 5, 53, 919395)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 7, 10, 5, 53, 921395)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 7, 10, 5, 53, 921395)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 7, 10, 5, 53, 921395)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 7, 10, 5, 53, 929386)), + ), + ] diff --git a/panel/migrations/0109_auto_20240214_0923.py b/panel/migrations/0109_auto_20240214_0923.py new file mode 100644 index 0000000..f0e6cb6 --- /dev/null +++ b/panel/migrations/0109_auto_20240214_0923.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-02-14 09:23 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0108_auto_20240207_1006'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 9, 23, 19, 970894)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 9, 23, 19, 839590)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 9, 23, 19, 839590)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 9, 23, 19, 839590)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 9, 23, 19, 839590)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 9, 23, 19, 849658)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 9, 23, 19, 849658)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 9, 23, 19, 849658)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 9, 23, 19, 859733)), + ), + migrations.CreateModel( + name='EvacuationPermit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('type', models.CharField(default='optional', max_length=100)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='evacuationpermit_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='evacuationpermit_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0110_auto_20240214_1029.py b/panel/migrations/0110_auto_20240214_1029.py new file mode 100644 index 0000000..08f031a --- /dev/null +++ b/panel/migrations/0110_auto_20240214_1029.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-02-14 10:29 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0109_auto_20240214_0923'), + ] + + operations = [ + migrations.AddField( + model_name='lastupdate', + name='update_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 10, 29, 27, 949183)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 10, 29, 27, 902867)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 10, 29, 27, 902867)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 10, 29, 27, 902867)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 10, 29, 27, 902867)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 10, 29, 27, 904867)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 10, 29, 27, 904867)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 10, 29, 27, 904867)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 14, 10, 29, 27, 910867)), + ), + ] diff --git a/panel/migrations/0111_auto_20240220_0856.py b/panel/migrations/0111_auto_20240220_0856.py new file mode 100644 index 0000000..e1d2410 --- /dev/null +++ b/panel/migrations/0111_auto_20240220_0856.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2024-02-20 08:56 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0110_auto_20240214_1029'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='freezing', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 8, 56, 42, 137436)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 8, 56, 42, 74939)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 8, 56, 42, 74939)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 8, 56, 42, 74939)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 8, 56, 42, 74939)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 8, 56, 42, 74939)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 8, 56, 42, 74939)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 8, 56, 42, 74939)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 8, 56, 42, 90564)), + ), + migrations.CreateModel( + name='SellForFreezing', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('permission', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sellforfreezing_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sellforfreezing_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0112_auto_20240220_1341.py b/panel/migrations/0112_auto_20240220_1341.py new file mode 100644 index 0000000..985d744 --- /dev/null +++ b/panel/migrations/0112_auto_20240220_1341.py @@ -0,0 +1,85 @@ +# Generated by Django 3.2.13 on 2024-02-20 13:41 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0020_auto_20240220_1341'), + ('panel', '0111_auto_20240220_0856'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 261383)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 139497)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 138498)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 139497)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 139497)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 143493)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 142493)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 142493)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 20, 13, 41, 7, 159478)), + ), + migrations.CreateModel( + name='LiveStockSupport', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='live_stock_support_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestocksupport_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestocksupport_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='live_stock_support_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='live_stock_support_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='live_stock_support_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0113_auto_20240221_1105.py b/panel/migrations/0113_auto_20240221_1105.py new file mode 100644 index 0000000..e8c4734 --- /dev/null +++ b/panel/migrations/0113_auto_20240221_1105.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2024-02-21 11:05 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0112_auto_20240220_1341'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 11, 5, 0, 773865)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 11, 5, 0, 659972)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 11, 5, 0, 659972)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 11, 5, 0, 659972)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 11, 5, 0, 659972)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 11, 5, 0, 663969)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 11, 5, 0, 663969)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 11, 5, 0, 663969)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 11, 5, 0, 680953)), + ), + migrations.CreateModel( + name='ColdHouse', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('total_quantity', models.BigIntegerField(default=0)), + ('total_weight', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='coldhouse_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_kill_house', to='panel.killhouse')), + ('live_stock_support', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_live_stock_support', to='panel.livestocksupport')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='coldhouse_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0114_auto_20240221_1306.py b/panel/migrations/0114_auto_20240221_1306.py new file mode 100644 index 0000000..d0040a0 --- /dev/null +++ b/panel/migrations/0114_auto_20240221_1306.py @@ -0,0 +1,85 @@ +# Generated by Django 3.2.13 on 2024-02-21 13:06 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0113_auto_20240221_1105'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 5, 58, 908387)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 5, 58, 797490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 5, 58, 797490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 5, 58, 797490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 5, 58, 797490)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 5, 58, 801486)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 5, 58, 801486)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 5, 58, 801486)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 5, 58, 817470)), + ), + migrations.CreateModel( + name='ColdHouseAllocations', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('quantity', models.BigIntegerField(default=0)), + ('accepted_quantity', models.BigIntegerField(default=0)), + ('weight', models.FloatField(default=0)), + ('accepted_weight', models.FloatField(default=0)), + ('cold_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_allocations_cold_house', to='panel.coldhouse')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='coldhouseallocations_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_allocations_kill_house_request', to='panel.killhouserequest')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='coldhouseallocations_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_allocations_poultry_request', to='panel.poultryrequest')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0115_auto_20240221_1314.py b/panel/migrations/0115_auto_20240221_1314.py new file mode 100644 index 0000000..ef9bddc --- /dev/null +++ b/panel/migrations/0115_auto_20240221_1314.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-02-21 13:14 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0114_auto_20240221_1306'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouseallocations', + name='state', + field=models.CharField(default='pending', max_length=20), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 13, 54, 530465)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 13, 54, 473517)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 13, 54, 473517)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 13, 54, 473517)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 13, 54, 473517)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 13, 54, 475515)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 13, 54, 475515)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 13, 54, 475515)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 13, 54, 484506)), + ), + ] diff --git a/panel/migrations/0116_auto_20240221_1317.py b/panel/migrations/0116_auto_20240221_1317.py new file mode 100644 index 0000000..c746987 --- /dev/null +++ b/panel/migrations/0116_auto_20240221_1317.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-02-21 13:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0115_auto_20240221_1314'), + ] + + operations = [ + migrations.AddField( + model_name='killhousewarehouse', + name='freezing_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousewarehouse', + name='freezing_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 17, 43, 576264)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 17, 43, 520316)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 17, 43, 520316)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 17, 43, 520316)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 17, 43, 520316)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 17, 43, 522315)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 17, 43, 522315)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 17, 43, 522315)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 13, 17, 43, 530307)), + ), + ] diff --git a/panel/migrations/0117_auto_20240221_1520.py b/panel/migrations/0117_auto_20240221_1520.py new file mode 100644 index 0000000..c69bdd8 --- /dev/null +++ b/panel/migrations/0117_auto_20240221_1520.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-02-21 15:20 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0116_auto_20240221_1317'), + ] + + operations = [ + migrations.RemoveField( + model_name='coldhouseallocations', + name='poultry_request', + ), + migrations.AddField( + model_name='coldhouseallocations', + name='kill_house_ware_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_allocations_kill_house_ware_house', to='panel.killhousewarehouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 15, 20, 43, 470195)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 15, 20, 43, 402259)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 15, 20, 43, 402259)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 15, 20, 43, 402259)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 15, 20, 43, 402259)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 15, 20, 43, 405256)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 15, 20, 43, 405256)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 15, 20, 43, 405256)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 21, 15, 20, 43, 415246)), + ), + ] diff --git a/panel/migrations/0118_auto_20240222_1235.py b/panel/migrations/0118_auto_20240222_1235.py new file mode 100644 index 0000000..e2fc801 --- /dev/null +++ b/panel/migrations/0118_auto_20240222_1235.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-02-22 12:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0117_auto_20240221_1520'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouseallocations', + name='date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 12, 35, 8, 259376)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 12, 35, 8, 212501)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 12, 35, 8, 212501)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 12, 35, 8, 212501)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 12, 35, 8, 212501)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 12, 35, 8, 212501)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 12, 35, 8, 212501)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 12, 35, 8, 212501)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 12, 35, 8, 212501)), + ), + ] diff --git a/panel/migrations/0119_auto_20240222_1346.py b/panel/migrations/0119_auto_20240222_1346.py new file mode 100644 index 0000000..b3b7b79 --- /dev/null +++ b/panel/migrations/0119_auto_20240222_1346.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-02-22 13:46 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0118_auto_20240222_1235'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouse', + name='name', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 13, 46, 20, 249494)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 13, 46, 20, 193545)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 13, 46, 20, 193545)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 13, 46, 20, 193545)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 13, 46, 20, 193545)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 13, 46, 20, 195543)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 13, 46, 20, 195543)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 13, 46, 20, 195543)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 13, 46, 20, 203538)), + ), + ] diff --git a/panel/migrations/0120_auto_20240222_1432.py b/panel/migrations/0120_auto_20240222_1432.py new file mode 100644 index 0000000..588c27b --- /dev/null +++ b/panel/migrations/0120_auto_20240222_1432.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-02-22 14:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0119_auto_20240222_1346'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='freezing', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 14, 32, 30, 754026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 14, 32, 30, 637136)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 14, 32, 30, 637136)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 14, 32, 30, 637136)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 14, 32, 30, 637136)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 14, 32, 30, 641133)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 14, 32, 30, 640134)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 14, 32, 30, 640134)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 22, 14, 32, 30, 657118)), + ), + ] diff --git a/panel/migrations/0121_auto_20240226_1343.py b/panel/migrations/0121_auto_20240226_1343.py new file mode 100644 index 0000000..79741aa --- /dev/null +++ b/panel/migrations/0121_auto_20240226_1343.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-02-26 13:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0120_auto_20240222_1432'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouseallocations', + name='reviewer', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 13, 43, 9, 133661)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 13, 43, 9, 78711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 13, 43, 9, 78711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 13, 43, 9, 78711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 13, 43, 9, 78711)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 13, 43, 9, 80711)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 13, 43, 9, 80711)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 13, 43, 9, 80711)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 13, 43, 9, 88703)), + ), + ] diff --git a/panel/migrations/0122_auto_20240226_1524.py b/panel/migrations/0122_auto_20240226_1524.py new file mode 100644 index 0000000..c52378e --- /dev/null +++ b/panel/migrations/0122_auto_20240226_1524.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2024-02-26 15:24 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0121_auto_20240226_1343'), + ] + + operations = [ + migrations.AddField( + model_name='killhousewarehouse', + name='free_sale_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousewarehouse', + name='free_sale_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 15, 24, 30, 586216)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 15, 24, 30, 527269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 15, 24, 30, 527269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 15, 24, 30, 527269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 15, 24, 30, 527269)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 15, 24, 30, 529267)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 15, 24, 30, 529267)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 15, 24, 30, 529267)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 26, 15, 24, 30, 537261)), + ), + migrations.CreateModel( + name='KillHouseFreeSaleBarInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('buyer_name', models.CharField(max_length=100, null=True)), + ('buyer_mobile', models.CharField(max_length=11, null=True)), + ('province', models.CharField(max_length=50, null=True)), + ('city', models.CharField(max_length=50, null=True)), + ('driver_name', models.CharField(max_length=100, null=True)), + ('driver_mobile', models.CharField(max_length=11, null=True)), + ('clearance_code', models.CharField(max_length=50, null=True)), + ('number_of_carcasses', models.BigIntegerField(default=0)), + ('weight_of_carcasses', models.FloatField(default=0)), + ('date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousefreesalebarinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousefreesalebarinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0123_auto_20240227_1159.py b/panel/migrations/0123_auto_20240227_1159.py new file mode 100644 index 0000000..8ba9e7e --- /dev/null +++ b/panel/migrations/0123_auto_20240227_1159.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-02-27 11:59 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0122_auto_20240226_1524'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='pelak', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='type_car', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 27, 11, 59, 11, 680109)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 27, 11, 59, 11, 624160)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 27, 11, 59, 11, 624160)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 27, 11, 59, 11, 624160)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 27, 11, 59, 11, 624160)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 27, 11, 59, 11, 626158)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 27, 11, 59, 11, 626158)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 27, 11, 59, 11, 626158)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 2, 27, 11, 59, 11, 634152)), + ), + ] diff --git a/panel/migrations/0124_auto_20240303_1034.py b/panel/migrations/0124_auto_20240303_1034.py new file mode 100644 index 0000000..950a5a4 --- /dev/null +++ b/panel/migrations/0124_auto_20240303_1034.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-03-03 10:34 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0123_auto_20240227_1159'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='weight_loss', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 34, 44, 58141)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 34, 43, 822978)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 34, 43, 822978)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 34, 43, 822978)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 34, 43, 822978)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 34, 43, 822978)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 34, 43, 822978)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 34, 43, 822978)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 34, 43, 838602)), + ), + ] diff --git a/panel/migrations/0125_auto_20240303_1044.py b/panel/migrations/0125_auto_20240303_1044.py new file mode 100644 index 0000000..72da5d6 --- /dev/null +++ b/panel/migrations/0125_auto_20240303_1044.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-03-03 10:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0124_auto_20240303_1034'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='ware_house_input_type', + field=models.CharField(default='input_weight', max_length=100), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 44, 41, 106811)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 44, 41, 59937)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 44, 41, 59937)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 44, 41, 59937)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 44, 41, 59937)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 44, 41, 59937)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 44, 41, 59937)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 44, 41, 59937)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 10, 44, 41, 75562)), + ), + ] diff --git a/panel/migrations/0126_auto_20240303_1103.py b/panel/migrations/0126_auto_20240303_1103.py new file mode 100644 index 0000000..4342fb8 --- /dev/null +++ b/panel/migrations/0126_auto_20240303_1103.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-03-03 11:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0125_auto_20240303_1044'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 11, 3, 7, 537947)), + ), + migrations.AlterField( + model_name='killhouserequest', + name='ware_house_input_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 11, 3, 7, 441814)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 11, 3, 7, 441814)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 11, 3, 7, 441814)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 11, 3, 7, 441814)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 11, 3, 7, 445887)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 11, 3, 7, 445887)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 11, 3, 7, 445887)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 3, 11, 3, 7, 461102)), + ), + ] diff --git a/panel/migrations/0127_auto_20240309_1046.py b/panel/migrations/0127_auto_20240309_1046.py new file mode 100644 index 0000000..d3efc6d --- /dev/null +++ b/panel/migrations/0127_auto_20240309_1046.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2024-03-09 10:46 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0126_auto_20240303_1103'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 9, 10, 46, 3, 920306)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 9, 10, 46, 3, 857803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 9, 10, 46, 3, 857803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 9, 10, 46, 3, 857803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 9, 10, 46, 3, 857803)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 9, 10, 46, 3, 857803)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 9, 10, 46, 3, 857803)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 9, 10, 46, 3, 857803)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 9, 10, 46, 3, 873429)), + ), + migrations.CreateModel( + name='OperationLimitation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('vet_farm_out_province_limitation', models.BooleanField(default=False)), + ('province_allocation_limitation', models.BooleanField(default=False)), + ('kill_house_allocation_limitation', models.BooleanField(default=False)), + ('kill_house_assignment_limitation', models.BooleanField(default=False)), + ('kill_house_input_bar_limitation', models.BooleanField(default=False)), + ('kill_house_steward_guild_allocation_limitation', models.BooleanField(default=False)), + ('kill_house_freezing_limitation', models.BooleanField(default=False)), + ('kill_house_free_sale_limitation', models.BooleanField(default=False)), + ('kill_house_free_buy_limitation', models.BooleanField(default=False)), + ('kill_house_vet_limitation', models.BooleanField(default=False)), + ('vet_farm_limitation', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='operationlimitation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='operationlimitation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0128_auto_20240311_1159.py b/panel/migrations/0128_auto_20240311_1159.py new file mode 100644 index 0000000..77c62d7 --- /dev/null +++ b/panel/migrations/0128_auto_20240311_1159.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-03-11 11:59 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0127_auto_20240309_1046'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='out_province', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 11, 59, 5, 454957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 11, 59, 5, 370034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 11, 59, 5, 370034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 11, 59, 5, 370034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 11, 59, 5, 370034)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 11, 59, 5, 373031)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 11, 59, 5, 373031)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 11, 59, 5, 373031)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 11, 59, 5, 382023)), + ), + ] diff --git a/panel/migrations/0129_auto_20240311_1555.py b/panel/migrations/0129_auto_20240311_1555.py new file mode 100644 index 0000000..c0342d8 --- /dev/null +++ b/panel/migrations/0129_auto_20240311_1555.py @@ -0,0 +1,83 @@ +# Generated by Django 3.2.13 on 2024-03-11 15:55 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0128_auto_20240311_1159'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 15, 55, 44, 219145)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 15, 55, 44, 104252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 15, 55, 44, 104252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 15, 55, 44, 104252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 15, 55, 44, 104252)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 15, 55, 44, 108248)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 15, 55, 44, 108248)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 15, 55, 44, 108248)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 11, 15, 55, 44, 127230)), + ), + migrations.CreateModel( + name='ApprovedPrice', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('approved', models.BooleanField(default=False)), + ('lowest_price', models.FloatField(default=0)), + ('highest_price', models.FloatField(default=0)), + ('lowest_weight', models.FloatField(default=0)), + ('highest_weight', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='approvedprice_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='approvedprice_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0130_auto_20240312_1158.py b/panel/migrations/0130_auto_20240312_1158.py new file mode 100644 index 0000000..17d6e16 --- /dev/null +++ b/panel/migrations/0130_auto_20240312_1158.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-03-12 11:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0129_auto_20240311_1555'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='approved_price', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 12, 11, 58, 3, 441865)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 12, 11, 58, 3, 387912)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 12, 11, 58, 3, 387912)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 12, 11, 58, 3, 387912)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 12, 11, 58, 3, 387912)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 12, 11, 58, 3, 389910)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 12, 11, 58, 3, 389910)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 12, 11, 58, 3, 389910)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 12, 11, 58, 3, 397903)), + ), + ] diff --git a/panel/migrations/0131_auto_20240315_2202.py b/panel/migrations/0131_auto_20240315_2202.py new file mode 100644 index 0000000..467482b --- /dev/null +++ b/panel/migrations/0131_auto_20240315_2202.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2024-03-15 22:02 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0130_auto_20240312_1158'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 15, 22, 1, 58, 686640)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 15, 22, 1, 58, 501812)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 15, 22, 1, 58, 501812)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 15, 22, 1, 58, 501812)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 15, 22, 1, 58, 501812)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 15, 22, 1, 58, 505809)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 15, 22, 1, 58, 505809)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 15, 22, 1, 58, 505809)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 15, 22, 1, 58, 522792)), + ), + migrations.CreateModel( + name='Announcements', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('description', models.TextField(max_length=2000, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='announcements_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='announcements_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0132_auto_20240318_1139.py b/panel/migrations/0132_auto_20240318_1139.py new file mode 100644 index 0000000..cbcaa42 --- /dev/null +++ b/panel/migrations/0132_auto_20240318_1139.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-03-18 11:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0131_auto_20240315_2202'), + ] + + operations = [ + migrations.AddField( + model_name='operationlimitation', + name='vet_check_kill_house_assignment_limitation', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 18, 11, 39, 33, 322571)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 18, 11, 39, 33, 195689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 18, 11, 39, 33, 195689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 18, 11, 39, 33, 195689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 18, 11, 39, 33, 195689)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 18, 11, 39, 33, 199687)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 18, 11, 39, 33, 199687)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 18, 11, 39, 33, 199687)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 3, 18, 11, 39, 33, 227659)), + ), + ] diff --git a/panel/migrations/0133_auto_20240409_1145.py b/panel/migrations/0133_auto_20240409_1145.py new file mode 100644 index 0000000..ecd5fa1 --- /dev/null +++ b/panel/migrations/0133_auto_20240409_1145.py @@ -0,0 +1,770 @@ +# Generated by Django 3.2.13 on 2024-04-09 11:45 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0132_auto_20240318_1139'), + ] + + operations = [ + migrations.AlterField( + model_name='additionalproducts', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='admin', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='announcements', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='approvedprice', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='areaactivity', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='autoacceptprovincekillrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='automakekillhouserequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='automatickillrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='automaticstewardallocation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='car', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='checkkillhousecomplaint', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='checkstate', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='checkunusualcasualties', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='citycommerce', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='cityjahad', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='cityoperator', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='cityoperatorcheckrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='cityvet', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='coldhouse', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='coldhouseallocations', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='commerce', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='debt', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='deposit', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='depositallocation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='driverrequestcancel', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='evacuationpermit', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='financialdocument', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='financialtransaction', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='freesalewithinprovince', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 11, 44, 54, 945205)), + ), + migrations.AlterField( + model_name='functionexecutor', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='guildroom', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='guilds', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='guildswarehouse', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='hatchinglossespermission', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='hourlimit', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='inspectoroperator', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='itransaction', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='jahad', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouse', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouseaddcar', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouseallowvet', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouseassignmentimages', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouseassignmentinformation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousecheckrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousecomplaint', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousecreditors', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousedailyquota', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousedriver', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousefactortopoultry', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousefactortoprovince', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousefreebarinformation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousefreesalebarinformation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousehourlimit', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouseoperator', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousepercentage', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousepercentageoflosses', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousepurchaserequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouserequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouserequestaction', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouserequestactionwinner', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouserequestexchange', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouserequestexchangeaddcar', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhouserequestexchangereserve', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousevet', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killhousewarehouse', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killrequestfactor', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='killrequestfactorpayment', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='livestocksupport', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='monthlyprofitpercentage', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='mostsearch', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='observatory', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='operationlimitation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 11, 44, 54, 824528)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 11, 44, 54, 824528)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 11, 44, 54, 824528)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 11, 44, 54, 824528)), + ), + migrations.AlterField( + model_name='paymentdeadline', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='penalty', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='percentageoflosses', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poscompany', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='posid', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='positem', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='posmachine', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='posversion', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 11, 44, 54, 831593)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 11, 44, 54, 831593)), + ), + migrations.AlterField( + model_name='poultry', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 11, 44, 54, 831593)), + ), + migrations.AlterField( + model_name='poultryallowcityprovince', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultryassignmentinformation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultryhatching', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultryrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultryrequestauction', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultryrequestexchange', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultryrequestexchangeaccept', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultrytenant', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='povinceinspector', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='pricing', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='product', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowkillhousechoosestewardguilds', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowkillhousedirectbuying', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowkillhousedirectbuyingtotal', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowkillhouseregistercar', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowkillhouseregisterguilds', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowkillhouseregisterguildstotal', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowpoultrychoosekillhouse', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowpoultrychoosekillhousetotal', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowpoultrysellfree', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceallowpoultrysellfreetotal', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceautoallocation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincecheckinformation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincecheckkillhousefactor', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincecheckoperatoroutrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincecheckoperatorrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincefactortokillhouse', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincefactortokillhouseforpoultry', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceimportkillhouseoutfactors', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincekillrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provinceoperator', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincepercentleftover', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincerequestaction', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincesupervisor', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='provincialgovernment', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='reportingfieldrolelimitation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='searchfields', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='sellforfreezing', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='shareofallocation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='smslicense', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='steward', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='stewardallocation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='stewardfreebarinformation', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='stewardwarehouse', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 11, 44, 54, 843781)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='typeactivity', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='vet', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='vetcheckallocations', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='vetcheckrequest', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='vetfarm', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='vetfarminspection', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='vetsupervisor', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='wagepayment', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='wallet', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='warehousefactor', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.CreateModel( + name='ChickenAgeRange', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('maximum', models.IntegerField(default=0)), + ('minimum', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chickenagerange_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chickenagerange_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0134_auto_20240409_1202.py b/panel/migrations/0134_auto_20240409_1202.py new file mode 100644 index 0000000..7311693 --- /dev/null +++ b/panel/migrations/0134_auto_20240409_1202.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2024-04-09 12:02 + +import datetime +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0133_auto_20240409_1145'), + ] + + operations = [ + migrations.AddField( + model_name='chickenagerange', + name='mid', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 2, 13, 343073)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 2, 13, 284068)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 2, 13, 284068)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 2, 13, 284068)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 2, 13, 284068)), + ), + migrations.AlterField( + model_name='postransactions', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 2, 13, 286068)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 2, 13, 286068)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 2, 13, 286068)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 2, 13, 294068)), + ), + ] diff --git a/panel/migrations/0135_auto_20240409_1220.py b/panel/migrations/0135_auto_20240409_1220.py new file mode 100644 index 0000000..6400044 --- /dev/null +++ b/panel/migrations/0135_auto_20240409_1220.py @@ -0,0 +1,68 @@ +# Generated by Django 3.2.13 on 2024-04-09 12:20 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0134_auto_20240409_1202'), + ] + + operations = [ + migrations.RemoveField( + model_name='chickenagerange', + name='mid', + ), + migrations.AddField( + model_name='chickenagerange', + name='active', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 20, 41, 280042)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 20, 41, 222039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 20, 41, 222039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 20, 41, 222039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 20, 41, 222039)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 20, 41, 224041)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 20, 41, 224041)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 20, 41, 224041)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 9, 12, 20, 41, 232039)), + ), + ] diff --git a/panel/migrations/0136_auto_20240413_1322.py b/panel/migrations/0136_auto_20240413_1322.py new file mode 100644 index 0000000..c43b516 --- /dev/null +++ b/panel/migrations/0136_auto_20240413_1322.py @@ -0,0 +1,88 @@ +# Generated by Django 3.2.13 on 2024-04-13 13:22 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0135_auto_20240409_1220'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 13, 13, 22, 33, 410655)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 13, 13, 22, 33, 270031)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 13, 13, 22, 33, 270031)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 13, 13, 22, 33, 270031)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 13, 13, 22, 33, 270031)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 13, 13, 22, 33, 285656)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 13, 13, 22, 33, 285656)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 13, 13, 22, 33, 285656)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 13, 13, 22, 33, 285656)), + ), + migrations.CreateModel( + name='TimeRange', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('poultry_request_start_hour', models.IntegerField(default=0)), + ('poultry_request_end_hour', models.IntegerField(default=0)), + ('kill_request_start_hour', models.IntegerField(default=0)), + ('kill_request_end_hour', models.IntegerField(default=0)), + ('province_kill_request_start_hour', models.IntegerField(default=0)), + ('province_kill_request_end_hour', models.IntegerField(default=0)), + ('kill_house_request_start_hour', models.IntegerField(default=0)), + ('kill_house_request_end_hour', models.IntegerField(default=0)), + ('vet_farm_check_start_hour', models.IntegerField(default=0)), + ('vet_farm_check_end_hour', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='timerange_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='timerange_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0137_auto_20240414_1050.py b/panel/migrations/0137_auto_20240414_1050.py new file mode 100644 index 0000000..0dcc163 --- /dev/null +++ b/panel/migrations/0137_auto_20240414_1050.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-04-14 10:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0136_auto_20240413_1322'), + ] + + operations = [ + migrations.AddField( + model_name='timerange', + name='time_range', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 10, 50, 14, 71645)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 10, 50, 14, 23895)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 10, 50, 14, 23895)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 10, 50, 14, 23895)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 10, 50, 14, 23895)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 10, 50, 14, 24758)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 10, 50, 14, 24758)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 10, 50, 14, 24758)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 10, 50, 14, 24758)), + ), + ] diff --git a/panel/migrations/0138_auto_20240414_1206.py b/panel/migrations/0138_auto_20240414_1206.py new file mode 100644 index 0000000..d5927ef --- /dev/null +++ b/panel/migrations/0138_auto_20240414_1206.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2024-04-14 12:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0137_auto_20240414_1050'), + ] + + operations = [ + migrations.RemoveField( + model_name='timerange', + name='kill_house_request_end_hour', + ), + migrations.RemoveField( + model_name='timerange', + name='kill_house_request_start_hour', + ), + migrations.RemoveField( + model_name='timerange', + name='kill_request_end_hour', + ), + migrations.RemoveField( + model_name='timerange', + name='kill_request_start_hour', + ), + migrations.RemoveField( + model_name='timerange', + name='poultry_request_end_hour', + ), + migrations.RemoveField( + model_name='timerange', + name='poultry_request_start_hour', + ), + migrations.RemoveField( + model_name='timerange', + name='province_kill_request_end_hour', + ), + migrations.RemoveField( + model_name='timerange', + name='province_kill_request_start_hour', + ), + migrations.RemoveField( + model_name='timerange', + name='vet_farm_check_end_hour', + ), + migrations.RemoveField( + model_name='timerange', + name='vet_farm_check_start_hour', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 12, 6, 13, 921323)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 12, 6, 13, 846327)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 12, 6, 13, 846327)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 12, 6, 13, 846327)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 12, 6, 13, 846327)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 12, 6, 13, 849327)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 12, 6, 13, 849327)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 12, 6, 13, 849327)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 14, 12, 6, 13, 862325)), + ), + ] diff --git a/panel/migrations/0139_auto_20240416_1440.py b/panel/migrations/0139_auto_20240416_1440.py new file mode 100644 index 0000000..ea4524d --- /dev/null +++ b/panel/migrations/0139_auto_20240416_1440.py @@ -0,0 +1,104 @@ +# Generated by Django 3.2.13 on 2024-04-16 14:40 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0025_auto_20240416_1440'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0138_auto_20240414_1206'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 998350)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 820349)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 820349)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 820349)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 820349)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 824348)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 824348)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 824348)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 16, 14, 40, 32, 841347)), + ), + migrations.CreateModel( + name='JahadInspector', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_inspector_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahadinspector_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahadinspector_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_inspector_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_inspector_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='jahad_inspector_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CitySupervisor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_supervisor_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='citysupervisor_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='citysupervisor_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_supervisor_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_supervisor_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_supervisor_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0140_auto_20240417_1103.py b/panel/migrations/0140_auto_20240417_1103.py new file mode 100644 index 0000000..a1ad144 --- /dev/null +++ b/panel/migrations/0140_auto_20240417_1103.py @@ -0,0 +1,83 @@ +# Generated by Django 3.2.13 on 2024-04-17 11:03 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0139_auto_20240416_1440'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 912674)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 760737)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 760737)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 760737)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 760737)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 760737)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 760737)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 760737)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 11, 2, 49, 791983)), + ), + migrations.CreateModel( + name='SystemWallet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('balance', models.BigIntegerField(default=0)), + ('active', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='systemwallet_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_wallet_guild', to='panel.guilds')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_wallet_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='systemwallet_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='system_wallet_steward', to='panel.steward')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0141_auto_20240417_1257.py b/panel/migrations/0141_auto_20240417_1257.py new file mode 100644 index 0000000..b5baaac --- /dev/null +++ b/panel/migrations/0141_auto_20240417_1257.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-04-17 12:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0140_auto_20240417_1103'), + ] + + operations = [ + migrations.AddField( + model_name='wagepayment', + name='type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 56, 50, 273113)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 56, 50, 185111)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 56, 50, 185111)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 56, 50, 185111)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 56, 50, 185111)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 56, 50, 187113)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 56, 50, 187113)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 56, 50, 187113)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 17, 12, 56, 50, 197113)), + ), + ] diff --git a/panel/migrations/0142_auto_20240418_1428.py b/panel/migrations/0142_auto_20240418_1428.py new file mode 100644 index 0000000..38f24fa --- /dev/null +++ b/panel/migrations/0142_auto_20240418_1428.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-04-18 14:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0141_auto_20240417_1257'), + ] + + operations = [ + migrations.AddField( + model_name='announcements', + name='role', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 14, 28, 28, 857470)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 14, 28, 28, 722478)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 14, 28, 28, 722478)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 14, 28, 28, 722478)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 14, 28, 28, 722478)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 14, 28, 28, 726477)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 14, 28, 28, 726477)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 14, 28, 28, 726477)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 14, 28, 28, 742474)), + ), + ] diff --git a/panel/migrations/0143_auto_20240418_1550.py b/panel/migrations/0143_auto_20240418_1550.py new file mode 100644 index 0000000..6d19cbb --- /dev/null +++ b/panel/migrations/0143_auto_20240418_1550.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-04-18 15:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0142_auto_20240418_1428'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='wallet_pay', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 15, 50, 22, 677160)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 15, 50, 22, 477163)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 15, 50, 22, 477163)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 15, 50, 22, 477163)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 15, 50, 22, 477163)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 15, 50, 22, 481163)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 15, 50, 22, 481163)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 15, 50, 22, 481163)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 18, 15, 50, 22, 508162)), + ), + ] diff --git a/panel/migrations/0144_auto_20240420_0033.py b/panel/migrations/0144_auto_20240420_0033.py new file mode 100644 index 0000000..6da3bdb --- /dev/null +++ b/panel/migrations/0144_auto_20240420_0033.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2024-04-20 00:33 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0027_auto_20240420_0033'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0143_auto_20240418_1550'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 978658)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 920652)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 920652)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 920652)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 920652)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 922652)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 922652)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 922652)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 0, 33, 3, 930653)), + ), + migrations.CreateModel( + name='SuperAdmin', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='super_admin_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='superadmin_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='superadmin_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='super_admin_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='super_admin_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='super_admin_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0145_auto_20240420_1517.py b/panel/migrations/0145_auto_20240420_1517.py new file mode 100644 index 0000000..1c0fc4a --- /dev/null +++ b/panel/migrations/0145_auto_20240420_1517.py @@ -0,0 +1,81 @@ +# Generated by Django 3.2.13 on 2024-04-20 15:17 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0144_auto_20240420_0033'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 15, 17, 36, 475825)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 15, 17, 36, 303828)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 15, 17, 36, 303828)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 15, 17, 36, 303828)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 15, 17, 36, 303828)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 15, 17, 36, 307824)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 15, 17, 36, 307824)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 15, 17, 36, 307824)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 20, 15, 17, 36, 322824)), + ), + migrations.CreateModel( + name='PaymentGatewayPercentage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('company', models.IntegerField(default=0)), + ('union', models.IntegerField(default=0)), + ('guilds', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='paymentgatewaypercentage_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='paymentgatewaypercentage_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0146_auto_20240427_1357.py b/panel/migrations/0146_auto_20240427_1357.py new file mode 100644 index 0000000..52a3ec3 --- /dev/null +++ b/panel/migrations/0146_auto_20240427_1357.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-04-27 13:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0145_auto_20240420_1517'), + ] + + operations = [ + migrations.AddField( + model_name='wagepayment', + name='total_amount_with_tax', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 57, 15, 370773)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 57, 15, 134772)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 57, 15, 133773)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 57, 15, 134772)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 57, 15, 134772)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 57, 15, 138774)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 57, 15, 138774)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 57, 15, 138774)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 27, 13, 57, 15, 157772)), + ), + ] diff --git a/panel/migrations/0147_auto_20240428_1211.py b/panel/migrations/0147_auto_20240428_1211.py new file mode 100644 index 0000000..ad95cdd --- /dev/null +++ b/panel/migrations/0147_auto_20240428_1211.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-04-28 12:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0146_auto_20240427_1357'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='type', + field=models.CharField(default='public', max_length=100), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 28, 12, 11, 41, 117270)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 28, 12, 11, 41, 52269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 28, 12, 11, 41, 52269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 28, 12, 11, 41, 52269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 28, 12, 11, 41, 52269)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 28, 12, 11, 41, 54269)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 28, 12, 11, 41, 54269)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 28, 12, 11, 41, 54269)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 28, 12, 11, 41, 61269)), + ), + ] diff --git a/panel/migrations/0148_auto_20240429_1110.py b/panel/migrations/0148_auto_20240429_1110.py new file mode 100644 index 0000000..c81387f --- /dev/null +++ b/panel/migrations/0148_auto_20240429_1110.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-04-29 11:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0147_auto_20240428_1211'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='city_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='company_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='guilds_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='union_share', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 10, 43, 343206)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 10, 43, 233210)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 10, 43, 233210)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 10, 43, 233210)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 10, 43, 233210)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 10, 43, 237211)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 10, 43, 237211)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 10, 43, 237211)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 10, 43, 254208)), + ), + ] diff --git a/panel/migrations/0149_auto_20240429_1131.py b/panel/migrations/0149_auto_20240429_1131.py new file mode 100644 index 0000000..4217824 --- /dev/null +++ b/panel/migrations/0149_auto_20240429_1131.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-04-29 11:31 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0148_auto_20240429_1110'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='killer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_killer', to='panel.killhouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 31, 37, 463070)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 31, 37, 332072)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 31, 37, 332072)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 31, 37, 332072)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 31, 37, 332072)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 31, 37, 336072)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 31, 37, 336072)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 31, 37, 336072)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 29, 11, 31, 37, 354076)), + ), + ] diff --git a/panel/migrations/0150_auto_20240430_1203.py b/panel/migrations/0150_auto_20240430_1203.py new file mode 100644 index 0000000..892cad7 --- /dev/null +++ b/panel/migrations/0150_auto_20240430_1203.py @@ -0,0 +1,83 @@ +# Generated by Django 3.2.13 on 2024-04-30 12:03 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0149_auto_20240429_1131'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 12, 3, 16, 989588)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 12, 3, 16, 827586)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 12, 3, 16, 827586)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 12, 3, 16, 827586)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 12, 3, 16, 827586)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 12, 3, 16, 831584)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 12, 3, 16, 831584)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 12, 3, 16, 831584)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 12, 3, 16, 849590)), + ), + migrations.CreateModel( + name='SlaughterHouseTransaction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('amount', models.BigIntegerField(default=0)), + ('amount_with_tax', models.BigIntegerField(default=0)), + ('type', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='slaughterhousetransaction_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='slaughter_house_transaction_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='slaughterhousetransaction_modifiedby', to=settings.AUTH_USER_MODEL)), + ('parent_kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='slaughter_house_transaction_parent_kill_house', to='panel.killhouse')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0151_auto_20240430_1327.py b/panel/migrations/0151_auto_20240430_1327.py new file mode 100644 index 0000000..4981331 --- /dev/null +++ b/panel/migrations/0151_auto_20240430_1327.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-04-30 13:27 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0150_auto_20240430_1203'), + ] + + operations = [ + migrations.AddField( + model_name='slaughterhousetransaction', + name='state', + field=models.CharField(default='pending', max_length=20), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='transaction', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 13, 27, 31, 661630)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 13, 27, 31, 584627)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 13, 27, 31, 584627)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 13, 27, 31, 584627)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 13, 27, 31, 584627)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 13, 27, 31, 586627)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 13, 27, 31, 586627)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 13, 27, 31, 586627)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 4, 30, 13, 27, 31, 596626)), + ), + ] diff --git a/panel/migrations/0152_auto_20240506_1344.py b/panel/migrations/0152_auto_20240506_1344.py new file mode 100644 index 0000000..09c8716 --- /dev/null +++ b/panel/migrations/0152_auto_20240506_1344.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2024-05-06 13:44 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0151_auto_20240430_1327'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 13, 44, 23, 884857)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 13, 44, 23, 759857)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 13, 44, 23, 759857)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 13, 44, 23, 759857)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 13, 44, 23, 759857)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 13, 44, 23, 759857)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 13, 44, 23, 759857)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 13, 44, 23, 759857)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 13, 44, 23, 775483)), + ), + migrations.CreateModel( + name='WageType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('amount', models.BigIntegerField(default=0)), + ('status', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wagetype_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wagetype_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PercentageOfWageType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('percent', models.FloatField(default=0)), + ('name', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percentageofwagetype_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percentageofwagetype_modifiedby', to=settings.AUTH_USER_MODEL)), + ('wage_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wage_type_percentage', to='panel.wagetype')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0153_auto_20240506_1401.py b/panel/migrations/0153_auto_20240506_1401.py new file mode 100644 index 0000000..65974ca --- /dev/null +++ b/panel/migrations/0153_auto_20240506_1401.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-05-06 14:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0152_auto_20240506_1344'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 14, 0, 52, 30523)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 14, 0, 51, 803520)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 14, 0, 51, 803520)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 14, 0, 51, 803520)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 14, 0, 51, 803520)), + ), + migrations.AlterField( + model_name='percentageofwagetype', + name='name', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 14, 0, 51, 808522)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 14, 0, 51, 807521)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 14, 0, 51, 808522)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 14, 0, 51, 826521)), + ), + migrations.AlterField( + model_name='wagetype', + name='name', + field=models.CharField(max_length=500, null=True), + ), + ] diff --git a/panel/migrations/0154_auto_20240506_1502.py b/panel/migrations/0154_auto_20240506_1502.py new file mode 100644 index 0000000..e571254 --- /dev/null +++ b/panel/migrations/0154_auto_20240506_1502.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-05-06 15:02 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0153_auto_20240506_1401'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 15, 2, 11, 471274)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 15, 2, 11, 414274)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 15, 2, 11, 414274)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 15, 2, 11, 414274)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 15, 2, 11, 414274)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 15, 2, 11, 416274)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 15, 2, 11, 416274)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 15, 2, 11, 416274)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 6, 15, 2, 11, 423274)), + ), + migrations.CreateModel( + name='ShareType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=500, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sharetype_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sharetype_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0155_auto_20240507_1044.py b/panel/migrations/0155_auto_20240507_1044.py new file mode 100644 index 0000000..80b0b40 --- /dev/null +++ b/panel/migrations/0155_auto_20240507_1044.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-05-07 10:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0154_auto_20240506_1502'), + ] + + operations = [ + migrations.AddField( + model_name='sharetype', + name='account_id', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 10, 44, 11, 949142)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 10, 44, 11, 902257)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 10, 44, 11, 902257)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 10, 44, 11, 902257)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 10, 44, 11, 902257)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 10, 44, 11, 902257)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 10, 44, 11, 902257)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 10, 44, 11, 902257)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 10, 44, 11, 902257)), + ), + ] diff --git a/panel/migrations/0156_auto_20240507_1105.py b/panel/migrations/0156_auto_20240507_1105.py new file mode 100644 index 0000000..4263eb6 --- /dev/null +++ b/panel/migrations/0156_auto_20240507_1105.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-05-07 11:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0155_auto_20240507_1044'), + ] + + operations = [ + migrations.RemoveField( + model_name='sharetype', + name='account_id', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 5, 49, 359953)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 5, 49, 227302)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 5, 49, 227302)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 5, 49, 227302)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 5, 49, 227302)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 5, 49, 231301)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 5, 49, 231301)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 5, 49, 231301)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 5, 49, 247302)), + ), + ] diff --git a/panel/migrations/0157_auto_20240507_1110.py b/panel/migrations/0157_auto_20240507_1110.py new file mode 100644 index 0000000..0a0387f --- /dev/null +++ b/panel/migrations/0157_auto_20240507_1110.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-05-07 11:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0156_auto_20240507_1105'), + ] + + operations = [ + migrations.AddField( + model_name='sharetype', + name='account_id', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 10, 33, 936524)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 10, 33, 811528)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 10, 33, 811528)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 10, 33, 811528)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 10, 33, 811528)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 10, 33, 814523)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 10, 33, 814523)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 10, 33, 814523)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 11, 10, 33, 831525)), + ), + ] diff --git a/panel/migrations/0158_auto_20240507_2243.py b/panel/migrations/0158_auto_20240507_2243.py new file mode 100644 index 0000000..031ec3e --- /dev/null +++ b/panel/migrations/0158_auto_20240507_2243.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-05-07 22:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0157_auto_20240507_1110'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='buy_type', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 22, 43, 42, 634426)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 22, 43, 42, 431538)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 22, 43, 42, 431538)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 22, 43, 42, 431538)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 22, 43, 42, 431538)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 22, 43, 42, 436646)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 22, 43, 42, 436606)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 22, 43, 42, 436646)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 22, 43, 42, 453971)), + ), + ] diff --git a/panel/migrations/0159_auto_20240507_2343.py b/panel/migrations/0159_auto_20240507_2343.py new file mode 100644 index 0000000..6262cf1 --- /dev/null +++ b/panel/migrations/0159_auto_20240507_2343.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-05-07 23:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0158_auto_20240507_2243'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='ware_house', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 23, 43, 9, 69324)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 23, 43, 8, 918128)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 23, 43, 8, 918128)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 23, 43, 8, 918128)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 23, 43, 8, 918128)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 23, 43, 8, 922207)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 23, 43, 8, 922207)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 23, 43, 8, 922207)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 7, 23, 43, 8, 933661)), + ), + ] diff --git a/panel/migrations/0160_auto_20240508_1019.py b/panel/migrations/0160_auto_20240508_1019.py new file mode 100644 index 0000000..4d2fd27 --- /dev/null +++ b/panel/migrations/0160_auto_20240508_1019.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-05-08 10:19 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0159_auto_20240507_2343'), + ] + + operations = [ + migrations.RemoveField( + model_name='percentageofwagetype', + name='name', + ), + migrations.AddField( + model_name='percentageofwagetype', + name='share_type', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='share_type_percentage', to='panel.sharetype'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 10, 19, 26, 875040)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 10, 19, 26, 812533)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 10, 19, 26, 812533)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 10, 19, 26, 812533)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 10, 19, 26, 812533)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 10, 19, 26, 812533)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 10, 19, 26, 812533)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 10, 19, 26, 812533)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 10, 19, 26, 828163)), + ), + ] diff --git a/panel/migrations/0161_auto_20240508_1203.py b/panel/migrations/0161_auto_20240508_1203.py new file mode 100644 index 0000000..65994d8 --- /dev/null +++ b/panel/migrations/0161_auto_20240508_1203.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-05-08 12:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0160_auto_20240508_1019'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='seller_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='seller_name', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 12, 3, 10, 378806)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 12, 3, 10, 255810)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 12, 3, 10, 255810)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 12, 3, 10, 255810)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 12, 3, 10, 255810)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 12, 3, 10, 259808)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 12, 3, 10, 259808)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 12, 3, 10, 259808)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 8, 12, 3, 10, 275807)), + ), + ] diff --git a/panel/migrations/0162_auto_20240511_1129.py b/panel/migrations/0162_auto_20240511_1129.py new file mode 100644 index 0000000..132951b --- /dev/null +++ b/panel/migrations/0162_auto_20240511_1129.py @@ -0,0 +1,106 @@ +# Generated by Django 3.2.13 on 2024-05-11 11:29 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0029_auto_20240511_1129'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0161_auto_20240508_1203'), + ] + + operations = [ + migrations.AddField( + model_name='poultry', + name='has_chain_company', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='poultryhatching', + name='chain_killed_quantity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='chain_killed_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='has_chain_company', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 804034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 741534)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 741534)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 741534)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 741534)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 741534)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 741534)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 741534)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 11, 29, 47, 741534)), + ), + migrations.CreateModel( + name='ChainCompany', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chaincompany_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chaincompany_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chain_company_user', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='poultry', + name='chain_company', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_chain_company', to='panel.chaincompany'), + ), + ] diff --git a/panel/migrations/0163_auto_20240511_1312.py b/panel/migrations/0163_auto_20240511_1312.py new file mode 100644 index 0000000..7e1475c --- /dev/null +++ b/panel/migrations/0163_auto_20240511_1312.py @@ -0,0 +1,76 @@ +# Generated by Django 3.2.13 on 2024-05-11 13:12 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0030_auto_20240511_1312'), + ('panel', '0162_auto_20240511_1129'), + ] + + operations = [ + migrations.AddField( + model_name='chaincompany', + name='address', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chain_company_address', to='authentication.systemaddress'), + ), + migrations.AddField( + model_name='chaincompany', + name='user_bank_info', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chain_company_bank_info', to='authentication.bankcard'), + ), + migrations.AddField( + model_name='chaincompany', + name='wallet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chain_company_wallet', to='panel.wallet'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 833975)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 677976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 677976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 677976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 677976)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 684978)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 684978)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 684978)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 11, 13, 11, 48, 704976)), + ), + ] diff --git a/panel/migrations/0164_auto_20240512_1109.py b/panel/migrations/0164_auto_20240512_1109.py new file mode 100644 index 0000000..b5c05a4 --- /dev/null +++ b/panel/migrations/0164_auto_20240512_1109.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-05-12 11:09 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0163_auto_20240511_1312'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultry', + name='chain_company', + ), + migrations.AddField( + model_name='poultryhatching', + name='chain_company', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_hatching_chain_company', to='panel.chaincompany'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 12, 11, 8, 55, 89534)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 12, 11, 8, 54, 873402)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 12, 11, 8, 54, 873402)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 12, 11, 8, 54, 873402)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 12, 11, 8, 54, 873402)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 12, 11, 8, 54, 889025)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 12, 11, 8, 54, 889025)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 12, 11, 8, 54, 889025)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 12, 11, 8, 54, 904650)), + ), + ] diff --git a/panel/migrations/0165_auto_20240513_1219.py b/panel/migrations/0165_auto_20240513_1219.py new file mode 100644 index 0000000..0578309 --- /dev/null +++ b/panel/migrations/0165_auto_20240513_1219.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2024-05-13 12:19 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0164_auto_20240512_1109'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 19, 17, 78483)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 19, 16, 846222)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 19, 16, 846222)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 19, 16, 846222)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 19, 16, 846222)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 19, 16, 861874)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 19, 16, 861874)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 19, 16, 861874)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 19, 16, 893124)), + ), + migrations.CreateModel( + name='ChainAllocation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('quantity', models.BigIntegerField(default=0)), + ('weight', models.FloatField(default=0)), + ('chain_company', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chain_company_allocation', to='panel.chaincompany')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chainallocation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chainallocation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_hatching', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_hatching_chain_allocation', to='panel.poultryhatching')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0166_auto_20240513_1255.py b/panel/migrations/0166_auto_20240513_1255.py new file mode 100644 index 0000000..a3aaec8 --- /dev/null +++ b/panel/migrations/0166_auto_20240513_1255.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-05-13 12:55 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0165_auto_20240513_1219'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='state', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 55, 44, 353947)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 55, 44, 193392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 55, 44, 193392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 55, 44, 193392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 55, 44, 193392)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 55, 44, 199387)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 55, 44, 199387)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 55, 44, 199387)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 55, 44, 218391)), + ), + ] diff --git a/panel/migrations/0167_auto_20240513_1256.py b/panel/migrations/0167_auto_20240513_1256.py new file mode 100644 index 0000000..671668a --- /dev/null +++ b/panel/migrations/0167_auto_20240513_1256.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-05-13 12:56 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0166_auto_20240513_1255'), + ] + + operations = [ + migrations.AlterField( + model_name='chainallocation', + name='state', + field=models.CharField(default='pending', max_length=50), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 56, 51, 629353)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 56, 51, 507352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 56, 51, 507352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 56, 51, 507352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 56, 51, 507352)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 56, 51, 513349)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 56, 51, 513349)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 56, 51, 513349)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 13, 12, 56, 51, 530352)), + ), + ] diff --git a/panel/migrations/0168_auto_20240515_1153.py b/panel/migrations/0168_auto_20240515_1153.py new file mode 100644 index 0000000..0cd81f8 --- /dev/null +++ b/panel/migrations/0168_auto_20240515_1153.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-05-15 11:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0167_auto_20240513_1256'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='message', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='quarantine_code', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='remover', + field=models.JSONField(null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='vet_farm_state', + field=models.CharField(default='pending', max_length=50), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 11, 52, 58, 841022)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 11, 52, 58, 782005)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 11, 52, 58, 782005)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 11, 52, 58, 782005)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 11, 52, 58, 782005)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 11, 52, 58, 786100)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 11, 52, 58, 786100)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 11, 52, 58, 786100)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 11, 52, 58, 786100)), + ), + ] diff --git a/panel/migrations/0169_auto_20240515_1301.py b/panel/migrations/0169_auto_20240515_1301.py new file mode 100644 index 0000000..e445193 --- /dev/null +++ b/panel/migrations/0169_auto_20240515_1301.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-05-15 13:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0168_auto_20240515_1153'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='quarantine_code_registrar', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 13, 1, 40, 245526)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 13, 1, 40, 100189)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 13, 1, 40, 100189)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 13, 1, 40, 100189)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 13, 1, 40, 100189)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 13, 1, 40, 102248)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 13, 1, 40, 102248)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 13, 1, 40, 102248)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 13, 1, 40, 126742)), + ), + ] diff --git a/panel/migrations/0170_auto_20240515_1453.py b/panel/migrations/0170_auto_20240515_1453.py new file mode 100644 index 0000000..fc64349 --- /dev/null +++ b/panel/migrations/0170_auto_20240515_1453.py @@ -0,0 +1,85 @@ +# Generated by Django 3.2.13 on 2024-05-15 14:53 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0169_auto_20240515_1301'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 14, 52, 47, 811795)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 14, 52, 47, 383796)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 14, 52, 47, 383796)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 14, 52, 47, 383796)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 14, 52, 47, 383796)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 14, 52, 47, 389790)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 14, 52, 47, 389790)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 14, 52, 47, 389790)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 14, 52, 47, 421793)), + ), + migrations.CreateModel( + name='ShareTypeWage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('percent', models.FloatField(default=0)), + ('amount', models.BigIntegerField(default=0)), + ('date', models.DateTimeField(null=True)), + ('Province_kill_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wage_province_kill_request', to='panel.provincekillrequest')), + ('chain_allocation', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wage_chain_allocation', to='panel.chainallocation')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sharetypewage_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house_free_bar', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wage_kill_house_free_bar', to='panel.killhousefreebarinformation')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sharetypewage_modifiedby', to=settings.AUTH_USER_MODEL)), + ('share_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wage_share_type', to='panel.sharetype')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0171_auto_20240515_1549.py b/panel/migrations/0171_auto_20240515_1549.py new file mode 100644 index 0000000..e54288c --- /dev/null +++ b/panel/migrations/0171_auto_20240515_1549.py @@ -0,0 +1,62 @@ +# Generated by Django 3.2.13 on 2024-05-15 15:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0170_auto_20240515_1453'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 15, 49, 38, 247387)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 15, 49, 38, 179388)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 15, 49, 38, 179388)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 15, 49, 38, 179388)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 15, 49, 38, 179388)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 15, 49, 38, 183388)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 15, 49, 38, 182388)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 15, 49, 38, 182388)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 15, 49, 38, 192387)), + ), + migrations.DeleteModel( + name='ShareTypeWage', + ), + ] diff --git a/panel/migrations/0172_auto_20240515_2306.py b/panel/migrations/0172_auto_20240515_2306.py new file mode 100644 index 0000000..e989345 --- /dev/null +++ b/panel/migrations/0172_auto_20240515_2306.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-05-15 23:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0171_auto_20240515_1549'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='other_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='total_wage_amount', + field=models.FloatField(default=0, null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='wallet_share', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 6, 25, 769223)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 6, 25, 706818)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 6, 25, 706818)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 6, 25, 706818)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 6, 25, 706818)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 6, 25, 706818)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 6, 25, 706818)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 6, 25, 706818)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 6, 25, 722340)), + ), + ] diff --git a/panel/migrations/0173_auto_20240515_2310.py b/panel/migrations/0173_auto_20240515_2310.py new file mode 100644 index 0000000..48ad8cd --- /dev/null +++ b/panel/migrations/0173_auto_20240515_2310.py @@ -0,0 +1,139 @@ +# Generated by Django 3.2.13 on 2024-05-15 23:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0172_auto_20240515_2306'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='city_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='company_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='guilds_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='other_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='total_wage_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='union_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='wage', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='wallet_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='city_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='company_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='guilds_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='other_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='total_wage_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='union_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='wage', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='wallet_share', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 10, 28, 624599)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 10, 28, 562080)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 10, 28, 562080)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 10, 28, 562080)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 10, 28, 562080)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 10, 28, 562080)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 10, 28, 562080)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 10, 28, 562080)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 10, 28, 577713)), + ), + ] diff --git a/panel/migrations/0174_auto_20240515_2326.py b/panel/migrations/0174_auto_20240515_2326.py new file mode 100644 index 0000000..20932e0 --- /dev/null +++ b/panel/migrations/0174_auto_20240515_2326.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-05-15 23:26 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0173_auto_20240515_2310'), + ] + + operations = [ + migrations.AddField( + model_name='wagetype', + name='en_name', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 26, 35, 975274)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 26, 35, 912275)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 26, 35, 912275)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 26, 35, 912275)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 26, 35, 912275)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 26, 35, 915275)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 26, 35, 915275)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 26, 35, 915275)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 15, 23, 26, 35, 924278)), + ), + ] diff --git a/panel/migrations/0175_auto_20240516_0015.py b/panel/migrations/0175_auto_20240516_0015.py new file mode 100644 index 0000000..07769fb --- /dev/null +++ b/panel/migrations/0175_auto_20240516_0015.py @@ -0,0 +1,154 @@ +# Generated by Django 3.2.13 on 2024-05-16 00:15 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0174_auto_20240515_2326'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='city_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='company_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='guilds_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='other_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='union_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='chainallocation', + name='wallet_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='city_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='company_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='guilds_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='other_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='union_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='wallet_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='city_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='company_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='guilds_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='other_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='union_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='wallet_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='sharetype', + name='en_name', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 0, 15, 40, 833489)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 0, 15, 40, 769491)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 0, 15, 40, 769491)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 0, 15, 40, 769491)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 0, 15, 40, 769491)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 0, 15, 40, 772492)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 0, 15, 40, 772492)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 0, 15, 40, 772492)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 0, 15, 40, 782493)), + ), + ] diff --git a/panel/migrations/0176_auto_20240516_1132.py b/panel/migrations/0176_auto_20240516_1132.py new file mode 100644 index 0000000..93ec82c --- /dev/null +++ b/panel/migrations/0176_auto_20240516_1132.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2024-05-16 11:32 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0175_auto_20240516_0015'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 11, 31, 51, 899929)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 11, 31, 51, 761925)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 11, 31, 51, 760926)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 11, 31, 51, 761925)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 11, 31, 51, 760926)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 11, 31, 51, 767926)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 11, 31, 51, 767926)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 11, 31, 51, 767926)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 11, 31, 51, 787927)), + ), + migrations.CreateModel( + name='TotalWageInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('total_amount', models.BigIntegerField(default=0)), + ('total_unpaid_amount', models.BigIntegerField(default=0)), + ('total_paid_amount', models.BigIntegerField(default=0)), + ('total_weight', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='totalwageinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='totalwageinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0177_auto_20240516_1320.py b/panel/migrations/0177_auto_20240516_1320.py new file mode 100644 index 0000000..dcb1434 --- /dev/null +++ b/panel/migrations/0177_auto_20240516_1320.py @@ -0,0 +1,83 @@ +# Generated by Django 3.2.13 on 2024-05-16 13:20 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0176_auto_20240516_1132'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 20, 37, 305672)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 20, 37, 168673)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 20, 37, 168673)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 20, 37, 168673)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 20, 37, 168673)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 20, 37, 176672)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 20, 37, 176672)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 20, 37, 176672)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 16, 13, 20, 37, 197668)), + ), + migrations.CreateModel( + name='ChainCompanyTransaction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('amount', models.BigIntegerField(default=0)), + ('amount_with_tax', models.BigIntegerField(default=0)), + ('transaction', models.IntegerField(null=True)), + ('state', models.CharField(default='pending', max_length=20)), + ('chain_company', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='transaction_chain_company', to='panel.chaincompany')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chaincompanytransaction_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chaincompanytransaction_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0178_auto_20240517_1337.py b/panel/migrations/0178_auto_20240517_1337.py new file mode 100644 index 0000000..f8f5e4f --- /dev/null +++ b/panel/migrations/0178_auto_20240517_1337.py @@ -0,0 +1,119 @@ +# Generated by Django 3.2.13 on 2024-05-17 13:37 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0177_auto_20240516_1320'), + ] + + operations = [ + migrations.AddField( + model_name='chaincompanytransaction', + name='city_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chaincompanytransaction', + name='company_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chaincompanytransaction', + name='guilds_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chaincompanytransaction', + name='other_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chaincompanytransaction', + name='union_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='chaincompanytransaction', + name='wallet_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='city_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='company_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='guilds_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='other_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='union_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='wallet_share', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 37, 27, 537561)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 37, 27, 470560)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 37, 27, 470560)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 37, 27, 470560)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 37, 27, 470560)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 37, 27, 475560)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 37, 27, 475560)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 37, 27, 475560)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 37, 27, 484561)), + ), + ] diff --git a/panel/migrations/0179_auto_20240517_1352.py b/panel/migrations/0179_auto_20240517_1352.py new file mode 100644 index 0000000..728d81e --- /dev/null +++ b/panel/migrations/0179_auto_20240517_1352.py @@ -0,0 +1,109 @@ +# Generated by Django 3.2.13 on 2024-05-17 13:52 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0178_auto_20240517_1337'), + ] + + operations = [ + migrations.AddField( + model_name='chaincompanytransaction', + name='cardHolderPan', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='chaincompanytransaction', + name='orderId', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='chaincompanytransaction', + name='pay_type', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='chaincompanytransaction', + name='refId', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='chaincompanytransaction', + name='saleReferenceId', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='cardHolderPan', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='orderId', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='pay_type', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='refId', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='slaughterhousetransaction', + name='saleReferenceId', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 52, 6, 476016)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 52, 6, 403012)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 52, 6, 403012)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 52, 6, 403012)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 52, 6, 403012)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 52, 6, 408017)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 52, 6, 408017)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 52, 6, 408017)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 13, 52, 6, 426016)), + ), + ] diff --git a/panel/migrations/0180_auto_20240517_2240.py b/panel/migrations/0180_auto_20240517_2240.py new file mode 100644 index 0000000..20bf350 --- /dev/null +++ b/panel/migrations/0180_auto_20240517_2240.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2024-05-17 22:40 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0179_auto_20240517_1352'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 22, 40, 13, 370382)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 22, 40, 13, 279378)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 22, 40, 13, 279378)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 22, 40, 13, 279378)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 22, 40, 13, 279378)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 22, 40, 13, 283380)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 22, 40, 13, 283380)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 22, 40, 13, 283380)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 17, 22, 40, 13, 296380)), + ), + migrations.CreateModel( + name='InternalTransaction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('date', models.DateTimeField(auto_now_add=True)), + ('amount', models.BigIntegerField(default=0)), + ('amount_with_tax', models.BigIntegerField(default=0)), + ('status', models.CharField(default='pending', max_length=100)), + ('transaction_type', models.CharField(max_length=100, null=True)), + ('type', models.CharField(max_length=100, null=True)), + ('payer_type', models.CharField(max_length=100, null=True)), + ('message', models.TextField(null=True)), + ('saleReferenceId', models.CharField(max_length=100, null=True)), + ('refId', models.CharField(max_length=100, null=True)), + ('orderId', models.CharField(max_length=100, null=True)), + ('cardHolderPan', models.CharField(max_length=100, null=True)), + ('union_share', models.BigIntegerField(default=0)), + ('company_share', models.BigIntegerField(default=0)), + ('guilds_share', models.BigIntegerField(default=0)), + ('city_share', models.BigIntegerField(default=0)), + ('wallet_share', models.BigIntegerField(default=0)), + ('other_share', models.BigIntegerField(default=0)), + ('chain_company', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='internal_transaction_chain_company_user', to='panel.chaincompany')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='internaltransaction_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='internal_transaction_kill_house_user', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='internaltransaction_modifiedby', to=settings.AUTH_USER_MODEL)), + ('parent_kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='internal_transaction_parent_kill_house', to='panel.killhouse')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0181_auto_20240521_1033.py b/panel/migrations/0181_auto_20240521_1033.py new file mode 100644 index 0000000..0c8e525 --- /dev/null +++ b/panel/migrations/0181_auto_20240521_1033.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-05-21 10:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0180_auto_20240517_2240'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='archive_wage', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='archive_wage', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 32, 42, 154728)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 32, 41, 725624)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 32, 41, 724545)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 32, 41, 725547)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 32, 41, 724545)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 32, 41, 751750)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 32, 41, 750547)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 32, 41, 750547)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 32, 41, 825332)), + ), + ] diff --git a/panel/migrations/0182_auto_20240521_1054.py b/panel/migrations/0182_auto_20240521_1054.py new file mode 100644 index 0000000..4a30cc6 --- /dev/null +++ b/panel/migrations/0182_auto_20240521_1054.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-05-21 10:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0181_auto_20240521_1033'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='archive_wage', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 53, 42, 664091)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 53, 42, 336007)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 53, 42, 336007)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 53, 42, 336007)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 53, 42, 336007)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 53, 42, 351633)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 53, 42, 351633)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 53, 42, 351633)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 21, 10, 53, 42, 382887)), + ), + ] diff --git a/panel/migrations/0183_auto_20240523_1653.py b/panel/migrations/0183_auto_20240523_1653.py new file mode 100644 index 0000000..5c02832 --- /dev/null +++ b/panel/migrations/0183_auto_20240523_1653.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-05-23 16:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0182_auto_20240521_1054'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='show_exclusive', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 23, 16, 53, 4, 929848)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 23, 16, 53, 4, 742837)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 23, 16, 53, 4, 742837)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 23, 16, 53, 4, 742837)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 23, 16, 53, 4, 742837)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 23, 16, 53, 4, 749838)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 23, 16, 53, 4, 749838)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 23, 16, 53, 4, 749838)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 23, 16, 53, 4, 768838)), + ), + ] diff --git a/panel/migrations/0184_auto_20240525_1028.py b/panel/migrations/0184_auto_20240525_1028.py new file mode 100644 index 0000000..24c330c --- /dev/null +++ b/panel/migrations/0184_auto_20240525_1028.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-05-25 10:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0183_auto_20240523_1653'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='authority', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='wagepayment', + name='authority', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 25, 10, 27, 37, 239441)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 25, 10, 27, 36, 795354)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 25, 10, 27, 36, 795354)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 25, 10, 27, 36, 795354)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 25, 10, 27, 36, 795354)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 25, 10, 27, 36, 795354)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 25, 10, 27, 36, 795354)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 25, 10, 27, 36, 795354)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 25, 10, 27, 36, 895690)), + ), + ] diff --git a/panel/migrations/0185_auto_20240528_1234.py b/panel/migrations/0185_auto_20240528_1234.py new file mode 100644 index 0000000..ec32669 --- /dev/null +++ b/panel/migrations/0185_auto_20240528_1234.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-05-28 12:34 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0184_auto_20240525_1028'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='link_pay', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='wagepayment', + name='link_pay', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 28, 12, 34, 14, 606743)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 28, 12, 34, 14, 418746)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 28, 12, 34, 14, 418746)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 28, 12, 34, 14, 418746)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 28, 12, 34, 14, 418746)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 28, 12, 34, 14, 427739)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 28, 12, 34, 14, 427739)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 28, 12, 34, 14, 427739)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 5, 28, 12, 34, 14, 448743)), + ), + ] diff --git a/panel/migrations/0186_auto_20240604_1332.py b/panel/migrations/0186_auto_20240604_1332.py new file mode 100644 index 0000000..84a3511 --- /dev/null +++ b/panel/migrations/0186_auto_20240604_1332.py @@ -0,0 +1,110 @@ +# Generated by Django 3.2.13 on 2024-06-04 13:32 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0185_auto_20240528_1234'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='buyer_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='buyer_name', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='city', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='driver_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='driver_name', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chain_company_allocation_kill_house', to='panel.killhouse'), + ), + migrations.AddField( + model_name='chainallocation', + name='out_province', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='chainallocation', + name='pelak', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='province', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='type_car', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 4, 13, 32, 29, 761792)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 4, 13, 32, 29, 699357)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 4, 13, 32, 29, 699357)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 4, 13, 32, 29, 699357)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 4, 13, 32, 29, 699357)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 4, 13, 32, 29, 699357)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 4, 13, 32, 29, 699357)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 4, 13, 32, 29, 699357)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 4, 13, 32, 29, 714997)), + ), + ] diff --git a/panel/migrations/0187_auto_20240605_1034.py b/panel/migrations/0187_auto_20240605_1034.py new file mode 100644 index 0000000..5db6657 --- /dev/null +++ b/panel/migrations/0187_auto_20240605_1034.py @@ -0,0 +1,134 @@ +# Generated by Django 3.2.13 on 2024-06-05 10:34 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0186_auto_20240604_1332'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='archive_wage', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='poultryrequest', + name='city_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='city_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='company_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='company_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='guilds_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='guilds_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='other_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='other_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='total_wage_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='union_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='union_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='wage', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='wallet_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='wallet_share_percent', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 10, 33, 53, 253165)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 10, 33, 53, 175033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 10, 33, 53, 175033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 10, 33, 53, 175033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 10, 33, 53, 175033)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 10, 33, 53, 190662)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 10, 33, 53, 190662)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 10, 33, 53, 190662)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 10, 33, 53, 190662)), + ), + ] diff --git a/panel/migrations/0188_auto_20240605_1220.py b/panel/migrations/0188_auto_20240605_1220.py new file mode 100644 index 0000000..69b0abd --- /dev/null +++ b/panel/migrations/0188_auto_20240605_1220.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-05 12:20 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0187_auto_20240605_1034'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='wage_pay', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 12, 19, 45, 672712)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 12, 19, 45, 544711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 12, 19, 45, 544711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 12, 19, 45, 544711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 12, 19, 45, 544711)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 12, 19, 45, 552713)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 12, 19, 45, 552713)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 12, 19, 45, 552713)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 12, 19, 45, 569712)), + ), + ] diff --git a/panel/migrations/0189_auto_20240605_1844.py b/panel/migrations/0189_auto_20240605_1844.py new file mode 100644 index 0000000..531592b --- /dev/null +++ b/panel/migrations/0189_auto_20240605_1844.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-05 18:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0188_auto_20240605_1220'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='now_age', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 18, 44, 3, 253313)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 18, 44, 3, 60162)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 18, 44, 3, 60162)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 18, 44, 3, 60162)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 18, 44, 3, 60162)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 18, 44, 3, 68160)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 18, 44, 3, 68160)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 18, 44, 3, 68160)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 5, 18, 44, 3, 85162)), + ), + ] diff --git a/panel/migrations/0190_auto_20240606_1050.py b/panel/migrations/0190_auto_20240606_1050.py new file mode 100644 index 0000000..c6ffc55 --- /dev/null +++ b/panel/migrations/0190_auto_20240606_1050.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-06 10:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0189_auto_20240605_1844'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='index_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 10, 49, 54, 149769)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 10, 49, 54, 4620)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 10, 49, 54, 4620)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 10, 49, 54, 4620)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 10, 49, 54, 4620)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 10, 49, 54, 20263)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 10, 49, 54, 20263)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 10, 49, 54, 20263)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 10, 49, 54, 35892)), + ), + ] diff --git a/panel/migrations/0191_auto_20240606_1122.py b/panel/migrations/0191_auto_20240606_1122.py new file mode 100644 index 0000000..1c43415 --- /dev/null +++ b/panel/migrations/0191_auto_20240606_1122.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-06 11:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0190_auto_20240606_1050'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='seconder', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 11, 22, 17, 675873)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 11, 22, 17, 543869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 11, 22, 17, 543869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 11, 22, 17, 543869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 11, 22, 17, 543869)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 11, 22, 17, 552080)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 11, 22, 17, 551078)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 11, 22, 17, 551078)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 6, 11, 22, 17, 570480)), + ), + ] diff --git a/panel/migrations/0192_auto_20240608_1038.py b/panel/migrations/0192_auto_20240608_1038.py new file mode 100644 index 0000000..6dc39aa --- /dev/null +++ b/panel/migrations/0192_auto_20240608_1038.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2024-06-08 10:38 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0191_auto_20240606_1122'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='poultry_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='internal_transaction_poultry_request', to='panel.poultryrequest'), + ), + migrations.AddField( + model_name='poultryrequest', + name='payer_fullname', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryrequest', + name='payer_type', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 10, 38, 17, 399972)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 10, 38, 17, 337462)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 10, 38, 17, 337462)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 10, 38, 17, 337462)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 10, 38, 17, 337462)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 10, 38, 17, 337462)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 10, 38, 17, 337462)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 10, 38, 17, 337462)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 10, 38, 17, 337462)), + ), + ] diff --git a/panel/migrations/0193_auto_20240608_2310.py b/panel/migrations/0193_auto_20240608_2310.py new file mode 100644 index 0000000..84f7f62 --- /dev/null +++ b/panel/migrations/0193_auto_20240608_2310.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-08 23:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0192_auto_20240608_1038'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='health_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 10, 14, 598287)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 10, 14, 401057)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 10, 14, 401057)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 10, 14, 401057)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 10, 14, 401057)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 10, 14, 410272)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 10, 14, 410272)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 10, 14, 410272)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 10, 14, 429716)), + ), + ] diff --git a/panel/migrations/0194_auto_20240608_2326.py b/panel/migrations/0194_auto_20240608_2326.py new file mode 100644 index 0000000..061837d --- /dev/null +++ b/panel/migrations/0194_auto_20240608_2326.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2024-06-08 23:26 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0193_auto_20240608_2310'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 25, 47, 759054)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 25, 47, 665294)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 25, 47, 665294)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 25, 47, 665294)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 25, 47, 665294)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 25, 47, 665294)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 25, 47, 665294)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 25, 47, 665294)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 8, 23, 25, 47, 680930)), + ), + migrations.CreateModel( + name='TotalPaymentGatewayPercentage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('company', models.IntegerField(default=0)), + ('union', models.IntegerField(default=0)), + ('guilds', models.IntegerField(default=0)), + ('type', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='totalpaymentgatewaypercentage_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='totalpaymentgatewaypercentage_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0195_auto_20240611_0019.py b/panel/migrations/0195_auto_20240611_0019.py new file mode 100644 index 0000000..5538868 --- /dev/null +++ b/panel/migrations/0195_auto_20240611_0019.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-06-11 00:19 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0194_auto_20240608_2326'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='poultry', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='internal_transaction_poultry', to='panel.poultry'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 11, 0, 19, 34, 853496)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 11, 0, 19, 34, 742494)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 11, 0, 19, 34, 742494)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 11, 0, 19, 34, 742494)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 11, 0, 19, 34, 742494)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 11, 0, 19, 34, 746496)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 11, 0, 19, 34, 746496)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 11, 0, 19, 34, 746496)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 11, 0, 19, 34, 760494)), + ), + ] diff --git a/panel/migrations/0196_auto_20240612_0051.py b/panel/migrations/0196_auto_20240612_0051.py new file mode 100644 index 0000000..2a3c6ba --- /dev/null +++ b/panel/migrations/0196_auto_20240612_0051.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2024-06-12 00:51 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0195_auto_20240611_0019'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 0, 50, 51, 343329)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 0, 50, 51, 280826)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 0, 50, 51, 280826)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 0, 50, 51, 280826)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 0, 50, 51, 280826)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 0, 50, 51, 280826)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 0, 50, 51, 280826)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 0, 50, 51, 280826)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 0, 50, 51, 296452)), + ), + migrations.CreateModel( + name='OutProvincePoultryRequestBuyer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('type', models.CharField(max_length=100, null=True)), + ('fullname', models.CharField(max_length=300, null=True)), + ('mobile', models.CharField(max_length=11, null=True)), + ('unit_name', models.CharField(max_length=300, null=True)), + ('city', models.CharField(max_length=300, null=True)), + ('province', models.CharField(max_length=300, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='outprovincepoultryrequestbuyer_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='outprovincepoultryrequestbuyer_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0197_auto_20240612_1118.py b/panel/migrations/0197_auto_20240612_1118.py new file mode 100644 index 0000000..25d008f --- /dev/null +++ b/panel/migrations/0197_auto_20240612_1118.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2024-06-12 11:18 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0196_auto_20240612_0051'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 17, 56, 998321)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 17, 56, 924317)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 17, 56, 924317)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 17, 56, 924317)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 17, 56, 924317)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 17, 56, 929320)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 17, 56, 929320)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 17, 56, 929320)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 17, 56, 938321)), + ), + migrations.CreateModel( + name='StewardFreeSaleBarInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('buyer_name', models.CharField(max_length=100, null=True)), + ('buyer_mobile', models.CharField(max_length=11, null=True)), + ('province', models.CharField(max_length=50, null=True)), + ('city', models.CharField(max_length=50, null=True)), + ('driver_name', models.CharField(max_length=100, null=True)), + ('driver_mobile', models.CharField(max_length=11, null=True)), + ('type_car', models.CharField(max_length=100, null=True)), + ('pelak', models.CharField(max_length=100, null=True)), + ('clearance_code', models.CharField(max_length=50, null=True)), + ('number_of_carcasses', models.BigIntegerField(default=0)), + ('weight_of_carcasses', models.FloatField(default=0)), + ('date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardfreesalebarinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardfreesalebarinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_steward', to='panel.steward')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0198_auto_20240612_1230.py b/panel/migrations/0198_auto_20240612_1230.py new file mode 100644 index 0000000..5e1fabd --- /dev/null +++ b/panel/migrations/0198_auto_20240612_1230.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-06-12 12:30 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0197_auto_20240612_1118'), + ] + + operations = [ + migrations.AddField( + model_name='stewardwarehouse', + name='free_sale_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='stewardwarehouse', + name='free_sale_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 30, 34, 51361)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 30, 33, 988361)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 30, 33, 988361)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 30, 33, 988361)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 30, 33, 988361)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 30, 33, 992361)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 30, 33, 992361)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 30, 33, 992361)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 12, 30, 34, 361)), + ), + ] diff --git a/panel/migrations/0199_auto_20240612_1137.py b/panel/migrations/0199_auto_20240612_1137.py new file mode 100644 index 0000000..12df402 --- /dev/null +++ b/panel/migrations/0199_auto_20240612_1137.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2024-06-12 11:37 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0036_auto_20240612_1137'), + ('panel', '0198_auto_20240612_1230'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 566738)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 516738)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 516738)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 516738)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 516738)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 519737)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 519737)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 519737)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 12, 11, 36, 51, 526737)), + ), + migrations.CreateModel( + name='CityLivestock', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('user_id_foreign_key', models.IntegerField(null=True)), + ('address_id_foreign_key', models.IntegerField(null=True)), + ('user_bank_id_foreign_key', models.IntegerField(null=True)), + ('wallet_id_foreign_key', models.IntegerField(null=True)), + ('city_jahad_id_key', models.IntegerField(null=True)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('city_number', models.IntegerField(default=0)), + ('city_name', models.CharField(max_length=100, null=True)), + ('province_number', models.IntegerField(default=0)), + ('province_name', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_livestock_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='citylivestock_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='citylivestock_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_livestock_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_livestock_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_livestock_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0200_auto_20240613_1037.py b/panel/migrations/0200_auto_20240613_1037.py new file mode 100644 index 0000000..bf59311 --- /dev/null +++ b/panel/migrations/0200_auto_20240613_1037.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-13 10:37 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0199_auto_20240612_1137'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='has_wage', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 36, 54, 702592)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 36, 54, 640085)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 36, 54, 640085)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 36, 54, 640085)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 36, 54, 640085)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 36, 54, 640085)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 36, 54, 640085)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 36, 54, 640085)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 36, 54, 655711)), + ), + ] diff --git a/panel/migrations/0201_auto_20240613_1106.py b/panel/migrations/0201_auto_20240613_1106.py new file mode 100644 index 0000000..de7c6f1 --- /dev/null +++ b/panel/migrations/0201_auto_20240613_1106.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2024-06-13 11:06 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0200_auto_20240613_1037'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='out_province_poultry_request_buyer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_hatching', to='panel.outprovincepoultryrequestbuyer'), + ), + migrations.AddField( + model_name='poultryrequest', + name='sms', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 6, 19, 518278)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 6, 19, 455774)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 6, 19, 455774)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 6, 19, 455774)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 6, 19, 455774)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 6, 19, 471404)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 6, 19, 471404)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 6, 19, 471404)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 6, 19, 471404)), + ), + ] diff --git a/panel/migrations/0202_auto_20240613_1043.py b/panel/migrations/0202_auto_20240613_1043.py new file mode 100644 index 0000000..2296a00 --- /dev/null +++ b/panel/migrations/0202_auto_20240613_1043.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-13 10:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0201_auto_20240613_1106'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='user_gate_way_id', + field=models.CharField(max_length=6, null=True, unique=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 42, 52, 235421)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 42, 52, 183811)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 42, 52, 183811)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 42, 52, 183811)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 42, 52, 183811)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 42, 52, 186810)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 42, 52, 186810)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 42, 52, 186810)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 10, 42, 52, 193809)), + ), + ] diff --git a/panel/migrations/0203_auto_20240613_1101.py b/panel/migrations/0203_auto_20240613_1101.py new file mode 100644 index 0000000..316d268 --- /dev/null +++ b/panel/migrations/0203_auto_20240613_1101.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2024-06-13 11:01 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0038_auto_20240613_1101'), + ('panel', '0202_auto_20240613_1043'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultryrequest', + name='user_gate_way_id', + ), + migrations.AddField( + model_name='outprovincepoultryrequestbuyer', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='out_province_poultry_user', to='authentication.systemuserprofile'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 869432)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 819388)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 819388)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 819388)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 819388)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 822432)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 822432)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 822432)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 13, 11, 1, 44, 829436)), + ), + ] diff --git a/panel/migrations/0204_auto_20240616_0110.py b/panel/migrations/0204_auto_20240616_0110.py new file mode 100644 index 0000000..d7662a9 --- /dev/null +++ b/panel/migrations/0204_auto_20240616_0110.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-06-16 01:10 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0203_auto_20240613_1101'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='out_province_poultry_request_buyer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='internal_transaction_out_province_poultry_request_buyer', to='panel.outprovincepoultryrequestbuyer'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 1, 10, 10, 175278)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 1, 10, 10, 83276)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 1, 10, 10, 82277)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 1, 10, 10, 83276)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 1, 10, 10, 83276)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 1, 10, 10, 87277)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 1, 10, 10, 87277)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 1, 10, 10, 87277)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 1, 10, 10, 100277)), + ), + ] diff --git a/panel/migrations/0205_auto_20240616_0956.py b/panel/migrations/0205_auto_20240616_0956.py new file mode 100644 index 0000000..8e37261 --- /dev/null +++ b/panel/migrations/0205_auto_20240616_0956.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2024-06-16 09:56 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0039_auto_20240616_0956'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0204_auto_20240616_0110'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 832131)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 779621)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 779621)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 779621)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 779621)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 782620)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 782620)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 782620)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 16, 9, 56, 22, 789621)), + ), + migrations.CreateModel( + name='ImprovingLivestock', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='improving_livestock_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='improvinglivestock_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='improvinglivestock_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='improving_livestock_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='improving_livestock_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='improving_livestock_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0206_auto_20240617_1954.py b/panel/migrations/0206_auto_20240617_1954.py new file mode 100644 index 0000000..0856967 --- /dev/null +++ b/panel/migrations/0206_auto_20240617_1954.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-17 19:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0205_auto_20240616_0956'), + ] + + operations = [ + migrations.AddField( + model_name='outprovincepoultryrequestbuyer', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 17, 19, 54, 33, 144088)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 17, 19, 54, 33, 3461)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 17, 19, 54, 33, 3461)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 17, 19, 54, 33, 3461)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 17, 19, 54, 33, 3461)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 17, 19, 54, 33, 3461)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 17, 19, 54, 33, 3461)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 17, 19, 54, 33, 3461)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 17, 19, 54, 33, 34713)), + ), + ] diff --git a/panel/migrations/0207_auto_20240618_1054.py b/panel/migrations/0207_auto_20240618_1054.py new file mode 100644 index 0000000..0ff0085 --- /dev/null +++ b/panel/migrations/0207_auto_20240618_1054.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-18 10:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0206_auto_20240617_1954'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='buyer_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 10, 54, 16, 275707)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 10, 54, 16, 166699)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 10, 54, 16, 166699)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 10, 54, 16, 166699)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 10, 54, 16, 166699)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 10, 54, 16, 174700)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 10, 54, 16, 174700)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 10, 54, 16, 174700)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 10, 54, 16, 192701)), + ), + ] diff --git a/panel/migrations/0208_auto_20240618_1417.py b/panel/migrations/0208_auto_20240618_1417.py new file mode 100644 index 0000000..f52bbef --- /dev/null +++ b/panel/migrations/0208_auto_20240618_1417.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-06-18 14:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0207_auto_20240618_1054'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='buyer_city', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryrequest', + name='buyer_fullname', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryrequest', + name='buyer_province', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 17, 24, 55435)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 17, 23, 915434)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 17, 23, 915434)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 17, 23, 915434)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 17, 23, 915434)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 17, 23, 924431)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 17, 23, 924431)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 17, 23, 924431)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 17, 23, 944435)), + ), + ] diff --git a/panel/migrations/0209_auto_20240618_1451.py b/panel/migrations/0209_auto_20240618_1451.py new file mode 100644 index 0000000..71bda8c --- /dev/null +++ b/panel/migrations/0209_auto_20240618_1451.py @@ -0,0 +1,66 @@ +# Generated by Django 3.2.13 on 2024-06-18 14:51 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0040_auto_20240618_1451'), + ('panel', '0208_auto_20240618_1417'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='internal_transaction_user', to='authentication.systemuserprofile'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 397388)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 273396)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 273396)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 273396)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 273396)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 280392)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 280392)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 280392)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 18, 14, 51, 39, 306388)), + ), + ] diff --git a/panel/migrations/0210_auto_20240619_1119.py b/panel/migrations/0210_auto_20240619_1119.py new file mode 100644 index 0000000..f318624 --- /dev/null +++ b/panel/migrations/0210_auto_20240619_1119.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2024-06-19 11:19 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0209_auto_20240618_1451'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='company_name', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='company_user_city', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='company_user_fullname', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='company_user_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='company_user_province', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='chainallocation', + name='registerer', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 11, 19, 41, 420635)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 11, 19, 41, 355638)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 11, 19, 41, 355638)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 11, 19, 41, 355638)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 11, 19, 41, 355638)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 11, 19, 41, 358637)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 11, 19, 41, 358637)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 11, 19, 41, 358637)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 11, 19, 41, 368637)), + ), + ] diff --git a/panel/migrations/0211_auto_20240619_1701.py b/panel/migrations/0211_auto_20240619_1701.py new file mode 100644 index 0000000..21de9f8 --- /dev/null +++ b/panel/migrations/0211_auto_20240619_1701.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-19 17:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0210_auto_20240619_1119'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='agent', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 17, 0, 55, 811933)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 17, 0, 55, 745933)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 17, 0, 55, 745933)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 17, 0, 55, 745933)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 17, 0, 55, 745933)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 17, 0, 55, 749935)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 17, 0, 55, 749935)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 17, 0, 55, 749935)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 19, 17, 0, 55, 759933)), + ), + ] diff --git a/panel/migrations/0212_auto_20240620_1006.py b/panel/migrations/0212_auto_20240620_1006.py new file mode 100644 index 0000000..3988da1 --- /dev/null +++ b/panel/migrations/0212_auto_20240620_1006.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-20 10:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0211_auto_20240619_1701'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='hatching_left_over', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 20, 10, 6, 45, 228875)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 20, 10, 6, 45, 41944)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 20, 10, 6, 45, 41944)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 20, 10, 6, 45, 41944)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 20, 10, 6, 45, 41944)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 20, 10, 6, 45, 50163)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 20, 10, 6, 45, 50163)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 20, 10, 6, 45, 50163)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 20, 10, 6, 45, 74704)), + ), + ] diff --git a/panel/migrations/0213_auto_20240622_1055.py b/panel/migrations/0213_auto_20240622_1055.py new file mode 100644 index 0000000..44787fe --- /dev/null +++ b/panel/migrations/0213_auto_20240622_1055.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-06-22 10:55 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0212_auto_20240620_1006'), + ] + + operations = [ + migrations.AddField( + model_name='outprovincepoultryrequestbuyer', + name='killer_kill_house_city', + field=models.CharField(max_length=300, null=True), + ), + migrations.AddField( + model_name='outprovincepoultryrequestbuyer', + name='killer_kill_house_province', + field=models.CharField(max_length=300, null=True), + ), + migrations.AddField( + model_name='outprovincepoultryrequestbuyer', + name='killer_kill_house_unit_name', + field=models.CharField(max_length=300, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 10, 54, 57, 940701)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 10, 54, 57, 772694)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 10, 54, 57, 772694)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 10, 54, 57, 772694)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 10, 54, 57, 772694)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 10, 54, 57, 779698)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 10, 54, 57, 779698)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 10, 54, 57, 779698)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 10, 54, 57, 797695)), + ), + ] diff --git a/panel/migrations/0214_auto_20240622_1153.py b/panel/migrations/0214_auto_20240622_1153.py new file mode 100644 index 0000000..ecb089f --- /dev/null +++ b/panel/migrations/0214_auto_20240622_1153.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-06-22 11:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0213_auto_20240622_1055'), + ] + + operations = [ + migrations.AddField( + model_name='outprovincepoultryrequestbuyer', + name='kill_house_unique_id', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='outprovincepoultryrequestbuyer', + name='killer_kill_house_unique_id', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 53, 13, 795929)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 53, 13, 694930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 53, 13, 694930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 53, 13, 694930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 53, 13, 694930)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 53, 13, 713939)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 53, 13, 713939)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 53, 13, 713939)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 53, 13, 736932)), + ), + ] diff --git a/panel/migrations/0215_auto_20240622_1158.py b/panel/migrations/0215_auto_20240622_1158.py new file mode 100644 index 0000000..1ebcd23 --- /dev/null +++ b/panel/migrations/0215_auto_20240622_1158.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-06-22 11:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0214_auto_20240622_1153'), + ] + + operations = [ + migrations.RemoveField( + model_name='outprovincepoultryrequestbuyer', + name='killer_kill_house_unique_id', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 58, 29, 282646)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 58, 29, 69649)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 58, 29, 68649)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 58, 29, 69649)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 58, 29, 69649)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 58, 29, 78648)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 58, 29, 77647)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 58, 29, 77647)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 11, 58, 29, 99648)), + ), + ] diff --git a/panel/migrations/0216_auto_20240622_1229.py b/panel/migrations/0216_auto_20240622_1229.py new file mode 100644 index 0000000..b6fbd70 --- /dev/null +++ b/panel/migrations/0216_auto_20240622_1229.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2024-06-22 12:29 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0215_auto_20240622_1158'), + ] + + operations = [ + migrations.RemoveField( + model_name='outprovincepoultryrequestbuyer', + name='killer_kill_house_city', + ), + migrations.RemoveField( + model_name='outprovincepoultryrequestbuyer', + name='killer_kill_house_province', + ), + migrations.RemoveField( + model_name='outprovincepoultryrequestbuyer', + name='killer_kill_house_unit_name', + ), + migrations.AddField( + model_name='poultryrequest', + name='kill_house_unique_id', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='poultryrequest', + name='killer_kill_house_city', + field=models.CharField(max_length=300, null=True), + ), + migrations.AddField( + model_name='poultryrequest', + name='killer_kill_house_province', + field=models.CharField(max_length=300, null=True), + ), + migrations.AddField( + model_name='poultryrequest', + name='killer_kill_house_unit_name', + field=models.CharField(max_length=300, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 12, 29, 40, 296176)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 12, 29, 40, 96175)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 12, 29, 40, 96175)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 12, 29, 40, 96175)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 12, 29, 40, 96175)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 12, 29, 40, 104176)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 12, 29, 40, 104176)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 12, 29, 40, 104176)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 12, 29, 40, 127173)), + ), + ] diff --git a/panel/migrations/0217_auto_20240622_1622.py b/panel/migrations/0217_auto_20240622_1622.py new file mode 100644 index 0000000..7e098f8 --- /dev/null +++ b/panel/migrations/0217_auto_20240622_1622.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-22 16:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0216_auto_20240622_1229'), + ] + + operations = [ + migrations.AddField( + model_name='killhousepurchaserequest', + name='total_limitation', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 16, 22, 18, 629905)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 16, 22, 18, 515909)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 16, 22, 18, 515909)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 16, 22, 18, 515909)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 16, 22, 18, 515909)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 16, 22, 18, 523909)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 16, 22, 18, 523909)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 16, 22, 18, 523909)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 22, 16, 22, 18, 542910)), + ), + ] diff --git a/panel/migrations/0218_auto_20240624_1409.py b/panel/migrations/0218_auto_20240624_1409.py new file mode 100644 index 0000000..151022e --- /dev/null +++ b/panel/migrations/0218_auto_20240624_1409.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-24 14:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0217_auto_20240622_1622'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='document_status', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 24, 14, 9, 28, 772796)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 24, 14, 9, 28, 702798)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 24, 14, 9, 28, 702798)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 24, 14, 9, 28, 702798)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 24, 14, 9, 28, 702798)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 24, 14, 9, 28, 706798)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 24, 14, 9, 28, 706798)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 24, 14, 9, 28, 706798)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 24, 14, 9, 28, 715798)), + ), + ] diff --git a/panel/migrations/0219_auto_20240629_1100.py b/panel/migrations/0219_auto_20240629_1100.py new file mode 100644 index 0000000..0ec5ad9 --- /dev/null +++ b/panel/migrations/0219_auto_20240629_1100.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-29 11:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0218_auto_20240624_1409'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='date_of_ware_house', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 0, 17, 534483)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 0, 17, 468478)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 0, 17, 468478)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 0, 17, 468478)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 0, 17, 468478)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 0, 17, 472480)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 0, 17, 472480)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 0, 17, 472480)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 0, 17, 481481)), + ), + ] diff --git a/panel/migrations/0220_auto_20240629_1118.py b/panel/migrations/0220_auto_20240629_1118.py new file mode 100644 index 0000000..428d3cb --- /dev/null +++ b/panel/migrations/0220_auto_20240629_1118.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2024-06-29 11:18 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0219_auto_20240629_1100'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 18, 15, 962134)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 18, 15, 868132)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 18, 15, 868132)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 18, 15, 868132)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 18, 15, 868132)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 18, 15, 874136)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 18, 15, 874136)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 18, 15, 874136)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 18, 15, 888133)), + ), + migrations.CreateModel( + name='BarDocumentStatus', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(max_length=500, null=True)), + ('sms', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bardocumentstatus_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bardocumentstatus_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0221_auto_20240629_1150.py b/panel/migrations/0221_auto_20240629_1150.py new file mode 100644 index 0000000..f0862f5 --- /dev/null +++ b/panel/migrations/0221_auto_20240629_1150.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2024-06-29 11:50 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0220_auto_20240629_1118'), + ] + + operations = [ + migrations.AddField( + model_name='bardocumentstatus', + name='is_error', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouserequest', + name='bar_document_status', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_request_bar_document_status', to='panel.bardocumentstatus'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 49, 46, 237978)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 49, 46, 74977)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 49, 46, 74977)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 49, 46, 74977)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 49, 46, 74977)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 49, 46, 82980)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 49, 46, 82980)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 49, 46, 82980)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 29, 11, 49, 46, 103976)), + ), + ] diff --git a/panel/migrations/0222_auto_20240630_1147.py b/panel/migrations/0222_auto_20240630_1147.py new file mode 100644 index 0000000..06ed3d4 --- /dev/null +++ b/panel/migrations/0222_auto_20240630_1147.py @@ -0,0 +1,117 @@ +# Generated by Django 3.2.13 on 2024-06-30 11:47 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0221_auto_20240629_1150'), + ] + + operations = [ + migrations.CreateModel( + name='Reports', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(max_length=500, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reports_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reports_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ReportsUsers', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=True)), + ('firstname', models.CharField(max_length=100, null=True)), + ('lastname', models.CharField(max_length=100, null=True)), + ('mobile', models.CharField(max_length=11, null=True)), + ('post', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reportsusers_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reportsusers_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 47, 32, 635688)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 47, 32, 573181)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 47, 32, 573181)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 47, 32, 573181)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 47, 32, 573181)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 47, 32, 573181)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 47, 32, 573181)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 47, 32, 573181)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 47, 32, 588807)), + ), + migrations.CreateModel( + name='UserReports', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='userreports_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='userreports_modifiedby', to=settings.AUTH_USER_MODEL)), + ('report', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='report_user_reports', to='panel.reports')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_reports_user', to='panel.reportsusers')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0223_auto_20240630_1148.py b/panel/migrations/0223_auto_20240630_1148.py new file mode 100644 index 0000000..a40b332 --- /dev/null +++ b/panel/migrations/0223_auto_20240630_1148.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-30 11:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0222_auto_20240630_1147'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 48, 22, 759623)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 48, 22, 650026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 48, 22, 650026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 48, 22, 650026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 48, 22, 650026)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 48, 22, 665644)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 48, 22, 665644)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 48, 22, 665644)), + ), + migrations.AlterField( + model_name='reportsusers', + name='post', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 11, 48, 22, 681276)), + ), + ] diff --git a/panel/migrations/0224_auto_20240630_1351.py b/panel/migrations/0224_auto_20240630_1351.py new file mode 100644 index 0000000..75bd157 --- /dev/null +++ b/panel/migrations/0224_auto_20240630_1351.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2024-06-30 13:51 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0223_auto_20240630_1148'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 13, 51, 47, 137894)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 13, 51, 47, 75384)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 13, 51, 47, 75384)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 13, 51, 47, 75384)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 13, 51, 47, 75384)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 13, 51, 47, 75384)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 13, 51, 47, 75384)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 13, 51, 47, 75384)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 13, 51, 47, 91010)), + ), + migrations.CreateModel( + name='ReportSubmissionTime', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('type', models.CharField(max_length=100, null=True)), + ('hour', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reportsubmissiontime_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reportsubmissiontime_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0225_auto_20240630_1443.py b/panel/migrations/0225_auto_20240630_1443.py new file mode 100644 index 0000000..ecc59b7 --- /dev/null +++ b/panel/migrations/0225_auto_20240630_1443.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-06-30 14:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0224_auto_20240630_1351'), + ] + + operations = [ + migrations.AddField( + model_name='reports', + name='active', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 14, 43, 1, 530443)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 14, 43, 1, 421065)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 14, 43, 1, 421065)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 14, 43, 1, 421065)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 14, 43, 1, 421065)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 14, 43, 1, 421065)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 14, 43, 1, 421065)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 14, 43, 1, 421065)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 6, 30, 14, 43, 1, 436691)), + ), + ] diff --git a/panel/migrations/0226_auto_20240701_1553.py b/panel/migrations/0226_auto_20240701_1553.py new file mode 100644 index 0000000..ec14463 --- /dev/null +++ b/panel/migrations/0226_auto_20240701_1553.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-01 15:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0225_auto_20240630_1443'), + ] + + operations = [ + migrations.AddField( + model_name='bardocumentstatus', + name='priority_id', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 1, 15, 53, 5, 184071)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 1, 15, 53, 5, 14072)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 1, 15, 53, 5, 14072)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 1, 15, 53, 5, 14072)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 1, 15, 53, 5, 14072)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 1, 15, 53, 5, 23070)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 1, 15, 53, 5, 23070)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 1, 15, 53, 5, 23070)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 1, 15, 53, 5, 47067)), + ), + ] diff --git a/panel/migrations/0227_auto_20240702_1406.py b/panel/migrations/0227_auto_20240702_1406.py new file mode 100644 index 0000000..744e810 --- /dev/null +++ b/panel/migrations/0227_auto_20240702_1406.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-07-02 14:06 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0226_auto_20240701_1553'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 6, 24, 744294)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 6, 24, 614783)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 6, 24, 614783)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 6, 24, 614783)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 6, 24, 614783)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 6, 24, 624909)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 6, 24, 624909)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 6, 24, 624909)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 6, 24, 645149)), + ), + migrations.CreateModel( + name='UserPosition', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(max_length=500, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='userposition_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='userposition_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0228_auto_20240702_1417.py b/panel/migrations/0228_auto_20240702_1417.py new file mode 100644 index 0000000..44f3f34 --- /dev/null +++ b/panel/migrations/0228_auto_20240702_1417.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-07-02 14:17 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0227_auto_20240702_1406'), + ] + + operations = [ + migrations.RemoveField( + model_name='reportsusers', + name='post', + ), + migrations.AddField( + model_name='reportsusers', + name='user_position', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reports_user_positon', to='panel.userposition'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 17, 29, 507043)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 17, 27, 737269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 17, 27, 737269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 17, 27, 737269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 17, 27, 737269)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 17, 27, 745332)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 17, 27, 745332)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 17, 27, 745332)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 14, 17, 27, 899346)), + ), + ] diff --git a/panel/migrations/0229_auto_20240702_1510.py b/panel/migrations/0229_auto_20240702_1510.py new file mode 100644 index 0000000..a675d7d --- /dev/null +++ b/panel/migrations/0229_auto_20240702_1510.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-02 15:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0228_auto_20240702_1417'), + ] + + operations = [ + migrations.AddField( + model_name='reportsusers', + name='city', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 15, 10, 18, 152825)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 15, 10, 17, 941822)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 15, 10, 17, 941822)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 15, 10, 17, 941822)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 15, 10, 17, 941822)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 15, 10, 17, 947821)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 15, 10, 17, 947821)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 15, 10, 17, 947821)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 2, 15, 10, 17, 965823)), + ), + ] diff --git a/panel/migrations/0230_auto_20240703_0926.py b/panel/migrations/0230_auto_20240703_0926.py new file mode 100644 index 0000000..0ee4355 --- /dev/null +++ b/panel/migrations/0230_auto_20240703_0926.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-03 09:26 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0229_auto_20240702_1510'), + ] + + operations = [ + migrations.AddField( + model_name='reportsusers', + name='user_token', + field=models.CharField(max_length=4, null=True, unique=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 9, 26, 31, 703980)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 9, 26, 31, 652978)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 9, 26, 31, 652978)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 9, 26, 31, 652978)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 9, 26, 31, 652978)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 9, 26, 31, 655979)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 9, 26, 31, 655979)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 9, 26, 31, 655979)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 9, 26, 31, 662979)), + ), + ] diff --git a/panel/migrations/0231_auto_20240703_1036.py b/panel/migrations/0231_auto_20240703_1036.py new file mode 100644 index 0000000..e427d28 --- /dev/null +++ b/panel/migrations/0231_auto_20240703_1036.py @@ -0,0 +1,71 @@ +# Generated by Django 3.2.13 on 2024-07-03 10:36 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0230_auto_20240703_0926'), + ] + + operations = [ + migrations.RemoveField( + model_name='reportsusers', + name='user_position', + ), + migrations.AddField( + model_name='reportsusers', + name='position', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 10, 36, 0, 64385)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 10, 35, 59, 906214)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 10, 35, 59, 906214)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 10, 35, 59, 906214)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 10, 35, 59, 906214)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 10, 35, 59, 906214)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 10, 35, 59, 906214)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 10, 35, 59, 906214)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 10, 35, 59, 923757)), + ), + migrations.DeleteModel( + name='UserPosition', + ), + ] diff --git a/panel/migrations/0232_auto_20240703_1101.py b/panel/migrations/0232_auto_20240703_1101.py new file mode 100644 index 0000000..c0076e0 --- /dev/null +++ b/panel/migrations/0232_auto_20240703_1101.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-03 11:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0231_auto_20240703_1036'), + ] + + operations = [ + migrations.AddField( + model_name='reports', + name='description', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 11, 1, 32, 685451)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 11, 1, 32, 544823)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 11, 1, 32, 544823)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 11, 1, 32, 544823)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 11, 1, 32, 544823)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 11, 1, 32, 544823)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 11, 1, 32, 544823)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 11, 1, 32, 544823)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 11, 1, 32, 576077)), + ), + ] diff --git a/panel/migrations/0233_auto_20240703_1419.py b/panel/migrations/0233_auto_20240703_1419.py new file mode 100644 index 0000000..2ea1160 --- /dev/null +++ b/panel/migrations/0233_auto_20240703_1419.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-03 14:19 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0232_auto_20240703_1101'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='description', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 14, 19, 5, 527305)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 14, 19, 5, 24303)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 14, 19, 5, 24303)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 14, 19, 5, 24303)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 14, 19, 5, 24303)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 14, 19, 5, 78302)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 14, 19, 5, 78302)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 14, 19, 5, 78302)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 14, 19, 5, 98301)), + ), + ] diff --git a/panel/migrations/0234_auto_20240703_1555.py b/panel/migrations/0234_auto_20240703_1555.py new file mode 100644 index 0000000..b70be61 --- /dev/null +++ b/panel/migrations/0234_auto_20240703_1555.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-07-03 15:55 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0233_auto_20240703_1419'), + ] + + operations = [ + migrations.AddField( + model_name='reports', + name='end_point', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='reportsusers', + name='fullname', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 15, 54, 50, 211682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 15, 54, 49, 162685)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 15, 54, 49, 162685)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 15, 54, 49, 162685)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 15, 54, 49, 162685)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 15, 54, 49, 170683)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 15, 54, 49, 170683)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 15, 54, 49, 170683)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 3, 15, 54, 49, 199681)), + ), + ] diff --git a/panel/migrations/0235_auto_20240706_1424.py b/panel/migrations/0235_auto_20240706_1424.py new file mode 100644 index 0000000..d050bfc --- /dev/null +++ b/panel/migrations/0235_auto_20240706_1424.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2024-07-06 14:24 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0234_auto_20240703_1555'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 14, 24, 21, 526892)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 14, 24, 21, 323890)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 14, 24, 21, 323890)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 14, 24, 21, 323890)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 14, 24, 21, 323890)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 14, 24, 21, 364892)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 14, 24, 21, 363893)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 14, 24, 21, 363893)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 14, 24, 21, 385896)), + ), + migrations.CreateModel( + name='MovingText', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('moving_text', models.TextField(null=True)), + ('role', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='movingtext_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='movingtext_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0236_auto_20240706_1520.py b/panel/migrations/0236_auto_20240706_1520.py new file mode 100644 index 0000000..b90487c --- /dev/null +++ b/panel/migrations/0236_auto_20240706_1520.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-06 15:20 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0235_auto_20240706_1424'), + ] + + operations = [ + migrations.AddField( + model_name='movingtext', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 15, 20, 22, 872489)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 15, 20, 22, 734489)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 15, 20, 22, 734489)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 15, 20, 22, 734489)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 15, 20, 22, 734489)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 15, 20, 22, 742489)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 15, 20, 22, 742489)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 15, 20, 22, 742489)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 15, 20, 22, 763489)), + ), + ] diff --git a/panel/migrations/0237_auto_20240706_1652.py b/panel/migrations/0237_auto_20240706_1652.py new file mode 100644 index 0000000..17ee1a2 --- /dev/null +++ b/panel/migrations/0237_auto_20240706_1652.py @@ -0,0 +1,117 @@ +# Generated by Django 3.2.13 on 2024-07-06 16:52 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0236_auto_20240706_1520'), + ] + + operations = [ + migrations.CreateModel( + name='MovingTextRole', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('role', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='movingtextrole_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='movingtextrole_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.RemoveField( + model_name='movingtext', + name='role', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 16, 52, 2, 514005)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 16, 52, 2, 368004)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 16, 52, 2, 368004)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 16, 52, 2, 368004)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 16, 52, 2, 368004)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 16, 52, 2, 376006)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 16, 52, 2, 376006)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 16, 52, 2, 376006)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 6, 16, 52, 2, 397006)), + ), + migrations.CreateModel( + name='MovingTextWithRole', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='movingtextwithrole_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='movingtextwithrole_modifiedby', to=settings.AUTH_USER_MODEL)), + ('moving_text', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='role_moving_text', to='panel.movingtext')), + ('role', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='moving_text_role', to='panel.movingtextrole')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='MovingTextDashboardStatus', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='movingtextdashboardstatus_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='movingtextdashboardstatus_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0238_auto_20240707_1153.py b/panel/migrations/0238_auto_20240707_1153.py new file mode 100644 index 0000000..a0afa73 --- /dev/null +++ b/panel/migrations/0238_auto_20240707_1153.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-07 11:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0237_auto_20240706_1652'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 7, 11, 53, 30, 483179)), + ), + migrations.AlterField( + model_name='movingtextwithrole', + name='active', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 7, 11, 53, 30, 350187)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 7, 11, 53, 30, 350187)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 7, 11, 53, 30, 350187)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 7, 11, 53, 30, 350187)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 7, 11, 53, 30, 360187)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 7, 11, 53, 30, 359187)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 7, 11, 53, 30, 359187)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 7, 11, 53, 30, 379184)), + ), + ] diff --git a/panel/migrations/0239_auto_20240708_1341.py b/panel/migrations/0239_auto_20240708_1341.py new file mode 100644 index 0000000..1fe5a8c --- /dev/null +++ b/panel/migrations/0239_auto_20240708_1341.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2024-07-08 13:41 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0238_auto_20240707_1153'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 8, 13, 41, 32, 171191)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 8, 13, 41, 32, 8192)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 8, 13, 41, 32, 7194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 8, 13, 41, 32, 7194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 8, 13, 41, 32, 7194)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 8, 13, 41, 32, 16192)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 8, 13, 41, 32, 16192)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 8, 13, 41, 32, 16192)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 8, 13, 41, 32, 37191)), + ), + migrations.CreateModel( + name='NewProduct', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=300, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='newproduct_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='newproduct_modifiedby', to=settings.AUTH_USER_MODEL)), + ('parent', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='child', to='panel.newproduct')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0240_auto_20240709_1204.py b/panel/migrations/0240_auto_20240709_1204.py new file mode 100644 index 0000000..a2f17ca --- /dev/null +++ b/panel/migrations/0240_auto_20240709_1204.py @@ -0,0 +1,159 @@ +# Generated by Django 3.2.13 on 2024-07-09 12:04 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0239_auto_20240708_1341'), + ] + + operations = [ + migrations.AddField( + model_name='newproduct', + name='Conventional_sales_package', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='newproduct', + name='Conventional_sales_status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='newproduct', + name='Conventional_sales_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='newproduct', + name='approved_price', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='newproduct', + name='approved_price_status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='newproduct', + name='product_id', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_maximum_inquiry_status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_maximum_inquiry_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_maximum_number_of_purchases', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_maximum_number_of_purchases_status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_maximum_number_of_purchases_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_maximum_package', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_maximum_package_status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_maximum_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_maximum_weight_status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='newproduct', + name='sale_limitation_status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='newproduct', + name='sale_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='newproduct', + name='sale_type_package_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='newproduct', + name='selling_more_than_inventory', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 9, 12, 4, 7, 449050)), + ), + migrations.AlterField( + model_name='newproduct', + name='name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 9, 12, 4, 7, 379045)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 9, 12, 4, 7, 379045)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 9, 12, 4, 7, 379045)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 9, 12, 4, 7, 379045)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 9, 12, 4, 7, 383047)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 9, 12, 4, 7, 383047)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 9, 12, 4, 7, 383047)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 9, 12, 4, 7, 393048)), + ), + ] diff --git a/panel/migrations/0241_auto_20240710_1333.py b/panel/migrations/0241_auto_20240710_1333.py new file mode 100644 index 0000000..562670e --- /dev/null +++ b/panel/migrations/0241_auto_20240710_1333.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-07-10 13:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0240_auto_20240709_1204'), + ] + + operations = [ + migrations.AddField( + model_name='paymentgatewaypercentage', + name='other', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='totalpaymentgatewaypercentage', + name='other', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 10, 13, 33, 29, 589941)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 10, 13, 33, 29, 441526)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 10, 13, 33, 29, 441526)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 10, 13, 33, 29, 441526)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 10, 13, 33, 29, 441526)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 10, 13, 33, 29, 450526)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 10, 13, 33, 29, 449524)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 10, 13, 33, 29, 449524)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 10, 13, 33, 29, 470525)), + ), + ] diff --git a/panel/migrations/0242_auto_20240713_0951.py b/panel/migrations/0242_auto_20240713_0951.py new file mode 100644 index 0000000..bead2de --- /dev/null +++ b/panel/migrations/0242_auto_20240713_0951.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2024-07-13 09:51 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0041_auto_20240713_0951'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0241_auto_20240710_1333'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 133959)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 81957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 81957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 81957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 81957)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 85956)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 84956)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 84956)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 9, 51, 8, 92960)), + ), + migrations.CreateModel( + name='AdminX', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_x_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='adminx_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='adminx_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_x_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_x_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_x_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0243_auto_20240713_1024.py b/panel/migrations/0243_auto_20240713_1024.py new file mode 100644 index 0000000..c06703c --- /dev/null +++ b/panel/migrations/0243_auto_20240713_1024.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2024-07-13 10:24 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0042_auto_20240713_1024'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0242_auto_20240713_0951'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 764775)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 708803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 708803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 708803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 708803)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 712776)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 712776)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 712776)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 10, 24, 12, 719803)), + ), + migrations.CreateModel( + name='Supporter', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supporter_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supporter_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supporter_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supporter_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supporter_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supporter_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0244_auto_20240713_1139.py b/panel/migrations/0244_auto_20240713_1139.py new file mode 100644 index 0000000..f777a86 --- /dev/null +++ b/panel/migrations/0244_auto_20240713_1139.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2024-07-13 11:39 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0243_auto_20240713_1024'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 39, 27, 212960)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 39, 27, 57951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 39, 27, 57951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 39, 27, 57951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 39, 27, 57951)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 39, 27, 62957)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 39, 27, 62957)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 39, 27, 62957)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 11, 39, 27, 83955)), + ), + migrations.CreateModel( + name='ZarinPalAccounts', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('account', models.CharField(max_length=50, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='zarinpalaccounts_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='zarinpalaccounts_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0245_auto_20240713_1236.py b/panel/migrations/0245_auto_20240713_1236.py new file mode 100644 index 0000000..0f49959 --- /dev/null +++ b/panel/migrations/0245_auto_20240713_1236.py @@ -0,0 +1,87 @@ +# Generated by Django 3.2.13 on 2024-07-13 12:36 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0244_auto_20240713_1139'), + ] + + operations = [ + migrations.RemoveField( + model_name='zarinpalaccounts', + name='account', + ), + migrations.RemoveField( + model_name='zarinpalaccounts', + name='name', + ), + migrations.AddField( + model_name='zarinpalaccounts', + name='company_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='zarinpalaccounts', + name='guild_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='zarinpalaccounts', + name='other_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='zarinpalaccounts', + name='union_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 36, 27, 138847)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 36, 27, 75847)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 36, 27, 75847)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 36, 27, 75847)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 36, 27, 75847)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 36, 27, 79847)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 36, 27, 79847)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 36, 27, 79847)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 36, 27, 88846)), + ), + ] diff --git a/panel/migrations/0246_auto_20240713_1250.py b/panel/migrations/0246_auto_20240713_1250.py new file mode 100644 index 0000000..73686d0 --- /dev/null +++ b/panel/migrations/0246_auto_20240713_1250.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2024-07-13 12:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0245_auto_20240713_1236'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='city_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='internaltransaction', + name='company_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='internaltransaction', + name='guilds_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='internaltransaction', + name='other_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='internaltransaction', + name='union_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='internaltransaction', + name='wallet_account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 50, 36, 332084)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 50, 36, 264081)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 50, 36, 264081)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 50, 36, 264081)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 50, 36, 264081)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 50, 36, 269084)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 50, 36, 269084)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 50, 36, 269084)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 12, 50, 36, 279081)), + ), + ] diff --git a/panel/migrations/0247_auto_20240713_1516.py b/panel/migrations/0247_auto_20240713_1516.py new file mode 100644 index 0000000..cd9729b --- /dev/null +++ b/panel/migrations/0247_auto_20240713_1516.py @@ -0,0 +1,90 @@ +# Generated by Django 3.2.13 on 2024-07-13 15:16 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0246_auto_20240713_1250'), + ] + + operations = [ + migrations.RemoveField( + model_name='zarinpalaccounts', + name='company_account', + ), + migrations.RemoveField( + model_name='zarinpalaccounts', + name='guild_account', + ), + migrations.RemoveField( + model_name='zarinpalaccounts', + name='other_account', + ), + migrations.RemoveField( + model_name='zarinpalaccounts', + name='union_account', + ), + migrations.AddField( + model_name='zarinpalaccounts', + name='account', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='zarinpalaccounts', + name='en_name', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='zarinpalaccounts', + name='name', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 15, 15, 22, 339101)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 15, 15, 21, 929104)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 15, 15, 21, 929104)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 15, 15, 21, 929104)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 15, 15, 21, 929104)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 15, 15, 21, 938105)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 15, 15, 21, 938105)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 15, 15, 21, 938105)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 13, 15, 15, 21, 958101)), + ), + ] diff --git a/panel/migrations/0248_auto_20240717_1145.py b/panel/migrations/0248_auto_20240717_1145.py new file mode 100644 index 0000000..4c69736 --- /dev/null +++ b/panel/migrations/0248_auto_20240717_1145.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-07-17 11:45 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0247_auto_20240713_1516'), + ] + + operations = [ + migrations.AddField( + model_name='provinceallowkillhousedirectbuying', + name='export_status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provinceallowkillhousedirectbuying', + name='freezing_status', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 11, 45, 14, 130480)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 11, 45, 14, 67974)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 11, 45, 14, 67974)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 11, 45, 14, 67974)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 11, 45, 14, 67974)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 11, 45, 14, 67974)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 11, 45, 14, 67974)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 11, 45, 14, 67974)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 11, 45, 14, 67974)), + ), + ] diff --git a/panel/migrations/0249_auto_20240717_1208.py b/panel/migrations/0249_auto_20240717_1208.py new file mode 100644 index 0000000..b362584 --- /dev/null +++ b/panel/migrations/0249_auto_20240717_1208.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2024-07-17 12:08 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0248_auto_20240717_1145'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='export_killed_quantity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='export_killed_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='export', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 12, 8, 33, 106662)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 12, 8, 32, 984960)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 12, 8, 32, 984960)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 12, 8, 32, 984960)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 12, 8, 32, 984960)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 12, 8, 32, 995117)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 12, 8, 32, 995117)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 12, 8, 32, 995117)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 12, 8, 33, 15381)), + ), + migrations.CreateModel( + name='PoultryExport', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryexport_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryexport_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0250_auto_20240717_1306.py b/panel/migrations/0250_auto_20240717_1306.py new file mode 100644 index 0000000..1bcffe8 --- /dev/null +++ b/panel/migrations/0250_auto_20240717_1306.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-07-17 13:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0249_auto_20240717_1208'), + ] + + operations = [ + migrations.AddField( + model_name='poultryexport', + name='limitation', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryexport', + name='limitation_status', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 6, 33, 529378)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 6, 33, 375616)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 6, 33, 375616)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 6, 33, 375616)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 6, 33, 375616)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 6, 33, 384808)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 6, 33, 384808)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 6, 33, 384808)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 6, 33, 406114)), + ), + ] diff --git a/panel/migrations/0251_auto_20240717_1332.py b/panel/migrations/0251_auto_20240717_1332.py new file mode 100644 index 0000000..208e52f --- /dev/null +++ b/panel/migrations/0251_auto_20240717_1332.py @@ -0,0 +1,81 @@ +# Generated by Django 3.2.13 on 2024-07-17 13:32 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0250_auto_20240717_1306'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 32, 40, 474937)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 32, 40, 333193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 32, 40, 333193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 32, 40, 333193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 32, 40, 333193)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 32, 40, 343297)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 32, 40, 343297)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 32, 40, 343297)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 32, 40, 363570)), + ), + migrations.CreateModel( + name='PoultryOutProvinceRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('limitation_status', models.BooleanField(default=False)), + ('limitation', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryoutprovincerequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryoutprovincerequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0252_auto_20240717_1350.py b/panel/migrations/0252_auto_20240717_1350.py new file mode 100644 index 0000000..8c9e524 --- /dev/null +++ b/panel/migrations/0252_auto_20240717_1350.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-17 13:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0251_auto_20240717_1332'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='export_status', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 50, 34, 859679)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 50, 34, 674747)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 50, 34, 674747)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 50, 34, 674747)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 50, 34, 674747)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 50, 34, 683745)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 50, 34, 683745)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 50, 34, 683745)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 17, 13, 50, 34, 705748)), + ), + ] diff --git a/panel/migrations/0253_auto_20240718_1206.py b/panel/migrations/0253_auto_20240718_1206.py new file mode 100644 index 0000000..f7dcece --- /dev/null +++ b/panel/migrations/0253_auto_20240718_1206.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-18 12:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0252_auto_20240717_1350'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='export_country', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 12, 6, 7, 490715)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 12, 6, 7, 426711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 12, 6, 7, 426711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 12, 6, 7, 426711)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 12, 6, 7, 426711)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 12, 6, 7, 430711)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 12, 6, 7, 430711)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 12, 6, 7, 430711)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 12, 6, 7, 439711)), + ), + ] diff --git a/panel/migrations/0254_auto_20240718_1303.py b/panel/migrations/0254_auto_20240718_1303.py new file mode 100644 index 0000000..b4cadcf --- /dev/null +++ b/panel/migrations/0254_auto_20240718_1303.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-07-18 13:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0253_auto_20240718_1206'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='export_code', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='killrequest', + name='export_message', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='killrequest', + name='export_state', + field=models.CharField(default='pending', max_length=20), + ), + migrations.AddField( + model_name='killrequest', + name='input_export_code', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 13, 3, 4, 137577)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 13, 3, 3, 381579)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 13, 3, 3, 381579)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 13, 3, 3, 381579)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 13, 3, 3, 381579)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 13, 3, 3, 389578)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 13, 3, 3, 388577)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 13, 3, 3, 389578)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 18, 13, 3, 3, 419578)), + ), + ] diff --git a/panel/migrations/0255_auto_20240720_1218.py b/panel/migrations/0255_auto_20240720_1218.py new file mode 100644 index 0000000..ba62316 --- /dev/null +++ b/panel/migrations/0255_auto_20240720_1218.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-20 12:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0254_auto_20240718_1303'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='accept_reject_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 20, 12, 18, 15, 285281)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 20, 12, 18, 15, 133281)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 20, 12, 18, 15, 133281)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 20, 12, 18, 15, 133281)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 20, 12, 18, 15, 133281)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 20, 12, 18, 15, 142281)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 20, 12, 18, 15, 141281)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 20, 12, 18, 15, 141281)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 20, 12, 18, 15, 161276)), + ), + ] diff --git a/panel/migrations/0256_auto_20240724_1147.py b/panel/migrations/0256_auto_20240724_1147.py new file mode 100644 index 0000000..2830068 --- /dev/null +++ b/panel/migrations/0256_auto_20240724_1147.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-24 11:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0255_auto_20240720_1218'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='image', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 24, 11, 47, 13, 852930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 24, 11, 47, 13, 790437)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 24, 11, 47, 13, 790437)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 24, 11, 47, 13, 790437)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 24, 11, 47, 13, 790437)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 24, 11, 47, 13, 790437)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 24, 11, 47, 13, 790437)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 24, 11, 47, 13, 790437)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 24, 11, 47, 13, 806067)), + ), + ] diff --git a/panel/migrations/0257_auto_20240725_1040.py b/panel/migrations/0257_auto_20240725_1040.py new file mode 100644 index 0000000..f7d278c --- /dev/null +++ b/panel/migrations/0257_auto_20240725_1040.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-07-25 10:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0256_auto_20240724_1147'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='kill_house_vet_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='kill_house_vet_state', + field=models.CharField(default='pending', max_length=50), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='kill_house_vet_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 10, 40, 32, 716044)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 10, 40, 32, 653538)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 10, 40, 32, 653538)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 10, 40, 32, 653538)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 10, 40, 32, 653538)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 10, 40, 32, 653538)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 10, 40, 32, 653538)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 10, 40, 32, 653538)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 10, 40, 32, 669170)), + ), + ] diff --git a/panel/migrations/0258_auto_20240725_1112.py b/panel/migrations/0258_auto_20240725_1112.py new file mode 100644 index 0000000..59e8637 --- /dev/null +++ b/panel/migrations/0258_auto_20240725_1112.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-07-25 11:12 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0257_auto_20240725_1040'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='acceptor_rejector', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='date_of_accept_reject', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 11, 12, 29, 724611)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 11, 12, 29, 646482)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 11, 12, 29, 646482)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 11, 12, 29, 646482)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 11, 12, 29, 646482)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 11, 12, 29, 662102)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 11, 12, 29, 662102)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 11, 12, 29, 662102)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 25, 11, 12, 29, 662102)), + ), + ] diff --git a/panel/migrations/0259_auto_20240727_1222.py b/panel/migrations/0259_auto_20240727_1222.py new file mode 100644 index 0000000..fff7e3b --- /dev/null +++ b/panel/migrations/0259_auto_20240727_1222.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-07-27 12:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0258_auto_20240725_1112'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='bar_clearance_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 27, 12, 21, 42, 877934)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 27, 12, 21, 42, 715876)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 27, 12, 21, 42, 715876)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 27, 12, 21, 42, 715876)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 27, 12, 21, 42, 715876)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 27, 12, 21, 42, 726021)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 27, 12, 21, 42, 726021)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 27, 12, 21, 42, 726021)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 27, 12, 21, 42, 746257)), + ), + ] diff --git a/panel/migrations/0260_auto_20240731_2252.py b/panel/migrations/0260_auto_20240731_2252.py new file mode 100644 index 0000000..7da014f --- /dev/null +++ b/panel/migrations/0260_auto_20240731_2252.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-07-31 22:52 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0259_auto_20240727_1222'), + ] + + operations = [ + migrations.AddField( + model_name='poultry', + name='Lat', + field=models.FloatField(null=True), + ), + migrations.AddField( + model_name='poultry', + name='Long', + field=models.FloatField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 31, 22, 51, 47, 896840)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 31, 22, 51, 47, 416776)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 31, 22, 51, 47, 416776)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 31, 22, 51, 47, 416776)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 31, 22, 51, 47, 416776)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 31, 22, 51, 47, 416776)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 31, 22, 51, 47, 416776)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 31, 22, 51, 47, 416776)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 7, 31, 22, 51, 47, 526157)), + ), + ] diff --git a/panel/migrations/0261_auto_20240802_1111.py b/panel/migrations/0261_auto_20240802_1111.py new file mode 100644 index 0000000..b1a3d1b --- /dev/null +++ b/panel/migrations/0261_auto_20240802_1111.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2024-08-02 11:11 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0260_auto_20240731_2252'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='to_guilds', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocation_to_guilds', to='panel.guilds'), + ), + migrations.AddField( + model_name='stewardallocation', + name='to_steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocation_to_steward', to='panel.steward'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 2, 11, 11, 18, 413422)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 2, 11, 11, 18, 350912)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 2, 11, 11, 18, 350912)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 2, 11, 11, 18, 350912)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 2, 11, 11, 18, 350912)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 2, 11, 11, 18, 350912)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 2, 11, 11, 18, 350912)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 2, 11, 11, 18, 350912)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 2, 11, 11, 18, 350912)), + ), + ] diff --git a/panel/migrations/0262_auto_20240803_1121.py b/panel/migrations/0262_auto_20240803_1121.py new file mode 100644 index 0000000..d343885 --- /dev/null +++ b/panel/migrations/0262_auto_20240803_1121.py @@ -0,0 +1,88 @@ +# Generated by Django 3.2.13 on 2024-08-03 11:21 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0043_auto_20240803_1121'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0261_auto_20240802_1111'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 606197)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 539193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 539193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 539193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 539193)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 543193)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 543193)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 543193)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 11, 21, 40, 552192)), + ), + migrations.CreateModel( + name='Dispenser', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('dispenser_type', models.CharField(max_length=100, null=True)), + ('car', models.CharField(max_length=100, null=True)), + ('pelak', models.CharField(max_length=100, null=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_steward', to='panel.steward')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0263_auto_20240803_1509.py b/panel/migrations/0263_auto_20240803_1509.py new file mode 100644 index 0000000..864d86e --- /dev/null +++ b/panel/migrations/0263_auto_20240803_1509.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-08-03 15:09 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0262_auto_20240803_1121'), + ] + + operations = [ + migrations.RemoveField( + model_name='dispenser', + name='steward', + ), + migrations.AddField( + model_name='dispenser', + name='guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_guild', to='panel.guilds'), + ), + migrations.AddField( + model_name='dispenser', + name='limitation_amount', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 9, 15, 908887)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 9, 15, 718886)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 9, 15, 718886)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 9, 15, 718886)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 9, 15, 718886)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 9, 15, 734888)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 9, 15, 734888)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 9, 15, 734888)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 9, 15, 763886)), + ), + ] diff --git a/panel/migrations/0264_auto_20240803_1523.py b/panel/migrations/0264_auto_20240803_1523.py new file mode 100644 index 0000000..bcdd6a7 --- /dev/null +++ b/panel/migrations/0264_auto_20240803_1523.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-03 15:23 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0263_auto_20240803_1509'), + ] + + operations = [ + migrations.AddField( + model_name='dispenser', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 23, 46, 370463)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 23, 46, 188460)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 23, 46, 188460)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 23, 46, 188460)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 23, 46, 188460)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 23, 46, 196462)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 23, 46, 196462)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 23, 46, 196462)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 23, 46, 215461)), + ), + ] diff --git a/panel/migrations/0265_auto_20240803_1527.py b/panel/migrations/0265_auto_20240803_1527.py new file mode 100644 index 0000000..a8d303d --- /dev/null +++ b/panel/migrations/0265_auto_20240803_1527.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-08-03 15:27 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0264_auto_20240803_1523'), + ] + + operations = [ + migrations.AddField( + model_name='posmachine', + name='dispenser', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_pos', to='panel.dispenser'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 27, 22, 170645)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 27, 22, 53646)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 27, 22, 53646)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 27, 22, 53646)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 27, 22, 53646)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 27, 22, 61644)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 27, 22, 61644)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 27, 22, 61644)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 3, 15, 27, 22, 80646)), + ), + ] diff --git a/panel/migrations/0266_auto_20240804_1011.py b/panel/migrations/0266_auto_20240804_1011.py new file mode 100644 index 0000000..61667c4 --- /dev/null +++ b/panel/migrations/0266_auto_20240804_1011.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-04 10:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0265_auto_20240803_1527'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='has_pos', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 10, 10, 37, 547291)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 10, 10, 37, 199108)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 10, 10, 37, 199108)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 10, 10, 37, 199108)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 10, 10, 37, 199108)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 10, 10, 37, 199108)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 10, 10, 37, 199108)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 10, 10, 37, 199108)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 10, 10, 37, 273510)), + ), + ] diff --git a/panel/migrations/0267_auto_20240804_1406.py b/panel/migrations/0267_auto_20240804_1406.py new file mode 100644 index 0000000..d173980 --- /dev/null +++ b/panel/migrations/0267_auto_20240804_1406.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2024-08-04 14:06 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0266_auto_20240804_1011'), + ] + + operations = [ + migrations.AddField( + model_name='dispenser', + name='registrar', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='stewardallocation', + name='dispenser', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocation_dispenser', to='panel.dispenser'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 14, 6, 13, 956548)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 14, 6, 13, 889547)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 14, 6, 13, 889547)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 14, 6, 13, 889547)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 14, 6, 13, 889547)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 14, 6, 13, 893547)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 14, 6, 13, 893547)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 14, 6, 13, 893547)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 14, 6, 13, 902547)), + ), + ] diff --git a/panel/migrations/0268_auto_20240804_2127.py b/panel/migrations/0268_auto_20240804_2127.py new file mode 100644 index 0000000..88734cb --- /dev/null +++ b/panel/migrations/0268_auto_20240804_2127.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-08-04 21:27 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0267_auto_20240804_1406'), + ] + + operations = [ + migrations.AddField( + model_name='dispenser', + name='free_guilds', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='dispenser', + name='free_sale', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='dispenser', + name='free_stewards', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 27, 26, 911516)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 27, 26, 777840)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 27, 26, 777840)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 27, 26, 777840)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 27, 26, 777840)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 27, 26, 794067)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 27, 26, 794067)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 27, 26, 794067)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 27, 26, 794821)), + ), + ] diff --git a/panel/migrations/0269_auto_20240804_2128.py b/panel/migrations/0269_auto_20240804_2128.py new file mode 100644 index 0000000..6ff8cba --- /dev/null +++ b/panel/migrations/0269_auto_20240804_2128.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-08-04 21:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0268_auto_20240804_2127'), + ] + + operations = [ + migrations.AlterField( + model_name='dispenser', + name='free_guilds', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='dispenser', + name='free_sale', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='dispenser', + name='free_stewards', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 28, 8, 50513)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 28, 7, 894264)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 28, 7, 894264)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 28, 7, 894264)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 28, 7, 894264)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 28, 7, 909884)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 28, 7, 909884)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 28, 7, 909884)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 4, 21, 28, 7, 925515)), + ), + ] diff --git a/panel/migrations/0270_auto_20240806_2324.py b/panel/migrations/0270_auto_20240806_2324.py new file mode 100644 index 0000000..fa44938 --- /dev/null +++ b/panel/migrations/0270_auto_20240806_2324.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-06 23:24 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0269_auto_20240804_2128'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='kill_house', + field=models.ManyToManyField(blank=True, null=True, related_name='guild_kill_houses', to='panel.KillHouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 6, 23, 23, 46, 407593)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 6, 23, 23, 46, 217587)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 6, 23, 23, 46, 216587)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 6, 23, 23, 46, 217587)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 6, 23, 23, 46, 217587)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 6, 23, 23, 46, 226587)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 6, 23, 23, 46, 225589)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 6, 23, 23, 46, 226587)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 6, 23, 23, 46, 252588)), + ), + ] diff --git a/panel/migrations/0271_auto_20240808_1144.py b/panel/migrations/0271_auto_20240808_1144.py new file mode 100644 index 0000000..153ac09 --- /dev/null +++ b/panel/migrations/0271_auto_20240808_1144.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.13 on 2024-08-08 11:44 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0270_auto_20240806_2324'), + ] + + operations = [ + migrations.AddField( + model_name='newproduct', + name='guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product_guild', to='panel.guilds'), + ), + migrations.AddField( + model_name='newproduct', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product_kill_house', to='panel.movingtextrole'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 11, 44, 29, 374105)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 11, 44, 29, 308106)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 11, 44, 29, 308106)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 11, 44, 29, 308106)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 11, 44, 29, 308106)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 11, 44, 29, 312110)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 11, 44, 29, 312110)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 11, 44, 29, 312110)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 11, 44, 29, 321106)), + ), + ] diff --git a/panel/migrations/0272_auto_20240808_1209.py b/panel/migrations/0272_auto_20240808_1209.py new file mode 100644 index 0000000..958ef1a --- /dev/null +++ b/panel/migrations/0272_auto_20240808_1209.py @@ -0,0 +1,95 @@ +# Generated by Django 3.2.13 on 2024-08-08 12:09 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0271_auto_20240808_1144'), + ] + + operations = [ + migrations.RemoveField( + model_name='newproduct', + name='guild', + ), + migrations.RemoveField( + model_name='newproduct', + name='kill_house', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 12, 9, 31, 606272)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 12, 9, 31, 538267)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 12, 9, 31, 538267)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 12, 9, 31, 538267)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 12, 9, 31, 538267)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 12, 9, 31, 542267)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 12, 9, 31, 541267)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 12, 9, 31, 541267)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 12, 9, 31, 551272)), + ), + migrations.CreateModel( + name='RolesProducts', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rolesproducts_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='roles_products_guild', to='panel.guilds')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='roles_products_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rolesproducts_modifiedby', to=settings.AUTH_USER_MODEL)), + ('parent_product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='roles_products_new_product', to='panel.newproduct')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='stewardallocation', + name='product', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocation_product', to='panel.rolesproducts'), + ), + ] diff --git a/panel/migrations/0273_auto_20240808_1410.py b/panel/migrations/0273_auto_20240808_1410.py new file mode 100644 index 0000000..305d82e --- /dev/null +++ b/panel/migrations/0273_auto_20240808_1410.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2024-08-08 14:10 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0272_auto_20240808_1209'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='product', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_kill_house_product', to='panel.rolesproducts'), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='product', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_kill_house_product', to='panel.rolesproducts'), + ), + migrations.AddField( + model_name='stewardfreebarinformation', + name='product', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_steward_product', to='panel.rolesproducts'), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='product', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_steward_product', to='panel.rolesproducts'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 14, 10, 11, 778885)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 14, 10, 11, 651887)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 14, 10, 11, 651887)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 14, 10, 11, 651887)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 14, 10, 11, 651887)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 14, 10, 11, 659886)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 14, 10, 11, 659886)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 14, 10, 11, 659886)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 8, 14, 10, 11, 672884)), + ), + ] diff --git a/panel/migrations/0274_auto_20240809_1838.py b/panel/migrations/0274_auto_20240809_1838.py new file mode 100644 index 0000000..6586489 --- /dev/null +++ b/panel/migrations/0274_auto_20240809_1838.py @@ -0,0 +1,228 @@ +# Generated by Django 3.2.13 on 2024-08-09 18:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0273_auto_20240808_1410'), + ] + + operations = [ + migrations.RemoveField( + model_name='rolesproducts', + name='active', + ), + migrations.AddField( + model_name='rolesproducts', + name='accepted_allocated_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='accepted_allocated_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='allocated_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='allocated_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='ave_weight_of_carcasses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_buying_bars_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_buying_bars_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_buying_bars_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_buying_bars_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_sale_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_sale_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='freezing_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='freezing_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='live_bars_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='live_bars_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='live_bars_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='live_bars_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_accepted_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_free_buying_bars', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_live_bars', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_rejected_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_returned_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='real_allocated_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='real_allocated_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='rejected_allocated_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='rejected_allocated_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='returned_allocated_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='returned_allocated_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_number_of_bars', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_remain_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_remain_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 38, 30, 988648)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 38, 30, 598813)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 38, 30, 598813)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 38, 30, 598813)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 38, 30, 598813)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 38, 30, 598813)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 38, 30, 598813)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 38, 30, 598813)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 38, 30, 676942)), + ), + ] diff --git a/panel/migrations/0275_auto_20240809_1850.py b/panel/migrations/0275_auto_20240809_1850.py new file mode 100644 index 0000000..35de096 --- /dev/null +++ b/panel/migrations/0275_auto_20240809_1850.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-09 18:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0274_auto_20240809_1838'), + ] + + operations = [ + migrations.AddField( + model_name='poscompany', + name='en_name', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 49, 46, 944993)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 49, 46, 762281)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 49, 46, 762281)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 49, 46, 762281)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 49, 46, 762281)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 49, 46, 770562)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 49, 46, 770562)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 49, 46, 770562)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 9, 18, 49, 46, 788872)), + ), + ] diff --git a/panel/migrations/0276_auto_20240810_0922.py b/panel/migrations/0276_auto_20240810_0922.py new file mode 100644 index 0000000..e7892ec --- /dev/null +++ b/panel/migrations/0276_auto_20240810_0922.py @@ -0,0 +1,191 @@ +# Generated by Django 3.2.13 on 2024-08-10 09:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0275_auto_20240809_1850'), + ] + + operations = [ + migrations.RemoveField( + model_name='rolesproducts', + name='accepted_allocated_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='accepted_allocated_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='allocated_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='allocated_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='ave_weight_of_carcasses', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_buying_bars_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_buying_bars_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_buying_bars_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_buying_bars_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_sale_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_sale_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='freezing_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='freezing_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='live_bars_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='live_bars_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='live_bars_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='live_bars_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_accepted_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_free_buying_bars', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_live_bars', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_rejected_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_returned_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='real_allocated_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='real_allocated_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='rejected_allocated_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='rejected_allocated_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='returned_allocated_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='returned_allocated_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_number_of_bars', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_remain_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_remain_weight', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 22, 8, 815832)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 22, 8, 706454)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 22, 8, 706454)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 22, 8, 706454)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 22, 8, 706454)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 22, 8, 706454)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 22, 8, 706454)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 22, 8, 706454)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 22, 8, 722075)), + ), + ] diff --git a/panel/migrations/0277_auto_20240810_0928.py b/panel/migrations/0277_auto_20240810_0928.py new file mode 100644 index 0000000..42da043 --- /dev/null +++ b/panel/migrations/0277_auto_20240810_0928.py @@ -0,0 +1,224 @@ +# Generated by Django 3.2.13 on 2024-08-10 09:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0276_auto_20240810_0922'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='accepted_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='accepted_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_buying_bars_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_buying_bars_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_buying_bars_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_buying_bars_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_sale_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_sale_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='freezing_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='freezing_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='live_bars_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='live_bars_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='live_bars_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='live_bars_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_accepted_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_free_buying_bars', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_live_bars', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_rejected_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_returned_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='real_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='real_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='rejected_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='rejected_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='returned_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='returned_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_number_of_bars', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_remain_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_remain_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='weight_ave', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 28, 3, 46873)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 28, 2, 915155)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 28, 2, 915155)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 28, 2, 915155)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 28, 2, 915155)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 28, 2, 930779)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 28, 2, 930779)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 28, 2, 930779)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 9, 28, 2, 946402)), + ), + ] diff --git a/panel/migrations/0278_auto_20240810_1357.py b/panel/migrations/0278_auto_20240810_1357.py new file mode 100644 index 0000000..3429c53 --- /dev/null +++ b/panel/migrations/0278_auto_20240810_1357.py @@ -0,0 +1,95 @@ +# Generated by Django 3.2.13 on 2024-08-10 13:57 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0277_auto_20240810_0928'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouseallocations', + name='real_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='coldhouseallocations', + name='real_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='allocated_quantity_from', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='allocated_weight_from', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='stewardallocation', + name='to_kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocation_to_kill_house', to='panel.killhouse'), + ), + migrations.AddField( + model_name='stewardfreebarinformation', + name='guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_guild', to='panel.guilds'), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_guild', to='panel.guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 13, 57, 29, 424449)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 13, 57, 29, 348453)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 13, 57, 29, 348453)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 13, 57, 29, 348453)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 13, 57, 29, 348453)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 13, 57, 29, 351453)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 13, 57, 29, 351453)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 13, 57, 29, 351453)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 10, 13, 57, 29, 361453)), + ), + ] diff --git a/panel/migrations/0279_auto_20240811_1102.py b/panel/migrations/0279_auto_20240811_1102.py new file mode 100644 index 0000000..c80151d --- /dev/null +++ b/panel/migrations/0279_auto_20240811_1102.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-08-11 11:02 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0278_auto_20240810_1357'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='steward_active', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='guilds', + name='steward_allocation_limit', + field=models.BigIntegerField(null=True), + ), + migrations.AddField( + model_name='guilds', + name='steward_limitation_allocation', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='stewards', + field=models.ManyToManyField(blank=True, null=True, related_name='_panel_guilds_stewards_+', to='panel.Guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 11, 11, 2, 33, 504334)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 11, 11, 2, 33, 433671)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 11, 11, 2, 33, 433671)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 11, 11, 2, 33, 433671)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 11, 11, 2, 33, 433671)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 11, 11, 2, 33, 433671)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 11, 11, 2, 33, 433671)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 11, 11, 2, 33, 433671)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 11, 11, 2, 33, 449317)), + ), + ] diff --git a/panel/migrations/0280_auto_20240812_1015.py b/panel/migrations/0280_auto_20240812_1015.py new file mode 100644 index 0000000..16cfa3f --- /dev/null +++ b/panel/migrations/0280_auto_20240812_1015.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-08-12 10:15 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0279_auto_20240811_1102'), + ] + + operations = [ + migrations.RemoveField( + model_name='killhousepurchaserequest', + name='limitation_number', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 26, 194366)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 26, 133372)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 26, 133372)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 26, 133372)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 26, 133372)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 26, 136370)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 26, 136370)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 26, 136370)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 26, 145403)), + ), + ] diff --git a/panel/migrations/0281_auto_20240812_1015.py b/panel/migrations/0281_auto_20240812_1015.py new file mode 100644 index 0000000..e61e363 --- /dev/null +++ b/panel/migrations/0281_auto_20240812_1015.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-12 10:15 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0280_auto_20240812_1015'), + ] + + operations = [ + migrations.AddField( + model_name='killhousepurchaserequest', + name='limitation_number', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 42, 219928)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 42, 138931)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 42, 138931)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 42, 138931)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 42, 138931)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 42, 143929)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 42, 143929)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 42, 143929)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 10, 15, 42, 157930)), + ), + ] diff --git a/panel/migrations/0282_auto_20240812_1349.py b/panel/migrations/0282_auto_20240812_1349.py new file mode 100644 index 0000000..05b1641 --- /dev/null +++ b/panel/migrations/0282_auto_20240812_1349.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-12 13:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0281_auto_20240812_1015'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='steward_kill_house', + field=models.ManyToManyField(blank=True, null=True, related_name='steward_kill_houses', to='panel.KillHouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 13, 49, 6, 293722)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 13, 49, 6, 137705)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 13, 49, 6, 136706)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 13, 49, 6, 137705)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 13, 49, 6, 137705)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 13, 49, 6, 144905)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 13, 49, 6, 144905)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 13, 49, 6, 144905)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 12, 13, 49, 6, 164178)), + ), + ] diff --git a/panel/migrations/0283_auto_20240813_0921.py b/panel/migrations/0283_auto_20240813_0921.py new file mode 100644 index 0000000..343db87 --- /dev/null +++ b/panel/migrations/0283_auto_20240813_0921.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-08-13 09:21 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0282_auto_20240812_1349'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='company_gateway_percent', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='guilds_gateway_percent', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='other_gateway_percent', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='union_gateway_percent', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 13, 9, 20, 55, 275421)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 13, 9, 20, 55, 212919)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 13, 9, 20, 55, 212919)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 13, 9, 20, 55, 212919)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 13, 9, 20, 55, 212919)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 13, 9, 20, 55, 212919)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 13, 9, 20, 55, 212919)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 13, 9, 20, 55, 212919)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 13, 9, 20, 55, 228547)), + ), + ] diff --git a/panel/migrations/0284_auto_20240814_1007.py b/panel/migrations/0284_auto_20240814_1007.py new file mode 100644 index 0000000..d4eeb31 --- /dev/null +++ b/panel/migrations/0284_auto_20240814_1007.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-08-14 10:07 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0283_auto_20240813_0921'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='registerar_fullname', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='guilds', + name='registerar_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 7, 19, 426552)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 7, 19, 322552)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 7, 19, 322552)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 7, 19, 322552)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 7, 19, 322552)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 7, 19, 327552)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 7, 19, 327552)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 7, 19, 327552)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 7, 19, 339550)), + ), + ] diff --git a/panel/migrations/0285_auto_20240814_1017.py b/panel/migrations/0285_auto_20240814_1017.py new file mode 100644 index 0000000..ad310fc --- /dev/null +++ b/panel/migrations/0285_auto_20240814_1017.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-14 10:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0284_auto_20240814_1007'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='registerar_role', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 17, 37, 624676)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 17, 37, 487679)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 17, 37, 487679)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 17, 37, 487679)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 17, 37, 487679)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 17, 37, 496677)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 17, 37, 496677)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 17, 37, 496677)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 14, 10, 17, 37, 515678)), + ), + ] diff --git a/panel/migrations/0286_auto_20240815_1337.py b/panel/migrations/0286_auto_20240815_1337.py new file mode 100644 index 0000000..41ab42a --- /dev/null +++ b/panel/migrations/0286_auto_20240815_1337.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-08-15 13:37 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0285_auto_20240814_1017'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='extra_bar_kill_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_kill_capacity', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 15, 13, 37, 43, 958087)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 15, 13, 37, 43, 884085)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 15, 13, 37, 43, 884085)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 15, 13, 37, 43, 884085)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 15, 13, 37, 43, 884085)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 15, 13, 37, 43, 888086)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 15, 13, 37, 43, 888086)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 15, 13, 37, 43, 888086)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 15, 13, 37, 43, 897088)), + ), + ] diff --git a/panel/migrations/0287_auto_20240817_1040.py b/panel/migrations/0287_auto_20240817_1040.py new file mode 100644 index 0000000..d4bb6d1 --- /dev/null +++ b/panel/migrations/0287_auto_20240817_1040.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-08-17 10:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0286_auto_20240815_1337'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='aggregate_code', + field=models.BigIntegerField(null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='aggregate_status', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 40, 10, 181057)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 40, 9, 901054)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 40, 9, 901054)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 40, 9, 901054)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 40, 9, 901054)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 40, 9, 919053)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 40, 9, 919053)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 40, 9, 919053)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 40, 9, 962050)), + ), + ] diff --git a/panel/migrations/0288_auto_20240817_1052.py b/panel/migrations/0288_auto_20240817_1052.py new file mode 100644 index 0000000..e005d0b --- /dev/null +++ b/panel/migrations/0288_auto_20240817_1052.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2024-08-17 10:52 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0287_auto_20240817_1040'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 51, 21, 709868)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 51, 21, 383323)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 51, 21, 383323)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 51, 21, 383323)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 51, 21, 383323)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 51, 21, 398322)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 51, 21, 398322)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 51, 21, 398322)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 17, 10, 51, 21, 439325)), + ), + migrations.CreateModel( + name='VetFarmAggregatePermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('limitation', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetfarmaggregatepermission_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vetfarmaggregatepermission_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0289_auto_20240819_1141.py b/panel/migrations/0289_auto_20240819_1141.py new file mode 100644 index 0000000..56f77ce --- /dev/null +++ b/panel/migrations/0289_auto_20240819_1141.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-19 11:41 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0288_auto_20240817_1052'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='off', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 11, 41, 15, 485214)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 11, 41, 15, 417207)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 11, 41, 15, 417207)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 11, 41, 15, 417207)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 11, 41, 15, 417207)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 11, 41, 15, 421210)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 11, 41, 15, 421210)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 11, 41, 15, 421210)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 11, 41, 15, 430211)), + ), + ] diff --git a/panel/migrations/0290_auto_20240819_1227.py b/panel/migrations/0290_auto_20240819_1227.py new file mode 100644 index 0000000..155519a --- /dev/null +++ b/panel/migrations/0290_auto_20240819_1227.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-08-19 12:27 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0289_auto_20240819_1141'), + ] + + operations = [ + migrations.RemoveField( + model_name='killhouse', + name='off', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 27, 40, 885627)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 27, 40, 820626)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 27, 40, 820626)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 27, 40, 820626)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 27, 40, 820626)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 27, 40, 824629)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 27, 40, 823626)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 27, 40, 824629)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 27, 40, 832626)), + ), + ] diff --git a/panel/migrations/0291_auto_20240819_1233.py b/panel/migrations/0291_auto_20240819_1233.py new file mode 100644 index 0000000..df7f1dc --- /dev/null +++ b/panel/migrations/0291_auto_20240819_1233.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-19 12:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0290_auto_20240819_1227'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='off', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 32, 57, 327494)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 32, 57, 259493)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 32, 57, 259493)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 32, 57, 259493)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 32, 57, 259493)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 32, 57, 263493)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 32, 57, 263493)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 32, 57, 263493)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 12, 32, 57, 273494)), + ), + ] diff --git a/panel/migrations/0292_auto_20240819_1325.py b/panel/migrations/0292_auto_20240819_1325.py new file mode 100644 index 0000000..d41fea9 --- /dev/null +++ b/panel/migrations/0292_auto_20240819_1325.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-08-19 13:25 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0291_auto_20240819_1233'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 13, 25, 31, 127798)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 13, 25, 31, 56804)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 13, 25, 31, 56804)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 13, 25, 31, 56804)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 13, 25, 31, 56804)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 13, 25, 31, 60803)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 13, 25, 31, 60803)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 13, 25, 31, 60803)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 19, 13, 25, 31, 69802)), + ), + migrations.CreateModel( + name='KillHouseBarLimitation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('limitation', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousebarlimitation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousebarlimitation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0293_auto_20240820_1038.py b/panel/migrations/0293_auto_20240820_1038.py new file mode 100644 index 0000000..fec2775 --- /dev/null +++ b/panel/migrations/0293_auto_20240820_1038.py @@ -0,0 +1,83 @@ +# Generated by Django 3.2.13 on 2024-08-20 10:38 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0044_auto_20240820_1038'), + ('panel', '0292_auto_20240819_1325'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 835912)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 679909)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 679909)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 679909)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 679909)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 688911)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 688911)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 688911)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 20, 10, 37, 50, 709910)), + ), + migrations.CreateModel( + name='CityPoultry', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_poultry_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='citypoultry_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='citypoultry_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_poultry_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_poultry_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_poultry_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0294_auto_20240821_0917.py b/panel/migrations/0294_auto_20240821_0917.py new file mode 100644 index 0000000..68d8e46 --- /dev/null +++ b/panel/migrations/0294_auto_20240821_0917.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-21 09:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0293_auto_20240820_1038'), + ] + + operations = [ + migrations.AddField( + model_name='killhousebarlimitation', + name='allow', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 17, 5, 178671)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 17, 5, 53671)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 17, 5, 53671)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 17, 5, 53671)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 17, 5, 53671)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 17, 5, 69298)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 17, 5, 69298)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 17, 5, 69298)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 17, 5, 84916)), + ), + ] diff --git a/panel/migrations/0295_auto_20240821_1000.py b/panel/migrations/0295_auto_20240821_1000.py new file mode 100644 index 0000000..95f1e0d --- /dev/null +++ b/panel/migrations/0295_auto_20240821_1000.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-21 10:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0294_auto_20240821_0917'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='max_kill_limit', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 59, 52, 969874)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 59, 52, 919916)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 59, 52, 919916)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 59, 52, 919916)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 59, 52, 919916)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 59, 52, 922909)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 59, 52, 922909)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 59, 52, 922909)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 21, 9, 59, 52, 929911)), + ), + ] diff --git a/panel/migrations/0296_auto_20240826_1223.py b/panel/migrations/0296_auto_20240826_1223.py new file mode 100644 index 0000000..fffbdbf --- /dev/null +++ b/panel/migrations/0296_auto_20240826_1223.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-08-26 12:23 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0295_auto_20240821_1000'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='violation_image', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='violation_report', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='violation_report_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='violation_reporter', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 26, 12, 23, 25, 845718)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 26, 12, 23, 25, 699715)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 26, 12, 23, 25, 699715)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 26, 12, 23, 25, 699715)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 26, 12, 23, 25, 699715)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 26, 12, 23, 25, 708717)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 26, 12, 23, 25, 708717)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 26, 12, 23, 25, 708717)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 26, 12, 23, 25, 729718)), + ), + ] diff --git a/panel/migrations/0297_auto_20240828_1203.py b/panel/migrations/0297_auto_20240828_1203.py new file mode 100644 index 0000000..c9097b5 --- /dev/null +++ b/panel/migrations/0297_auto_20240828_1203.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2024-08-28 12:03 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0296_auto_20240826_1223'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 12, 3, 31, 12666)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 12, 3, 30, 823113)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 12, 3, 30, 823113)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 12, 3, 30, 823113)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 12, 3, 30, 823113)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 12, 3, 30, 838414)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 12, 3, 30, 838414)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 12, 3, 30, 838414)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 12, 3, 30, 873075)), + ), + migrations.CreateModel( + name='KillHouseStewardGuildRelation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allocation_number', models.IntegerField(default=0)), + ('Guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_relation', to='panel.guilds')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousestewardguildrelation_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_relation', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousestewardguildrelation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_relation', to='panel.steward')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0298_auto_20240828_1410.py b/panel/migrations/0298_auto_20240828_1410.py new file mode 100644 index 0000000..8f1660f --- /dev/null +++ b/panel/migrations/0298_auto_20240828_1410.py @@ -0,0 +1,67 @@ +# Generated by Django 3.2.13 on 2024-08-28 14:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0297_auto_20240828_1203'), + ] + + operations = [ + migrations.RemoveField( + model_name='killhousestewardguildrelation', + name='Guild', + ), + migrations.RemoveField( + model_name='killhousestewardguildrelation', + name='steward', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 10, 32, 570252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 10, 32, 424253)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 10, 32, 424253)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 10, 32, 424253)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 10, 32, 424253)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 10, 32, 433251)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 10, 32, 433251)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 10, 32, 433251)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 10, 32, 454251)), + ), + ] diff --git a/panel/migrations/0299_auto_20240828_1416.py b/panel/migrations/0299_auto_20240828_1416.py new file mode 100644 index 0000000..b67898e --- /dev/null +++ b/panel/migrations/0299_auto_20240828_1416.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2024-08-28 14:16 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0298_auto_20240828_1410'), + ] + + operations = [ + migrations.RenameField( + model_name='killhousestewardguildrelation', + old_name='allocation_number', + new_name='allocation_limit', + ), + migrations.AddField( + model_name='killhousestewardguildrelation', + name='guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_relation', to='panel.guilds'), + ), + migrations.AddField( + model_name='killhousestewardguildrelation', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_relation', to='panel.guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 16, 24, 699352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 16, 24, 554353)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 16, 24, 554353)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 16, 24, 554353)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 16, 24, 554353)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 16, 24, 562352)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 16, 24, 562352)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 16, 24, 562352)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 28, 14, 16, 24, 583351)), + ), + ] diff --git a/panel/migrations/0300_auto_20240829_0958.py b/panel/migrations/0300_auto_20240829_0958.py new file mode 100644 index 0000000..11fd445 --- /dev/null +++ b/panel/migrations/0300_auto_20240829_0958.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-08-29 09:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0299_auto_20240828_1416'), + ] + + operations = [ + migrations.AddField( + model_name='killhousestewardguildrelation', + name='allocation_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 9, 58, 12, 250734)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 9, 58, 12, 104568)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 9, 58, 12, 103569)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 9, 58, 12, 103569)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 9, 58, 12, 103569)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 9, 58, 12, 111774)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 9, 58, 12, 111774)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 9, 58, 12, 111774)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 9, 58, 12, 133197)), + ), + ] diff --git a/panel/migrations/0301_auto_20240829_1025.py b/panel/migrations/0301_auto_20240829_1025.py new file mode 100644 index 0000000..e366a6a --- /dev/null +++ b/panel/migrations/0301_auto_20240829_1025.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-08-29 10:25 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0300_auto_20240829_0958'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='violation_report_edit_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='violation_report_editor', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 10, 25, 19, 688278)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 10, 25, 19, 637277)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 10, 25, 19, 637277)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 10, 25, 19, 637277)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 10, 25, 19, 637277)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 10, 25, 19, 640277)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 10, 25, 19, 640277)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 10, 25, 19, 640277)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 29, 10, 25, 19, 647276)), + ), + ] diff --git a/panel/migrations/0302_auto_20240830_1023.py b/panel/migrations/0302_auto_20240830_1023.py new file mode 100644 index 0000000..abf3f7c --- /dev/null +++ b/panel/migrations/0302_auto_20240830_1023.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2024-08-30 10:23 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0301_auto_20240829_1025'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 23, 49, 542279)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 23, 49, 489280)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 23, 49, 489280)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 23, 49, 489280)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 23, 49, 489280)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 23, 49, 493279)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 23, 49, 493279)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 23, 49, 493279)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 23, 49, 500279)), + ), + ] diff --git a/panel/migrations/0303_auto_20240830_1033.py b/panel/migrations/0303_auto_20240830_1033.py new file mode 100644 index 0000000..f27c4bd --- /dev/null +++ b/panel/migrations/0303_auto_20240830_1033.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2024-08-30 10:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0302_auto_20240830_1023'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 4, 327359)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 4, 273350)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 4, 273350)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 4, 273350)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 4, 273350)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 4, 277349)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 4, 277349)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 4, 277349)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 4, 285320)), + ), + ] diff --git a/panel/migrations/0304_auto_20240830_1033.py b/panel/migrations/0304_auto_20240830_1033.py new file mode 100644 index 0000000..a7e740f --- /dev/null +++ b/panel/migrations/0304_auto_20240830_1033.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2024-08-30 10:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0303_auto_20240830_1033'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 22, 254046)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 22, 202039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 22, 202039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 22, 202039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 22, 202039)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 22, 206011)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 22, 206011)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 22, 206011)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 30, 10, 33, 22, 213048)), + ), + ] diff --git a/panel/migrations/0305_auto_20240831_1000.py b/panel/migrations/0305_auto_20240831_1000.py new file mode 100644 index 0000000..aabae58 --- /dev/null +++ b/panel/migrations/0305_auto_20240831_1000.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-08-31 10:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0304_auto_20240830_1033'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='payer_fullname', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='internaltransaction', + name='payer_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 31, 9, 59, 48, 910949)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 31, 9, 59, 48, 780947)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 31, 9, 59, 48, 780947)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 31, 9, 59, 48, 780947)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 31, 9, 59, 48, 780947)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 31, 9, 59, 48, 787948)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 31, 9, 59, 48, 787948)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 31, 9, 59, 48, 787948)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 8, 31, 9, 59, 48, 807948)), + ), + ] diff --git a/panel/migrations/0306_auto_20240907_1020.py b/panel/migrations/0306_auto_20240907_1020.py new file mode 100644 index 0000000..ccb5071 --- /dev/null +++ b/panel/migrations/0306_auto_20240907_1020.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2024-09-07 10:20 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0305_auto_20240831_1000'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 7, 10, 19, 59, 576427)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 7, 10, 19, 59, 525427)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 7, 10, 19, 59, 525427)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 7, 10, 19, 59, 525427)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 7, 10, 19, 59, 525427)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 7, 10, 19, 59, 529426)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 7, 10, 19, 59, 529426)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 7, 10, 19, 59, 529426)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 7, 10, 19, 59, 536427)), + ), + ] diff --git a/panel/migrations/0307_auto_20240911_1147.py b/panel/migrations/0307_auto_20240911_1147.py new file mode 100644 index 0000000..28959db --- /dev/null +++ b/panel/migrations/0307_auto_20240911_1147.py @@ -0,0 +1,81 @@ +# Generated by Django 3.2.13 on 2024-09-11 11:47 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0306_auto_20240907_1020'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 11, 11, 46, 32, 619790)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 11, 11, 46, 32, 519485)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 11, 11, 46, 32, 519485)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 11, 11, 46, 32, 519485)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 11, 11, 46, 32, 519485)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 11, 11, 46, 32, 519485)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 11, 11, 46, 32, 519485)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 11, 11, 46, 32, 519485)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 11, 11, 46, 32, 535107)), + ), + migrations.CreateModel( + name='OutOfProvinceSellingCarcassesPermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('type', models.CharField(max_length=100, null=True)), + ('percent', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='outofprovincesellingcarcassespermission_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='outofprovincesellingcarcassespermission_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0308_auto_20240912_0926.py b/panel/migrations/0308_auto_20240912_0926.py new file mode 100644 index 0000000..2569a23 --- /dev/null +++ b/panel/migrations/0308_auto_20240912_0926.py @@ -0,0 +1,87 @@ +# Generated by Django 3.2.13 on 2024-09-12 09:26 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0046_auto_20240912_0926'), + ('panel', '0307_auto_20240911_1147'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 53, 102356)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 53, 31361)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 53, 31361)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 53, 31361)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 53, 31361)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 53, 35361)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 53, 35361)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 53, 35361)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 9, 25, 53, 46356)), + ), + migrations.CreateModel( + name='OutProvinceCarcassesBuyer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('type', models.CharField(max_length=100, null=True)), + ('fullname', models.CharField(max_length=300, null=True)), + ('mobile', models.CharField(max_length=11, null=True)), + ('unit_name', models.CharField(max_length=300, null=True)), + ('city', models.CharField(max_length=300, null=True)), + ('province', models.CharField(max_length=300, null=True)), + ('active', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='outprovincecarcassesbuyer_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='outprovincecarcassesbuyer_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='out_province_carcasses_user', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0309_auto_20240912_1121.py b/panel/migrations/0309_auto_20240912_1121.py new file mode 100644 index 0000000..512dd5f --- /dev/null +++ b/panel/migrations/0309_auto_20240912_1121.py @@ -0,0 +1,103 @@ +# Generated by Django 3.2.13 on 2024-09-12 11:21 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0308_auto_20240912_0926'), + ] + + operations = [ + migrations.RemoveField( + model_name='outprovincecarcassesbuyer', + name='type', + ), + migrations.RemoveField( + model_name='outprovincecarcassesbuyer', + name='user', + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='buyer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_buyer', to='panel.outprovincecarcassesbuyer'), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='permission_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='registerar_fullname', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='status', + field=models.CharField(max_length=300, null=True), + ), + migrations.AddField( + model_name='outprovincecarcassesbuyer', + name='first_name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='outprovincecarcassesbuyer', + name='last_name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 21, 11, 776880)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 21, 11, 710883)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 21, 11, 710883)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 21, 11, 710883)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 21, 11, 710883)), + ), + migrations.AlterField( + model_name='outprovincecarcassesbuyer', + name='fullname', + field=models.CharField(max_length=150, null=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 21, 11, 715882)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 21, 11, 715882)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 21, 11, 715882)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 11, 21, 11, 724882)), + ), + ] diff --git a/panel/migrations/0310_auto_20240912_1211.py b/panel/migrations/0310_auto_20240912_1211.py new file mode 100644 index 0000000..800c882 --- /dev/null +++ b/panel/migrations/0310_auto_20240912_1211.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-09-12 12:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0309_auto_20240912_1121'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 11, 0, 251205)), + ), + migrations.AlterField( + model_name='killhousefreesalebarinformation', + name='status', + field=models.CharField(default='pending', max_length=300), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 11, 0, 10194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 11, 0, 10194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 11, 0, 10194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 11, 0, 10194)), + ), + migrations.AlterField( + model_name='outprovincecarcassesbuyer', + name='fullname', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 11, 0, 20191)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 11, 0, 20191)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 11, 0, 20191)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 12, 12, 11, 0, 41185)), + ), + ] diff --git a/panel/migrations/0311_auto_20240914_1038.py b/panel/migrations/0311_auto_20240914_1038.py new file mode 100644 index 0000000..fda0177 --- /dev/null +++ b/panel/migrations/0311_auto_20240914_1038.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-09-14 10:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0310_auto_20240912_1211'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='accepted_number_of_carcasses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='accepted_weight_of_carcasses', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='real_number_of_carcasses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='real_weight_of_carcasses', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 14, 10, 38, 45, 500959)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 14, 10, 38, 45, 438452)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 14, 10, 38, 45, 438452)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 14, 10, 38, 45, 438452)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 14, 10, 38, 45, 438452)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 14, 10, 38, 45, 438452)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 14, 10, 38, 45, 438452)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 14, 10, 38, 45, 438452)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 14, 10, 38, 45, 454082)), + ), + ] diff --git a/panel/migrations/0312_auto_20240915_1241.py b/panel/migrations/0312_auto_20240915_1241.py new file mode 100644 index 0000000..46bc36b --- /dev/null +++ b/panel/migrations/0312_auto_20240915_1241.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2024-09-15 12:41 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0311_auto_20240914_1038'), + ] + + operations = [ + migrations.AddField( + model_name='outprovincecarcassesbuyer', + name='Kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_buyer', to='panel.killhouse'), + ), + migrations.AddField( + model_name='outprovincecarcassesbuyer', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_buyer', to='panel.guilds'), + ), + migrations.AddField( + model_name='outprovincecarcassesbuyer', + name='type_activity', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='buyer_activity', to='panel.typeactivity'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 15, 12, 41, 21, 175479)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 15, 12, 41, 21, 106474)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 15, 12, 41, 21, 106474)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 15, 12, 41, 21, 106474)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 15, 12, 41, 21, 106474)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 15, 12, 41, 21, 110477)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 15, 12, 41, 21, 110477)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 15, 12, 41, 21, 110477)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 9, 15, 12, 41, 21, 120477)), + ), + ] diff --git a/panel/migrations/0313_auto_20241005_1310.py b/panel/migrations/0313_auto_20241005_1310.py new file mode 100644 index 0000000..b37b55d --- /dev/null +++ b/panel/migrations/0313_auto_20241005_1310.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-10-05 13:10 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0312_auto_20240915_1241'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 9, 40, 462800)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 9, 39, 236442)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 9, 39, 236442)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 9, 39, 236442)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 9, 39, 236442)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 9, 39, 244482)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 9, 39, 244482)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 9, 39, 244482)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 5, 13, 9, 39, 266764)), + ), + migrations.CreateModel( + name='ProductPricingType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('province', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='productpricingtype_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='productpricingtype_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0314_auto_20241012_1226.py b/panel/migrations/0314_auto_20241012_1226.py new file mode 100644 index 0000000..78d8092 --- /dev/null +++ b/panel/migrations/0314_auto_20241012_1226.py @@ -0,0 +1,129 @@ +# Generated by Django 3.2.13 on 2024-10-12 12:26 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0313_auto_20241005_1310'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='city_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='city_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='company_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='company_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='guilds_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='guilds_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='other_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='other_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='total_wage_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='union_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='union_share_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='wage', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='wallet_share', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='wallet_share_percent', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 12, 12, 26, 22, 185647)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 12, 12, 26, 22, 132109)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 12, 12, 26, 22, 131110)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 12, 12, 26, 22, 132109)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 12, 12, 26, 22, 131110)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 12, 12, 26, 22, 136107)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 12, 12, 26, 22, 136107)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 12, 12, 26, 22, 136107)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 12, 12, 26, 22, 144125)), + ), + ] diff --git a/panel/migrations/0315_auto_20241015_1027.py b/panel/migrations/0315_auto_20241015_1027.py new file mode 100644 index 0000000..3c81dd8 --- /dev/null +++ b/panel/migrations/0315_auto_20241015_1027.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-10-15 10:27 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0314_auto_20241012_1226'), + ] + + operations = [ + migrations.RemoveField( + model_name='internaltransaction', + name='poultry_request', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 27, 5, 42750)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 27, 4, 899314)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 27, 4, 899314)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 27, 4, 899314)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 27, 4, 899314)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 27, 4, 908308)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 27, 4, 907309)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 27, 4, 907309)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 27, 4, 928297)), + ), + ] diff --git a/panel/migrations/0316_auto_20241015_1036.py b/panel/migrations/0316_auto_20241015_1036.py new file mode 100644 index 0000000..9136c2b --- /dev/null +++ b/panel/migrations/0316_auto_20241015_1036.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-10-15 10:36 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0315_auto_20241015_1027'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='poultry_request', + field=models.ManyToManyField(blank=True, null=True, related_name='poutry_request_transactions', to='panel.PoultryRequest'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 35, 54, 550482)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 35, 53, 401345)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 35, 53, 401345)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 35, 53, 401345)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 35, 53, 401345)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 35, 53, 409340)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 35, 53, 409340)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 35, 53, 409340)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 15, 10, 35, 53, 431327)), + ), + ] diff --git a/panel/migrations/0317_auto_20241017_1226.py b/panel/migrations/0317_auto_20241017_1226.py new file mode 100644 index 0000000..4f87b38 --- /dev/null +++ b/panel/migrations/0317_auto_20241017_1226.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-10-17 12:26 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0316_auto_20241015_1036'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='payment_link', + field=models.CharField(max_length=300, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 17, 12, 24, 40, 274885)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 17, 12, 24, 39, 11683)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 17, 12, 24, 39, 11683)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 17, 12, 24, 39, 11683)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 17, 12, 24, 39, 11683)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 17, 12, 24, 39, 245149)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 17, 12, 24, 39, 244145)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 17, 12, 24, 39, 244145)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 17, 12, 24, 39, 277137)), + ), + ] diff --git a/panel/migrations/0318_auto_20241022_1026.py b/panel/migrations/0318_auto_20241022_1026.py new file mode 100644 index 0000000..c8a57fe --- /dev/null +++ b/panel/migrations/0318_auto_20241022_1026.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-10-22 10:26 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0317_auto_20241017_1226'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 26, 9, 804487)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 26, 9, 750632)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 26, 9, 750632)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 26, 9, 750632)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 26, 9, 750632)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 26, 9, 754621)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 26, 9, 753624)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 26, 9, 753624)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 26, 9, 762600)), + ), + migrations.CreateModel( + name='KillHousePricePermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousepricepermission_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='killhousepricepermission_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0319_auto_20241022_1028.py b/panel/migrations/0319_auto_20241022_1028.py new file mode 100644 index 0000000..0fb8396 --- /dev/null +++ b/panel/migrations/0319_auto_20241022_1028.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-10-22 10:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0318_auto_20241022_1026'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='kill_house_price', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 28, 1, 762873)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 28, 1, 703033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 28, 1, 703033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 28, 1, 703033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 28, 1, 703033)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 28, 1, 707022)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 28, 1, 707022)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 28, 1, 707022)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 22, 10, 28, 1, 715001)), + ), + ] diff --git a/panel/migrations/0320_auto_20241023_1309.py b/panel/migrations/0320_auto_20241023_1309.py new file mode 100644 index 0000000..73af8f9 --- /dev/null +++ b/panel/migrations/0320_auto_20241023_1309.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2024-10-23 13:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0319_auto_20241022_1028'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='direct_losses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='direct_losses_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='direct_losses_editor', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='direct_losses_inputer', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='direct_losses_last_edit_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 8, 55, 412392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 8, 55, 357891)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 8, 55, 357891)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 8, 55, 357891)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 8, 55, 357891)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 8, 55, 361369)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 8, 55, 361369)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 8, 55, 361369)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 8, 55, 370062)), + ), + ] diff --git a/panel/migrations/0321_auto_20241023_1326.py b/panel/migrations/0321_auto_20241023_1326.py new file mode 100644 index 0000000..c1afca5 --- /dev/null +++ b/panel/migrations/0321_auto_20241023_1326.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-10-23 13:26 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0320_auto_20241023_1309'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='total_losses', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 26, 2, 979501)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 26, 2, 925602)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 26, 2, 925602)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 26, 2, 925602)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 26, 2, 925602)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 26, 2, 929079)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 26, 2, 929079)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 26, 2, 929079)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 23, 13, 26, 2, 937773)), + ), + ] diff --git a/panel/migrations/0322_auto_20241024_0931.py b/panel/migrations/0322_auto_20241024_0931.py new file mode 100644 index 0000000..3c8aa57 --- /dev/null +++ b/panel/migrations/0322_auto_20241024_0931.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-10-24 09:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0321_auto_20241023_1326'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='violation_message', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 9, 31, 4, 529543)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 9, 31, 4, 481794)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 9, 31, 4, 481794)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 9, 31, 4, 481794)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 9, 31, 4, 481794)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 9, 31, 4, 481794)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 9, 31, 4, 481794)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 9, 31, 4, 481794)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 9, 31, 4, 497574)), + ), + ] diff --git a/panel/migrations/0323_auto_20241024_2016.py b/panel/migrations/0323_auto_20241024_2016.py new file mode 100644 index 0000000..641e9bc --- /dev/null +++ b/panel/migrations/0323_auto_20241024_2016.py @@ -0,0 +1,78 @@ +# Generated by Django 3.2.13 on 2024-10-24 20:16 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0322_auto_20241024_0931'), + ] + + operations = [ + migrations.CreateModel( + name='IranProvinces', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=19)), + ('slug', models.CharField(max_length=17)), + ('tel_prefix', models.CharField(max_length=3, null=True)), + ], + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 15, 50, 554224)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 15, 50, 505589)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 15, 50, 505589)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 15, 50, 505589)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 15, 50, 505589)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 15, 50, 508588)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 15, 50, 508588)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 15, 50, 508588)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 15, 50, 515594)), + ), + migrations.CreateModel( + name='IranCities', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=17)), + ('slug', models.CharField(max_length=26)), + ('province_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='panel.iranprovinces')), + ], + ), + ] diff --git a/panel/migrations/0324_auto_20241024_2018.py b/panel/migrations/0324_auto_20241024_2018.py new file mode 100644 index 0000000..e98474e --- /dev/null +++ b/panel/migrations/0324_auto_20241024_2018.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-10-24 20:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0323_auto_20241024_2016'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 1, 47441)), + ), + migrations.AlterField( + model_name='irancities', + name='name', + field=models.CharField(max_length=250), + ), + migrations.AlterField( + model_name='irancities', + name='slug', + field=models.CharField(max_length=250), + ), + migrations.AlterField( + model_name='iranprovinces', + name='name', + field=models.CharField(max_length=250), + ), + migrations.AlterField( + model_name='iranprovinces', + name='slug', + field=models.CharField(max_length=250), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 0, 990919)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 0, 990919)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 0, 990919)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 0, 990919)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 0, 993918)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 0, 993918)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 0, 993918)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 1, 1920)), + ), + ] diff --git a/panel/migrations/0325_auto_20241024_2018.py b/panel/migrations/0325_auto_20241024_2018.py new file mode 100644 index 0000000..d3112c2 --- /dev/null +++ b/panel/migrations/0325_auto_20241024_2018.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2024-10-24 20:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0324_auto_20241024_2018'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 18, 330457)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 18, 274490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 18, 274490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 18, 274490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 18, 274490)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 18, 279491)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 18, 279491)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 18, 279491)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 24, 20, 18, 18, 286493)), + ), + ] diff --git a/panel/migrations/0326_auto_20241026_0950.py b/panel/migrations/0326_auto_20241026_0950.py new file mode 100644 index 0000000..ef79428 --- /dev/null +++ b/panel/migrations/0326_auto_20241026_0950.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-10-26 09:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0325_auto_20241024_2018'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='total_free_commitment_quantity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='total_free_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 9, 50, 41, 702285)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 9, 50, 41, 650395)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 9, 50, 41, 650395)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 9, 50, 41, 650395)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 9, 50, 41, 650395)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 9, 50, 41, 653520)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 9, 50, 41, 653520)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 9, 50, 41, 653520)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 9, 50, 41, 661195)), + ), + ] diff --git a/panel/migrations/0327_auto_20241026_1309.py b/panel/migrations/0327_auto_20241026_1309.py new file mode 100644 index 0000000..12edab3 --- /dev/null +++ b/panel/migrations/0327_auto_20241026_1309.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-10-26 13:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0326_auto_20241026_0950'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='commitment_type', + field=models.CharField(default='govermental', max_length=20), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 13, 9, 24, 947395)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 13, 9, 24, 882225)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 13, 9, 24, 882225)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 13, 9, 24, 882225)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 13, 9, 24, 882225)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 13, 9, 24, 898342)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 13, 9, 24, 898342)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 13, 9, 24, 898342)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 26, 13, 9, 24, 898342)), + ), + ] diff --git a/panel/migrations/0328_auto_20241029_1116.py b/panel/migrations/0328_auto_20241029_1116.py new file mode 100644 index 0000000..c80baf3 --- /dev/null +++ b/panel/migrations/0328_auto_20241029_1116.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.13 on 2024-10-29 11:16 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0050_auto_20241029_1116'), + ('panel', '0327_auto_20241026_1309'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 785111)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 730745)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 730745)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 730745)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 730745)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 734223)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 734223)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 734223)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 10, 29, 11, 16, 42, 742915)), + ), + migrations.CreateModel( + name='BaseOutProvinceCarcassesBuyer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('fullname', models.CharField(max_length=200, null=True)), + ('first_name', models.CharField(max_length=200, null=True)), + ('last_name', models.CharField(max_length=200, null=True)), + ('mobile', models.CharField(max_length=11, null=True)), + ('unit_name', models.CharField(max_length=300, null=True)), + ('city', models.CharField(max_length=300, null=True)), + ('province', models.CharField(max_length=300, null=True)), + ('active', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='baseoutprovincecarcassesbuyer_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='baseoutprovincecarcassesbuyer_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='base_buyer_user', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='outprovincecarcassesbuyer', + name='buyer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='base_buyer', to='panel.baseoutprovincecarcassesbuyer'), + ), + ] diff --git a/panel/migrations/0329_auto_20241103_0927.py b/panel/migrations/0329_auto_20241103_0927.py new file mode 100644 index 0000000..09e014a --- /dev/null +++ b/panel/migrations/0329_auto_20241103_0927.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-03 09:27 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0328_auto_20241029_1116'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='violation_image1', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 27, 42, 624676)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 27, 42, 570320)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 27, 42, 570320)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 27, 42, 570320)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 27, 42, 570320)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 27, 42, 573416)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 27, 42, 573416)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 27, 42, 573416)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 27, 42, 582091)), + ), + ] diff --git a/panel/migrations/0330_auto_20241103_0936.py b/panel/migrations/0330_auto_20241103_0936.py new file mode 100644 index 0000000..c093f14 --- /dev/null +++ b/panel/migrations/0330_auto_20241103_0936.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-11-03 09:36 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0329_auto_20241103_0927'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultryhatching', + name='violation_image', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 36, 8, 826621)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 36, 8, 773093)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 36, 8, 773093)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 36, 8, 773093)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 36, 8, 773093)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 36, 8, 776198)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 36, 8, 776198)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 36, 8, 776198)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 36, 8, 783900)), + ), + ] diff --git a/panel/migrations/0331_auto_20241103_0938.py b/panel/migrations/0331_auto_20241103_0938.py new file mode 100644 index 0000000..1918cb0 --- /dev/null +++ b/panel/migrations/0331_auto_20241103_0938.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-03 09:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0330_auto_20241103_0936'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='violation_image', + field=models.JSONField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 38, 23, 209006)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 38, 23, 157271)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 38, 23, 157271)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 38, 23, 157271)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 38, 23, 157271)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 38, 23, 160263)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 38, 23, 160263)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 38, 23, 160263)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 38, 23, 168735)), + ), + ] diff --git a/panel/migrations/0332_auto_20241103_0939.py b/panel/migrations/0332_auto_20241103_0939.py new file mode 100644 index 0000000..211f3dd --- /dev/null +++ b/panel/migrations/0332_auto_20241103_0939.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-03 09:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0331_auto_20241103_0938'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 39, 7, 89194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 39, 7, 21375)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 39, 7, 21375)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 39, 7, 21375)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 39, 7, 21375)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 39, 7, 25365)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 39, 7, 25365)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 39, 7, 25365)), + ), + migrations.AlterField( + model_name='poultryhatching', + name='violation_image', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 39, 7, 34340)), + ), + ] diff --git a/panel/migrations/0333_auto_20241103_0947.py b/panel/migrations/0333_auto_20241103_0947.py new file mode 100644 index 0000000..a57b20d --- /dev/null +++ b/panel/migrations/0333_auto_20241103_0947.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-11-03 09:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0332_auto_20241103_0939'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultryhatching', + name='violation_image1', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 46, 53, 252329)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 46, 53, 191990)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 46, 53, 191990)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 46, 53, 191990)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 46, 53, 191990)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 46, 53, 196369)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 46, 53, 196369)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 46, 53, 196369)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 3, 9, 46, 53, 204600)), + ), + ] diff --git a/panel/migrations/0334_auto_20241104_1433.py b/panel/migrations/0334_auto_20241104_1433.py new file mode 100644 index 0000000..8859c53 --- /dev/null +++ b/panel/migrations/0334_auto_20241104_1433.py @@ -0,0 +1,324 @@ +# Generated by Django 3.2.13 on 2024-11-04 14:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0333_auto_20241103_0947'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='free_accepted_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_accepted_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_free_sale_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_free_sale_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_freezing_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_freezing_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_real_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_real_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_rejected_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_rejected_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_returned_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_returned_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_accepted_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_accepted_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_free_sale_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_free_sale_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_freezing_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_freezing_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_real_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_real_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_rejected_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_rejected_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_returned_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_returned_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_free_accepted_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_free_bars', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_free_rejected_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_free_returned_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_governmental_accepted_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_governmental_rejected_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_governmental_returned_allocations', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_province_free_bars', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='number_of_province_governmental_bars', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_free_live_bars_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_free_live_bars_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_free_live_bars_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_free_live_bars_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_governmental_live_bars_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_governmental_live_bars_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_governmental_live_bars_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_governmental_live_bars_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_free_bars_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_free_bars_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_free_bars_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_free_bars_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_free_remain_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_free_remain_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_governmental_remain_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_governmental_remain_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 14, 33, 30, 287782)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 14, 33, 30, 234799)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 14, 33, 30, 234799)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 14, 33, 30, 234799)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 14, 33, 30, 234799)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 14, 33, 30, 237791)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 14, 33, 30, 237791)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 14, 33, 30, 237791)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 14, 33, 30, 245769)), + ), + ] diff --git a/panel/migrations/0335_auto_20241104_2248.py b/panel/migrations/0335_auto_20241104_2248.py new file mode 100644 index 0000000..c4210fb --- /dev/null +++ b/panel/migrations/0335_auto_20241104_2248.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2024-11-04 22:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0334_auto_20241104_1433'), + ] + + operations = [ + migrations.RemoveField( + model_name='rolesproducts', + name='live_bars_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='live_bars_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='live_bars_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='live_bars_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_live_bars', + ), + migrations.AddField( + model_name='rolesproducts', + name='total_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 22, 47, 22, 632356)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 22, 47, 22, 486409)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 22, 47, 22, 486409)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 22, 47, 22, 486409)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 22, 47, 22, 486409)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 22, 47, 22, 497407)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 22, 47, 22, 497407)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 22, 47, 22, 497407)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 4, 22, 47, 22, 518906)), + ), + ] diff --git a/panel/migrations/0336_auto_20241105_0834.py b/panel/migrations/0336_auto_20241105_0834.py new file mode 100644 index 0000000..f9d7013 --- /dev/null +++ b/panel/migrations/0336_auto_20241105_0834.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-11-05 08:34 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0335_auto_20241104_2248'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='name', + field=models.CharField(max_length=300, null=True), + ), + migrations.AddField( + model_name='rolesproducts', + name='weight_average', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 8, 34, 37, 733110)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 8, 34, 37, 685808)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 8, 34, 37, 685808)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 8, 34, 37, 685808)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 8, 34, 37, 685808)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 8, 34, 37, 685808)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 8, 34, 37, 685808)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 8, 34, 37, 685808)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 8, 34, 37, 685808)), + ), + ] diff --git a/panel/migrations/0337_auto_20241105_2335.py b/panel/migrations/0337_auto_20241105_2335.py new file mode 100644 index 0000000..c4cdbd1 --- /dev/null +++ b/panel/migrations/0337_auto_20241105_2335.py @@ -0,0 +1,83 @@ +# Generated by Django 3.2.13 on 2024-11-05 23:35 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0336_auto_20241105_0834'), + ] + + operations = [ + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_free_sale_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_free_sale_weight', + ), + migrations.AddField( + model_name='coldhouseallocations', + name='allocation_type', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='coldhouseallocations', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_allocations_kill_house', to='panel.killhouse'), + ), + migrations.AddField( + model_name='stewardallocation', + name='sale_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 23, 34, 57, 315592)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 23, 34, 57, 262053)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 23, 34, 57, 262053)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 23, 34, 57, 262053)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 23, 34, 57, 262053)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 23, 34, 57, 265051)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 23, 34, 57, 265051)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 23, 34, 57, 265051)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 5, 23, 34, 57, 273046)), + ), + ] diff --git a/panel/migrations/0338_auto_20241106_1605.py b/panel/migrations/0338_auto_20241106_1605.py new file mode 100644 index 0000000..6549d37 --- /dev/null +++ b/panel/migrations/0338_auto_20241106_1605.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-11-06 16:05 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0337_auto_20241105_2335'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouseallocations', + name='product', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_allocations_product', to='panel.rolesproducts'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 6, 16, 5, 26, 780042)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 6, 16, 5, 26, 732512)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 6, 16, 5, 26, 732512)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 6, 16, 5, 26, 732512)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 6, 16, 5, 26, 732512)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 6, 16, 5, 26, 736062)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 6, 16, 5, 26, 736062)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 6, 16, 5, 26, 736062)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 6, 16, 5, 26, 743017)), + ), + ] diff --git a/panel/migrations/0339_auto_20241107_1047.py b/panel/migrations/0339_auto_20241107_1047.py new file mode 100644 index 0000000..b2c8cf4 --- /dev/null +++ b/panel/migrations/0339_auto_20241107_1047.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-11-07 10:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0338_auto_20241106_1605'), + ] + + operations = [ + migrations.RemoveField( + model_name='stewardallocation', + name='steward', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 47, 29, 442024)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 47, 29, 396578)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 47, 29, 396578)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 47, 29, 396578)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 47, 29, 396578)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 47, 29, 400054)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 47, 29, 398315)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 47, 29, 398315)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 47, 29, 407008)), + ), + ] diff --git a/panel/migrations/0340_auto_20241107_1055.py b/panel/migrations/0340_auto_20241107_1055.py new file mode 100644 index 0000000..60d2d56 --- /dev/null +++ b/panel/migrations/0340_auto_20241107_1055.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-11-07 10:55 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0339_auto_20241107_1047'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_steward_allocation', to='panel.guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 55, 45, 512087)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 55, 45, 456180)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 55, 45, 456180)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 55, 45, 456180)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 55, 45, 456180)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 55, 45, 456180)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 55, 45, 456180)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 55, 45, 456180)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 10, 55, 45, 471853)), + ), + ] diff --git a/panel/migrations/0341_auto_20241107_1450.py b/panel/migrations/0341_auto_20241107_1450.py new file mode 100644 index 0000000..d3f4268 --- /dev/null +++ b/panel/migrations/0341_auto_20241107_1450.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-11-07 14:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0340_auto_20241107_1055'), + ] + + operations = [ + migrations.RemoveField( + model_name='stewardallocation', + name='to_steward', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 50, 46, 40322)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 50, 45, 993033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 50, 45, 993033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 50, 45, 993033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 50, 45, 993033)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 50, 45, 993033)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 50, 45, 993033)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 50, 45, 993033)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 50, 46, 8781)), + ), + ] diff --git a/panel/migrations/0342_auto_20241107_1456.py b/panel/migrations/0342_auto_20241107_1456.py new file mode 100644 index 0000000..92c2a12 --- /dev/null +++ b/panel/migrations/0342_auto_20241107_1456.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-11-07 14:56 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0341_auto_20241107_1450'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='to_steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocation_to_steward', to='panel.guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 56, 46, 371033)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 56, 46, 312755)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 56, 46, 312755)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 56, 46, 312755)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 56, 46, 312755)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 56, 46, 323790)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 56, 46, 323790)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 56, 46, 323790)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 7, 14, 56, 46, 323790)), + ), + ] diff --git a/panel/migrations/0343_auto_20241108_1518.py b/panel/migrations/0343_auto_20241108_1518.py new file mode 100644 index 0000000..3a4451d --- /dev/null +++ b/panel/migrations/0343_auto_20241108_1518.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-11-08 15:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0342_auto_20241107_1456'), + ] + + operations = [ + migrations.RemoveField( + model_name='stewardfreebarinformation', + name='steward', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 18, 44, 457986)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 18, 44, 393024)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 18, 44, 392024)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 18, 44, 393024)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 18, 44, 392024)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 18, 44, 397022)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 18, 44, 397022)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 18, 44, 397022)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 18, 44, 407015)), + ), + ] diff --git a/panel/migrations/0344_auto_20241108_1527.py b/panel/migrations/0344_auto_20241108_1527.py new file mode 100644 index 0000000..d4f0ee2 --- /dev/null +++ b/panel/migrations/0344_auto_20241108_1527.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-11-08 15:27 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0343_auto_20241108_1518'), + ] + + operations = [ + migrations.AddField( + model_name='stewardfreebarinformation', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_steward', to='panel.guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 27, 21, 441695)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 27, 20, 954396)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 27, 20, 954396)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 27, 20, 954396)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 27, 20, 954396)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 27, 20, 960393)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 27, 20, 960393)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 27, 20, 960393)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 27, 20, 978382)), + ), + ] diff --git a/panel/migrations/0345_auto_20241108_1547.py b/panel/migrations/0345_auto_20241108_1547.py new file mode 100644 index 0000000..418badf --- /dev/null +++ b/panel/migrations/0345_auto_20241108_1547.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-11-08 15:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0344_auto_20241108_1527'), + ] + + operations = [ + migrations.RemoveField( + model_name='stewardfreesalebarinformation', + name='steward', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 46, 40, 173215)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 46, 40, 70756)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 46, 40, 70756)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 46, 40, 70756)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 46, 40, 70756)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 46, 40, 78267)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 46, 40, 78267)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 46, 40, 78267)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 46, 40, 98255)), + ), + ] diff --git a/panel/migrations/0346_auto_20241108_1552.py b/panel/migrations/0346_auto_20241108_1552.py new file mode 100644 index 0000000..4144fe7 --- /dev/null +++ b/panel/migrations/0346_auto_20241108_1552.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-11-08 15:52 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0345_auto_20241108_1547'), + ] + + operations = [ + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_steward', to='panel.guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 52, 12, 508750)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 52, 12, 393303)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 52, 12, 393303)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 52, 12, 393303)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 52, 12, 393303)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 52, 12, 403296)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 52, 12, 403296)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 52, 12, 403296)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 8, 15, 52, 12, 420287)), + ), + ] diff --git a/panel/migrations/0347_auto_20241109_1406.py b/panel/migrations/0347_auto_20241109_1406.py new file mode 100644 index 0000000..d87a6d5 --- /dev/null +++ b/panel/migrations/0347_auto_20241109_1406.py @@ -0,0 +1,73 @@ +# Generated by Django 3.2.13 on 2024-11-09 14:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0346_auto_20241108_1552'), + ] + + operations = [ + migrations.RemoveField( + model_name='chaincompany', + name='address', + ), + migrations.AddField( + model_name='chaincompany', + name='city', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='chaincompany', + name='province', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 6, 1, 926932)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 6, 1, 875069)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 6, 1, 875069)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 6, 1, 875069)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 6, 1, 875069)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 6, 1, 876074)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 6, 1, 876074)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 6, 1, 876074)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 6, 1, 876074)), + ), + ] diff --git a/panel/migrations/0348_auto_20241109_1421.py b/panel/migrations/0348_auto_20241109_1421.py new file mode 100644 index 0000000..e82a4ce --- /dev/null +++ b/panel/migrations/0348_auto_20241109_1421.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-09 14:21 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0347_auto_20241109_1406'), + ] + + operations = [ + migrations.AddField( + model_name='chaincompany', + name='address', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 21, 6, 23616)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 21, 5, 973191)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 21, 5, 973191)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 21, 5, 973191)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 21, 5, 973191)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 21, 5, 976672)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 21, 5, 976672)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 21, 5, 976672)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 14, 21, 5, 983626)), + ), + ] diff --git a/panel/migrations/0349_auto_20241109_1506.py b/panel/migrations/0349_auto_20241109_1506.py new file mode 100644 index 0000000..a60ddb0 --- /dev/null +++ b/panel/migrations/0349_auto_20241109_1506.py @@ -0,0 +1,66 @@ +# Generated by Django 3.2.13 on 2024-11-09 15:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0348_auto_20241109_1421'), + ] + + operations = [ + migrations.CreateModel( + name='AutomaticDirectBuyingPermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('allow', models.BooleanField(default=False)), + ], + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 6, 42, 83357)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 6, 42, 20253)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 6, 42, 20253)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 6, 42, 20253)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 6, 42, 20253)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 6, 42, 20253)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 6, 42, 20253)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 6, 42, 20253)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 6, 42, 43368)), + ), + ] diff --git a/panel/migrations/0350_auto_20241109_1555.py b/panel/migrations/0350_auto_20241109_1555.py new file mode 100644 index 0000000..b910b67 --- /dev/null +++ b/panel/migrations/0350_auto_20241109_1555.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-09 15:55 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0349_auto_20241109_1506'), + ] + + operations = [ + migrations.AddField( + model_name='chaincompany', + name='postal_code', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 55, 9, 737274)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 55, 9, 664271)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 55, 9, 664271)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 55, 9, 664271)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 55, 9, 664271)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 55, 9, 680124)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 55, 9, 680124)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 55, 9, 680124)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 15, 55, 9, 680124)), + ), + ] diff --git a/panel/migrations/0351_auto_20241109_2036.py b/panel/migrations/0351_auto_20241109_2036.py new file mode 100644 index 0000000..b5feaf7 --- /dev/null +++ b/panel/migrations/0351_auto_20241109_2036.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-11-09 20:36 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0350_auto_20241109_1555'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='breeding_unique_id', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='licence_number', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 20, 35, 48, 461905)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 20, 35, 48, 392342)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 20, 35, 48, 392342)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 20, 35, 48, 392342)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 20, 35, 48, 392342)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 20, 35, 48, 397304)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 20, 35, 48, 397304)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 20, 35, 48, 397304)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 9, 20, 35, 48, 404928)), + ), + ] diff --git a/panel/migrations/0352_auto_20241110_1035.py b/panel/migrations/0352_auto_20241110_1035.py new file mode 100644 index 0000000..e229353 --- /dev/null +++ b/panel/migrations/0352_auto_20241110_1035.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-10 10:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0351_auto_20241109_2036'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='free_direct_buying', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 10, 35, 32, 176021)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 10, 35, 32, 134688)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 10, 35, 32, 134688)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 10, 35, 32, 134688)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 10, 35, 32, 134688)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 10, 35, 32, 134688)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 10, 35, 32, 134688)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 10, 35, 32, 134688)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 10, 35, 32, 144494)), + ), + ] diff --git a/panel/migrations/0353_auto_20241110_1345.py b/panel/migrations/0353_auto_20241110_1345.py new file mode 100644 index 0000000..ccdb5b7 --- /dev/null +++ b/panel/migrations/0353_auto_20241110_1345.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-11-10 13:45 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0352_auto_20241110_1035'), + ] + + operations = [ + migrations.AddField( + model_name='automaticdirectbuyingpermission', + name='end_hour', + field=models.CharField(max_length=5, null=True), + ), + migrations.AddField( + model_name='automaticdirectbuyingpermission', + name='start_hour', + field=models.CharField(max_length=5, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 45, 23, 924135)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 45, 23, 876406)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 45, 23, 876406)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 45, 23, 876406)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 45, 23, 876406)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 45, 23, 876406)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 45, 23, 876406)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 45, 23, 876406)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 45, 23, 876406)), + ), + ] diff --git a/panel/migrations/0354_auto_20241110_1354.py b/panel/migrations/0354_auto_20241110_1354.py new file mode 100644 index 0000000..b311832 --- /dev/null +++ b/panel/migrations/0354_auto_20241110_1354.py @@ -0,0 +1,77 @@ +# Generated by Django 3.2.13 on 2024-11-10 13:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0353_auto_20241110_1345'), + ] + + operations = [ + migrations.RemoveField( + model_name='automaticdirectbuyingpermission', + name='end_hour', + ), + migrations.RemoveField( + model_name='automaticdirectbuyingpermission', + name='start_hour', + ), + migrations.AddField( + model_name='automaticdirectbuyingpermission', + name='end_time', + field=models.TimeField(null=True), + ), + migrations.AddField( + model_name='automaticdirectbuyingpermission', + name='start_time', + field=models.TimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 53, 51, 911213)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 53, 51, 858915)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 53, 51, 858915)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 53, 51, 858915)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 53, 51, 858915)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 53, 51, 862008)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 53, 51, 862008)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 53, 51, 862008)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 13, 53, 51, 870258)), + ), + ] diff --git a/panel/migrations/0355_auto_20241110_2306.py b/panel/migrations/0355_auto_20241110_2306.py new file mode 100644 index 0000000..47c4e2f --- /dev/null +++ b/panel/migrations/0355_auto_20241110_2306.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-10 23:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0354_auto_20241110_1354'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='archive_wage', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 23, 5, 7, 958712)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 23, 5, 7, 33078)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 23, 5, 7, 33078)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 23, 5, 7, 33078)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 23, 5, 7, 33078)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 23, 5, 7, 280487)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 23, 5, 7, 280487)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 23, 5, 7, 280487)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 10, 23, 5, 7, 301476)), + ), + ] diff --git a/panel/migrations/0356_auto_20241112_1250.py b/panel/migrations/0356_auto_20241112_1250.py new file mode 100644 index 0000000..990f3cf --- /dev/null +++ b/panel/migrations/0356_auto_20241112_1250.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2024-11-12 12:50 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0355_auto_20241110_2306'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 12, 50, 15, 210167)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 12, 50, 15, 142359)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 12, 50, 15, 142359)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 12, 50, 15, 142359)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 12, 50, 15, 142359)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 12, 50, 15, 145837)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 12, 50, 15, 145837)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 12, 50, 15, 145837)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 12, 50, 15, 154530)), + ), + migrations.CreateModel( + name='AgeNotificationPoultry', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('message', models.TextField()), + ('poultry_age', models.CharField(max_length=2)), + ('hour_send', models.CharField(max_length=2)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='agenotificationpoultry_createdby', to=settings.AUTH_USER_MODEL)), + ('hatching', models.ManyToManyField(null=True, related_name='poultry_hatching_age_notification', to='panel.PoultryHatching')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='agenotificationpoultry_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0357_auto_20241112_1332.py b/panel/migrations/0357_auto_20241112_1332.py new file mode 100644 index 0000000..313fdce --- /dev/null +++ b/panel/migrations/0357_auto_20241112_1332.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-12 13:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0356_auto_20241112_1250'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='interface_number', + field=models.CharField(max_length=11, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 13, 32, 4, 138426)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 13, 32, 4, 88006)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 13, 32, 4, 88006)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 13, 32, 4, 88006)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 13, 32, 4, 88006)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 13, 32, 4, 91482)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 13, 32, 4, 91482)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 13, 32, 4, 91482)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 13, 32, 4, 98437)), + ), + ] diff --git a/panel/migrations/0358_auto_20241112_1459.py b/panel/migrations/0358_auto_20241112_1459.py new file mode 100644 index 0000000..8664379 --- /dev/null +++ b/panel/migrations/0358_auto_20241112_1459.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-12 14:59 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0357_auto_20241112_1332'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='amount', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 14, 59, 1, 503664)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 14, 59, 1, 456496)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 14, 59, 1, 456496)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 14, 59, 1, 456496)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 14, 59, 1, 456496)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 14, 59, 1, 459971)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 14, 59, 1, 459971)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 14, 59, 1, 459971)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 14, 59, 1, 468664)), + ), + ] diff --git a/panel/migrations/0359_auto_20241112_1511.py b/panel/migrations/0359_auto_20241112_1511.py new file mode 100644 index 0000000..22b8644 --- /dev/null +++ b/panel/migrations/0359_auto_20241112_1511.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-11-12 15:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0358_auto_20241112_1459'), + ] + + operations = [ + migrations.RemoveField( + model_name='agenotificationpoultry', + name='hatching', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 15, 11, 40, 307194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 15, 11, 40, 247335)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 15, 11, 40, 247335)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 15, 11, 40, 247335)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 15, 11, 40, 247335)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 15, 11, 40, 250343)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 15, 11, 40, 250343)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 15, 11, 40, 250343)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 12, 15, 11, 40, 259347)), + ), + ] diff --git a/panel/migrations/0360_auto_20241113_1050.py b/panel/migrations/0360_auto_20241113_1050.py new file mode 100644 index 0000000..3418d53 --- /dev/null +++ b/panel/migrations/0360_auto_20241113_1050.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2024-11-13 10:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0359_auto_20241112_1511'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 50, 36, 738892)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 50, 36, 687128)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 50, 36, 687128)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 50, 36, 687128)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 50, 36, 687128)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 50, 36, 690426)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 50, 36, 690426)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 50, 36, 690426)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 50, 36, 698675)), + ), + ] diff --git a/panel/migrations/0361_auto_20241113_1058.py b/panel/migrations/0361_auto_20241113_1058.py new file mode 100644 index 0000000..4451dd0 --- /dev/null +++ b/panel/migrations/0361_auto_20241113_1058.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-11-13 10:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0360_auto_20241113_1050'), + ] + + operations = [ + migrations.RemoveField( + model_name='guilds', + name='stewards', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 57, 54, 689819)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 57, 54, 635980)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 57, 54, 635980)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 57, 54, 635980)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 57, 54, 635980)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 57, 54, 640109)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 57, 54, 640109)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 57, 54, 640109)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 10, 57, 54, 648163)), + ), + ] diff --git a/panel/migrations/0362_auto_20241113_1102.py b/panel/migrations/0362_auto_20241113_1102.py new file mode 100644 index 0000000..356fa07 --- /dev/null +++ b/panel/migrations/0362_auto_20241113_1102.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-13 11:02 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0361_auto_20241113_1058'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='stewards', + field=models.ManyToManyField(blank=True, related_name='_panel_guilds_stewards_+', to='panel.Guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 11, 2, 33, 982127)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 11, 2, 33, 930485)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 11, 2, 33, 930485)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 11, 2, 33, 930485)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 11, 2, 33, 930485)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 11, 2, 33, 933533)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 11, 2, 33, 933533)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 11, 2, 33, 933533)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 13, 11, 2, 33, 940751)), + ), + ] diff --git a/panel/migrations/0363_auto_20241114_1345.py b/panel/migrations/0363_auto_20241114_1345.py new file mode 100644 index 0000000..3ecfb76 --- /dev/null +++ b/panel/migrations/0363_auto_20241114_1345.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-14 13:45 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0362_auto_20241113_1102'), + ] + + operations = [ + migrations.AddField( + model_name='newproduct', + name='image', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 14, 13, 45, 8, 923802)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 14, 13, 45, 8, 871217)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 14, 13, 45, 8, 871217)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 14, 13, 45, 8, 871217)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 14, 13, 45, 8, 871217)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 14, 13, 45, 8, 874694)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 14, 13, 45, 8, 874694)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 14, 13, 45, 8, 874694)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 14, 13, 45, 8, 874694)), + ), + ] diff --git a/panel/migrations/0364_auto_20241115_1217.py b/panel/migrations/0364_auto_20241115_1217.py new file mode 100644 index 0000000..70e86df --- /dev/null +++ b/panel/migrations/0364_auto_20241115_1217.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-11-15 12:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0363_auto_20241114_1345'), + ] + + operations = [ + migrations.AddField( + model_name='posmachine', + name='company_name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='posmachine', + name='last_check', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 15, 12, 14, 51, 332362)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 15, 12, 14, 49, 965749)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 15, 12, 14, 49, 965749)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 15, 12, 14, 49, 965749)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 15, 12, 14, 49, 965749)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 15, 12, 14, 49, 978742)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 15, 12, 14, 49, 978742)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 15, 12, 14, 49, 978742)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 15, 12, 14, 50, 336648)), + ), + ] diff --git a/panel/migrations/0365_auto_20241116_0944.py b/panel/migrations/0365_auto_20241116_0944.py new file mode 100644 index 0000000..20b080f --- /dev/null +++ b/panel/migrations/0365_auto_20241116_0944.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-11-16 09:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0364_auto_20241115_1217'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='approved_price', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_price', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 9, 44, 17, 85123)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 9, 44, 17, 37613)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 9, 44, 17, 37613)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 9, 44, 17, 37613)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 9, 44, 17, 37613)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 9, 44, 17, 37613)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 9, 44, 17, 37613)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 9, 44, 17, 37613)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 9, 44, 17, 53766)), + ), + ] diff --git a/panel/migrations/0366_auto_20241116_1121.py b/panel/migrations/0366_auto_20241116_1121.py new file mode 100644 index 0000000..da40702 --- /dev/null +++ b/panel/migrations/0366_auto_20241116_1121.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-11-16 11:21 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0365_auto_20241116_0944'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='pos_free_real_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='pos_governmental_real_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='pos_real_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 21, 10, 208447)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 21, 10, 161061)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 21, 10, 161061)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 21, 10, 161061)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 21, 10, 161061)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 21, 10, 161061)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 21, 10, 161061)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 21, 10, 161061)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 21, 10, 176852)), + ), + ] diff --git a/panel/migrations/0367_auto_20241116_1144.py b/panel/migrations/0367_auto_20241116_1144.py new file mode 100644 index 0000000..423ba66 --- /dev/null +++ b/panel/migrations/0367_auto_20241116_1144.py @@ -0,0 +1,67 @@ +# Generated by Django 3.2.13 on 2024-11-16 11:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0366_auto_20241116_1121'), + ] + + operations = [ + migrations.RemoveField( + model_name='newproduct', + name='approved_price', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='approved_price', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 43, 57, 326180)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 43, 57, 278816)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 43, 57, 278816)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 43, 57, 278816)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 43, 57, 278816)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 43, 57, 278816)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 43, 57, 278816)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 43, 57, 278816)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 43, 57, 294564)), + ), + ] diff --git a/panel/migrations/0368_auto_20241116_1148.py b/panel/migrations/0368_auto_20241116_1148.py new file mode 100644 index 0000000..6f288ab --- /dev/null +++ b/panel/migrations/0368_auto_20241116_1148.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-16 11:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0367_auto_20241116_1144'), + ] + + operations = [ + migrations.AddField( + model_name='newproduct', + name='approved_price', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 48, 4, 938713)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 48, 4, 897351)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 48, 4, 897351)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 48, 4, 897351)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 48, 4, 897351)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 48, 4, 901367)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 48, 4, 901367)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 48, 4, 901367)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 16, 11, 48, 4, 909131)), + ), + ] diff --git a/panel/migrations/0369_auto_20241117_1013.py b/panel/migrations/0369_auto_20241117_1013.py new file mode 100644 index 0000000..c13d6e0 --- /dev/null +++ b/panel/migrations/0369_auto_20241117_1013.py @@ -0,0 +1,85 @@ +# Generated by Django 3.2.13 on 2024-11-17 10:13 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0368_auto_20241116_1148'), + ] + + operations = [ + migrations.RemoveField( + model_name='guilds', + name='stewards', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 13, 1, 521581)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 13, 1, 468920)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 13, 1, 468920)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 13, 1, 468920)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 13, 1, 468920)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 13, 1, 472910)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 13, 1, 472910)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 13, 1, 472910)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 13, 1, 481238)), + ), + migrations.CreateModel( + name='GuildSteward', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildsteward_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='guild_to_stewards', to='panel.guilds')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildsteward_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='steward_to_guilds', to='panel.guilds')), + ], + options={ + 'unique_together': {('guild', 'steward')}, + }, + ), + ] diff --git a/panel/migrations/0370_auto_20241117_1020.py b/panel/migrations/0370_auto_20241117_1020.py new file mode 100644 index 0000000..f969517 --- /dev/null +++ b/panel/migrations/0370_auto_20241117_1020.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-17 10:20 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0369_auto_20241117_1013'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='stewards', + field=models.ManyToManyField(blank=True, related_name='guild_stewards', through='panel.GuildSteward', to='panel.Guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 19, 57, 345099)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 19, 57, 290808)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 19, 57, 290808)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 19, 57, 290808)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 19, 57, 290808)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 19, 57, 295057)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 19, 57, 295057)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 19, 57, 295057)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 10, 19, 57, 302243)), + ), + ] diff --git a/panel/migrations/0371_auto_20241117_1545.py b/panel/migrations/0371_auto_20241117_1545.py new file mode 100644 index 0000000..4deabc6 --- /dev/null +++ b/panel/migrations/0371_auto_20241117_1545.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2024-11-17 15:45 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0370_auto_20241117_1020'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='free_allocated_quantity_from', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_allocated_weight_from', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_allocated_quantity_from', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='governmental_allocated_weight_from', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_governmental_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='total_governmental_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 15, 45, 26, 248153)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 15, 45, 26, 195680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 15, 45, 26, 195680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 15, 45, 26, 195680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 15, 45, 26, 195680)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 15, 45, 26, 198772)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 15, 45, 26, 198772)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 15, 45, 26, 198772)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 15, 45, 26, 206392)), + ), + ] diff --git a/panel/migrations/0372_auto_20241117_2222.py b/panel/migrations/0372_auto_20241117_2222.py new file mode 100644 index 0000000..12c4f7d --- /dev/null +++ b/panel/migrations/0372_auto_20241117_2222.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2024-11-17 22:22 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0371_auto_20241117_1545'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 22, 22, 26, 491951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 22, 22, 26, 431458)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 22, 22, 26, 431458)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 22, 22, 26, 431458)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 22, 22, 26, 431458)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 22, 22, 26, 435455)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 22, 22, 26, 435455)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 22, 22, 26, 435455)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 17, 22, 22, 26, 443473)), + ), + migrations.CreateModel( + name='PosMachineTransactions', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('check_id', models.CharField(max_length=100, null=True)), + ('mobile', models.CharField(max_length=100, null=True)), + ('natcode', models.CharField(max_length=100, null=True)), + ('fullname', models.CharField(max_length=100, null=True)), + ('date', models.DateTimeField(null=True)), + ('price', models.BigIntegerField(default=0)), + ('paid', models.BooleanField(default=False)), + ('checkout', models.BooleanField(default=False)), + ('hasTry', models.BooleanField(default=False)), + ('state', models.IntegerField(default=0)), + ('posProvider', models.CharField(max_length=100, null=True)), + ('result', models.CharField(max_length=100, null=True)), + ('refnum', models.CharField(max_length=100, null=True)), + ('terminal', models.CharField(max_length=100, null=True)), + ('cart', models.CharField(max_length=100, null=True)), + ('weight', models.IntegerField(default=0)), + ('lng', models.FloatField(default=0)), + ('lot', models.FloatField(default=0)), + ('additional', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posmachinetransactions_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posmachinetransactions_modifiedby', to=settings.AUTH_USER_MODEL)), + ('pos', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='roles_products_pos_transactions', to='panel.posmachine')), + ('product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='roles_products_pos_transactions', to='panel.rolesproducts')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0373_auto_20241118_0811.py b/panel/migrations/0373_auto_20241118_0811.py new file mode 100644 index 0000000..e6aba59 --- /dev/null +++ b/panel/migrations/0373_auto_20241118_0811.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-18 08:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0372_auto_20241117_2222'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='steward_temp_key', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 8, 10, 49, 576544)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 8, 10, 49, 528588)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 8, 10, 49, 527080)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 8, 10, 49, 528588)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 8, 10, 49, 527080)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 8, 10, 49, 528588)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 8, 10, 49, 528588)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 8, 10, 49, 528588)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 8, 10, 49, 539929)), + ), + ] diff --git a/panel/migrations/0374_auto_20241118_0946.py b/panel/migrations/0374_auto_20241118_0946.py new file mode 100644 index 0000000..785d7bd --- /dev/null +++ b/panel/migrations/0374_auto_20241118_0946.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2024-11-18 09:46 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0373_auto_20241118_0811'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 9, 46, 4, 727351)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 9, 46, 4, 667811)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 9, 46, 4, 667811)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 9, 46, 4, 667811)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 9, 46, 4, 667811)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 9, 46, 4, 679401)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 9, 46, 4, 679401)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 9, 46, 4, 679401)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 9, 46, 4, 679401)), + ), + migrations.CreateModel( + name='BroadcastPrice', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('kill_house_price', models.FloatField(default=0)), + ('steward_price', models.FloatField(default=0)), + ('guild_price', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='broadcastprice_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='broadcastprice_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0375_auto_20241118_1054.py b/panel/migrations/0375_auto_20241118_1054.py new file mode 100644 index 0000000..02877f9 --- /dev/null +++ b/panel/migrations/0375_auto_20241118_1054.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-11-18 10:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0374_auto_20241118_0946'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='approved_price', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='approved_price_status', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 10, 54, 34, 979780)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 10, 54, 34, 914531)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 10, 54, 34, 914531)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 10, 54, 34, 914531)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 10, 54, 34, 914531)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 10, 54, 34, 930215)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 10, 54, 34, 930215)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 10, 54, 34, 930215)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 10, 54, 34, 930215)), + ), + ] diff --git a/panel/migrations/0376_auto_20241118_2152.py b/panel/migrations/0376_auto_20241118_2152.py new file mode 100644 index 0000000..878ee2d --- /dev/null +++ b/panel/migrations/0376_auto_20241118_2152.py @@ -0,0 +1,379 @@ +# Generated by Django 3.2.13 on 2024-11-18 21:52 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0375_auto_20241118_1054'), + ] + + operations = [ + migrations.RemoveField( + model_name='rolesproducts', + name='accepted_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='accepted_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='allocated_quantity_from', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='allocated_weight_from', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_accepted_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_accepted_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_allocated_quantity_from', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_allocated_weight_from', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_buying_bars_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_buying_bars_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_buying_bars_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_buying_bars_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_free_sale_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_free_sale_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_freezing_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_freezing_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_real_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_real_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_rejected_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_rejected_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_returned_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_returned_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_sale_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='free_sale_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_accepted_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_accepted_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_allocated_quantity_from', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_allocated_weight_from', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_freezing_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_freezing_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_real_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_real_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_rejected_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_rejected_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_returned_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='governmental_returned_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_accepted_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_free_accepted_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_free_bars', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_free_buying_bars', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_free_rejected_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_free_returned_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_governmental_accepted_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_governmental_rejected_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_governmental_returned_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_province_free_bars', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_province_governmental_bars', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_rejected_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='number_of_returned_allocations', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='pos_free_real_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='pos_governmental_real_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='pos_real_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='province_free_live_bars_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='province_free_live_bars_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='province_free_live_bars_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='province_free_live_bars_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='province_governmental_live_bars_carcasses_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='province_governmental_live_bars_carcasses_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='province_governmental_live_bars_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='province_governmental_live_bars_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='rejected_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='rejected_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='returned_allocated_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='returned_allocated_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_free_bars_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_free_bars_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_free_remain_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_free_remain_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_governmental_remain_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_governmental_remain_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_number_of_bars', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_quantity', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='total_weight', + ), + migrations.RemoveField( + model_name='rolesproducts', + name='weight_ave', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 51, 44, 671767)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 51, 44, 521766)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 51, 44, 521766)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 51, 44, 521766)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 51, 44, 521766)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 51, 44, 530765)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 51, 44, 530765)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 51, 44, 530765)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 51, 44, 553765)), + ), + ] diff --git a/panel/migrations/0377_auto_20241118_2157.py b/panel/migrations/0377_auto_20241118_2157.py new file mode 100644 index 0000000..1aa1872 --- /dev/null +++ b/panel/migrations/0377_auto_20241118_2157.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-11-18 21:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0376_auto_20241118_2152'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='loss_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='pos_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 57, 37, 114071)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 57, 36, 971074)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 57, 36, 971074)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 57, 36, 971074)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 57, 36, 971074)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 57, 36, 979075)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 57, 36, 979075)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 57, 36, 979075)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 21, 57, 37, 74)), + ), + ] diff --git a/panel/migrations/0378_auto_20241118_2317.py b/panel/migrations/0378_auto_20241118_2317.py new file mode 100644 index 0000000..94583e9 --- /dev/null +++ b/panel/migrations/0378_auto_20241118_2317.py @@ -0,0 +1,134 @@ +# Generated by Django 3.2.13 on 2024-11-18 23:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0377_auto_20241118_2157'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='free_buying_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='free_buying_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='out_province_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='out_province_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_allocated_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_free_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_free_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_governmental_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_governmental_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='receive_free_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='receive_free_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='receive_governmental_carcasses_quantity', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='receive_governmental_carcasses_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='stewardallocation', + name='approved_price_status', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 23, 17, 9, 597718)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 23, 17, 9, 490724)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 23, 17, 9, 490724)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 23, 17, 9, 490724)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 23, 17, 9, 490724)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 23, 17, 9, 499716)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 23, 17, 9, 499716)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 23, 17, 9, 499716)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 18, 23, 17, 9, 512715)), + ), + ] diff --git a/panel/migrations/0379_auto_20241120_0810.py b/panel/migrations/0379_auto_20241120_0810.py new file mode 100644 index 0000000..bc317a2 --- /dev/null +++ b/panel/migrations/0379_auto_20241120_0810.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-20 08:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0378_auto_20241118_2317'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='archive_wage', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 20, 8, 10, 5, 521863)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 20, 8, 10, 5, 480355)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 20, 8, 10, 5, 480355)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 20, 8, 10, 5, 480355)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 20, 8, 10, 5, 480355)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 20, 8, 10, 5, 482867)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 20, 8, 10, 5, 482867)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 20, 8, 10, 5, 482867)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 20, 8, 10, 5, 490399)), + ), + ] diff --git a/panel/migrations/0380_auto_20241126_1028.py b/panel/migrations/0380_auto_20241126_1028.py new file mode 100644 index 0000000..47f7fb1 --- /dev/null +++ b/panel/migrations/0380_auto_20241126_1028.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2024-11-26 10:28 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0379_auto_20241120_0810'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 28, 37, 755333)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 28, 37, 706047)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 28, 37, 706047)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 28, 37, 706047)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 28, 37, 706047)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 28, 37, 709792)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 28, 37, 709792)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 28, 37, 709792)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 28, 37, 717802)), + ), + migrations.CreateModel( + name='OutProvinceSaleLimitation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('kill_house', models.FloatField(default=0)), + ('steward', models.FloatField(default=0)), + ('guild', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='outprovincesalelimitation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='outprovincesalelimitation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0381_auto_20241126_1047.py b/panel/migrations/0381_auto_20241126_1047.py new file mode 100644 index 0000000..81566df --- /dev/null +++ b/panel/migrations/0381_auto_20241126_1047.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-26 10:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0380_auto_20241126_1028'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='weight_loss', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 47, 21, 521335)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 47, 21, 474133)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 47, 21, 474133)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 47, 21, 474133)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 47, 21, 474133)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 47, 21, 474133)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 47, 21, 474133)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 47, 21, 474133)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 10, 47, 21, 489797)), + ), + ] diff --git a/panel/migrations/0382_auto_20241126_1606.py b/panel/migrations/0382_auto_20241126_1606.py new file mode 100644 index 0000000..76f9e92 --- /dev/null +++ b/panel/migrations/0382_auto_20241126_1606.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-26 16:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0381_auto_20241126_1047'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='automatic_accept', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 16, 5, 53, 932393)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 16, 5, 53, 873939)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 16, 5, 53, 873939)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 16, 5, 53, 873939)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 16, 5, 53, 873939)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 16, 5, 53, 876931)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 16, 5, 53, 876931)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 16, 5, 53, 876931)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 26, 16, 5, 53, 886775)), + ), + ] diff --git a/panel/migrations/0383_auto_20241127_0958.py b/panel/migrations/0383_auto_20241127_0958.py new file mode 100644 index 0000000..cecaf90 --- /dev/null +++ b/panel/migrations/0383_auto_20241127_0958.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-11-27 09:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0382_auto_20241126_1606'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='calculate_status', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='calculate_status', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='calculate_status', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='stewardallocation', + name='calculate_status', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 27, 9, 58, 44, 447438)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 27, 9, 58, 44, 384249)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 27, 9, 58, 44, 384249)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 27, 9, 58, 44, 384249)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 27, 9, 58, 44, 384249)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 27, 9, 58, 44, 400031)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 27, 9, 58, 44, 400031)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 27, 9, 58, 44, 400031)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 27, 9, 58, 44, 400031)), + ), + ] diff --git a/panel/migrations/0384_auto_20241130_1018.py b/panel/migrations/0384_auto_20241130_1018.py new file mode 100644 index 0000000..5c870a3 --- /dev/null +++ b/panel/migrations/0384_auto_20241130_1018.py @@ -0,0 +1,119 @@ +# Generated by Django 3.2.13 on 2024-11-30 10:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0383_auto_20241127_0958'), + ] + + operations = [ + migrations.AddField( + model_name='cityoperatorcheckrequest', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='coldhouseallocations', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouseassignmentinformation', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouserequest', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killrequest', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='poultryrequest', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='stewardallocation', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='stewardfreebarinformation', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 18, 29, 494738)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 18, 29, 431374)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 18, 29, 431374)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 18, 29, 431374)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 18, 29, 431374)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 18, 29, 431374)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 18, 29, 431374)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 18, 29, 431374)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 18, 29, 449051)), + ), + ] diff --git a/panel/migrations/0385_auto_20241130_1048.py b/panel/migrations/0385_auto_20241130_1048.py new file mode 100644 index 0000000..2b239b9 --- /dev/null +++ b/panel/migrations/0385_auto_20241130_1048.py @@ -0,0 +1,114 @@ +# Generated by Django 3.2.13 on 2024-11-30 10:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0384_auto_20241130_1018'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouseallocations', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouseassignmentinformation', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouserequest', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killrequest', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='poultryrequest', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='stewardallocation', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='stewardfreebarinformation', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 48, 18, 826754)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 48, 18, 769116)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 48, 18, 769116)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 48, 18, 769116)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 48, 18, 769116)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 48, 18, 770859)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 48, 18, 770859)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 48, 18, 770859)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 10, 48, 18, 780724)), + ), + ] diff --git a/panel/migrations/0386_auto_20241130_1830.py b/panel/migrations/0386_auto_20241130_1830.py new file mode 100644 index 0000000..e2c4540 --- /dev/null +++ b/panel/migrations/0386_auto_20241130_1830.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-11-30 18:30 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0385_auto_20241130_1048'), + ] + + operations = [ + migrations.AddField( + model_name='internaltransaction', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='internaltransaction', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 30, 13, 744002)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 30, 13, 694002)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 30, 13, 694002)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 30, 13, 694002)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 30, 13, 694002)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 30, 13, 697000)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 30, 13, 697000)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 30, 13, 697000)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 30, 13, 704003)), + ), + ] diff --git a/panel/migrations/0387_auto_20241130_1836.py b/panel/migrations/0387_auto_20241130_1836.py new file mode 100644 index 0000000..1838c03 --- /dev/null +++ b/panel/migrations/0387_auto_20241130_1836.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.13 on 2024-11-30 18:36 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0386_auto_20241130_1830'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 36, 30, 7309)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 36, 29, 954682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 36, 29, 954682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 36, 29, 954682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 36, 29, 954682)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 36, 29, 958682)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 36, 29, 958682)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 36, 29, 958682)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 18, 36, 29, 966682)), + ), + ] diff --git a/panel/migrations/0388_auto_20241130_1902.py b/panel/migrations/0388_auto_20241130_1902.py new file mode 100644 index 0000000..3847ab9 --- /dev/null +++ b/panel/migrations/0388_auto_20241130_1902.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-11-30 19:02 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0387_auto_20241130_1836'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='poultryhatching', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 2, 7, 216917)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 2, 7, 164917)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 2, 7, 163917)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 2, 7, 164917)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 2, 7, 164917)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 2, 7, 167918)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 2, 7, 167918)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 2, 7, 167918)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 19, 2, 7, 175917)), + ), + ] diff --git a/panel/migrations/0389_auto_20241130_2009.py b/panel/migrations/0389_auto_20241130_2009.py new file mode 100644 index 0000000..5461264 --- /dev/null +++ b/panel/migrations/0389_auto_20241130_2009.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-11-30 20:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0388_auto_20241130_1902'), + ] + + operations = [ + migrations.AddField( + model_name='cityoperatorcheckrequest', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 20, 9, 25, 973531)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 20, 9, 25, 907506)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 20, 9, 25, 907506)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 20, 9, 25, 907506)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 20, 9, 25, 907506)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 20, 9, 25, 912506)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 20, 9, 25, 912506)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 20, 9, 25, 912506)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 11, 30, 20, 9, 25, 921506)), + ), + ] diff --git a/panel/migrations/0390_auto_20241203_0901.py b/panel/migrations/0390_auto_20241203_0901.py new file mode 100644 index 0000000..78e851b --- /dev/null +++ b/panel/migrations/0390_auto_20241203_0901.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-12-03 09:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0389_auto_20241130_2009'), + ] + + operations = [ + migrations.AddField( + model_name='killhousepercentage', + name='change_data', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 0, 57, 78407)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 0, 57, 15250)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 0, 57, 15250)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 0, 57, 15250)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 0, 57, 15250)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 0, 57, 24371)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 0, 57, 24371)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 0, 57, 24371)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 0, 57, 37124)), + ), + ] diff --git a/panel/migrations/0391_auto_20241203_0935.py b/panel/migrations/0391_auto_20241203_0935.py new file mode 100644 index 0000000..83ab194 --- /dev/null +++ b/panel/migrations/0391_auto_20241203_0935.py @@ -0,0 +1,63 @@ +# Generated by Django 3.2.13 on 2024-12-03 09:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0390_auto_20241203_0901'), + ] + + operations = [ + migrations.RemoveField( + model_name='agenotificationpoultry', + name='hour_send', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 35, 14, 990898)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 35, 14, 937628)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 35, 14, 937628)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 35, 14, 937628)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 35, 14, 937628)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 35, 14, 941633)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 35, 14, 941633)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 35, 14, 941633)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 35, 14, 949641)), + ), + ] diff --git a/panel/migrations/0392_auto_20241203_0946.py b/panel/migrations/0392_auto_20241203_0946.py new file mode 100644 index 0000000..18911b2 --- /dev/null +++ b/panel/migrations/0392_auto_20241203_0946.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-12-03 09:46 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0391_auto_20241203_0935'), + ] + + operations = [ + migrations.AddField( + model_name='agenotificationpoultry', + name='losses_percent', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 46, 33, 335840)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 46, 33, 278517)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 46, 33, 278517)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 46, 33, 278517)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 46, 33, 278517)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 46, 33, 290295)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 46, 33, 288291)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 46, 33, 288291)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 3, 9, 46, 33, 298305)), + ), + ] diff --git a/panel/migrations/0393_auto_20241204_1334.py b/panel/migrations/0393_auto_20241204_1334.py new file mode 100644 index 0000000..23ea649 --- /dev/null +++ b/panel/migrations/0393_auto_20241204_1334.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.13 on 2024-12-04 13:34 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0392_auto_20241203_0946'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 34, 18, 639596)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 34, 18, 580193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 34, 18, 580193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 34, 18, 580193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 34, 18, 580193)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 34, 18, 580193)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 34, 18, 580193)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 34, 18, 580193)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 34, 18, 597812)), + ), + migrations.CreateModel( + name='PosAllocationTransactions', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('check_id', models.CharField(max_length=100, null=True)), + ('date', models.DateTimeField(null=True)), + ('price', models.BigIntegerField(default=0)), + ('paid', models.BooleanField(default=False)), + ('state', models.IntegerField(default=0)), + ('posProvider', models.CharField(max_length=100, null=True)), + ('result', models.TextField(null=True)), + ('refnum', models.CharField(max_length=100, null=True)), + ('terminal', models.CharField(max_length=100, null=True)), + ('cart', models.CharField(max_length=100, null=True)), + ('lng', models.FloatField(default=0)), + ('lot', models.FloatField(default=0)), + ('additional', models.CharField(max_length=200, null=True)), + ('allocation', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_allocation_transactions', to='panel.stewardallocation')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posallocationtransactions_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posallocationtransactions_modifiedby', to=settings.AUTH_USER_MODEL)), + ('pos', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_allocation_pos_transactions', to='panel.posmachine')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0394_auto_20241204_1357.py b/panel/migrations/0394_auto_20241204_1357.py new file mode 100644 index 0000000..aebb0d2 --- /dev/null +++ b/panel/migrations/0394_auto_20241204_1357.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-12-04 13:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0393_auto_20241204_1334'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='total_amount_paid', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='stewardallocation', + name='total_amount_remain', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 57, 38, 76197)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 57, 38, 36867)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 57, 38, 36867)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 57, 38, 36867)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 57, 38, 36867)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 57, 38, 38869)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 57, 38, 38869)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 57, 38, 38869)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 4, 13, 57, 38, 42613)), + ), + ] diff --git a/panel/migrations/0395_auto_20241207_1034.py b/panel/migrations/0395_auto_20241207_1034.py new file mode 100644 index 0000000..0cfb09a --- /dev/null +++ b/panel/migrations/0395_auto_20241207_1034.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-12-07 10:34 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0394_auto_20241204_1357'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 7, 10, 34, 23, 57412)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 7, 10, 34, 22, 916411)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 7, 10, 34, 22, 916411)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 7, 10, 34, 22, 916411)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 7, 10, 34, 22, 916411)), + ), + migrations.AlterField( + model_name='posallocationtransactions', + name='additional', + field=models.CharField(blank=True, max_length=200, null=True), + ), + migrations.AlterField( + model_name='posallocationtransactions', + name='cart', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='posallocationtransactions', + name='refnum', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='posallocationtransactions', + name='terminal', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 7, 10, 34, 22, 925408)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 7, 10, 34, 22, 925408)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 7, 10, 34, 22, 925408)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 7, 10, 34, 22, 946411)), + ), + ] diff --git a/panel/migrations/0396_auto_20241208_1147.py b/panel/migrations/0396_auto_20241208_1147.py new file mode 100644 index 0000000..282f4e4 --- /dev/null +++ b/panel/migrations/0396_auto_20241208_1147.py @@ -0,0 +1,104 @@ +# Generated by Django 3.2.13 on 2024-12-08 11:47 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0052_auto_20241208_1147'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0395_auto_20241207_1034'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 620353)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 576799)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 576799)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 576799)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 576799)), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='additional', + field=models.CharField(blank=True, max_length=200, null=True), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='cart', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='refnum', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='terminal', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 578802)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 578802)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 578802)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 8, 11, 47, 31, 586812)), + ), + migrations.CreateModel( + name='ParentCompany', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_company_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parentcompany_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parentcompany_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_company_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_company_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_company_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0397_auto_20241209_1422.py b/panel/migrations/0397_auto_20241209_1422.py new file mode 100644 index 0000000..015b17a --- /dev/null +++ b/panel/migrations/0397_auto_20241209_1422.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-12-09 14:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0396_auto_20241208_1147'), + ] + + operations = [ + migrations.AddField( + model_name='chainallocation', + name='temporary_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='chainallocation', + name='temporary_trash', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 9, 14, 22, 21, 718310)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 9, 14, 22, 21, 672543)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 9, 14, 22, 21, 672543)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 9, 14, 22, 21, 672543)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 9, 14, 22, 21, 672543)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 9, 14, 22, 21, 672543)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 9, 14, 22, 21, 672543)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 9, 14, 22, 21, 672543)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 9, 14, 22, 21, 686607)), + ), + ] diff --git a/panel/migrations/0398_auto_20241211_0956.py b/panel/migrations/0398_auto_20241211_0956.py new file mode 100644 index 0000000..b221993 --- /dev/null +++ b/panel/migrations/0398_auto_20241211_0956.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2024-12-11 09:56 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0397_auto_20241209_1422'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouse', + name='total_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='coldhouse', + name='total_input_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='coldhouse', + name='total_remain_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='stewardallocation', + name='to_cold_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocation_to_cold_house', to='panel.coldhouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 9, 55, 58, 341632)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 9, 55, 58, 278540)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 9, 55, 58, 278540)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 9, 55, 58, 278540)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 9, 55, 58, 278540)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 9, 55, 58, 294187)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 9, 55, 58, 294187)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 9, 55, 58, 294187)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 9, 55, 58, 297890)), + ), + ] diff --git a/panel/migrations/0399_auto_20241211_1115.py b/panel/migrations/0399_auto_20241211_1115.py new file mode 100644 index 0000000..7525131 --- /dev/null +++ b/panel/migrations/0399_auto_20241211_1115.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-12-11 11:15 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0398_auto_20241211_0956'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='cold_house_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 11, 15, 21, 15940)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 11, 15, 20, 964280)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 11, 15, 20, 964280)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 11, 15, 20, 964280)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 11, 15, 20, 964280)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 11, 15, 20, 968028)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 11, 15, 20, 968028)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 11, 15, 20, 968028)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 11, 11, 15, 20, 978054)), + ), + ] diff --git a/panel/migrations/0400_auto_20241214_1358.py b/panel/migrations/0400_auto_20241214_1358.py new file mode 100644 index 0000000..7a8d814 --- /dev/null +++ b/panel/migrations/0400_auto_20241214_1358.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-12-14 13:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0399_auto_20241211_1115'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='end_period_losses_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='end_period_losses_editor', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='end_period_losses_inputer', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='end_period_losses_last_edit_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 14, 13, 58, 20, 146992)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 14, 13, 58, 20, 109296)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 14, 13, 58, 20, 109296)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 14, 13, 58, 20, 109296)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 14, 13, 58, 20, 109296)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 14, 13, 58, 20, 111304)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 14, 13, 58, 20, 111304)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 14, 13, 58, 20, 111304)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 14, 13, 58, 20, 121076)), + ), + ] diff --git a/panel/migrations/0401_auto_20241215_1031.py b/panel/migrations/0401_auto_20241215_1031.py new file mode 100644 index 0000000..be03f51 --- /dev/null +++ b/panel/migrations/0401_auto_20241215_1031.py @@ -0,0 +1,90 @@ +# Generated by Django 3.2.13 on 2024-12-15 10:31 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0053_auto_20241215_1031'), + ('panel', '0400_auto_20241214_1358'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 547975)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 494571)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 494571)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 494571)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 494571)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 498586)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 498586)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 498586)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 10, 31, 13, 508356)), + ), + migrations.CreateModel( + name='ColdHouseSteward', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('identity_documents', models.JSONField(null=True)), + ('active', models.BooleanField(default=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_steward_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='coldhousesteward_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='coldhousesteward_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_steward_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_steward_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_steward_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='coldhouse', + name='cold_house_steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cold_house_steward_cold_house', to='panel.coldhousesteward'), + ), + ] diff --git a/panel/migrations/0402_auto_20241215_1139.py b/panel/migrations/0402_auto_20241215_1139.py new file mode 100644 index 0000000..1c72690 --- /dev/null +++ b/panel/migrations/0402_auto_20241215_1139.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-12-15 11:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0401_auto_20241215_1031'), + ] + + operations = [ + migrations.AddField( + model_name='coldhousesteward', + name='name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 39, 45, 998861)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 39, 45, 947484)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 39, 45, 947484)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 39, 45, 947484)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 39, 45, 947484)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 39, 45, 951236)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 39, 45, 949493)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 39, 45, 949493)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 11, 39, 45, 959272)), + ), + ] diff --git a/panel/migrations/0403_auto_20241215_1458.py b/panel/migrations/0403_auto_20241215_1458.py new file mode 100644 index 0000000..a3c7e65 --- /dev/null +++ b/panel/migrations/0403_auto_20241215_1458.py @@ -0,0 +1,66 @@ +# Generated by Django 3.2.13 on 2024-12-15 14:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0402_auto_20241215_1139'), + ] + + operations = [ + migrations.RemoveField( + model_name='coldhouse', + name='cold_house_steward', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 14, 58, 29, 388133)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 14, 58, 29, 328905)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 14, 58, 29, 328905)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 14, 58, 29, 328905)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 14, 58, 29, 328905)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 14, 58, 29, 332923)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 14, 58, 29, 332923)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 14, 58, 29, 332923)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 15, 14, 58, 29, 342707)), + ), + migrations.DeleteModel( + name='ColdHouseSteward', + ), + ] diff --git a/panel/migrations/0404_auto_20241216_1214.py b/panel/migrations/0404_auto_20241216_1214.py new file mode 100644 index 0000000..d3c2910 --- /dev/null +++ b/panel/migrations/0404_auto_20241216_1214.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.13 on 2024-12-16 12:14 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0403_auto_20241215_1458'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouse', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_cold_house', to='panel.guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 12, 13, 59, 860134)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 12, 13, 59, 811116)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 12, 13, 59, 811116)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 12, 13, 59, 811116)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 12, 13, 59, 811116)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 12, 13, 59, 811116)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 12, 13, 59, 811116)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 12, 13, 59, 811116)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 12, 13, 59, 811116)), + ), + ] diff --git a/panel/migrations/0405_auto_20241216_1524.py b/panel/migrations/0405_auto_20241216_1524.py new file mode 100644 index 0000000..8a9ec47 --- /dev/null +++ b/panel/migrations/0405_auto_20241216_1524.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2024-12-16 15:24 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0404_auto_20241216_1214'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouse', + name='city', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='coldhouse', + name='province', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 23, 40, 566639)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 23, 40, 501236)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 23, 40, 501236)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 23, 40, 501236)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 23, 40, 501236)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 23, 40, 517378)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 23, 40, 517378)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 23, 40, 517378)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 23, 40, 517378)), + ), + ] diff --git a/panel/migrations/0406_auto_20241216_1532.py b/panel/migrations/0406_auto_20241216_1532.py new file mode 100644 index 0000000..8850ef6 --- /dev/null +++ b/panel/migrations/0406_auto_20241216_1532.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-12-16 15:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0405_auto_20241216_1524'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouse', + name='address', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 32, 6, 642789)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 32, 6, 587202)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 32, 6, 587202)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 32, 6, 587202)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 32, 6, 587202)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 32, 6, 587202)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 32, 6, 587202)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 32, 6, 587202)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 15, 32, 6, 587202)), + ), + ] diff --git a/panel/migrations/0407_auto_20241216_1625.py b/panel/migrations/0407_auto_20241216_1625.py new file mode 100644 index 0000000..ce04307 --- /dev/null +++ b/panel/migrations/0407_auto_20241216_1625.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-12-16 16:25 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0406_auto_20241216_1532'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouse', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='coldhouse', + name='broadcast', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='coldhouse', + name='relocate', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 16, 25, 25, 772998)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 16, 25, 25, 725421)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 16, 25, 25, 725421)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 16, 25, 25, 725421)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 16, 25, 25, 725421)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 16, 25, 25, 725421)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 16, 25, 25, 725421)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 16, 25, 25, 725421)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 16, 16, 25, 25, 741157)), + ), + ] diff --git a/panel/migrations/0408_auto_20241218_1435.py b/panel/migrations/0408_auto_20241218_1435.py new file mode 100644 index 0000000..8329f8f --- /dev/null +++ b/panel/migrations/0408_auto_20241218_1435.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.13 on 2024-12-18 14:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0407_auto_20241216_1625'), + ] + + operations = [ + migrations.AddField( + model_name='coldhouse', + name='capacity', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 18, 14, 35, 2, 783568)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 18, 14, 35, 2, 728394)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 18, 14, 35, 2, 728394)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 18, 14, 35, 2, 728394)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 18, 14, 35, 2, 728394)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 18, 14, 35, 2, 732146)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 18, 14, 35, 2, 732146)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 18, 14, 35, 2, 732146)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 18, 14, 35, 2, 740180)), + ), + ] diff --git a/panel/migrations/0409_auto_20241221_1150.py b/panel/migrations/0409_auto_20241221_1150.py new file mode 100644 index 0000000..e21207e --- /dev/null +++ b/panel/migrations/0409_auto_20241221_1150.py @@ -0,0 +1,116 @@ +# Generated by Django 3.2.13 on 2024-12-21 11:50 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0408_auto_20241218_1435'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 357582)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 304662)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 304662)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 304662)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 304662)), + ), + migrations.AlterField( + model_name='poscompany', + name='en_name', + field=models.CharField(default='', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 308678)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 308678)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 308678)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 314435)), + ), + migrations.CreateModel( + name='POSDeviceSession', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('version', models.IntegerField()), + ('mac', models.CharField(max_length=50)), + ('name', models.TextField(default='')), + ('sdk', models.TextField(default='')), + ('serial', models.TextField(default='')), + ('ip', models.CharField(default='0.0.0.0', max_length=15)), + ('password', models.CharField(max_length=10)), + ('session_create_date', models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 422783))), + ('session_last_seen_date', models.DateTimeField(default=datetime.datetime(2024, 12, 21, 11, 50, 49, 422783))), + ('lng', models.FloatField(default=0)), + ('lot', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posdevicesession_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posdevicesession_modifiedby', to=settings.AUTH_USER_MODEL)), + ('pos', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pos_device_session', to='panel.posmachine')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PosDeviceVersion', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('code', models.IntegerField()), + ('description', models.TextField()), + ('enable', models.BooleanField(default=True)), + ('remove', models.BooleanField(default=False)), + ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pos_version_company', to='panel.poscompany')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posdeviceversion_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posdeviceversion_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('company', 'code')}, + }, + ), + ] diff --git a/panel/migrations/0410_auto_20241221_1258.py b/panel/migrations/0410_auto_20241221_1258.py new file mode 100644 index 0000000..5f95188 --- /dev/null +++ b/panel/migrations/0410_auto_20241221_1258.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-12-21 12:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0409_auto_20241221_1150'), + ] + + operations = [ + migrations.AddField( + model_name='posmachine', + name='multi_device', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 621034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 557976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 557976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 557976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 557976)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 684608)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 684608)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 557976)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 557976)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 557976)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 12, 58, 16, 573665)), + ), + ] diff --git a/panel/migrations/0411_auto_20241221_1357.py b/panel/migrations/0411_auto_20241221_1357.py new file mode 100644 index 0000000..17a2d18 --- /dev/null +++ b/panel/migrations/0411_auto_20241221_1357.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2024-12-21 13:57 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0410_auto_20241221_1258'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 527747)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 464764)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 464764)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 464764)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 464764)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='pos', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pos_device_session', to='panel.posmachine'), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 598977)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 598977)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 464764)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 464764)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 464764)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 13, 57, 2, 480519)), + ), + ] diff --git a/panel/migrations/0412_auto_20241221_1535.py b/panel/migrations/0412_auto_20241221_1535.py new file mode 100644 index 0000000..841a78d --- /dev/null +++ b/panel/migrations/0412_auto_20241221_1535.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-12-21 15:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0411_auto_20241221_1357'), + ] + + operations = [ + migrations.AddField( + model_name='poscompany', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 670983)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 635641)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 635641)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 635641)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 635641)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 749659)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 749659)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 637649)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 637649)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 637649)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 21, 15, 35, 0, 645414)), + ), + ] diff --git a/panel/migrations/0413_auto_20241222_1203.py b/panel/migrations/0413_auto_20241222_1203.py new file mode 100644 index 0000000..dcf8578 --- /dev/null +++ b/panel/migrations/0413_auto_20241222_1203.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2024-12-22 12:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0412_auto_20241221_1535'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 306557)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 255159)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 255159)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 255159)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 255159)), + ), + migrations.AlterField( + model_name='poscompany', + name='en_name', + field=models.CharField(max_length=100), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 359503)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 359503)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 257166)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 257166)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 257166)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 22, 12, 3, 16, 264930)), + ), + ] diff --git a/panel/migrations/0414_auto_20241223_1441.py b/panel/migrations/0414_auto_20241223_1441.py new file mode 100644 index 0000000..2886777 --- /dev/null +++ b/panel/migrations/0414_auto_20241223_1441.py @@ -0,0 +1,95 @@ +# Generated by Django 3.2.13 on 2024-12-23 14:41 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0413_auto_20241222_1203'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 221956)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 160774)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 160774)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 160774)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 160774)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 296932)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 296932)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 164791)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 164791)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 164791)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 14, 40, 50, 176573)), + ), + migrations.CreateModel( + name='SubSectorTransactions', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('date', models.DateTimeField(null=True)), + ('from_account', models.CharField(max_length=200, null=True)), + ('to_account', models.CharField(max_length=200, null=True)), + ('type', models.CharField(max_length=50, null=True)), + ('amount', models.BigIntegerField(default=0)), + ('image', models.CharField(max_length=500, null=True)), + ('city_operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_operator_transactions', to='panel.cityoperator')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subsectortransactions_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subsectortransactions_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0415_auto_20241223_1547.py b/panel/migrations/0415_auto_20241223_1547.py new file mode 100644 index 0000000..ec4f522 --- /dev/null +++ b/panel/migrations/0415_auto_20241223_1547.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2024-12-23 15:47 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0414_auto_20241223_1441'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 351303)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 303866)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 303866)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 303866)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 303866)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 414433)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 414433)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 303866)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 303866)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 303866)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 23, 15, 47, 16, 319538)), + ), + migrations.CreateModel( + name='SubSectorPercentageOfWageType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('city', models.BooleanField(default=False)), + ('percent', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subsectorpercentageofwagetype_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subsectorpercentageofwagetype_modifiedby', to=settings.AUTH_USER_MODEL)), + ('percentage_of_wage_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sub_sector_wage_type', to='panel.percentageofwagetype')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0416_auto_20241225_1417.py b/panel/migrations/0416_auto_20241225_1417.py new file mode 100644 index 0000000..da47004 --- /dev/null +++ b/panel/migrations/0416_auto_20241225_1417.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-12-25 14:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0415_auto_20241223_1547'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='entered_message', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='entered_message', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 830692)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 783333)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 783333)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 783333)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 783333)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 893755)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 893755)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 783333)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 783333)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 783333)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 25, 14, 17, 38, 783333)), + ), + ] diff --git a/panel/migrations/0417_auto_20241231_1523.py b/panel/migrations/0417_auto_20241231_1523.py new file mode 100644 index 0000000..b0efdaa --- /dev/null +++ b/panel/migrations/0417_auto_20241231_1523.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2024-12-31 15:23 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0416_auto_20241225_1417'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='segmentation_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 827142)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 773720)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 773720)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 773720)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 773720)), + ), + migrations.AlterField( + model_name='poscompany', + name='en_name', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 896526)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 896526)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 777736)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 777736)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 777736)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 15, 23, 48, 785767)), + ), + ] diff --git a/panel/migrations/0418_auto_20241231_2121.py b/panel/migrations/0418_auto_20241231_2121.py new file mode 100644 index 0000000..dd503f7 --- /dev/null +++ b/panel/migrations/0418_auto_20241231_2121.py @@ -0,0 +1,92 @@ +# Generated by Django 3.2.13 on 2024-12-31 21:21 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0417_auto_20241231_1523'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 46, 900798)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 46, 431295)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 46, 431295)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 46, 431295)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 46, 431295)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 47, 214724)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 47, 214724)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 46, 431295)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 46, 431295)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 46, 431295)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2024, 12, 31, 21, 20, 46, 509421)), + ), + migrations.CreateModel( + name='PosSegmentation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('date', models.DateTimeField(null=True)), + ('weight', models.BigIntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='possegmentation_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_segmentation', to='panel.guilds')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='possegmentation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product_segmentation', to='panel.rolesproducts')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0419_auto_20250106_1612.py b/panel/migrations/0419_auto_20250106_1612.py new file mode 100644 index 0000000..8475d35 --- /dev/null +++ b/panel/migrations/0419_auto_20250106_1612.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-01-06 16:12 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0418_auto_20241231_2121'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='vet_farm', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_poultry_request', to='panel.vet'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 35, 923259)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 35, 678264)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 35, 678264)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 35, 678264)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 35, 678264)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 36, 322261)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 36, 322261)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 35, 689264)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 35, 689264)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 35, 689264)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 6, 16, 12, 35, 725259)), + ), + ] diff --git a/panel/migrations/0420_auto_20250107_1233.py b/panel/migrations/0420_auto_20250107_1233.py new file mode 100644 index 0000000..22e9796 --- /dev/null +++ b/panel/migrations/0420_auto_20250107_1233.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-01-07 12:33 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0419_auto_20250106_1612'), + ] + + operations = [ + migrations.AddField( + model_name='subsectortransactions', + name='vet', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vet_transactions', to='panel.vet'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 210911)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 140904)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 140904)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 140904)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 140904)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 288907)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 288907)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 144913)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 144913)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 144913)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 12, 33, 10, 155904)), + ), + ] diff --git a/panel/migrations/0421_auto_20250107_1807.py b/panel/migrations/0421_auto_20250107_1807.py new file mode 100644 index 0000000..cc9b9b7 --- /dev/null +++ b/panel/migrations/0421_auto_20250107_1807.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-01-07 18:07 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0420_auto_20250107_1233'), + ] + + operations = [ + migrations.AddField( + model_name='posmachinetransactions', + name='current_price', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 6, 59, 79680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 6, 58, 301593)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 6, 58, 301593)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 6, 58, 301593)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 6, 58, 301593)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 7, 0, 610830)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 7, 0, 610830)), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='check_id', + field=models.CharField(max_length=100, null=True, unique=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 6, 58, 314003)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 6, 58, 314003)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 6, 58, 314003)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 7, 18, 6, 58, 368243)), + ), + ] diff --git a/panel/migrations/0422_auto_20250112_1004.py b/panel/migrations/0422_auto_20250112_1004.py new file mode 100644 index 0000000..b557d1e --- /dev/null +++ b/panel/migrations/0422_auto_20250112_1004.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-01-12 10:04 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0421_auto_20250107_1807'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='first_date_input_archive', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='input_archiver', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='output_archive_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='output_archiver', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='second_date_input_archive', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 198471)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 147451)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 147451)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 147451)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 147451)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 259729)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 259729)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 150452)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 150452)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 150452)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 10, 4, 2, 159452)), + ), + ] diff --git a/panel/migrations/0423_auto_20250112_1550.py b/panel/migrations/0423_auto_20250112_1550.py new file mode 100644 index 0000000..e37da68 --- /dev/null +++ b/panel/migrations/0423_auto_20250112_1550.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-01-12 15:50 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0055_auto_20250112_1550'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0422_auto_20250112_1004'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 406622)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 345434)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 345434)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 345434)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 345434)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 485627)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 485627)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 349451)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 349451)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 349451)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 12, 15, 50, 33, 359224)), + ), + migrations.CreateModel( + name='CityGuild', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('wallet_amount', models.BigIntegerField(default=0)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_guild_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityguild_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cityguild_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_guild_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_guild_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_guild_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0424_auto_20250113_1532.py b/panel/migrations/0424_auto_20250113_1532.py new file mode 100644 index 0000000..79e4068 --- /dev/null +++ b/panel/migrations/0424_auto_20250113_1532.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-01-13 15:32 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0423_auto_20250112_1550'), + ] + + operations = [ + migrations.AddField( + model_name='subsectortransactions', + name='city_guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='city_guild_transactions', to='panel.cityguild'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 223579)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 175634)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 175634)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 175634)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 175634)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 287469)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 287469)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 177642)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 177642)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 177642)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 13, 15, 32, 48, 177642)), + ), + ] diff --git a/panel/migrations/0425_auto_20250119_1410.py b/panel/migrations/0425_auto_20250119_1410.py new file mode 100644 index 0000000..87db522 --- /dev/null +++ b/panel/migrations/0425_auto_20250119_1410.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2025-01-19 14:10 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0424_auto_20250113_1532'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='bar_code', + field=models.BigIntegerField(null=True), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='exclusive_killer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_exclusive_killer', to='panel.killhouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 749225)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 678351)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 678351)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 678351)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 678351)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 833728)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 833728)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 682099)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 682099)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 682099)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 19, 14, 10, 37, 692122)), + ), + ] diff --git a/panel/migrations/0426_auto_20250120_0929.py b/panel/migrations/0426_auto_20250120_0929.py new file mode 100644 index 0000000..09fd5c1 --- /dev/null +++ b/panel/migrations/0426_auto_20250120_0929.py @@ -0,0 +1,73 @@ +# Generated by Django 3.2.13 on 2025-01-20 09:29 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0425_auto_20250119_1410'), + ] + + operations = [ + migrations.RemoveField( + model_name='killhousefreebarinformation', + name='bar_code', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 728285)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 676731)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 676731)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 676731)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 676731)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 783379)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 783379)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 680738)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 680738)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 680738)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 29, 32, 688756)), + ), + ] diff --git a/panel/migrations/0427_auto_20250120_0941.py b/panel/migrations/0427_auto_20250120_0941.py new file mode 100644 index 0000000..decf49e --- /dev/null +++ b/panel/migrations/0427_auto_20250120_0941.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-01-20 09:41 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0426_auto_20250120_0929'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='bar_code', + field=models.BigIntegerField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 484543)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 437207)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 437207)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 437207)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 437207)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 557797)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 557797)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 437207)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 437207)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 437207)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 9, 40, 52, 453030)), + ), + ] diff --git a/panel/migrations/0428_auto_20250120_1638.py b/panel/migrations/0428_auto_20250120_1638.py new file mode 100644 index 0000000..1067515 --- /dev/null +++ b/panel/migrations/0428_auto_20250120_1638.py @@ -0,0 +1,149 @@ +# Generated by Django 3.2.13 on 2025-01-20 16:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0427_auto_20250120_0941'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='unit_address', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='killhouse', + name='unit_city', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouse', + name='unit_economical_number', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouse', + name='unit_name', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='killhouse', + name='unit_national_id', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouse', + name='unit_postal_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouse', + name='unit_province', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouse', + name='unit_registration_number', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='provinceoperator', + name='unit_address', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='provinceoperator', + name='unit_city', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='provinceoperator', + name='unit_economical_number', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='provinceoperator', + name='unit_name', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='provinceoperator', + name='unit_national_id', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='provinceoperator', + name='unit_postal_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='provinceoperator', + name='unit_province', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='provinceoperator', + name='unit_registration_number', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 304283)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 242955)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 242955)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 242955)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 242955)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 369060)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 369060)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 242955)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 242955)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 242955)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 20, 16, 38, 46, 260748)), + ), + ] diff --git a/panel/migrations/0429_auto_20250121_0857.py b/panel/migrations/0429_auto_20250121_0857.py new file mode 100644 index 0000000..a354e87 --- /dev/null +++ b/panel/migrations/0429_auto_20250121_0857.py @@ -0,0 +1,133 @@ +# Generated by Django 3.2.13 on 2025-01-21 08:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0428_auto_20250120_1638'), + ] + + operations = [ + migrations.RemoveField( + model_name='killhouse', + name='unit_address', + ), + migrations.RemoveField( + model_name='killhouse', + name='unit_city', + ), + migrations.RemoveField( + model_name='killhouse', + name='unit_economical_number', + ), + migrations.RemoveField( + model_name='killhouse', + name='unit_name', + ), + migrations.RemoveField( + model_name='killhouse', + name='unit_national_id', + ), + migrations.RemoveField( + model_name='killhouse', + name='unit_postal_code', + ), + migrations.RemoveField( + model_name='killhouse', + name='unit_province', + ), + migrations.RemoveField( + model_name='killhouse', + name='unit_registration_number', + ), + migrations.RemoveField( + model_name='provinceoperator', + name='unit_address', + ), + migrations.RemoveField( + model_name='provinceoperator', + name='unit_city', + ), + migrations.RemoveField( + model_name='provinceoperator', + name='unit_economical_number', + ), + migrations.RemoveField( + model_name='provinceoperator', + name='unit_name', + ), + migrations.RemoveField( + model_name='provinceoperator', + name='unit_national_id', + ), + migrations.RemoveField( + model_name='provinceoperator', + name='unit_postal_code', + ), + migrations.RemoveField( + model_name='provinceoperator', + name='unit_province', + ), + migrations.RemoveField( + model_name='provinceoperator', + name='unit_registration_number', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 42, 18768)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 971136)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 971136)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 971136)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 971136)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 42, 101751)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 42, 101751)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 971136)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 971136)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 971136)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 21, 8, 57, 41, 991011)), + ), + ] diff --git a/panel/migrations/0430_auto_20250125_1225.py b/panel/migrations/0430_auto_20250125_1225.py new file mode 100644 index 0000000..342489a --- /dev/null +++ b/panel/migrations/0430_auto_20250125_1225.py @@ -0,0 +1,95 @@ +# Generated by Django 3.2.13 on 2025-01-25 12:25 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0429_auto_20250121_0857'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 931853)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 882524)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 882524)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 882524)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 882524)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 994586)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 994586)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 886273)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 886273)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 886273)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 25, 12, 24, 48, 894300)), + ), + migrations.CreateModel( + name='DistributionUserLevel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('fa_title', models.CharField(max_length=200, null=True)), + ('en_title', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='distributionuserlevel_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='distributionuserlevel_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='guilds', + name='user_level', + field=models.ManyToManyField(blank=True, null=True, related_name='guild_user_level', to='panel.DistributionUserLevel'), + ), + ] diff --git a/panel/migrations/0431_auto_20250127_1622.py b/panel/migrations/0431_auto_20250127_1622.py new file mode 100644 index 0000000..984ed6d --- /dev/null +++ b/panel/migrations/0431_auto_20250127_1622.py @@ -0,0 +1,111 @@ +# Generated by Django 3.2.13 on 2025-01-27 16:22 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0430_auto_20250125_1225'), + ] + + operations = [ + migrations.CreateModel( + name='OtherProducts', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=300, null=True)), + ('unit', models.CharField(max_length=100, null=True)), + ('image', models.CharField(max_length=500, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='otherproducts_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='other_products_guild', to='panel.guilds')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='other_products_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='otherproducts_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 737693)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 689741)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 689741)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 689741)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 689741)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 801506)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 801506)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 689741)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 689741)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 689741)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 1, 27, 16, 22, 25, 705865)), + ), + migrations.CreateModel( + name='ProductsTransactions', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='productstransactions_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='productstransactions_modifiedby', to=settings.AUTH_USER_MODEL)), + ('other_product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='products_transactions_other_product', to='panel.otherproducts')), + ('product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='products_transactions_product', to='panel.rolesproducts')), + ('transaction', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='transaction_products_transactions', to='panel.posmachinetransactions')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0432_auto_20250201_1449.py b/panel/migrations/0432_auto_20250201_1449.py new file mode 100644 index 0000000..781c68d --- /dev/null +++ b/panel/migrations/0432_auto_20250201_1449.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-01 14:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0431_auto_20250127_1622'), + ] + + operations = [ + migrations.AddField( + model_name='cityguild', + name='unit_name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 477473)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 424957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 424957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 424957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 424957)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 542472)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 542472)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 427958)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 427958)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 427958)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 1, 14, 49, 12, 436962)), + ), + ] diff --git a/panel/migrations/0433_auto_20250205_1303.py b/panel/migrations/0433_auto_20250205_1303.py new file mode 100644 index 0000000..cae202d --- /dev/null +++ b/panel/migrations/0433_auto_20250205_1303.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-02-05 13:03 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0432_auto_20250201_1449'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='poultry_hatching', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_hatching_kill_req', to='panel.poultryhatching'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 139756)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 87546)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 87546)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 87546)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 87546)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 203901)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 203901)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 90547)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 90547)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 90547)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 5, 13, 3, 20, 99546)), + ), + ] diff --git a/panel/migrations/0434_auto_20250209_0918.py b/panel/migrations/0434_auto_20250209_0918.py new file mode 100644 index 0000000..c98c37e --- /dev/null +++ b/panel/migrations/0434_auto_20250209_0918.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-09 09:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0433_auto_20250205_1303'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='killing_age', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 750045)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 694838)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 694838)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 694838)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 694838)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 805068)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 805068)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 694838)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 694838)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 694838)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 9, 18, 20, 694838)), + ), + ] diff --git a/panel/migrations/0435_auto_20250209_1024.py b/panel/migrations/0435_auto_20250209_1024.py new file mode 100644 index 0000000..5636830 --- /dev/null +++ b/panel/migrations/0435_auto_20250209_1024.py @@ -0,0 +1,95 @@ +# Generated by Django 3.2.13 on 2025-02-09 10:24 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0434_auto_20250209_0918'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 178145)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 114993)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 114993)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 114993)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 114993)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 241425)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 241425)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 130904)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 130904)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 130904)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 9, 10, 24, 42, 130904)), + ), + migrations.CreateModel( + name='PoultryPrediction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('date', models.DateTimeField(null=True)), + ('killing_ave_age', models.IntegerField(default=1)), + ('active_left_over', models.IntegerField(default=0)), + ('killing_ave_count', models.IntegerField(default=0)), + ('killing_ave_weight', models.IntegerField(default=0)), + ('killing_loss_weight_percent', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryprediction_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryprediction_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='prediction_poultry', to='panel.poultry')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0436_auto_20250210_1938.py b/panel/migrations/0436_auto_20250210_1938.py new file mode 100644 index 0000000..0f1eb15 --- /dev/null +++ b/panel/migrations/0436_auto_20250210_1938.py @@ -0,0 +1,109 @@ +# Generated by Django 3.2.13 on 2025-02-10 19:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0435_auto_20250209_1024'), + ] + + operations = [ + migrations.AddField( + model_name='poultry', + name='active_left_over', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='poultry', + name='killing_ave_age', + field=models.IntegerField(default=1), + ), + migrations.AddField( + model_name='poultry', + name='killing_ave_count', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='killing_ave_weight', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='killing_carcasses_weight', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='killing_live_weight', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='killing_loss_weight_percent', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 41, 806956)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 41, 661957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 41, 661957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 41, 661957)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 41, 661957)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 42, 2958)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 42, 2958)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 41, 669956)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 41, 669956)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 41, 669956)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 10, 19, 37, 41, 694957)), + ), + ] diff --git a/panel/migrations/0437_auto_20250211_1410.py b/panel/migrations/0437_auto_20250211_1410.py new file mode 100644 index 0000000..fca998a --- /dev/null +++ b/panel/migrations/0437_auto_20250211_1410.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-11 14:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0436_auto_20250210_1938'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='predicate_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 108857)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 57572)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 57572)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 57572)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 57572)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 167892)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 167892)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 61578)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 59575)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 59575)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 11, 14, 10, 6, 69588)), + ), + ] diff --git a/panel/migrations/0438_auto_20250212_0900.py b/panel/migrations/0438_auto_20250212_0900.py new file mode 100644 index 0000000..e50f588 --- /dev/null +++ b/panel/migrations/0438_auto_20250212_0900.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-02-12 09:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0437_auto_20250211_1410'), + ] + + operations = [ + migrations.AddField( + model_name='poultry', + name='real_killing_ave_weight', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='real_killing_carcasses_weight', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='real_killing_live_weight', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='real_killing_loss_weight_percent', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 52, 968136)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 52, 920917)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 52, 920917)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 52, 920917)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 52, 920917)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 53, 31412)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 53, 31412)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 52, 920917)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 52, 920917)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 52, 920917)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 8, 59, 52, 920917)), + ), + ] diff --git a/panel/migrations/0439_auto_20250212_0957.py b/panel/migrations/0439_auto_20250212_0957.py new file mode 100644 index 0000000..aa88436 --- /dev/null +++ b/panel/migrations/0439_auto_20250212_0957.py @@ -0,0 +1,85 @@ +# Generated by Django 3.2.13 on 2025-02-12 09:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0438_auto_20250212_0900'), + ] + + operations = [ + migrations.RemoveField( + model_name='poultry', + name='real_killing_ave_weight', + ), + migrations.RemoveField( + model_name='poultry', + name='real_killing_carcasses_weight', + ), + migrations.RemoveField( + model_name='poultry', + name='real_killing_live_weight', + ), + migrations.RemoveField( + model_name='poultry', + name='real_killing_loss_weight_percent', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 34, 999092)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 34, 957362)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 34, 957362)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 34, 957362)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 34, 957362)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 35, 62384)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 35, 62384)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 34, 959365)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 34, 959365)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 34, 959365)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 9, 57, 34, 967113)), + ), + ] diff --git a/panel/migrations/0440_auto_20250212_1003.py b/panel/migrations/0440_auto_20250212_1003.py new file mode 100644 index 0000000..4afde45 --- /dev/null +++ b/panel/migrations/0440_auto_20250212_1003.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-02-12 10:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0439_auto_20250212_0957'), + ] + + operations = [ + migrations.AddField( + model_name='poultry', + name='real_killing_ave_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='real_killing_carcasses_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='real_killing_live_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultry', + name='real_killing_loss_weight_percent', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 93891)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 30788)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 30788)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 30788)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 30788)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 157646)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 157646)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 46600)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 46600)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 46600)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 10, 3, 46, 46600)), + ), + ] diff --git a/panel/migrations/0441_auto_20250212_1455.py b/panel/migrations/0441_auto_20250212_1455.py new file mode 100644 index 0000000..80e12e4 --- /dev/null +++ b/panel/migrations/0441_auto_20250212_1455.py @@ -0,0 +1,108 @@ +# Generated by Django 3.2.13 on 2025-02-12 14:55 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0440_auto_20250212_1003'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='bar_difference_request_quantity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='bar_difference_request_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 58, 988034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 58, 934837)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 58, 934837)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 58, 934837)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 58, 934837)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 59, 51297)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 59, 51297)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 58, 936579)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 58, 936579)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 58, 936579)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 12, 14, 54, 58, 936579)), + ), + migrations.CreateModel( + name='BarDifferenceRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.CharField(default='pending', max_length=20)), + ('register_fullname', models.CharField(max_length=200, null=True)), + ('register_mobile', models.CharField(max_length=200, null=True)), + ('quantity', models.IntegerField(default=0)), + ('real_quantity', models.IntegerField(default=0)), + ('weight', models.IntegerField(default=0)), + ('real_weight', models.IntegerField(default=0)), + ('violation_image', models.JSONField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bardifferencerequest_createdby', to=settings.AUTH_USER_MODEL)), + ('hatching', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='difference_hatching', to='panel.poultryhatching')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='difference_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bardifferencerequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0442_auto_20250216_1014.py b/panel/migrations/0442_auto_20250216_1014.py new file mode 100644 index 0000000..c17f094 --- /dev/null +++ b/panel/migrations/0442_auto_20250216_1014.py @@ -0,0 +1,104 @@ +# Generated by Django 3.2.13 on 2025-02-16 10:14 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0441_auto_20250212_1455'), + ] + + operations = [ + migrations.AddField( + model_name='otherproducts', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='otherproducts', + name='price', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='posmachine', + name='password', + field=models.CharField(max_length=10, null=True), + ), + migrations.AddField( + model_name='posmachine', + name='serial', + field=models.TextField(default=''), + ), + migrations.AddField( + model_name='productstransactions', + name='cur_price', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='productstransactions', + name='cur_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='productstransactions', + name='total_price', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 101937)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 54854)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 54854)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 54854)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 54854)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 164950)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 164950)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 54854)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 54854)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 54854)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 16, 10, 14, 32, 54854)), + ), + ] diff --git a/panel/migrations/0443_auto_20250217_1419.py b/panel/migrations/0443_auto_20250217_1419.py new file mode 100644 index 0000000..dac32ba --- /dev/null +++ b/panel/migrations/0443_auto_20250217_1419.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-02-17 14:19 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0442_auto_20250216_1014'), + ] + + operations = [ + migrations.AddField( + model_name='posmachinetransactions', + name='price_paid', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='posmachinetransactions', + name='price_type', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='posmachinetransactions', + name='products', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 115270)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 72010)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 72010)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 72010)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 72010)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 178564)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 178564)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 74018)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 74018)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 74018)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 14, 19, 35, 83558)), + ), + ] diff --git a/panel/migrations/0444_auto_20250217_1557.py b/panel/migrations/0444_auto_20250217_1557.py new file mode 100644 index 0000000..cdcb74f --- /dev/null +++ b/panel/migrations/0444_auto_20250217_1557.py @@ -0,0 +1,98 @@ +# Generated by Django 3.2.13 on 2025-02-17 15:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0443_auto_20250217_1419'), + ] + + operations = [ + migrations.RemoveField( + model_name='posmachinetransactions', + name='products', + ), + migrations.AddField( + model_name='productstransactions', + name='image', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='productstransactions', + name='name', + field=models.CharField(max_length=300, null=True), + ), + migrations.AddField( + model_name='productstransactions', + name='price_approved', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='productstransactions', + name='targetunit', + field=models.CharField(max_length=10, null=True), + ), + migrations.AddField( + model_name='productstransactions', + name='unit', + field=models.CharField(max_length=10, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 72792)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 19431)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 19431)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 19431)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 19431)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 140357)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 140357)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 23447)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 23447)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 23447)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 15, 57, 16, 25188)), + ), + ] diff --git a/panel/migrations/0445_auto_20250217_1707.py b/panel/migrations/0445_auto_20250217_1707.py new file mode 100644 index 0000000..a8896ce --- /dev/null +++ b/panel/migrations/0445_auto_20250217_1707.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-17 17:07 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0444_auto_20250217_1557'), + ] + + operations = [ + migrations.AddField( + model_name='posmachinetransactions', + name='pos_date', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 288068)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 224487)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 224487)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 224487)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 224487)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 351467)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 351467)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 240152)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 240152)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 240152)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 17, 17, 7, 8, 240152)), + ), + ] diff --git a/panel/migrations/0446_auto_20250218_0853.py b/panel/migrations/0446_auto_20250218_0853.py new file mode 100644 index 0000000..3a97d67 --- /dev/null +++ b/panel/migrations/0446_auto_20250218_0853.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-02-18 08:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0445_auto_20250217_1707'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 373562)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 312553)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 312553)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 312553)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 312553)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 447066)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 447066)), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='fullname', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='mobile', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='natcode', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 326259)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 326259)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 326259)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 8, 53, 40, 326259)), + ), + ] diff --git a/panel/migrations/0447_auto_20250218_1015.py b/panel/migrations/0447_auto_20250218_1015.py new file mode 100644 index 0000000..fd18b3a --- /dev/null +++ b/panel/migrations/0447_auto_20250218_1015.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-18 10:15 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0446_auto_20250218_0853'), + ] + + operations = [ + migrations.AddField( + model_name='productstransactions', + name='price', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 223131)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 159967)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 159967)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 159967)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 159967)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 285946)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 285946)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 159967)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 159967)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 159967)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 18, 10, 15, 31, 175993)), + ), + ] diff --git a/panel/migrations/0448_auto_20250222_1023.py b/panel/migrations/0448_auto_20250222_1023.py new file mode 100644 index 0000000..78779fc --- /dev/null +++ b/panel/migrations/0448_auto_20250222_1023.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-02-22 10:23 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0447_auto_20250218_1015'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='inquiry_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='inquiry_destination', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='inquiry_driver', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='inquiry_origin', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='inquiry_pelak', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 481689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 424692)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 424692)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 424692)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 424692)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 557216)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 557216)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 428690)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 428690)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 428690)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 10, 23, 30, 437727)), + ), + ] diff --git a/panel/migrations/0449_auto_20250222_1112.py b/panel/migrations/0449_auto_20250222_1112.py new file mode 100644 index 0000000..95b9b94 --- /dev/null +++ b/panel/migrations/0449_auto_20250222_1112.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-22 11:12 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0448_auto_20250222_1023'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 15, 66783)), + ), + migrations.AlterField( + model_name='killhouserequest', + name='inquiry_date', + field=models.DateField(null=True), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 14, 960733)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 14, 960733)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 14, 960733)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 14, 960733)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 15, 148784)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 15, 148784)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 14, 967733)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 14, 967733)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 14, 967733)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 11, 12, 14, 983731)), + ), + ] diff --git a/panel/migrations/0450_auto_20250222_1636.py b/panel/migrations/0450_auto_20250222_1636.py new file mode 100644 index 0000000..5d14240 --- /dev/null +++ b/panel/migrations/0450_auto_20250222_1636.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-22 16:36 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0449_auto_20250222_1112'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='unique_identifier', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 881342)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 828077)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 828077)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 828077)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 828077)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 944772)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 944772)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 832093)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 832093)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 832093)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 22, 16, 36, 19, 841866)), + ), + ] diff --git a/panel/migrations/0451_auto_20250223_0958.py b/panel/migrations/0451_auto_20250223_0958.py new file mode 100644 index 0000000..ad19bef --- /dev/null +++ b/panel/migrations/0451_auto_20250223_0958.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-02-23 09:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0450_auto_20250222_1636'), + ] + + operations = [ + migrations.AddField( + model_name='bardifferencerequest', + name='acceptor_fullname', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='bardifferencerequest', + name='acceptor_mobile', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 602089)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 546124)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 546124)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 546124)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 546124)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 669116)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 669116)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 549123)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 549123)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 549123)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 9, 58, 8, 559125)), + ), + ] diff --git a/panel/migrations/0452_auto_20250223_1001.py b/panel/migrations/0452_auto_20250223_1001.py new file mode 100644 index 0000000..7a50799 --- /dev/null +++ b/panel/migrations/0452_auto_20250223_1001.py @@ -0,0 +1,77 @@ +# Generated by Django 3.2.13 on 2025-02-23 10:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0451_auto_20250223_0958'), + ] + + operations = [ + migrations.CreateModel( + name='CookieSamasat', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('asp_net_session_id', models.CharField(default='-', max_length=250, null=True)), + ('aspxauth', models.TextField(default='-', null=True)), + ], + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 721902)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 618904)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 618904)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 618904)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 618904)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 949442)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 949442)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 627904)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 627904)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 627904)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 1, 15, 641898)), + ), + ] diff --git a/panel/migrations/0453_auto_20250223_1005.py b/panel/migrations/0453_auto_20250223_1005.py new file mode 100644 index 0000000..7a6fd06 --- /dev/null +++ b/panel/migrations/0453_auto_20250223_1005.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-23 10:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0452_auto_20250223_1001'), + ] + + operations = [ + migrations.AddField( + model_name='bardifferencerequest', + name='acceptor_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 329451)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 274451)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 274451)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 274451)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 274451)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 400485)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 400485)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 277445)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 277445)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 277445)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 5, 18, 286447)), + ), + ] diff --git a/panel/migrations/0454_auto_20250223_1006.py b/panel/migrations/0454_auto_20250223_1006.py new file mode 100644 index 0000000..74ce9c5 --- /dev/null +++ b/panel/migrations/0454_auto_20250223_1006.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-02-23 10:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0453_auto_20250223_1005'), + ] + + operations = [ + migrations.AlterField( + model_name='cookiesamasat', + name='asp_net_session_id', + field=models.CharField(max_length=250, null=True), + ), + migrations.AlterField( + model_name='cookiesamasat', + name='aspxauth', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 176319)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 20159)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 20159)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 20159)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 20159)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 330324)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 330324)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 27158)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 27158)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 27158)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 10, 6, 40, 42172)), + ), + ] diff --git a/panel/migrations/0455_auto_20250223_1128.py b/panel/migrations/0455_auto_20250223_1128.py new file mode 100644 index 0000000..92e31f4 --- /dev/null +++ b/panel/migrations/0455_auto_20250223_1128.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-23 11:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0454_auto_20250223_1006'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='share_debt_counting_wage', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 145444)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 97930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 97930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 97930)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 97930)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 208267)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 208267)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 97930)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 97930)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 97930)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 23, 11, 28, 29, 97930)), + ), + ] diff --git a/panel/migrations/0456_auto_20250224_1320.py b/panel/migrations/0456_auto_20250224_1320.py new file mode 100644 index 0000000..0c8aeb4 --- /dev/null +++ b/panel/migrations/0456_auto_20250224_1320.py @@ -0,0 +1,72 @@ +# Generated by Django 3.2.13 on 2025-02-24 13:20 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0455_auto_20250223_1128'), + ] + + operations = [ + migrations.DeleteModel( + name='CookieSamasat', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 179710)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 124485)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 124485)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 124485)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 124485)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 244710)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 244710)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 127484)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 127484)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 127484)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 20, 15, 137075)), + ), + ] diff --git a/panel/migrations/0457_auto_20250224_1322.py b/panel/migrations/0457_auto_20250224_1322.py new file mode 100644 index 0000000..daae981 --- /dev/null +++ b/panel/migrations/0457_auto_20250224_1322.py @@ -0,0 +1,76 @@ +# Generated by Django 3.2.13 on 2025-02-24 13:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0456_auto_20250224_1320'), + ] + + operations = [ + migrations.CreateModel( + name='CookieSamasat', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cookie', models.TextField(null=True)), + ], + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 607350)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 85927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 85927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 85927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 85927)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 911630)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 912632)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 215978)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 215978)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 215978)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 24, 13, 22, 35, 233979)), + ), + ] diff --git a/panel/migrations/0458_auto_20250225_1118.py b/panel/migrations/0458_auto_20250225_1118.py new file mode 100644 index 0000000..f4dcf62 --- /dev/null +++ b/panel/migrations/0458_auto_20250225_1118.py @@ -0,0 +1,98 @@ +# Generated by Django 3.2.13 on 2025-02-25 11:18 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0457_auto_20250224_1322'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 44, 37893)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 43, 570069)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 43, 570069)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 43, 570069)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 43, 570069)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 44, 582534)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 44, 582534)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 43, 583595)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 43, 583595)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 43, 583595)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 17, 43, 644135)), + ), + migrations.CreateModel( + name='LiveChickenTransportDetails', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('quarantine_code', models.CharField(max_length=100, null=True)), + ('rejester_date', models.DateTimeField(null=True)), + ('quantity', models.IntegerField(null=True)), + ('state', models.CharField(max_length=100, null=True)), + ('product_name', models.CharField(max_length=200, null=True)), + ('kill_house_unique_identifier', models.CharField(max_length=100, null=True)), + ('kill_house_name', models.CharField(max_length=100, null=True)), + ('status_registration_date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livechickentransportdetails_createdby', to=settings.AUTH_USER_MODEL)), + ('hatching', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='panel.poultryhatching')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livechickentransportdetails_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0459_auto_20250225_1144.py b/panel/migrations/0459_auto_20250225_1144.py new file mode 100644 index 0000000..1c4a493 --- /dev/null +++ b/panel/migrations/0459_auto_20250225_1144.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-25 11:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0458_auto_20250225_1118'), + ] + + operations = [ + migrations.AddField( + model_name='cookiesamasat', + name='table_name', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 802252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 741614)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 741614)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 741614)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 741614)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 877300)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 877300)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 744616)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 744616)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 744616)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 25, 11, 44, 20, 755662)), + ), + ] diff --git a/panel/migrations/0460_auto_20250226_0937.py b/panel/migrations/0460_auto_20250226_0937.py new file mode 100644 index 0000000..72352ee --- /dev/null +++ b/panel/migrations/0460_auto_20250226_0937.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-02-26 09:37 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0459_auto_20250225_1144'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='health_certificate', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 68278)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 13642)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 13642)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 13642)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 13642)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 132278)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 132278)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 17642)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 17642)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 17642)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 2, 26, 9, 36, 48, 28643)), + ), + ] diff --git a/panel/migrations/0461_auto_20250302_1203.py b/panel/migrations/0461_auto_20250302_1203.py new file mode 100644 index 0000000..d1c5ddc --- /dev/null +++ b/panel/migrations/0461_auto_20250302_1203.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-03-02 12:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0460_auto_20250226_0937'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 269923)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 222211)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 222211)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 222211)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 222211)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 349474)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 349474)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 222211)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 222211)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 222211)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 12, 2, 54, 238331)), + ), + ] diff --git a/panel/migrations/0462_auto_20250302_1351.py b/panel/migrations/0462_auto_20250302_1351.py new file mode 100644 index 0000000..b9e73de --- /dev/null +++ b/panel/migrations/0462_auto_20250302_1351.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-03-02 13:51 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0461_auto_20250302_1203'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 218645)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 171251)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 171251)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 171251)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 171251)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 297544)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 297544)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 173260)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 173260)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 173260)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 13, 51, 24, 183299)), + ), + ] diff --git a/panel/migrations/0463_auto_20250302_1458.py b/panel/migrations/0463_auto_20250302_1458.py new file mode 100644 index 0000000..bbfcb22 --- /dev/null +++ b/panel/migrations/0463_auto_20250302_1458.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-03-02 14:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0462_auto_20250302_1351'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 502833)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 455023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 455023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 455023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 455023)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 566111)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 566111)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 455023)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 455023)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 455023)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 14, 58, 25, 455023)), + ), + ] diff --git a/panel/migrations/0464_auto_20250302_1628.py b/panel/migrations/0464_auto_20250302_1628.py new file mode 100644 index 0000000..9b7e777 --- /dev/null +++ b/panel/migrations/0464_auto_20250302_1628.py @@ -0,0 +1,81 @@ +# Generated by Django 3.2.13 on 2025-03-02 16:28 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0006_auto_20250302_1627'), + ('panel', '0463_auto_20250302_1458'), + ] + + operations = [ + migrations.AddField( + model_name='posmachine', + name='cooperative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_pos', to='LiveStock.cooperative'), + ), + migrations.AddField( + model_name='postransactions', + name='cooperative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cooperative_pos_transaction', to='LiveStock.cooperative'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 286157)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 220689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 220689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 220689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 220689)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 347567)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 347567)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 236438)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 236438)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 236438)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 2, 16, 28, 37, 236438)), + ), + ] diff --git a/panel/migrations/0465_auto_20250303_1205.py b/panel/migrations/0465_auto_20250303_1205.py new file mode 100644 index 0000000..3acdfec --- /dev/null +++ b/panel/migrations/0465_auto_20250303_1205.py @@ -0,0 +1,76 @@ +# Generated by Django 3.2.13 on 2025-03-03 12:05 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('LiveStock', '0011_remove_livestockallocations_rancher'), + ('panel', '0464_auto_20250302_1628'), + ] + + operations = [ + migrations.AddField( + model_name='productstransactions', + name='live_stack_products', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='products_transactions_live_stack_products', to='LiveStock.livestockrolseproduct'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 267991)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 206651)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 206651)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 206651)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 206651)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 338154)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 338154)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 209728)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 209728)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 209728)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 12, 5, 3, 220046)), + ), + ] diff --git a/panel/migrations/0466_auto_20250303_1315.py b/panel/migrations/0466_auto_20250303_1315.py new file mode 100644 index 0000000..70015b9 --- /dev/null +++ b/panel/migrations/0466_auto_20250303_1315.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-03-03 13:15 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0465_auto_20250303_1205'), + ] + + operations = [ + migrations.AddField( + model_name='otherproducts', + name='targetunit', + field=models.CharField(default='g', max_length=100), + ), + migrations.AddField( + model_name='posmachinetransactions', + name='live_stock', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 92332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 34263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 34263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 34263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 34263)), + ), + migrations.AlterField( + model_name='otherproducts', + name='unit', + field=models.CharField(default='kg', max_length=100), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 160318)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 160318)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 37255)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 37255)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 37255)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 13, 15, 44, 48485)), + ), + ] diff --git a/panel/migrations/0467_auto_20250303_1500.py b/panel/migrations/0467_auto_20250303_1500.py new file mode 100644 index 0000000..a3cddb6 --- /dev/null +++ b/panel/migrations/0467_auto_20250303_1500.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-03-03 15:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0466_auto_20250303_1315'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 105824)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 52406)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 52406)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 52406)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 52406)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 163071)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 163071)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 56422)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 56422)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 56422)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 3, 14, 59, 55, 64454)), + ), + ] diff --git a/panel/migrations/0468_auto_20250304_1730.py b/panel/migrations/0468_auto_20250304_1730.py new file mode 100644 index 0000000..eff3082 --- /dev/null +++ b/panel/migrations/0468_auto_20250304_1730.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-03-04 17:30 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0467_auto_20250303_1500'), + ] + + operations = [ + migrations.AddField( + model_name='poultry', + name='interest_license_id', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 191973)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 138607)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 138607)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 138607)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 138607)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 258942)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 258942)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 142606)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 142606)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 142606)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 4, 17, 29, 54, 151649)), + ), + ] diff --git a/panel/migrations/0469_auto_20250305_1330.py b/panel/migrations/0469_auto_20250305_1330.py new file mode 100644 index 0000000..11c0d76 --- /dev/null +++ b/panel/migrations/0469_auto_20250305_1330.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-03-05 13:30 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0468_auto_20250304_1730'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 293058)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 238817)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 238817)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 238817)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 238817)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 358060)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 358060)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 241814)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 241814)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 241814)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 5, 13, 30, 35, 250815)), + ), + ] diff --git a/panel/migrations/0470_auto_20250307_1650.py b/panel/migrations/0470_auto_20250307_1650.py new file mode 100644 index 0000000..1ca6af4 --- /dev/null +++ b/panel/migrations/0470_auto_20250307_1650.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-03-07 16:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0469_auto_20250305_1330'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 688507)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 630991)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 630991)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 630991)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 630991)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 755806)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 755806)), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='additional', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 634769)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 634769)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 634769)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 7, 16, 50, 14, 634769)), + ), + ] diff --git a/panel/migrations/0471_auto_20250316_2255.py b/panel/migrations/0471_auto_20250316_2255.py new file mode 100644 index 0000000..b46d156 --- /dev/null +++ b/panel/migrations/0471_auto_20250316_2255.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-03-16 22:55 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0470_auto_20250307_1650'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 3, 124044)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 2, 890050)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 2, 890050)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 2, 890050)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 2, 890050)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 3, 394045)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 3, 394045)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 2, 954044)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 2, 954044)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 2, 954044)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 3, 16, 22, 55, 2, 976050)), + ), + migrations.CreateModel( + name='RequestLimitation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('limitation', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='requestlimitation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='requestlimitation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0472_auto_20250413_1442.py b/panel/migrations/0472_auto_20250413_1442.py new file mode 100644 index 0000000..b2e8477 --- /dev/null +++ b/panel/migrations/0472_auto_20250413_1442.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-04-13 14:42 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0471_auto_20250316_2255'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 14, 970156)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 14, 907205)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 14, 907205)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 14, 907205)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 14, 907205)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 15, 35215)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 15, 35215)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 14, 907205)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 14, 907205)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 14, 907205)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 14, 42, 14, 922874)), + ), + migrations.CreateModel( + name='PriceConfirmation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('poultry_status', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='priceconfirmation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='priceconfirmation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0473_auto_20250413_1557.py b/panel/migrations/0473_auto_20250413_1557.py new file mode 100644 index 0000000..109defd --- /dev/null +++ b/panel/migrations/0473_auto_20250413_1557.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-04-13 15:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0472_auto_20250413_1442'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='price_confirmation', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='poultryrequest', + name='price_confirmation_code', + field=models.CharField(max_length=10, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 97621)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 44868)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 42860)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 44868)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 44868)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 168622)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 168622)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 46876)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 46876)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 46876)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 13, 15, 57, 31, 56653)), + ), + ] diff --git a/panel/migrations/0474_auto_20250414_1231.py b/panel/migrations/0474_auto_20250414_1231.py new file mode 100644 index 0000000..a3bb752 --- /dev/null +++ b/panel/migrations/0474_auto_20250414_1231.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-04-14 12:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0473_auto_20250413_1557'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='input_price_confirmation_code', + field=models.CharField(max_length=10, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 311620)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 264468)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 264468)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 264468)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 264468)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 390458)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 390458)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 264468)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 264468)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 264468)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 12, 31, 9, 280178)), + ), + ] diff --git a/panel/migrations/0475_auto_20250414_1710.py b/panel/migrations/0475_auto_20250414_1710.py new file mode 100644 index 0000000..63cf8a8 --- /dev/null +++ b/panel/migrations/0475_auto_20250414_1710.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-04-14 17:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0474_auto_20250414_1231'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='price_confirmation', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 829546)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 773829)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 773829)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 773829)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 773829)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 899300)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 899300)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 776841)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 776841)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 776841)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 14, 17, 10, 7, 787208)), + ), + ] diff --git a/panel/migrations/0476_auto_20250420_1106.py b/panel/migrations/0476_auto_20250420_1106.py new file mode 100644 index 0000000..ed2a242 --- /dev/null +++ b/panel/migrations/0476_auto_20250420_1106.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-04-20 11:06 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0475_auto_20250414_1710'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='register_type', + field=models.CharField(max_length=250, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 613325)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 561032)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 561032)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 561032)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 561032)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 678957)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 678957)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 564290)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 564290)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 564290)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 6, 13, 573290)), + ), + ] diff --git a/panel/migrations/0477_auto_20250420_1108.py b/panel/migrations/0477_auto_20250420_1108.py new file mode 100644 index 0000000..785ee53 --- /dev/null +++ b/panel/migrations/0477_auto_20250420_1108.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-04-20 11:08 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0476_auto_20250420_1106'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 25, 35345)), + ), + migrations.AlterField( + model_name='killhousefreebarinformation', + name='register_type', + field=models.CharField(default='manual', max_length=250), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 24, 932803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 24, 932803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 24, 932803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 24, 932803)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 25, 141342)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 25, 141342)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 24, 938811)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 24, 938811)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 24, 938811)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 20, 11, 8, 24, 963819)), + ), + ] diff --git a/panel/migrations/0478_auto_20250428_1358.py b/panel/migrations/0478_auto_20250428_1358.py new file mode 100644 index 0000000..7a6c9f1 --- /dev/null +++ b/panel/migrations/0478_auto_20250428_1358.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-04-28 13:58 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0477_auto_20250420_1108'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='final_accept', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 13, 149184)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 12, 921184)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 12, 921184)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 12, 921184)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 12, 921184)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 13, 443185)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 13, 443185)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 12, 936185)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 12, 936185)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 12, 936185)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 4, 28, 13, 58, 12, 988186)), + ), + ] diff --git a/panel/migrations/0479_auto_20250503_1400.py b/panel/migrations/0479_auto_20250503_1400.py new file mode 100644 index 0000000..d050105 --- /dev/null +++ b/panel/migrations/0479_auto_20250503_1400.py @@ -0,0 +1,96 @@ +# Generated by Django 3.2.13 on 2025-05-03 14:00 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0478_auto_20250428_1358'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 311657)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 256484)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 256484)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 256484)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 256484)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 382834)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 382834)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 260234)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 260234)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 260234)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 3, 13, 59, 59, 270277)), + ), + migrations.CreateModel( + name='ArchiveWageInfo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('start_year', models.DateTimeField(null=True)), + ('end_year', models.DateTimeField(null=True)), + ('total_wage', models.BigIntegerField(default=0)), + ('total_paid_wage', models.BigIntegerField(default=0)), + ('total_company_paid_wage', models.BigIntegerField(default=0)), + ('total_union_paid_wage', models.BigIntegerField(default=0)), + ('total_guild_paid_wage', models.BigIntegerField(default=0)), + ('total_vet_paid_wage', models.BigIntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='archivewageinfo_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='archivewageinfo_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0480_auto_20250504_1149.py b/panel/migrations/0480_auto_20250504_1149.py new file mode 100644 index 0000000..0a20279 --- /dev/null +++ b/panel/migrations/0480_auto_20250504_1149.py @@ -0,0 +1,90 @@ +# Generated by Django 3.2.13 on 2025-05-04 11:49 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0479_auto_20250503_1400'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 23, 664637)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 22, 406293)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 22, 406293)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 22, 406293)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 22, 406293)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 23, 735896)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 23, 735896)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 22, 408301)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 22, 408301)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 22, 408301)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 11, 48, 23, 196458)), + ), + migrations.CreateModel( + name='CompanyBeneficiaryAccount', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, null=True)), + ('percent', models.BigIntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='companybeneficiaryaccount_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='companybeneficiaryaccount_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0481_auto_20250504_1207.py b/panel/migrations/0481_auto_20250504_1207.py new file mode 100644 index 0000000..2fe0799 --- /dev/null +++ b/panel/migrations/0481_auto_20250504_1207.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-04 12:07 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0480_auto_20250504_1149'), + ] + + operations = [ + migrations.AddField( + model_name='companybeneficiaryaccount', + name='shaba', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 347412)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 284262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 284262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 284262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 284262)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 411233)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 411233)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 300078)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 300078)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 300078)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 4, 12, 7, 29, 300078)), + ), + ] diff --git a/panel/migrations/0482_auto_20250505_1431.py b/panel/migrations/0482_auto_20250505_1431.py new file mode 100644 index 0000000..9615136 --- /dev/null +++ b/panel/migrations/0482_auto_20250505_1431.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-05-05 14:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0481_auto_20250504_1207'), + ] + + operations = [ + migrations.AddField( + model_name='companybeneficiaryaccount', + name='in_province', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='companybeneficiaryaccount', + name='out_province', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 725490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 677832)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 677832)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 677832)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 677832)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 789006)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 789006)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 677832)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 677832)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 677832)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 5, 14, 30, 52, 693897)), + ), + ] diff --git a/panel/migrations/0483_auto_20250506_1054.py b/panel/migrations/0483_auto_20250506_1054.py new file mode 100644 index 0000000..45efc9c --- /dev/null +++ b/panel/migrations/0483_auto_20250506_1054.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-06 10:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0482_auto_20250505_1431'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='samasat_discharge_percentage', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 816669)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 740124)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 740124)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 740124)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 740124)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 922646)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 922646)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 745652)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 745652)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 745652)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 6, 10, 54, 4, 758786)), + ), + ] diff --git a/panel/migrations/0484_auto_20250510_1211.py b/panel/migrations/0484_auto_20250510_1211.py new file mode 100644 index 0000000..5c5614f --- /dev/null +++ b/panel/migrations/0484_auto_20250510_1211.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-05-10 12:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0483_auto_20250506_1054'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='InteractTypeName', + field=models.CharField(blank=True, max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='PersonTypeName', + field=models.CharField(blank=True, max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='UnionTypeName', + field=models.CharField(blank=True, max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 599550)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 545483)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 545483)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 545483)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 545483)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 666618)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 666618)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 548589)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 548589)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 548589)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 10, 12, 11, 0, 558202)), + ), + ] diff --git a/panel/migrations/0485_auto_20250511_1456.py b/panel/migrations/0485_auto_20250511_1456.py new file mode 100644 index 0000000..baf73eb --- /dev/null +++ b/panel/migrations/0485_auto_20250511_1456.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-11 14:56 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0484_auto_20250510_1211'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 204123)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 149931)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 149931)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 149931)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 149931)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 269685)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 269685)), + ), + migrations.AlterField( + model_name='posmachinetransactions', + name='result', + field=models.CharField(max_length=1000, null=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 153027)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 153027)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 153027)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 11, 14, 56, 11, 162494)), + ), + ] diff --git a/panel/migrations/0486_auto_20250517_0910.py b/panel/migrations/0486_auto_20250517_0910.py new file mode 100644 index 0000000..88662ee --- /dev/null +++ b/panel/migrations/0486_auto_20250517_0910.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-17 09:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0485_auto_20250511_1456'), + ] + + operations = [ + migrations.AddField( + model_name='companybeneficiaryaccount', + name='unique_code', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 87896)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 36262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 36262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 36262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 36262)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 153895)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 153895)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 39262)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 39262)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 39262)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 9, 10, 18, 48262)), + ), + ] diff --git a/panel/migrations/0487_auto_20250517_1602.py b/panel/migrations/0487_auto_20250517_1602.py new file mode 100644 index 0000000..69fbe71 --- /dev/null +++ b/panel/migrations/0487_auto_20250517_1602.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-05-17 16:02 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0486_auto_20250517_0910'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='out_province_selling_limitation', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='out_province_selling_limitation_percent', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 154748)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 107117)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 107117)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 107117)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 107117)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 217794)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 217794)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 107117)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 107117)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 107117)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 16, 2, 6, 123214)), + ), + ] diff --git a/panel/migrations/0488_auto_20250517_1701.py b/panel/migrations/0488_auto_20250517_1701.py new file mode 100644 index 0000000..6a2361e --- /dev/null +++ b/panel/migrations/0488_auto_20250517_1701.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-05-17 17:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0487_auto_20250517_1602'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='in_province_selling_limitation', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='in_province_selling_limitation_percent', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 908665)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 852452)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 852452)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 852452)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 852452)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 976471)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 976471)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 855988)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 855988)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 855988)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 17, 17, 1, 31, 866866)), + ), + ] diff --git a/panel/migrations/0489_auto_20250518_1144.py b/panel/migrations/0489_auto_20250518_1144.py new file mode 100644 index 0000000..1a649ab --- /dev/null +++ b/panel/migrations/0489_auto_20250518_1144.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-18 11:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0488_auto_20250517_1701'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='quarantine_weight_of_carcasses', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 913969)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 859288)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 859288)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 859288)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 859288)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 980965)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 980965)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 862280)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 862280)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 862280)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 18, 11, 44, 15, 872136)), + ), + ] diff --git a/panel/migrations/0490_auto_20250520_1132.py b/panel/migrations/0490_auto_20250520_1132.py new file mode 100644 index 0000000..c6df344 --- /dev/null +++ b/panel/migrations/0490_auto_20250520_1132.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-20 11:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0489_auto_20250518_1144'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='CertId', + field=models.CharField(blank=True, max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 491945)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 437946)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 437946)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 437946)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 437946)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 555944)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 555944)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 441908)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 441908)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 441908)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 20, 11, 31, 54, 451948)), + ), + ] diff --git a/panel/migrations/0491_auto_20250525_1503.py b/panel/migrations/0491_auto_20250525_1503.py new file mode 100644 index 0000000..41a2a2d --- /dev/null +++ b/panel/migrations/0491_auto_20250525_1503.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-05-25 15:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0490_auto_20250520_1132'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 253633)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 197749)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 197749)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 197749)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 197749)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 321918)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 321918)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 201900)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 201900)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 201900)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 2, 53, 211179)), + ), + ] diff --git a/panel/migrations/0492_auto_20250525_1504.py b/panel/migrations/0492_auto_20250525_1504.py new file mode 100644 index 0000000..bd90a48 --- /dev/null +++ b/panel/migrations/0492_auto_20250525_1504.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-05-25 15:04 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0491_auto_20250525_1503'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 135589)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 77519)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 76488)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 76488)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 76488)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 208362)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 208362)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 80788)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 80788)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 80788)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 4, 13, 90869)), + ), + ] diff --git a/panel/migrations/0493_auto_20250525_1505.py b/panel/migrations/0493_auto_20250525_1505.py new file mode 100644 index 0000000..21f482d --- /dev/null +++ b/panel/migrations/0493_auto_20250525_1505.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-05-25 15:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0492_auto_20250525_1504'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 294893)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 238863)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 238863)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 238863)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 238863)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 362839)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 362839)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 241987)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 241987)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 241987)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 25, 15, 5, 28, 251492)), + ), + ] diff --git a/panel/migrations/0494_auto_20250526_0939.py b/panel/migrations/0494_auto_20250526_0939.py new file mode 100644 index 0000000..e0e60ab --- /dev/null +++ b/panel/migrations/0494_auto_20250526_0939.py @@ -0,0 +1,103 @@ +# Generated by Django 3.2.13 on 2025-05-26 09:39 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0493_auto_20250525_1505'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='increase_quantity', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 40, 41495)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 39, 969999)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 39, 969999)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 39, 969999)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 39, 969999)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 40, 138437)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 40, 138437)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 39, 973993)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 39, 973993)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 39, 973993)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 9, 39, 39, 985609)), + ), + migrations.CreateModel( + name='HatchingIncreaseRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('hatching_quantity', models.IntegerField(null=True)), + ('quantity', models.IntegerField(null=True)), + ('hatching_kill_quantity', models.IntegerField(null=True)), + ('hatching_left_over', models.IntegerField(null=True)), + ('message', models.TextField(null=True)), + ('registerer_name', models.CharField(max_length=250, null=True)), + ('registerer_role', models.CharField(max_length=50, null=True)), + ('registerer_mobile', models.CharField(max_length=20, null=True)), + ('date', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hatchingincreaserequest_createdby', to=settings.AUTH_USER_MODEL)), + ('hatching', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='increase_hatching', to='panel.poultryhatching')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hatchingincreaserequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0495_auto_20250526_1214.py b/panel/migrations/0495_auto_20250526_1214.py new file mode 100644 index 0000000..a22b091 --- /dev/null +++ b/panel/migrations/0495_auto_20250526_1214.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-05-26 12:14 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0494_auto_20250526_0939'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='license', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='license_file', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='guilds', + name='license_form', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 759005)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 711431)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 711431)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 711431)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 711431)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 846169)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 846169)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 719289)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 719289)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 719289)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 12, 14, 25, 731373)), + ), + ] diff --git a/panel/migrations/0496_auto_20250526_1440.py b/panel/migrations/0496_auto_20250526_1440.py new file mode 100644 index 0000000..b33b1b4 --- /dev/null +++ b/panel/migrations/0496_auto_20250526_1440.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-05-26 14:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0495_auto_20250526_1214'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='checker_message', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='guilds', + name='final_accept', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='reviewer_fullname', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='guilds', + name='reviewer_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AddField( + model_name='guilds', + name='reviewer_role', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 40, 940928)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 40, 886263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 40, 886263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 40, 886263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 40, 886263)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 41, 7838)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 41, 7838)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 40, 890278)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 40, 890278)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 40, 890278)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 26, 14, 40, 40, 901319)), + ), + ] diff --git a/panel/migrations/0497_auto_20250527_0854.py b/panel/migrations/0497_auto_20250527_0854.py new file mode 100644 index 0000000..f309f49 --- /dev/null +++ b/panel/migrations/0497_auto_20250527_0854.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-27 08:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0496_auto_20250526_1440'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='temporary_registration', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 29, 58207)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 28, 993976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 28, 993976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 28, 993976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 28, 993976)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 29, 129217)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 29, 129217)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 28, 999593)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 28, 999593)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 28, 999593)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 8, 54, 29, 11739)), + ), + ] diff --git a/panel/migrations/0498_auto_20250527_1032.py b/panel/migrations/0498_auto_20250527_1032.py new file mode 100644 index 0000000..d1cf263 --- /dev/null +++ b/panel/migrations/0498_auto_20250527_1032.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-27 10:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0497_auto_20250527_0854'), + ] + + operations = [ + migrations.AddField( + model_name='hatchingincreaserequest', + name='hatching_losses', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 385260)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 328648)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 328648)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 328648)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 328648)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 463753)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 463753)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 331742)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 331742)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 331742)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 27, 10, 32, 36, 341530)), + ), + ] diff --git a/panel/migrations/0499_auto_20250528_1132.py b/panel/migrations/0499_auto_20250528_1132.py new file mode 100644 index 0000000..c3fbf69 --- /dev/null +++ b/panel/migrations/0499_auto_20250528_1132.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.13 on 2025-05-28 11:32 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0498_auto_20250527_1032'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 632526)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 576823)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 576823)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 576823)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 576823)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 702213)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 702213)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 579920)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 579920)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 579920)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 32, 7, 590973)), + ), + migrations.CreateModel( + name='ChickenCommissionPrices', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_price', models.IntegerField(default=0)), + ('wholesaler_price', models.IntegerField(default=0)), + ('retailer_price', models.IntegerField(default=0)), + ('chicken_average_price', models.IntegerField(default=0)), + ('date', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chickencommissionprices_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chickencommissionprices_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0500_auto_20250528_1140.py b/panel/migrations/0500_auto_20250528_1140.py new file mode 100644 index 0000000..f6d6f03 --- /dev/null +++ b/panel/migrations/0500_auto_20250528_1140.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-05-28 11:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0499_auto_20250528_1132'), + ] + + operations = [ + migrations.AlterField( + model_name='chickencommissionprices', + name='kill_house_price', + field=models.IntegerField(default=1500), + ), + migrations.AlterField( + model_name='chickencommissionprices', + name='retailer_price', + field=models.IntegerField(default=4000), + ), + migrations.AlterField( + model_name='chickencommissionprices', + name='wholesaler_price', + field=models.IntegerField(default=2000), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 250349)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 194646)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 194646)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 194646)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 194646)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 318847)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 318847)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 197550)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 197550)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 197550)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 11, 40, 2, 207882)), + ), + ] diff --git a/panel/migrations/0501_auto_20250528_1554.py b/panel/migrations/0501_auto_20250528_1554.py new file mode 100644 index 0000000..470cbb1 --- /dev/null +++ b/panel/migrations/0501_auto_20250528_1554.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-05-28 15:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0500_auto_20250528_1140'), + ] + + operations = [ + migrations.AddField( + model_name='chickencommissionprices', + name='kill_request_amount', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='chickencommissionprices', + name='poultry_request_amount', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='chickencommissionprices', + name='province_kill_request_amount', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 896874)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 828889)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 828889)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 828889)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 828889)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 988848)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 988848)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 833707)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 833707)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 833707)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 28, 15, 54, 1, 844910)), + ), + ] diff --git a/panel/migrations/0502_auto_20250531_1005.py b/panel/migrations/0502_auto_20250531_1005.py new file mode 100644 index 0000000..daa1a8a --- /dev/null +++ b/panel/migrations/0502_auto_20250531_1005.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-31 10:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0501_auto_20250528_1554'), + ] + + operations = [ + migrations.AlterField( + model_name='chickencommissionprices', + name='date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 857054)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 650126)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 650126)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 650126)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 650126)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 976787)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 976787)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 661494)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 661494)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 661494)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 10, 5, 24, 678243)), + ), + ] diff --git a/panel/migrations/0503_auto_20250531_1207.py b/panel/migrations/0503_auto_20250531_1207.py new file mode 100644 index 0000000..772b4ac --- /dev/null +++ b/panel/migrations/0503_auto_20250531_1207.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-05-31 12:07 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0502_auto_20250531_1005'), + ] + + operations = [ + migrations.AlterField( + model_name='chickencommissionprices', + name='kill_house_price', + field=models.IntegerField(default=15000), + ), + migrations.AlterField( + model_name='chickencommissionprices', + name='retailer_price', + field=models.IntegerField(default=40000), + ), + migrations.AlterField( + model_name='chickencommissionprices', + name='wholesaler_price', + field=models.IntegerField(default=20000), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 47, 950795)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 47, 854630)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 47, 854630)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 47, 854630)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 47, 854630)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 48, 146217)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 48, 146217)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 47, 859617)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 47, 858620)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 47, 858620)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 6, 47, 871584)), + ), + ] diff --git a/panel/migrations/0504_auto_20250531_1249.py b/panel/migrations/0504_auto_20250531_1249.py new file mode 100644 index 0000000..deb4b67 --- /dev/null +++ b/panel/migrations/0504_auto_20250531_1249.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-31 12:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0503_auto_20250531_1207'), + ] + + operations = [ + migrations.AddField( + model_name='chickencommissionprices', + name='shipping_price', + field=models.IntegerField(default=25000), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 103178)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 48589)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 48589)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 48589)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 48589)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 173466)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 173466)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 51580)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 51580)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 51580)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 12, 49, 18, 62046)), + ), + ] diff --git a/panel/migrations/0505_auto_20250531_1332.py b/panel/migrations/0505_auto_20250531_1332.py new file mode 100644 index 0000000..943036b --- /dev/null +++ b/panel/migrations/0505_auto_20250531_1332.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-31 13:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0504_auto_20250531_1249'), + ] + + operations = [ + migrations.AlterField( + model_name='chickencommissionprices', + name='shipping_price', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 864669)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 806794)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 806794)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 806794)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 806794)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 938401)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 938401)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 809942)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 809942)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 809942)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 32, 30, 820585)), + ), + ] diff --git a/panel/migrations/0506_auto_20250531_1344.py b/panel/migrations/0506_auto_20250531_1344.py new file mode 100644 index 0000000..25abe08 --- /dev/null +++ b/panel/migrations/0506_auto_20250531_1344.py @@ -0,0 +1,73 @@ +# Generated by Django 3.2.13 on 2025-05-31 13:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0505_auto_20250531_1332'), + ] + + operations = [ + migrations.RemoveField( + model_name='chickencommissionprices', + name='shipping_price', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 178880)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 112165)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 112165)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 112165)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 112165)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 286547)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 286547)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 116182)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 116182)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 116182)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 13, 44, 38, 127964)), + ), + ] diff --git a/panel/migrations/0507_auto_20250531_1433.py b/panel/migrations/0507_auto_20250531_1433.py new file mode 100644 index 0000000..c4df035 --- /dev/null +++ b/panel/migrations/0507_auto_20250531_1433.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-05-31 14:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0506_auto_20250531_1344'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='quarantine_quantity', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 300822)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 234288)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 234288)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 234288)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 234288)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 406500)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 406500)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 238278)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 238278)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 238278)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 5, 31, 14, 32, 56, 249842)), + ), + ] diff --git a/panel/migrations/0508_auto_20250601_1023.py b/panel/migrations/0508_auto_20250601_1023.py new file mode 100644 index 0000000..60269b2 --- /dev/null +++ b/panel/migrations/0508_auto_20250601_1023.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.13 on 2025-06-01 10:23 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0071_auto_20250601_1023'), + ('panel', '0507_auto_20250531_1433'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 831670)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 756490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 756490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 756490)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 756490)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 909045)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 909045)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 774258)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 774258)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 774258)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 1, 10, 23, 19, 784295)), + ), + migrations.CreateModel( + name='ProteinGuild', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='protein_guild_address', to='authentication.systemaddress')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='proteinguild_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='proteinguild_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='protein_guild_user', to='authentication.systemuserprofile')), + ('user_bank_info', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='protein_guild_bank_info', to='authentication.bankcard')), + ('wallet', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='protein_guild_wallet', to='panel.wallet')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0509_auto_20250602_1504.py b/panel/migrations/0509_auto_20250602_1504.py new file mode 100644 index 0000000..72ff1e4 --- /dev/null +++ b/panel/migrations/0509_auto_20250602_1504.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-06-02 15:04 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0508_auto_20250601_1023'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='weight_loss_of_carcasses', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 30, 51554)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 29, 994154)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 29, 994154)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 29, 994154)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 29, 994154)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 30, 120716)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 30, 120716)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 29, 998168)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 29, 998168)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 29, 998168)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 2, 15, 4, 30, 8194)), + ), + ] diff --git a/panel/migrations/0510_auto_20250603_1443.py b/panel/migrations/0510_auto_20250603_1443.py new file mode 100644 index 0000000..fdb14b3 --- /dev/null +++ b/panel/migrations/0510_auto_20250603_1443.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2025-06-03 14:43 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0509_auto_20250602_1504'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 102987)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 36709)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 36709)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 36709)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 36709)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 194004)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 194004)), + ), + migrations.AlterField( + model_name='posdeviceversion', + name='company', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pos_version_company', to='panel.poscompany'), + ), + migrations.AlterField( + model_name='posdeviceversion', + name='description', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 40698)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 40698)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 40698)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 3, 14, 43, 35, 52943)), + ), + ] diff --git a/panel/migrations/0511_auto_20250607_0938.py b/panel/migrations/0511_auto_20250607_0938.py new file mode 100644 index 0000000..607a034 --- /dev/null +++ b/panel/migrations/0511_auto_20250607_0938.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2025-06-07 09:38 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0510_auto_20250603_1443'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 285936)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 220682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 220682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 220682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 220682)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 372735)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 372735)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 224699)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 224699)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 224699)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 9, 38, 12, 236510)), + ), + migrations.CreateModel( + name='CommonlyUsed', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('exclusive', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commonlyused_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commonly_used_guild', to='panel.guilds')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commonly_used_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commonlyused_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0512_auto_20250607_1053.py b/panel/migrations/0512_auto_20250607_1053.py new file mode 100644 index 0000000..580dec5 --- /dev/null +++ b/panel/migrations/0512_auto_20250607_1053.py @@ -0,0 +1,73 @@ +# Generated by Django 3.2.13 on 2025-06-07 10:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0511_auto_20250607_0938'), + ] + + operations = [ + migrations.RemoveField( + model_name='commonlyused', + name='exclusive', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 167705)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 106803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 106803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 106803)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 106803)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 238327)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 238327)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 109802)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 109802)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 109802)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 10, 52, 57, 121564)), + ), + ] diff --git a/panel/migrations/0513_auto_20250607_1502.py b/panel/migrations/0513_auto_20250607_1502.py new file mode 100644 index 0000000..25251c7 --- /dev/null +++ b/panel/migrations/0513_auto_20250607_1502.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-06-07 15:02 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0512_auto_20250607_1053'), + ] + + operations = [ + migrations.AddField( + model_name='commonlyused', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='commonly_used_steward', to='panel.guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 94820)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 5886)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 5886)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 5886)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 5886)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 584922)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 584922)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 9902)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 9902)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 9902)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 15, 1, 43, 25742)), + ), + ] diff --git a/panel/migrations/0514_auto_20250607_1612.py b/panel/migrations/0514_auto_20250607_1612.py new file mode 100644 index 0000000..e0b2eb8 --- /dev/null +++ b/panel/migrations/0514_auto_20250607_1612.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-06-07 16:12 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0513_auto_20250607_1502'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='register_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 613592)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 528530)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 528530)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 528530)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 528530)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 696621)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 696621)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 532547)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 532547)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 532547)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 12, 1, 546352)), + ), + ] diff --git a/panel/migrations/0515_auto_20250607_1624.py b/panel/migrations/0515_auto_20250607_1624.py new file mode 100644 index 0000000..73c677e --- /dev/null +++ b/panel/migrations/0515_auto_20250607_1624.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-06-07 16:24 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0514_auto_20250607_1612'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='overhead', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 765249)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 707463)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 707463)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 707463)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 707463)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 833617)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 833617)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 717434)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 717434)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 717434)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 7, 16, 24, 45, 717434)), + ), + ] diff --git a/panel/migrations/0516_auto_20250609_1157.py b/panel/migrations/0516_auto_20250609_1157.py new file mode 100644 index 0000000..4fdfad4 --- /dev/null +++ b/panel/migrations/0516_auto_20250609_1157.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-06-09 11:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0515_auto_20250607_1624'), + ] + + operations = [ + migrations.AddField( + model_name='commonlyused', + name='priority', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 309019)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 246332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 246332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 246332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 246332)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 371832)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 371832)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 246332)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 246332)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 246332)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 11, 57, 39, 261985)), + ), + ] diff --git a/panel/migrations/0517_auto_20250609_1435.py b/panel/migrations/0517_auto_20250609_1435.py new file mode 100644 index 0000000..55b3310 --- /dev/null +++ b/panel/migrations/0517_auto_20250609_1435.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-06-09 14:35 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0516_auto_20250609_1157'), + ] + + operations = [ + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='buyer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_free_sale_bar_info_buyer', to='panel.outprovincecarcassesbuyer'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 214604)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 153824)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 153824)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 153824)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 153824)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 290569)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 290569)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 156824)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 156824)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 156824)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 9, 14, 35, 9, 169487)), + ), + ] diff --git a/panel/migrations/0518_auto_20250610_1345.py b/panel/migrations/0518_auto_20250610_1345.py new file mode 100644 index 0000000..37c3202 --- /dev/null +++ b/panel/migrations/0518_auto_20250610_1345.py @@ -0,0 +1,119 @@ +# Generated by Django 3.2.13 on 2025-06-10 13:45 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0517_auto_20250609_1435'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='description', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='image', + field=models.CharField(max_length=500, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='price', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='killhouserequest', + name='price_editor', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='price_editor_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='price_editor_role', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='price_register_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='price_registerar', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='price_registerar_role', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='settlement_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 305343)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 257989)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 257989)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 257989)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 257989)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 368442)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 368442)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 257989)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 257989)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 257989)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 15, 257989)), + ), + ] diff --git a/panel/migrations/0519_auto_20250610_1345.py b/panel/migrations/0519_auto_20250610_1345.py new file mode 100644 index 0000000..7b1476d --- /dev/null +++ b/panel/migrations/0519_auto_20250610_1345.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-06-10 13:45 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0518_auto_20250610_1345'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 248364)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 186723)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 186723)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 186723)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 186723)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 321059)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 321059)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 186723)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 186723)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 186723)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 10, 13, 45, 46, 202729)), + ), + ] diff --git a/panel/migrations/0520_auto_20250628_1428.py b/panel/migrations/0520_auto_20250628_1428.py new file mode 100644 index 0000000..989ddf5 --- /dev/null +++ b/panel/migrations/0520_auto_20250628_1428.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-06-28 14:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0519_auto_20250610_1345'), + ] + + operations = [ + migrations.AddField( + model_name='bardocumentstatus', + name='description', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 84182)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 20982)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 20982)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 20982)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 20982)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 147535)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 147535)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 20982)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 20982)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 20982)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 14, 27, 54, 40677)), + ), + ] diff --git a/panel/migrations/0521_auto_20250628_1502.py b/panel/migrations/0521_auto_20250628_1502.py new file mode 100644 index 0000000..4b0ef7c --- /dev/null +++ b/panel/migrations/0521_auto_20250628_1502.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-06-28 15:02 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0520_auto_20250628_1428'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='bar_document_description', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 658308)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 585023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 585023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 585023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 585023)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 766966)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 766966)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 589039)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 587031)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 587031)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 6, 28, 15, 1, 51, 600828)), + ), + ] diff --git a/panel/migrations/0522_auto_20250707_0926.py b/panel/migrations/0522_auto_20250707_0926.py new file mode 100644 index 0000000..63a148c --- /dev/null +++ b/panel/migrations/0522_auto_20250707_0926.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2025-07-07 09:26 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0521_auto_20250628_1502'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 399532)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 336424)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 336424)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 336424)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 336424)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 462689)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 462689)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 344142)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 344142)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 344142)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 25, 45, 356175)), + ), + migrations.CreateModel( + name='PoultryRequestQuarantineCode', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('quarantine_code', models.CharField(max_length=200, null=True)), + ('quarantine_quantity', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequestquarantinecode_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryrequestquarantinecode_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_code', to='panel.poultryrequest')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0523_auto_20250707_0959.py b/panel/migrations/0523_auto_20250707_0959.py new file mode 100644 index 0000000..a37ee93 --- /dev/null +++ b/panel/migrations/0523_auto_20250707_0959.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-07-07 09:59 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0522_auto_20250707_0926'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequestquarantinecode', + name='system_quarantine_quantity', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 48, 16337)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 47, 952935)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 47, 952935)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 47, 952935)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 47, 952935)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 48, 95465)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 48, 95465)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 47, 968894)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 47, 968894)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 47, 968894)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 7, 9, 58, 47, 968894)), + ), + ] diff --git a/panel/migrations/0524_auto_20250708_0838.py b/panel/migrations/0524_auto_20250708_0838.py new file mode 100644 index 0000000..ad5fc2d --- /dev/null +++ b/panel/migrations/0524_auto_20250708_0838.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-07-08 08:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0523_auto_20250707_0959'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequestquarantinecode', + name='register_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='poultryrequestquarantinecode', + name='registrar', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 598369)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 535610)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 535610)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 535610)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 535610)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 661543)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 661543)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 535610)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 535610)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 535610)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 8, 38, 24, 553538)), + ), + ] diff --git a/panel/migrations/0525_auto_20250708_1018.py b/panel/migrations/0525_auto_20250708_1018.py new file mode 100644 index 0000000..5a1a154 --- /dev/null +++ b/panel/migrations/0525_auto_20250708_1018.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-07-08 10:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0524_auto_20250708_0838'), + ] + + operations = [ + migrations.AddField( + model_name='poultry', + name='order_limit', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 215751)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 132638)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 132638)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 132638)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 132638)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 393590)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 393590)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 134646)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 134646)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 134646)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 10, 18, 23, 148456)), + ), + ] diff --git a/panel/migrations/0526_auto_20250708_1421.py b/panel/migrations/0526_auto_20250708_1421.py new file mode 100644 index 0000000..d9e67a0 --- /dev/null +++ b/panel/migrations/0526_auto_20250708_1421.py @@ -0,0 +1,109 @@ +# Generated by Django 3.2.13 on 2025-07-08 14:21 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0525_auto_20250708_1018'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 16, 33025)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 14, 939813)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 14, 939813)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 14, 939813)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 14, 939813)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 18, 220599)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 18, 220599)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 15, 228558)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 15, 228558)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 15, 228558)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 8, 14, 21, 15, 525000)), + ), + migrations.CreateModel( + name='UploadImageLimitation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_allocation', models.BooleanField(default=False)), + ('kill_house_free_sale', models.BooleanField(default=False)), + ('steward_allocation', models.BooleanField(default=False)), + ('steward_free_sale', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='uploadimagelimitation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='uploadimagelimitation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PercentageDropLimitation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('kill_house_limit_percent_down', models.IntegerField(default=0)), + ('kill_house_limit_percent_up', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percentagedroplimitation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='percentagedroplimitation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0527_auto_20250709_1112.py b/panel/migrations/0527_auto_20250709_1112.py new file mode 100644 index 0000000..3d2335a --- /dev/null +++ b/panel/migrations/0527_auto_20250709_1112.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-07-09 11:12 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0526_auto_20250708_1421'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='image', + field=models.CharField(max_length=500, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 85731)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 21962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 21962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 21962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 21962)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 165616)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 165616)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 21962)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 21962)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 21962)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 9, 11, 12, 13, 37660)), + ), + ] diff --git a/panel/migrations/0528_auto_20250713_1028.py b/panel/migrations/0528_auto_20250713_1028.py new file mode 100644 index 0000000..e45c320 --- /dev/null +++ b/panel/migrations/0528_auto_20250713_1028.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-07-13 10:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0527_auto_20250709_1112'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='role_activation', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 804539)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 742089)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 742089)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 742089)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 742089)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 880340)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 880340)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 747344)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 747344)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 747344)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 13, 10, 28, 14, 759699)), + ), + ] diff --git a/panel/migrations/0529_auto_20250714_1045.py b/panel/migrations/0529_auto_20250714_1045.py new file mode 100644 index 0000000..2cd2e5c --- /dev/null +++ b/panel/migrations/0529_auto_20250714_1045.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-07-14 10:45 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0528_auto_20250713_1028'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='tenant_city', + field=models.CharField(blank=True, max_length=200, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='tenant_fullname', + field=models.CharField(blank=True, max_length=300, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='tenant_mobile', + field=models.CharField(blank=True, max_length=20, null=True), + ), + migrations.AddField( + model_name='poultryhatching', + name='tenant_national_code', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 646000)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 596927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 596927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 596927)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 596927)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 721321)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 721321)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 600677)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 600677)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 600677)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 45, 17, 610698)), + ), + ] diff --git a/panel/migrations/0530_auto_20250714_1100.py b/panel/migrations/0530_auto_20250714_1100.py new file mode 100644 index 0000000..b545935 --- /dev/null +++ b/panel/migrations/0530_auto_20250714_1100.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-07-14 11:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0529_auto_20250714_1045'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='has_tenant', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 106447)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 46837)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 46837)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 46837)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 46837)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 181246)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 181246)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 51170)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 49918)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 49918)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 14, 10, 59, 52, 62139)), + ), + ] diff --git a/panel/migrations/0531_auto_20250719_0857.py b/panel/migrations/0531_auto_20250719_0857.py new file mode 100644 index 0000000..4893208 --- /dev/null +++ b/panel/migrations/0531_auto_20250719_0857.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-07-19 08:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0530_auto_20250714_1100'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='non_receipt', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 48, 137)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 47, 950202)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 47, 950202)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 47, 950202)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 47, 950202)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 48, 83600)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 48, 83600)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 47, 950202)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 47, 950202)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 47, 950202)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 8, 56, 47, 966887)), + ), + ] diff --git a/panel/migrations/0532_auto_20250719_0938.py b/panel/migrations/0532_auto_20250719_0938.py new file mode 100644 index 0000000..3654dae --- /dev/null +++ b/panel/migrations/0532_auto_20250719_0938.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-07-19 09:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0531_auto_20250719_0857'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_state', + field=models.CharField(default='pending', max_length=20), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 315001)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 109879)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 109879)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 109879)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 109879)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 665325)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 665325)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 182942)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 181938)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 182942)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 19, 9, 38, 37, 196218)), + ), + ] diff --git a/panel/migrations/0533_auto_20250720_1445.py b/panel/migrations/0533_auto_20250720_1445.py new file mode 100644 index 0000000..7298dfc --- /dev/null +++ b/panel/migrations/0533_auto_20250720_1445.py @@ -0,0 +1,90 @@ +# Generated by Django 3.2.13 on 2025-07-20 14:45 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0532_auto_20250719_0938'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 870699)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 811222)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 811222)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 811222)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 811222)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 937670)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 937670)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 811222)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 811222)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 811222)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 14, 44, 59, 827110)), + ), + migrations.CreateModel( + name='ApkInfo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('info', models.JSONField(null=True)), + ('download_link', models.CharField(blank=True, max_length=700, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='apkinfo_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='apkinfo_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0534_auto_20250720_1510.py b/panel/migrations/0534_auto_20250720_1510.py new file mode 100644 index 0000000..1f3e1c3 --- /dev/null +++ b/panel/migrations/0534_auto_20250720_1510.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-07-20 15:10 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0533_auto_20250720_1445'), + ] + + operations = [ + migrations.AddField( + model_name='possegmentation', + name='to_guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='to_guild_segmentation', to='panel.guilds'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 123294)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 65908)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 65908)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 65908)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 65908)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 196236)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 196236)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 69918)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 69918)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 69918)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 20, 15, 10, 7, 79685)), + ), + ] diff --git a/panel/migrations/0535_auto_20250722_1133.py b/panel/migrations/0535_auto_20250722_1133.py new file mode 100644 index 0000000..f23df46 --- /dev/null +++ b/panel/migrations/0535_auto_20250722_1133.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-07-22 11:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0534_auto_20250720_1510'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='receipt', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 422441)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 282039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 282039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 282039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 282039)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 829213)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 829213)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 285802)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 285802)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 285802)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 11, 33, 38, 337268)), + ), + ] diff --git a/panel/migrations/0536_auto_20250722_1248.py b/panel/migrations/0536_auto_20250722_1248.py new file mode 100644 index 0000000..d1d7c03 --- /dev/null +++ b/panel/migrations/0536_auto_20250722_1248.py @@ -0,0 +1,108 @@ +# Generated by Django 3.2.13 on 2025-07-22 12:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0535_auto_20250722_1133'), + ] + + operations = [ + migrations.RemoveField( + model_name='killhouserequest', + name='receipt', + ), + migrations.AddField( + model_name='killhouserequest', + name='main_non_receipt', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_check_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_checker', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_checker_mobile', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_return_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_returner', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_returner_mobile', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 348209)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 298104)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 298104)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 298104)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 298104)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 431602)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 431602)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 302279)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 302279)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 302279)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 22, 12, 48, 25, 313760)), + ), + ] diff --git a/panel/migrations/0537_auto_20250723_0917.py b/panel/migrations/0537_auto_20250723_0917.py new file mode 100644 index 0000000..a4fc4d8 --- /dev/null +++ b/panel/migrations/0537_auto_20250723_0917.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-07-23 09:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0536_auto_20250722_1248'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_checker_message', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_message', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 297196)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 237591)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 237591)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 237591)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 237591)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 368970)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 368970)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 240591)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 240591)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 240591)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 9, 16, 57, 252142)), + ), + ] diff --git a/panel/migrations/0538_auto_20250723_1013.py b/panel/migrations/0538_auto_20250723_1013.py new file mode 100644 index 0000000..5cf2a71 --- /dev/null +++ b/panel/migrations/0538_auto_20250723_1013.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-07-23 10:13 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0537_auto_20250723_0917'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_return', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouserequest', + name='non_receipt_return_message', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 46, 71841)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 45, 992864)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 45, 992864)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 45, 992864)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 45, 992864)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 46, 150749)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 46, 150749)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 45, 998628)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 45, 998628)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 45, 998628)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 23, 10, 12, 46, 10672)), + ), + ] diff --git a/panel/migrations/0539_auto_20250727_0734.py b/panel/migrations/0539_auto_20250727_0734.py new file mode 100644 index 0000000..5f99885 --- /dev/null +++ b/panel/migrations/0539_auto_20250727_0734.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-07-27 07:34 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0538_auto_20250723_1013'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='poultry_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_request_kill_req', to='panel.poultryrequest'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 665446)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 606524)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 606524)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 606524)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 606524)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 745055)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 745055)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 618150)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 618150)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 618150)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 7, 34, 12, 633949)), + ), + ] diff --git a/panel/migrations/0540_auto_20250727_1238.py b/panel/migrations/0540_auto_20250727_1238.py new file mode 100644 index 0000000..f200a2a --- /dev/null +++ b/panel/migrations/0540_auto_20250727_1238.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2025-07-27 12:38 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0539_auto_20250727_0734'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 141096)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 66862)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 66862)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 66862)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 66862)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 211380)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 211380)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 84756)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 83863)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 83863)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 12, 38, 17, 94792)), + ), + migrations.CreateModel( + name='DirectBuyingVerification', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('poultry_code_mandatory', models.BooleanField(default=False)), + ('payment_deadline', models.BooleanField(default=False)), + ('payment_deadline_days', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='directbuyingverification_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='directbuyingverification_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0541_auto_20250727_1453.py b/panel/migrations/0541_auto_20250727_1453.py new file mode 100644 index 0000000..f4180be --- /dev/null +++ b/panel/migrations/0541_auto_20250727_1453.py @@ -0,0 +1,117 @@ +# Generated by Django 3.2.13 on 2025-07-27 14:53 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0540_auto_20250727_1238'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='extension_payment_deadline_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='killrequest', + name='extension_payment_deadline_days', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='killrequest', + name='payment_deadline_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='killrequest', + name='payment_deadline_days', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='killrequest', + name='poultry_mobile', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 751631)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 678843)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 678843)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 678843)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 678843)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 808891)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 808891)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 682594)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 682594)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 682594)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 7, 27, 14, 52, 48, 694628)), + ), + migrations.CreateModel( + name='DirectBuyingPayment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('amount', models.BigIntegerField(default=0)), + ('image', models.CharField(max_length=700, null=True)), + ('date', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='directbuyingpayment_createdby', to=settings.AUTH_USER_MODEL)), + ('kill_request', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='direct_buying_kill_request', to='panel.killrequest')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='directbuyingpayment_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0542_auto_20250803_0821.py b/panel/migrations/0542_auto_20250803_0821.py new file mode 100644 index 0000000..0eea485 --- /dev/null +++ b/panel/migrations/0542_auto_20250803_0821.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-08-03 08:21 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0541_auto_20250727_1453'), + ] + + operations = [ + migrations.RemoveField( + model_name='directbuyingpayment', + name='kill_request', + ), + migrations.AddField( + model_name='directbuyingpayment', + name='province_kill_request', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='direct_buying_province_kill_request', to='panel.provincekillrequest'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 70588)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 7445)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 7445)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 7445)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 7445)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 134072)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 134072)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 7445)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 7445)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 7445)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 8, 21, 20, 29074)), + ), + ] diff --git a/panel/migrations/0543_auto_20250803_1532.py b/panel/migrations/0543_auto_20250803_1532.py new file mode 100644 index 0000000..5561553 --- /dev/null +++ b/panel/migrations/0543_auto_20250803_1532.py @@ -0,0 +1,139 @@ +# Generated by Django 3.2.13 on 2025-08-03 15:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0542_auto_20250803_0821'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='payment_deadline', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='extension_payment_deadline_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='extension_payment_deadline_days', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='final_accept', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_archive', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_archive_message', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_check_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_checker_fullname', + field=models.CharField(default='pending', max_length=50), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_checker_mobile', + field=models.CharField(default='pending', max_length=50), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_days', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_state', + field=models.CharField(default='pending', max_length=50), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 214232)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 162704)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 162704)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 162704)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 162704)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 277655)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 277655)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 166453)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 166453)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 166453)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 3, 15, 32, 44, 178481)), + ), + ] diff --git a/panel/migrations/0544_auto_20250805_0852.py b/panel/migrations/0544_auto_20250805_0852.py new file mode 100644 index 0000000..2bdc273 --- /dev/null +++ b/panel/migrations/0544_auto_20250805_0852.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-08-05 08:52 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0543_auto_20250803_1532'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='other_cold_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocation_to_other_cold_house', to='panel.coldhouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 476670)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 417208)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 417208)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 417208)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 417208)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 550536)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 550536)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 421208)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 420209)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 420209)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 5, 8, 51, 47, 432691)), + ), + ] diff --git a/panel/migrations/0545_auto_20250806_1515.py b/panel/migrations/0545_auto_20250806_1515.py new file mode 100644 index 0000000..e3639ec --- /dev/null +++ b/panel/migrations/0545_auto_20250806_1515.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-08-06 15:15 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0544_auto_20250805_0852'), + ] + + operations = [ + migrations.AddField( + model_name='directbuyingpayment', + name='payment_registrar', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='directbuyingpayment', + name='payment_registrar_mobile', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='final_accept_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='final_accept_registrar', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='final_accept_registrar_mobile', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 300885)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 108915)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 108915)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 108915)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 108915)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 636379)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 636379)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 112935)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 112935)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 112935)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 15, 24, 211849)), + ), + ] diff --git a/panel/migrations/0546_auto_20250806_1553.py b/panel/migrations/0546_auto_20250806_1553.py new file mode 100644 index 0000000..d167701 --- /dev/null +++ b/panel/migrations/0546_auto_20250806_1553.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-08-06 15:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0545_auto_20250806_1515'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 20, 343909)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 19, 975984)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 19, 975984)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 19, 975984)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 19, 975984)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 20, 532469)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 20, 532469)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 19, 978985)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 19, 978985)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 19, 978985)), + ), + migrations.AlterField( + model_name='provincekillrequest', + name='payment_deadline_checker_fullname', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='provincekillrequest', + name='payment_deadline_checker_mobile', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 53, 20, 34940)), + ), + ] diff --git a/panel/migrations/0547_auto_20250809_0949.py b/panel/migrations/0547_auto_20250809_0949.py new file mode 100644 index 0000000..fd74fb9 --- /dev/null +++ b/panel/migrations/0547_auto_20250809_0949.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-08-09 09:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0546_auto_20250806_1553'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='company_document', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouserequest', + name='document_number', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='fine', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='fine', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 210801)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 157367)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 157367)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 157367)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 157367)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 274069)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 274069)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 159373)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 159373)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 159373)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 9, 49, 11, 171148)), + ), + ] diff --git a/panel/migrations/0548_auto_20250809_1021.py b/panel/migrations/0548_auto_20250809_1021.py new file mode 100644 index 0000000..e540135 --- /dev/null +++ b/panel/migrations/0548_auto_20250809_1021.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-09 10:21 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0547_auto_20250809_0949'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='direct_buying', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 540483)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 456991)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 456991)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 456991)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 456991)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 621762)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 621762)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 460996)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 460996)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 460996)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 10, 20, 55, 474727)), + ), + ] diff --git a/panel/migrations/0549_auto_20250809_1237.py b/panel/migrations/0549_auto_20250809_1237.py new file mode 100644 index 0000000..042fb6b --- /dev/null +++ b/panel/migrations/0549_auto_20250809_1237.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-09 12:37 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0548_auto_20250809_1021'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='fine', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 140637)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 78000)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 78000)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 78000)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 78000)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 208071)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 208071)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 80006)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 80006)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 80006)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 12, 37, 4, 82012)), + ), + ] diff --git a/panel/migrations/0550_auto_20250809_1351.py b/panel/migrations/0550_auto_20250809_1351.py new file mode 100644 index 0000000..a567642 --- /dev/null +++ b/panel/migrations/0550_auto_20250809_1351.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-08-09 13:51 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0549_auto_20250809_1237'), + ] + + operations = [ + migrations.AddField( + model_name='automaticdirectbuyingpermission', + name='fine_active', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='automaticdirectbuyingpermission', + name='fine_end_time', + field=models.TimeField(null=True), + ), + migrations.AddField( + model_name='automaticdirectbuyingpermission', + name='fine_start_time', + field=models.TimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 441160)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 379243)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 379243)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 379243)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 379243)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 515663)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 515663)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 382977)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 382977)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 382977)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 13, 51, 19, 394010)), + ), + ] diff --git a/panel/migrations/0551_auto_20250809_1409.py b/panel/migrations/0551_auto_20250809_1409.py new file mode 100644 index 0000000..d799e57 --- /dev/null +++ b/panel/migrations/0551_auto_20250809_1409.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-09 14:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0550_auto_20250809_1351'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='archive_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 442289)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 373380)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 373380)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 373380)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 373380)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 522380)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 522380)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 376569)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 376569)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 376569)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 14, 9, 27, 389995)), + ), + ] diff --git a/panel/migrations/0552_auto_20250809_1522.py b/panel/migrations/0552_auto_20250809_1522.py new file mode 100644 index 0000000..4fa9439 --- /dev/null +++ b/panel/migrations/0552_auto_20250809_1522.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-09 15:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0551_auto_20250809_1409'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='payment_deadline_supporter_message', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 874577)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 805184)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 805184)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 805184)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 805184)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 945684)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 945684)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 805184)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 805184)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 805184)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 15, 21, 43, 820987)), + ), + ] diff --git a/panel/migrations/0553_auto_20250809_1613.py b/panel/migrations/0553_auto_20250809_1613.py new file mode 100644 index 0000000..df10671 --- /dev/null +++ b/panel/migrations/0553_auto_20250809_1613.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-09 16:13 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0552_auto_20250809_1522'), + ] + + operations = [ + migrations.AddField( + model_name='directbuyingpayment', + name='payment_deadline_supporter_message', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 21, 14046)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 20, 948459)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 20, 948459)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 20, 948459)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 20, 948459)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 21, 91455)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 21, 91455)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 20, 948459)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 20, 948459)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 20, 948459)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 9, 16, 13, 20, 964488)), + ), + ] diff --git a/panel/migrations/0554_auto_20250810_1256.py b/panel/migrations/0554_auto_20250810_1256.py new file mode 100644 index 0000000..92b5678 --- /dev/null +++ b/panel/migrations/0554_auto_20250810_1256.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2025-08-10 12:56 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0553_auto_20250809_1613'), + ] + + operations = [ + migrations.CreateModel( + name='FinePermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('out_poultry_request', models.BooleanField(default=False)), + ('out_poultry_request_start_time', models.TimeField(null=True)), + ('out_poultry_request_end_time', models.TimeField(null=True)), + ('out_poultry_request_fine_coefficient', models.FloatField(default=0)), + ('direct_buying', models.BooleanField(default=False)), + ('direct_buying_start_time', models.TimeField(null=True)), + ('direct_buying_end_time', models.TimeField(null=True)), + ('direct_buying_fine_coefficient', models.FloatField(default=0)), + ('in_province_allocations', models.BooleanField(default=False)), + ('in_province_allocations_fine_coefficient', models.FloatField(default=0)), + ('in_province_bars', models.BooleanField(default=False)), + ('in_province_bars_fine_coefficient', models.FloatField(default=0)), + ], + ), + migrations.RemoveField( + model_name='automaticdirectbuyingpermission', + name='fine_active', + ), + migrations.RemoveField( + model_name='automaticdirectbuyingpermission', + name='fine_end_time', + ), + migrations.RemoveField( + model_name='automaticdirectbuyingpermission', + name='fine_start_time', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 20, 675480)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 19, 562340)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 19, 562340)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 19, 562340)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 19, 562340)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 20, 938713)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 20, 938713)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 19, 566097)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 19, 566097)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 19, 566097)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 12, 56, 19, 775568)), + ), + ] diff --git a/panel/migrations/0555_auto_20250810_1354.py b/panel/migrations/0555_auto_20250810_1354.py new file mode 100644 index 0000000..4603676 --- /dev/null +++ b/panel/migrations/0555_auto_20250810_1354.py @@ -0,0 +1,105 @@ +# Generated by Django 3.2.13 on 2025-08-10 13:54 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0554_auto_20250810_1256'), + ] + + operations = [ + migrations.AddField( + model_name='finepermission', + name='create_date', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='finepermission', + name='created_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='finepermission_createdby', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='finepermission', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AddField( + model_name='finepermission', + name='modified_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='finepermission_modifiedby', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='finepermission', + name='modify_date', + field=models.DateTimeField(auto_now=True), + ), + migrations.AddField( + model_name='finepermission', + name='trash', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 636802)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 539755)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 539755)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 539755)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 539755)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 719611)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 719611)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 543203)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 543203)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 543203)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 13, 53, 48, 555434)), + ), + ] diff --git a/panel/migrations/0556_auto_20250810_1414.py b/panel/migrations/0556_auto_20250810_1414.py new file mode 100644 index 0000000..4ae2492 --- /dev/null +++ b/panel/migrations/0556_auto_20250810_1414.py @@ -0,0 +1,114 @@ +# Generated by Django 3.2.13 on 2025-08-10 14:14 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0555_auto_20250810_1354'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='fine_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhouserequest', + name='fine_coefficient', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='fine_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryrequest', + name='fine_coefficient', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='direct_buying_fine', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='direct_buying_fine_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='direct_buying_fine_coefficient', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='fine_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='provincekillrequest', + name='fine_coefficient', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 733783)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 666990)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 666990)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 666990)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 666990)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 817347)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 817347)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 666990)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 666990)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 666990)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 10, 14, 14, 1, 685079)), + ), + ] diff --git a/panel/migrations/0557_auto_20250811_0909.py b/panel/migrations/0557_auto_20250811_0909.py new file mode 100644 index 0000000..7439194 --- /dev/null +++ b/panel/migrations/0557_auto_20250811_0909.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2025-08-11 09:09 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0556_auto_20250810_1414'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 120372)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 54962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 54962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 54962)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 54962)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 200536)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 200536)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 54962)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 54962)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 54962)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 11, 9, 9, 8, 71655)), + ), + migrations.CreateModel( + name='ManagementSendSms', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=100, null=True)), + ('username', models.CharField(max_length=100, null=True)), + ('password', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='managementsendsms_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='managementsendsms_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0558_auto_20250817_0851.py b/panel/migrations/0558_auto_20250817_0851.py new file mode 100644 index 0000000..880d02a --- /dev/null +++ b/panel/migrations/0558_auto_20250817_0851.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-17 08:51 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0557_auto_20250811_0909'), + ] + + operations = [ + migrations.AddField( + model_name='provincekillrequest', + name='market', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 642022)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 579029)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 579029)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 579029)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 579029)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 705036)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 705036)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 579029)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 579029)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 579029)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 8, 50, 55, 594728)), + ), + ] diff --git a/panel/migrations/0559_auto_20250817_1014.py b/panel/migrations/0559_auto_20250817_1014.py new file mode 100644 index 0000000..872038e --- /dev/null +++ b/panel/migrations/0559_auto_20250817_1014.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-17 10:14 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0558_auto_20250817_0851'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='market', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 126162)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 67026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 67026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 67026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 67026)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 197498)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 197498)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 70057)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 70057)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 70057)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 14, 39, 81644)), + ), + ] diff --git a/panel/migrations/0560_auto_20250817_1040.py b/panel/migrations/0560_auto_20250817_1040.py new file mode 100644 index 0000000..0644670 --- /dev/null +++ b/panel/migrations/0560_auto_20250817_1040.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-17 10:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0559_auto_20250817_1014'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='market_state', + field=models.CharField(default='pending', max_length=20), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 382081)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 321052)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 321052)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 321052)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 321052)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 454544)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 454544)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 324018)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 324018)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 324018)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 40, 6, 335958)), + ), + ] diff --git a/panel/migrations/0561_auto_20250817_1048.py b/panel/migrations/0561_auto_20250817_1048.py new file mode 100644 index 0000000..d17b22c --- /dev/null +++ b/panel/migrations/0561_auto_20250817_1048.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-08-17 10:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0560_auto_20250817_1040'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='market_capacity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='market_capacity_percent', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 45, 990425)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 45, 849026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 45, 849026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 45, 849026)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 45, 849026)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 46, 181534)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 46, 181534)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 45, 853026)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 45, 853026)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 45, 853026)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 10, 47, 45, 901280)), + ), + ] diff --git a/panel/migrations/0562_auto_20250817_1351.py b/panel/migrations/0562_auto_20250817_1351.py new file mode 100644 index 0000000..276f977 --- /dev/null +++ b/panel/migrations/0562_auto_20250817_1351.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-17 13:51 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0561_auto_20250817_1048'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='market_final_accept', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 379531)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 235394)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 235394)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 235394)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 235394)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 488984)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 488984)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 239963)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 239963)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 239963)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 17, 13, 51, 9, 253026)), + ), + ] diff --git a/panel/migrations/0563_auto_20250818_0941.py b/panel/migrations/0563_auto_20250818_0941.py new file mode 100644 index 0000000..c517dcd --- /dev/null +++ b/panel/migrations/0563_auto_20250818_0941.py @@ -0,0 +1,83 @@ +# Generated by Django 3.2.13 on 2025-08-18 09:41 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0562_auto_20250817_1351'), + ] + + operations = [ + migrations.RemoveField( + model_name='killhouse', + name='market_capacity', + ), + migrations.AddField( + model_name='killhouse', + name='market_light_capacity', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='market_light_capacity_percent', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 239632)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 166381)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 166381)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 166381)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 166381)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 336581)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 336581)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 168130)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 168130)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 168130)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 18, 9, 40, 47, 183833)), + ), + ] diff --git a/panel/migrations/0564_auto_20250820_1145.py b/panel/migrations/0564_auto_20250820_1145.py new file mode 100644 index 0000000..3b94319 --- /dev/null +++ b/panel/migrations/0564_auto_20250820_1145.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-20 11:45 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0563_auto_20250818_0941'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='market_buying', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 264698)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 201500)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 201500)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 201500)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 201500)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 328086)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 328086)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 201500)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 201500)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 201500)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 11, 45, 29, 217194)), + ), + ] diff --git a/panel/migrations/0565_auto_20250820_1530.py b/panel/migrations/0565_auto_20250820_1530.py new file mode 100644 index 0000000..b85a146 --- /dev/null +++ b/panel/migrations/0565_auto_20250820_1530.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-20 15:30 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0564_auto_20250820_1145'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='market_state_message', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 570780)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 510845)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 510845)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 510845)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 510845)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 650397)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 650397)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 513845)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 513845)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 513845)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 20, 15, 30, 35, 525448)), + ), + ] diff --git a/panel/migrations/0566_auto_20250825_1122.py b/panel/migrations/0566_auto_20250825_1122.py new file mode 100644 index 0000000..bff6fdc --- /dev/null +++ b/panel/migrations/0566_auto_20250825_1122.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-08-25 11:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0565_auto_20250820_1530'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='market_buying_limitation', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killrequest', + name='market_expire_date_time', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 36, 999969)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 36, 938242)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 36, 938242)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 36, 938242)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 36, 938242)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 37, 73788)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 37, 73788)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 36, 942162)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 36, 942162)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 36, 942162)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 11, 22, 36, 954160)), + ), + ] diff --git a/panel/migrations/0567_auto_20250825_1535.py b/panel/migrations/0567_auto_20250825_1535.py new file mode 100644 index 0000000..8f6b37d --- /dev/null +++ b/panel/migrations/0567_auto_20250825_1535.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-25 15:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0566_auto_20250825_1122'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='market_buying_capacity_percent_status', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 849885)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 787312)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 787312)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 787312)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 787312)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 925219)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 925219)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 791175)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 791175)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 791175)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 15, 35, 17, 802175)), + ), + ] diff --git a/panel/migrations/0568_auto_20250825_1605.py b/panel/migrations/0568_auto_20250825_1605.py new file mode 100644 index 0000000..b892b8c --- /dev/null +++ b/panel/migrations/0568_auto_20250825_1605.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-25 16:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0567_auto_20250825_1535'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequest', + name='market', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 40, 949376)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 40, 885933)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 40, 885933)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 40, 885933)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 40, 885933)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 41, 30350)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 41, 30350)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 40, 885933)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 40, 885933)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 40, 885933)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 25, 16, 5, 40, 902063)), + ), + ] diff --git a/panel/migrations/0569_auto_20250826_0913.py b/panel/migrations/0569_auto_20250826_0913.py new file mode 100644 index 0000000..ef14b32 --- /dev/null +++ b/panel/migrations/0569_auto_20250826_0913.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2025-08-26 09:13 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0568_auto_20250825_1605'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 479237)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 261691)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 261691)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 261691)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 261691)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 759890)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 759890)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 265693)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 265693)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 265693)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 12, 38, 294154)), + ), + migrations.CreateModel( + name='ShowMarketRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('start_time', models.TimeField(null=True)), + ('end_time', models.TimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='showmarketrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='showmarketrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0570_auto_20250826_0943.py b/panel/migrations/0570_auto_20250826_0943.py new file mode 100644 index 0000000..dd00f20 --- /dev/null +++ b/panel/migrations/0570_auto_20250826_0943.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-26 09:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0569_auto_20250826_0913'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='direct_buying_intermediary_mobile', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 179886)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 116466)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 116466)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 116466)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 116466)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 243083)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 243083)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 132242)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 132242)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 132242)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 26, 9, 43, 44, 132242)), + ), + ] diff --git a/panel/migrations/0571_auto_20250827_1013.py b/panel/migrations/0571_auto_20250827_1013.py new file mode 100644 index 0000000..0734c7c --- /dev/null +++ b/panel/migrations/0571_auto_20250827_1013.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-27 10:13 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0570_auto_20250826_0943'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='poultry_payment_limitation', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 280577)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 218560)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 218560)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 218560)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 218560)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 356242)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 356242)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 222614)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 221606)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 221606)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 10, 13, 15, 233640)), + ), + ] diff --git a/panel/migrations/0572_auto_20250827_1509.py b/panel/migrations/0572_auto_20250827_1509.py new file mode 100644 index 0000000..bbe473c --- /dev/null +++ b/panel/migrations/0572_auto_20250827_1509.py @@ -0,0 +1,92 @@ +# Generated by Django 3.2.13 on 2025-08-27 15:09 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0571_auto_20250827_1013'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 299175)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 220332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 220332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 220332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 220332)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 377318)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 377318)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 230305)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 230305)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 230305)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 27, 15, 8, 38, 245265)), + ), + migrations.CreateModel( + name='ManagementHatchingAgeRange', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('from_age', models.SmallIntegerField(default=0, max_length=3)), + ('to_age', models.SmallIntegerField(default=0, max_length=3)), + ('from_weight', models.FloatField(default=0)), + ('to_weight', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='managementhatchingagerange_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='managementhatchingagerange_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0573_auto_20250829_0135.py b/panel/migrations/0573_auto_20250829_0135.py new file mode 100644 index 0000000..0aa9c4f --- /dev/null +++ b/panel/migrations/0573_auto_20250829_0135.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-08-29 01:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0572_auto_20250827_1509'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='input_market_code', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='killrequest', + name='market_code', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='killrequest', + name='market_code_status', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 25, 908416)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 25, 547043)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 25, 542530)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 25, 547043)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 25, 542530)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 26, 436192)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 26, 436192)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 25, 593424)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 25, 593424)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 25, 593424)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 29, 1, 34, 25, 667629)), + ), + ] diff --git a/panel/migrations/0574_auto_20250830_0839.py b/panel/migrations/0574_auto_20250830_0839.py new file mode 100644 index 0000000..135b17d --- /dev/null +++ b/panel/migrations/0574_auto_20250830_0839.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-08-30 08:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0573_auto_20250829_0135'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='total_kill_capacity_percent', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 659969)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 497743)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 497743)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 497743)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 497743)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 757962)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 757962)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 501762)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 501762)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 501762)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 30, 8, 39, 18, 524234)), + ), + ] diff --git a/panel/migrations/0575_auto_20250831_0913.py b/panel/migrations/0575_auto_20250831_0913.py new file mode 100644 index 0000000..70ffaa6 --- /dev/null +++ b/panel/migrations/0575_auto_20250831_0913.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-08-31 09:13 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0574_auto_20250830_0839'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='free_quota', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='governmental_quota', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='quota', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 125108)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 77789)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 77789)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 77789)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 77789)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 204546)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 204546)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 81801)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 81801)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 81801)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 31, 9, 13, 1, 91826)), + ), + ] diff --git a/panel/migrations/0576_auto_20250901_0847.py b/panel/migrations/0576_auto_20250901_0847.py new file mode 100644 index 0000000..da8398d --- /dev/null +++ b/panel/migrations/0576_auto_20250901_0847.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2025-09-01 08:47 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0575_auto_20250831_0913'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 758000)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 219705)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 219705)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 219705)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 219705)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 856804)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 856804)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 223704)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 223704)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 223704)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 8, 47, 26, 236775)), + ), + migrations.CreateModel( + name='IndexWeightCategory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=100, null=True)), + ('min_value', models.FloatField(default=0)), + ('max_value', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='indexweightcategory_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='indexweightcategory_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0577_auto_20250901_1207.py b/panel/migrations/0577_auto_20250901_1207.py new file mode 100644 index 0000000..9520205 --- /dev/null +++ b/panel/migrations/0577_auto_20250901_1207.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2025-09-01 12:07 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0072_auto_20250901_1207'), + ('panel', '0576_auto_20250901_0847'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 733492)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 673537)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 673537)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 673537)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 673537)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 807700)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 807700)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 676773)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 676773)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 676773)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 1, 12, 6, 58, 687744)), + ), + migrations.CreateModel( + name='PoultryScience', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryscience_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultryscience_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry', models.ManyToManyField(related_name='poultry_entries', to='panel.Poultry')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_science_user', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0578_auto_20250902_1208.py b/panel/migrations/0578_auto_20250902_1208.py new file mode 100644 index 0000000..2176fc3 --- /dev/null +++ b/panel/migrations/0578_auto_20250902_1208.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-09-02 12:08 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0577_auto_20250901_1207'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='quota_custom', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='quota_custom_quantity', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='quota_max_kill_limit', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='quota_request', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 804899)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 741775)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 741775)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 741775)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 741775)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 874103)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 874103)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 741775)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 741775)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 741775)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 12, 8, 0, 757556)), + ), + ] diff --git a/panel/migrations/0579_auto_20250902_1540.py b/panel/migrations/0579_auto_20250902_1540.py new file mode 100644 index 0000000..de1ce13 --- /dev/null +++ b/panel/migrations/0579_auto_20250902_1540.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-09-02 15:40 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0578_auto_20250902_1208'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 825214)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 755793)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 755793)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 755793)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 755793)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 895647)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 895647)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 771740)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 771740)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 771740)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 2, 15, 40, 21, 771740)), + ), + migrations.CreateModel( + name='PoultryScienceReport', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('date', models.DateTimeField(null=True)), + ('image', models.JSONField(null=True)), + ('lat', models.CharField(max_length=250, null=True)), + ('log', models.CharField(max_length=250, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultrysciencereport_createdby', to=settings.AUTH_USER_MODEL)), + ('hatching', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_science_hatching', to='panel.poultryhatching')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultrysciencereport_modifiedby', to=settings.AUTH_USER_MODEL)), + ('poultry_science', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_science_reporter', to='panel.poultryscience')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0580_auto_20250903_0907.py b/panel/migrations/0580_auto_20250903_0907.py new file mode 100644 index 0000000..a347564 --- /dev/null +++ b/panel/migrations/0580_auto_20250903_0907.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-09-03 09:07 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0579_auto_20250902_1540'), + ] + + operations = [ + migrations.AddField( + model_name='poultrysciencereport', + name='reporter_fullname', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='reporter_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 620948)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 519459)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 519459)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 519459)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 519459)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 745579)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 747592)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 524490)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 524490)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 524490)), + ), + migrations.AlterField( + model_name='poultrysciencereport', + name='lat', + field=models.FloatField(null=True), + ), + migrations.AlterField( + model_name='poultrysciencereport', + name='log', + field=models.FloatField(null=True), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 3, 9, 6, 43, 540326)), + ), + ] diff --git a/panel/migrations/0581_auto_20250914_1103.py b/panel/migrations/0581_auto_20250914_1103.py new file mode 100644 index 0000000..ffd980a --- /dev/null +++ b/panel/migrations/0581_auto_20250914_1103.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-09-14 11:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0580_auto_20250903_0907'), + ] + + operations = [ + migrations.AddField( + model_name='finepermission', + name='end_time', + field=models.TimeField(null=True), + ), + migrations.AddField( + model_name='finepermission', + name='fine', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='finepermission', + name='fine_coefficient', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='finepermission', + name='name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='finepermission', + name='start_time', + field=models.TimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 863307)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 799680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 799680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 799680)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 799680)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 928495)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 928495)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 799680)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 799680)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 799680)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 11, 3, 25, 815759)), + ), + ] diff --git a/panel/migrations/0582_auto_20250914_1449.py b/panel/migrations/0582_auto_20250914_1449.py new file mode 100644 index 0000000..91a5241 --- /dev/null +++ b/panel/migrations/0582_auto_20250914_1449.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-09-14 14:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0581_auto_20250914_1103'), + ] + + operations = [ + migrations.AddField( + model_name='bardifferencerequest', + name='acceptor_message', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='bardifferencerequest', + name='register_message', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 868412)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 808380)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 808380)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 808380)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 808380)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 937416)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 937416)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 811380)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 811380)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 811380)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 14, 49, 21, 822411)), + ), + ] diff --git a/panel/migrations/0583_auto_20250914_1621.py b/panel/migrations/0583_auto_20250914_1621.py new file mode 100644 index 0000000..aa09e77 --- /dev/null +++ b/panel/migrations/0583_auto_20250914_1621.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.13 on 2025-09-14 16:21 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0582_auto_20250914_1449'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 216537)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 148392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 148392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 148392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 148392)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 295416)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 295416)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 152655)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 152655)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 152655)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 21, 13, 164656)), + ), + migrations.CreateModel( + name='MarketPoultryRequestPermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('min_age_value', models.IntegerField(default=0)), + ('max_age_value', models.IntegerField(default=0)), + ('governmental_percent', models.FloatField(default=0)), + ('free_percent', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='marketpoultryrequestpermission_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='marketpoultryrequestpermission_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0584_auto_20250914_1630.py b/panel/migrations/0584_auto_20250914_1630.py new file mode 100644 index 0000000..5f1a0ac --- /dev/null +++ b/panel/migrations/0584_auto_20250914_1630.py @@ -0,0 +1,72 @@ +# Generated by Django 3.2.13 on 2025-09-14 16:30 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0583_auto_20250914_1621'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 242342)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 166581)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 166581)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 166581)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 166581)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 356112)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 356112)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 170582)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 170582)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 170582)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 14, 16, 30, 24, 183234)), + ), + migrations.DeleteModel( + name='MarketPoultryRequestPermission', + ), + ] diff --git a/panel/migrations/0585_auto_20250915_0902.py b/panel/migrations/0585_auto_20250915_0902.py new file mode 100644 index 0000000..d51847c --- /dev/null +++ b/panel/migrations/0585_auto_20250915_0902.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-15 09:02 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0584_auto_20250914_1630'), + ] + + operations = [ + migrations.AddField( + model_name='bardifferencerequest', + name='acceptor_image', + field=models.JSONField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 439706)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 378063)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 378063)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 378063)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 378063)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 510519)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 510519)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 382062)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 382062)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 382062)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 9, 2, 2, 394815)), + ), + ] diff --git a/panel/migrations/0586_auto_20250915_1411.py b/panel/migrations/0586_auto_20250915_1411.py new file mode 100644 index 0000000..35329dc --- /dev/null +++ b/panel/migrations/0586_auto_20250915_1411.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-09-15 14:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0585_auto_20250915_0902'), + ] + + operations = [ + migrations.CreateModel( + name='TokenEitaaForEachVet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('token', models.CharField(max_length=250)), + ('vet_fullname', models.CharField(max_length=50)), + ('vet_mobile', models.CharField(max_length=11)), + ('grop_name', models.CharField(max_length=250)), + ], + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 201456)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 142194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 142194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 142194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 142194)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 274016)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 274016)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 145291)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 145291)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 145291)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 10, 40, 157269)), + ), + ] diff --git a/panel/migrations/0587_auto_20250915_1433.py b/panel/migrations/0587_auto_20250915_1433.py new file mode 100644 index 0000000..50d6bfa --- /dev/null +++ b/panel/migrations/0587_auto_20250915_1433.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-15 14:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0586_auto_20250915_1411'), + ] + + operations = [ + migrations.RenameField( + model_name='tokeneitaaforeachvet', + old_name='grop_name', + new_name='group_name', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 12, 940225)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 12, 884804)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 12, 884804)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 12, 884804)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 12, 884804)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 13, 1686)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 13, 1686)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 12, 886813)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 12, 886813)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 12, 886813)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 14, 33, 12, 898860)), + ), + ] diff --git a/panel/migrations/0588_auto_20250915_1603.py b/panel/migrations/0588_auto_20250915_1603.py new file mode 100644 index 0000000..5a5e1bf --- /dev/null +++ b/panel/migrations/0588_auto_20250915_1603.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-09-15 16:03 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0587_auto_20250915_1433'), + ] + + operations = [ + migrations.AddField( + model_name='possegmentation', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_segmentation', to='panel.killhouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 159972)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 100122)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 100122)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 100122)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 100122)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 230663)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 230663)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 103768)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 103768)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 103768)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 15, 16, 3, 37, 114846)), + ), + ] diff --git a/panel/migrations/0589_auto_20250916_0935.py b/panel/migrations/0589_auto_20250916_0935.py new file mode 100644 index 0000000..872a69d --- /dev/null +++ b/panel/migrations/0589_auto_20250916_0935.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-09-16 09:35 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0588_auto_20250915_1603'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='out_province_free_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='out_province_free_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='out_province_governmental_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='out_province_governmental_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='out_province_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 34, 938573)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 34, 881160)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 34, 881160)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 34, 881160)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 34, 881160)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 35, 7431)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 35, 7431)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 34, 885173)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 34, 885173)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 34, 885173)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 9, 35, 34, 895205)), + ), + ] diff --git a/panel/migrations/0590_auto_20250916_1031.py b/panel/migrations/0590_auto_20250916_1031.py new file mode 100644 index 0000000..e41fbb9 --- /dev/null +++ b/panel/migrations/0590_auto_20250916_1031.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-16 10:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0589_auto_20250916_0935'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='sale_type', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 361220)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 308110)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 308110)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 308110)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 308110)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 436315)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 436315)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 310118)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 310118)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 310118)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 10, 31, 24, 322153)), + ), + ] diff --git a/panel/migrations/0591_auto_20250916_1427.py b/panel/migrations/0591_auto_20250916_1427.py new file mode 100644 index 0000000..3e4646b --- /dev/null +++ b/panel/migrations/0591_auto_20250916_1427.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-09-16 14:27 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0590_auto_20250916_1031'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='in_province_free_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='in_province_free_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='in_province_governmental_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='in_province_governmental_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='in_province_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 874690)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 812039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 812039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 812039)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 812039)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 949437)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 949437)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 816052)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 816052)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 816052)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 16, 14, 27, 1, 827074)), + ), + ] diff --git a/panel/migrations/0592_auto_20250920_0849.py b/panel/migrations/0592_auto_20250920_0849.py new file mode 100644 index 0000000..8ac53cc --- /dev/null +++ b/panel/migrations/0592_auto_20250920_0849.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-20 08:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0591_auto_20250916_1427'), + ] + + operations = [ + migrations.AddField( + model_name='poultrysciencereport', + name='state', + field=models.CharField(default='pending', max_length=50), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 859106)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 795659)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 795659)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 795659)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 795659)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 922664)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 922664)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 811694)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 811694)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 811694)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 8, 49, 2, 811694)), + ), + ] diff --git a/panel/migrations/0592_auto_20250920_0938.py b/panel/migrations/0592_auto_20250920_0938.py new file mode 100644 index 0000000..67eba66 --- /dev/null +++ b/panel/migrations/0592_auto_20250920_0938.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-09-20 09:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0591_auto_20250916_1427'), + ] + + operations = [ + migrations.AddField( + model_name='rolesproducts', + name='province_free_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='province_governmental_allocated_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 290014)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 229293)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 229293)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 229293)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 229293)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 362812)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 362812)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 233528)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 233528)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 233528)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 9, 38, 12, 244155)), + ), + ] diff --git a/panel/migrations/0593_merge_0592_auto_20250920_0849_0592_auto_20250920_0938.py b/panel/migrations/0593_merge_0592_auto_20250920_0849_0592_auto_20250920_0938.py new file mode 100644 index 0000000..c683b9c --- /dev/null +++ b/panel/migrations/0593_merge_0592_auto_20250920_0849_0592_auto_20250920_0938.py @@ -0,0 +1,14 @@ +# Generated by Django 3.2.13 on 2025-09-20 12:57 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0592_auto_20250920_0849'), + ('panel', '0592_auto_20250920_0938'), + ] + + operations = [ + ] diff --git a/panel/migrations/0594_auto_20250920_1257.py b/panel/migrations/0594_auto_20250920_1257.py new file mode 100644 index 0000000..cad82dc --- /dev/null +++ b/panel/migrations/0594_auto_20250920_1257.py @@ -0,0 +1,82 @@ +# Generated by Django 3.2.13 on 2025-09-20 12:57 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0073_auto_20250920_1257'), + ('panel', '0593_merge_0592_auto_20250920_0849_0592_auto_20250920_0938'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 643388)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 556023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 556023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 556023)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 556023)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 819793)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 819793)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 560012)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 560012)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 560012)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 12, 57, 40, 571981)), + ), + migrations.CreateModel( + name='UserLoginLog', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('headers', models.JSONField(blank=True, null=True)), + ('ip_address', models.CharField(blank=True, max_length=500, null=True)), + ('user_agent', models.CharField(blank=True, max_length=500, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('user_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='login_logs_user', to='authentication.systemuserprofile')), + ], + ), + ] diff --git a/panel/migrations/0595_auto_20250920_1554.py b/panel/migrations/0595_auto_20250920_1554.py new file mode 100644 index 0000000..f69c75c --- /dev/null +++ b/panel/migrations/0595_auto_20250920_1554.py @@ -0,0 +1,113 @@ +# Generated by Django 3.2.13 on 2025-09-20 15:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0594_auto_20250920_1257'), + ] + + operations = [ + migrations.RemoveField( + model_name='killhouse', + name='in_province_free_selling_permission', + ), + migrations.RemoveField( + model_name='killhouse', + name='in_province_governmental_selling_permission', + ), + migrations.RemoveField( + model_name='killhouse', + name='in_province_selling_permission', + ), + migrations.RemoveField( + model_name='killhouse', + name='out_province_free_selling_permission', + ), + migrations.RemoveField( + model_name='killhouse', + name='out_province_governmental_selling_permission', + ), + migrations.RemoveField( + model_name='killhouse', + name='out_province_selling_permission', + ), + migrations.AddField( + model_name='killhouse', + name='free_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='governmental_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='segmentation_free_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='segmentation_governmental_percent', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 27, 15262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 26, 961971)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 26, 961971)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 26, 961971)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 26, 961971)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 27, 78519)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 27, 78519)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 26, 963977)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 26, 963977)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 26, 963977)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 15, 53, 26, 967731)), + ), + ] diff --git a/panel/migrations/0595_auto_20250920_1648.py b/panel/migrations/0595_auto_20250920_1648.py new file mode 100644 index 0000000..ad1328d --- /dev/null +++ b/panel/migrations/0595_auto_20250920_1648.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2025-09-20 16:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0594_auto_20250920_1257'), + ] + + operations = [ + migrations.AddField( + model_name='poultrysciencereport', + name='message', + field=models.CharField(max_length=250, null=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='message_ai', + field=models.CharField(max_length=250, null=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='message_registerer_fullname', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='message_registerer_mobile', + field=models.CharField(max_length=11, null=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='real_quantity', + field=models.SmallIntegerField(null=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='real_quantity_ai', + field=models.SmallIntegerField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 570823)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 521433)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 521433)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 521433)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 521433)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 644254)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 644254)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 523441)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 523441)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 523441)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 48, 30, 535487)), + ), + ] diff --git a/panel/migrations/0596_merge_0595_auto_20250920_1554_0595_auto_20250920_1648.py b/panel/migrations/0596_merge_0595_auto_20250920_1554_0595_auto_20250920_1648.py new file mode 100644 index 0000000..5b14a3a --- /dev/null +++ b/panel/migrations/0596_merge_0595_auto_20250920_1554_0595_auto_20250920_1648.py @@ -0,0 +1,14 @@ +# Generated by Django 3.2.13 on 2025-09-20 16:52 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0595_auto_20250920_1554'), + ('panel', '0595_auto_20250920_1648'), + ] + + operations = [ + ] diff --git a/panel/migrations/0597_auto_20250920_1652.py b/panel/migrations/0597_auto_20250920_1652.py new file mode 100644 index 0000000..5d73e75 --- /dev/null +++ b/panel/migrations/0597_auto_20250920_1652.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-20 16:52 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0596_merge_0595_auto_20250920_1554_0595_auto_20250920_1648'), + ] + + operations = [ + migrations.AddField( + model_name='poultrysciencereport', + name='message_registerer_role', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 773659)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 708253)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 708253)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 708253)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 708253)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 850774)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 850774)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 724280)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 724280)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 724280)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 20, 16, 52, 19, 724280)), + ), + ] diff --git a/panel/migrations/0598_auto_20250921_0848.py b/panel/migrations/0598_auto_20250921_0848.py new file mode 100644 index 0000000..e3ec7f2 --- /dev/null +++ b/panel/migrations/0598_auto_20250921_0848.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-09-21 08:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0597_auto_20250920_1652'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 4, 1804)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 3, 954489)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 3, 954489)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 3, 954489)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 3, 954489)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 4, 76929)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 4, 76929)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 3, 958508)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 3, 958508)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 3, 958508)), + ), + migrations.AlterField( + model_name='poultrysciencereport', + name='real_quantity', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='poultrysciencereport', + name='real_quantity_ai', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 21, 8, 48, 3, 968547)), + ), + ] diff --git a/panel/migrations/0599_auto_20250922_0840.py b/panel/migrations/0599_auto_20250922_0840.py new file mode 100644 index 0000000..7dfa2c7 --- /dev/null +++ b/panel/migrations/0599_auto_20250922_0840.py @@ -0,0 +1,134 @@ +# Generated by Django 3.2.13 on 2025-09-22 08:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0598_auto_20250921_0848'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='total_input_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_input_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_input_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_remain_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_remain_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_segmentation_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_segmentation_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_selling_in_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_selling_in_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_selling_out_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_selling_out_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_selling_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_selling_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 102974)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 42392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 42392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 42392)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 42392)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 177691)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 177691)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 46219)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 46219)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 46219)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 8, 39, 51, 57955)), + ), + ] diff --git a/panel/migrations/0600_auto_20250922_1048.py b/panel/migrations/0600_auto_20250922_1048.py new file mode 100644 index 0000000..79df757 --- /dev/null +++ b/panel/migrations/0600_auto_20250922_1048.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-22 10:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0599_auto_20250922_0840'), + ] + + operations = [ + migrations.AddField( + model_name='possegmentation', + name='sale_type', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 131709)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 72605)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 72605)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 72605)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 72605)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 203123)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 203123)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 75605)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 75605)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 75605)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 10, 48, 9, 87290)), + ), + ] diff --git a/panel/migrations/0601_auto_20250922_1333.py b/panel/migrations/0601_auto_20250922_1333.py new file mode 100644 index 0000000..94c0010 --- /dev/null +++ b/panel/migrations/0601_auto_20250922_1333.py @@ -0,0 +1,114 @@ +# Generated by Django 3.2.13 on 2025-09-22 13:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0600_auto_20250922_1048'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='total_cold_house_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_cold_house_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_cold_house_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_in_province_free_bars_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_in_province_governmental_bars_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_out_province_buying_bars_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_remain_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_segmentation_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_selling_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 696007)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 616809)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 616809)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 616809)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 616809)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 912395)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 912395)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 620826)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 620826)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 620826)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 32, 43, 633451)), + ), + ] diff --git a/panel/migrations/0602_auto_20250922_1339.py b/panel/migrations/0602_auto_20250922_1339.py new file mode 100644 index 0000000..301fb2f --- /dev/null +++ b/panel/migrations/0602_auto_20250922_1339.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-22 13:39 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0601_auto_20250922_1333'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='total_commitment_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 580722)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 518058)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 518058)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 518058)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 518058)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 643571)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 643571)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 518058)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 518058)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 518058)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 22, 13, 38, 49, 533696)), + ), + ] diff --git a/panel/migrations/0603_auto_20250924_1347.py b/panel/migrations/0603_auto_20250924_1347.py new file mode 100644 index 0000000..9d5b6a1 --- /dev/null +++ b/panel/migrations/0603_auto_20250924_1347.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-09-24 13:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0602_auto_20250922_1339'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='quota', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='possegmentation', + name='quota', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='stewardallocation', + name='quota', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 19, 596291)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 18, 350108)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 18, 350108)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 18, 350108)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 18, 350108)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 20, 557163)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 20, 557163)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 18, 354127)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 18, 354127)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 18, 354127)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 13, 46, 18, 367951)), + ), + ] diff --git a/panel/migrations/0604_auto_20250924_1427.py b/panel/migrations/0604_auto_20250924_1427.py new file mode 100644 index 0000000..a812f39 --- /dev/null +++ b/panel/migrations/0604_auto_20250924_1427.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2025-09-24 14:27 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0603_auto_20250924_1347'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='killhouserequest', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='possegmentation', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='provincekillrequest', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='stewardallocation', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 825104)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 777273)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 777273)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 777273)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 777273)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 904733)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 904733)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 777273)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 777273)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 777273)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 24, 14, 26, 59, 793392)), + ), + ] diff --git a/panel/migrations/0605_auto_20250925_1046.py b/panel/migrations/0605_auto_20250925_1046.py new file mode 100644 index 0000000..b2f7c9f --- /dev/null +++ b/panel/migrations/0605_auto_20250925_1046.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-25 10:46 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0604_auto_20250924_1427'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='free_sale_form_governmental_quota', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 55, 28362)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 54, 865276)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 54, 865276)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 54, 865276)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 54, 865276)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 55, 215861)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 55, 215861)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 54, 880901)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 54, 880901)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 54, 880901)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 10, 45, 54, 912145)), + ), + ] diff --git a/panel/migrations/0606_auto_20250925_1108.py b/panel/migrations/0606_auto_20250925_1108.py new file mode 100644 index 0000000..bf61ce3 --- /dev/null +++ b/panel/migrations/0606_auto_20250925_1108.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-09-25 11:08 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0605_auto_20250925_1046'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='cold_house_free_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='cold_house_governmental_percent', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 37, 987332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 37, 831083)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 37, 831083)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 37, 831083)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 37, 831083)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 38, 181051)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 38, 181051)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 37, 846708)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 37, 846708)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 37, 846708)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 11, 7, 37, 877958)), + ), + ] diff --git a/panel/migrations/0607_auto_20250925_1345.py b/panel/migrations/0607_auto_20250925_1345.py new file mode 100644 index 0000000..407811b --- /dev/null +++ b/panel/migrations/0607_auto_20250925_1345.py @@ -0,0 +1,129 @@ +# Generated by Django 3.2.13 on 2025-09-25 13:45 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0606_auto_20250925_1108'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='out_province_free_buying_commitment_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_cold_house_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_cold_house_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_segmentation_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_segmentation_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_selling_in_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_selling_in_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_selling_out_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_selling_out_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='warehouse_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouserequest', + name='warehouse_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 479946)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 401813)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 401813)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 401813)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 401813)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 573696)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 573696)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 401813)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 401813)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 401813)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 13, 44, 52, 417436)), + ), + ] diff --git a/panel/migrations/0608_auto_20250925_1422.py b/panel/migrations/0608_auto_20250925_1422.py new file mode 100644 index 0000000..aed41a5 --- /dev/null +++ b/panel/migrations/0608_auto_20250925_1422.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-09-25 14:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0607_auto_20250925_1345'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='total_in_province_free_bars_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_in_province_governmental_bars_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_out_province_buying_bars_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 535811)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 200034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 200034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 200034)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 200034)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 870337)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 870337)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 200034)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 200034)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 200034)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 14, 21, 46, 262535)), + ), + ] diff --git a/panel/migrations/0609_auto_20250925_1501.py b/panel/migrations/0609_auto_20250925_1501.py new file mode 100644 index 0000000..fbd70d7 --- /dev/null +++ b/panel/migrations/0609_auto_20250925_1501.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-09-25 15:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0608_auto_20250925_1422'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='total_commitment_selling_in_province_free_remain_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='total_commitment_selling_in_province_governmental_remain_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 351378)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 242003)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 242003)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 242003)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 242003)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 481337)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 481337)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 257627)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 257627)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 257627)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 25, 15, 0, 34, 273252)), + ), + ] diff --git a/panel/migrations/0610_auto_20250927_2016.py b/panel/migrations/0610_auto_20250927_2016.py new file mode 100644 index 0000000..33bf94f --- /dev/null +++ b/panel/migrations/0610_auto_20250927_2016.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-27 20:16 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0609_auto_20250925_1501'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='payment_deadline_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 919090)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 856377)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 856377)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 856377)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 856377)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 986702)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 986702)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 863611)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 863611)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 863611)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 16, 1, 863611)), + ), + ] diff --git a/panel/migrations/0611_auto_20250927_2020.py b/panel/migrations/0611_auto_20250927_2020.py new file mode 100644 index 0000000..21f06ab --- /dev/null +++ b/panel/migrations/0611_auto_20250927_2020.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-09-27 20:20 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0610_auto_20250927_2016'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 769159)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 711971)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 711971)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 711971)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 711971)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 834274)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 834274)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 713978)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 713978)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 713978)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 19, 52, 725523)), + ), + migrations.CreateModel( + name='AllowRegisterCodeForStewardAllocation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allowregistercodeforstewardallocation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allowregistercodeforstewardallocation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0612_auto_20250927_2024.py b/panel/migrations/0612_auto_20250927_2024.py new file mode 100644 index 0000000..944ce7f --- /dev/null +++ b/panel/migrations/0612_auto_20250927_2024.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-09-27 20:24 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0611_auto_20250927_2020'), + ] + + operations = [ + migrations.RenameField( + model_name='stewardallocation', + old_name='payment_deadline_date', + new_name='expire_date_time_registration_code', + ), + migrations.AddField( + model_name='allowregistercodeforstewardallocation', + name='time', + field=models.CharField(max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 201652)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 134266)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 134266)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 134266)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 134266)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 456453)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 456453)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 134266)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 134266)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 134266)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 24, 3, 154243)), + ), + ] diff --git a/panel/migrations/0613_auto_20250927_2026.py b/panel/migrations/0613_auto_20250927_2026.py new file mode 100644 index 0000000..21bf6a5 --- /dev/null +++ b/panel/migrations/0613_auto_20250927_2026.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-27 20:26 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0612_auto_20250927_2024'), + ] + + operations = [ + migrations.RenameField( + model_name='allowregistercodeforstewardallocation', + old_name='allow', + new_name='active', + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 52, 76001)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 51, 935740)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 51, 935740)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 51, 935740)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 51, 935740)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 52, 255944)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 52, 255944)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 51, 939758)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 51, 939758)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 51, 939758)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 25, 51, 953563)), + ), + ] diff --git a/panel/migrations/0614_auto_20250927_2028.py b/panel/migrations/0614_auto_20250927_2028.py new file mode 100644 index 0000000..3ea969d --- /dev/null +++ b/panel/migrations/0614_auto_20250927_2028.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-27 20:28 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0613_auto_20250927_2026'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='active_expire_date_time', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 400725)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 321689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 321689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 321689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 321689)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 493839)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 493839)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 331733)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 331733)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 331733)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 28, 2, 345538)), + ), + ] diff --git a/panel/migrations/0615_auto_20250927_2041.py b/panel/migrations/0615_auto_20250927_2041.py new file mode 100644 index 0000000..a8ca4dd --- /dev/null +++ b/panel/migrations/0615_auto_20250927_2041.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-27 20:41 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0614_auto_20250927_2028'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='interface_number', + field=models.CharField(max_length=11, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 352777)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 289245)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 289245)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 289245)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 289245)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 472020)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 472020)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 289245)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 289245)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 289245)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 27, 20, 41, 27, 315417)), + ), + ] diff --git a/panel/migrations/0616_auto_20250929_1505.py b/panel/migrations/0616_auto_20250929_1505.py new file mode 100644 index 0000000..9390028 --- /dev/null +++ b/panel/migrations/0616_auto_20250929_1505.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-29 15:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0615_auto_20250927_2041'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='free_sale_from_free_quota_in_province', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 25, 686330)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 25, 267332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 25, 267332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 25, 267332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 25, 267332)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 26, 206328)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 26, 206328)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 25, 279331)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 25, 279331)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 25, 279331)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 15, 4, 25, 312330)), + ), + ] diff --git a/panel/migrations/0617_auto_20250929_1856.py b/panel/migrations/0617_auto_20250929_1856.py new file mode 100644 index 0000000..847b122 --- /dev/null +++ b/panel/migrations/0617_auto_20250929_1856.py @@ -0,0 +1,106 @@ +# Generated by Django 3.2.13 on 2025-09-29 18:56 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0616_auto_20250929_1505'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='active_register_code', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='logged_register_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='guilds', + name='register_code', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 506219)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 405222)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 405222)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 405222)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 405222)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 689605)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 689605)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 410215)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 410215)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 410215)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 18, 55, 36, 429222)), + ), + migrations.CreateModel( + name='AllowRegisterCodeForGuilds', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('time', models.CharField(max_length=50, null=True)), + ('has_time', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allowregistercodeforguilds_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allowregistercodeforguilds_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0618_auto_20250929_1900.py b/panel/migrations/0618_auto_20250929_1900.py new file mode 100644 index 0000000..75a5c9e --- /dev/null +++ b/panel/migrations/0618_auto_20250929_1900.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-29 19:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0617_auto_20250929_1856'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='expire_time_register_code', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 371159)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 235268)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 235268)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 235268)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 235268)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 471449)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 471449)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 238753)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 238753)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 238753)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 29, 19, 0, 36, 253273)), + ), + ] diff --git a/panel/migrations/0619_auto_20250930_1003.py b/panel/migrations/0619_auto_20250930_1003.py new file mode 100644 index 0000000..b2ec636 --- /dev/null +++ b/panel/migrations/0619_auto_20250930_1003.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-30 10:03 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0618_auto_20250929_1900'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='register_date_time_registration_code', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 358573)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 293048)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 293048)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 293048)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 293048)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 437002)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 437002)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 297054)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 297054)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 297054)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 10, 3, 21, 311042)), + ), + ] diff --git a/panel/migrations/0620_auto_20250930_1118.py b/panel/migrations/0620_auto_20250930_1118.py new file mode 100644 index 0000000..7b7b9aa --- /dev/null +++ b/panel/migrations/0620_auto_20250930_1118.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-09-30 11:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0619_auto_20250930_1003'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='register_date_register_code', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 498959)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 424521)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 422309)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 422309)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 422309)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 588423)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 588423)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 426524)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 426524)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 426524)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 9, 30, 11, 17, 43, 442520)), + ), + ] diff --git a/panel/migrations/0621_auto_20251001_1123.py b/panel/migrations/0621_auto_20251001_1123.py new file mode 100644 index 0000000..e920e4a --- /dev/null +++ b/panel/migrations/0621_auto_20251001_1123.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-01 11:23 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0620_auto_20250930_1118'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='is_registered', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 782700)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 728701)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 728701)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 728701)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 728701)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 844700)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 844700)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 731701)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 731701)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 731701)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 1, 11, 23, 29, 741700)), + ), + ] diff --git a/panel/migrations/0622_auto_20251004_1105.py b/panel/migrations/0622_auto_20251004_1105.py new file mode 100644 index 0000000..0e63cba --- /dev/null +++ b/panel/migrations/0622_auto_20251004_1105.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2025-10-04 11:05 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0621_auto_20251001_1123'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='input_warehouse', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_input_warehouse', to='panel.killhouse'), + ), + migrations.AddField( + model_name='killhouserequest', + name='input_warehouse', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_input_warehouse', to='panel.killhouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 701514)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 646111)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 646111)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 646111)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 646111)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 775134)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 775134)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 646111)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 646111)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 646111)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 4, 11, 5, 3, 661603)), + ), + ] diff --git a/panel/migrations/0623_auto_20251005_1416.py b/panel/migrations/0623_auto_20251005_1416.py new file mode 100644 index 0000000..bec7dd0 --- /dev/null +++ b/panel/migrations/0623_auto_20251005_1416.py @@ -0,0 +1,390 @@ +# Generated by Django 3.2.13 on 2025-10-05 14:16 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0622_auto_20251004_1105'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='cold_house_free_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='cold_house_governmental_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='free_sale_form_governmental_quota', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='free_sale_from_free_quota_in_province', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='free_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='governmental_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='in_province_free_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='in_province_governmental_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='out_province_free_buying_commitment_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='out_province_free_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='out_province_governmental_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='segmentation_free_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='segmentation_governmental_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_cold_house_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_cold_house_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_cold_house_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_cold_house_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_cold_house_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_segmentation_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_segmentation_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_selling_in_province_free_remain_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_selling_in_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_selling_in_province_governmental_remain_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_selling_in_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_selling_out_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_commitment_selling_out_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_in_province_free_bars_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_in_province_free_bars_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_in_province_governmental_bars_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_in_province_governmental_bars_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_input_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_input_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_input_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_out_province_buying_bars_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_out_province_buying_bars_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_remain_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_remain_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_remain_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_segmentation_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_segmentation_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_segmentation_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_selling_in_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_selling_in_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_selling_out_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_selling_out_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_selling_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_selling_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='total_selling_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 613503)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 546562)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 546562)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 546562)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 546562)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 692181)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 692181)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 546562)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 546562)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 546562)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 5, 14, 16, 1, 571467)), + ), + migrations.CreateModel( + name='GuildsGeneralConfigs', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('activator', models.CharField(max_length=200, null=True)), + ('out_province_governmental_selling_percent', models.FloatField(default=0)), + ('out_province_free_selling_percent', models.FloatField(default=0)), + ('out_province_free_buying_commitment_percent', models.FloatField(default=0)), + ('in_province_governmental_selling_percent', models.FloatField(default=0)), + ('in_province_free_selling_percent', models.FloatField(default=0)), + ('segmentation_governmental_percent', models.FloatField(default=0)), + ('segmentation_free_selling_percent', models.FloatField(default=0)), + ('cold_house_governmental_percent', models.FloatField(default=0)), + ('cold_house_free_percent', models.FloatField(default=0)), + ('governmental_selling_permission', models.BooleanField(default=False)), + ('free_selling_permission', models.BooleanField(default=False)), + ('free_sale_form_governmental_quota', models.BooleanField(default=False)), + ('free_sale_from_free_quota_in_province', models.BooleanField(default=False)), + ('total_input_warehouse_weight', models.FloatField(default=0)), + ('total_input_warehouse_governmental_weight', models.FloatField(default=0)), + ('total_input_warehouse_free_weight', models.FloatField(default=0)), + ('total_selling_warehouse_governmental_weight', models.FloatField(default=0)), + ('total_selling_warehouse_free_weight', models.FloatField(default=0)), + ('total_remain_warehouse_governmental_weight', models.FloatField(default=0)), + ('total_remain_warehouse_free_weight', models.FloatField(default=0)), + ('total_remain_warehouse_weight', models.FloatField(default=0)), + ('total_selling_in_province_governmental_weight', models.FloatField(default=0)), + ('total_selling_in_province_free_weight', models.FloatField(default=0)), + ('total_selling_out_province_governmental_weight', models.FloatField(default=0)), + ('total_selling_out_province_free_weight', models.FloatField(default=0)), + ('total_segmentation_governmental_weight', models.FloatField(default=0)), + ('total_segmentation_free_weight', models.FloatField(default=0)), + ('total_in_province_governmental_bars_weight', models.FloatField(default=0)), + ('total_in_province_free_bars_weight', models.FloatField(default=0)), + ('total_out_province_buying_bars_weight', models.FloatField(default=0)), + ('total_selling_warehouse_weight', models.FloatField(default=0)), + ('total_segmentation_weight', models.FloatField(default=0)), + ('total_cold_house_weight', models.FloatField(default=0)), + ('total_cold_house_governmental_weight', models.FloatField(default=0)), + ('total_cold_house_free_weight', models.FloatField(default=0)), + ('total_commitment_governmental_weight', models.FloatField(default=0)), + ('total_commitment_free_weight', models.FloatField(default=0)), + ('total_in_province_governmental_bars_commitment_weight', models.FloatField(default=0)), + ('total_in_province_free_bars_commitment_weight', models.FloatField(default=0)), + ('total_out_province_buying_bars_commitment_weight', models.FloatField(default=0)), + ('total_commitment_selling_in_province_governmental_weight', models.FloatField(default=0)), + ('total_commitment_selling_in_province_free_weight', models.FloatField(default=0)), + ('total_commitment_selling_in_province_governmental_remain_weight', models.FloatField(default=0)), + ('total_commitment_selling_in_province_free_remain_weight', models.FloatField(default=0)), + ('total_commitment_selling_out_province_governmental_weight', models.FloatField(default=0)), + ('total_commitment_selling_out_province_free_weight', models.FloatField(default=0)), + ('total_commitment_cold_house_governmental_weight', models.FloatField(default=0)), + ('total_commitment_cold_house_free_weight', models.FloatField(default=0)), + ('total_commitment_segmentation_governmental_weight', models.FloatField(default=0)), + ('total_commitment_segmentation_free_weight', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildsgeneralconfigs_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildsgeneralconfigs_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0624_auto_20251006_0847.py b/panel/migrations/0624_auto_20251006_0847.py new file mode 100644 index 0000000..accf0aa --- /dev/null +++ b/panel/migrations/0624_auto_20251006_0847.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-10-06 08:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0623_auto_20251005_1416'), + ] + + operations = [ + migrations.AddField( + model_name='stewardfreebarinformation', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 420961)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 362561)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 362561)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 362561)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 362561)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 490832)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 490832)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 365552)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 365552)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 365552)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 8, 47, 27, 376105)), + ), + ] diff --git a/panel/migrations/0625_auto_20251006_0905.py b/panel/migrations/0625_auto_20251006_0905.py new file mode 100644 index 0000000..59dd57e --- /dev/null +++ b/panel/migrations/0625_auto_20251006_0905.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-10-06 09:05 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0624_auto_20251006_0847'), + ] + + operations = [ + migrations.AddField( + model_name='stewardfreebarinformation', + name='quota', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='quota', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 43, 16386)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 42, 957682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 42, 957682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 42, 957682)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 42, 957682)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 43, 88542)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 43, 88542)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 42, 960783)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 42, 960783)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 42, 960783)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 9, 5, 42, 971751)), + ), + ] diff --git a/panel/migrations/0626_auto_20251006_1457.py b/panel/migrations/0626_auto_20251006_1457.py new file mode 100644 index 0000000..60afef9 --- /dev/null +++ b/panel/migrations/0626_auto_20251006_1457.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-06 14:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0625_auto_20251006_0905'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='return_trash', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 516113)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 447500)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 447500)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 447500)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 447500)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 673245)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 673245)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 449504)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 449504)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 449504)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 14, 56, 39, 464089)), + ), + ] diff --git a/panel/migrations/0627_auto_20251006_1554.py b/panel/migrations/0627_auto_20251006_1554.py new file mode 100644 index 0000000..88e8444 --- /dev/null +++ b/panel/migrations/0627_auto_20251006_1554.py @@ -0,0 +1,101 @@ +# Generated by Django 3.2.13 on 2025-10-06 15:54 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0626_auto_20251006_1457'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='return_trash_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='stewardallocation', + name='returner_trash', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 607296)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 544352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 544352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 544352)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 544352)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 703294)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 703294)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 544352)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 544352)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 544352)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 6, 15, 54, 18, 559983)), + ), + migrations.CreateModel( + name='StewardAppLogin', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('device_name', models.CharField(max_length=200, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardapplogin_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardapplogin_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_login', to='panel.guilds')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0628_auto_20251007_1220.py b/panel/migrations/0628_auto_20251007_1220.py new file mode 100644 index 0000000..980124f --- /dev/null +++ b/panel/migrations/0628_auto_20251007_1220.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-07 12:20 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0627_auto_20251006_1554'), + ] + + operations = [ + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='sale_type', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 110869)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 51788)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 51788)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 51788)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 51788)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 180340)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 180340)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 57084)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 57084)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 57084)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 12, 20, 28, 67662)), + ), + ] diff --git a/panel/migrations/0629_auto_20251007_1443.py b/panel/migrations/0629_auto_20251007_1443.py new file mode 100644 index 0000000..e199467 --- /dev/null +++ b/panel/migrations/0629_auto_20251007_1443.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-07 14:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0628_auto_20251007_1220'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='steward_warehouse', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 403817)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 116366)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 116366)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 116366)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 116366)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 690994)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 690994)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 120355)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 120355)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 120355)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 14, 43, 33, 148709)), + ), + ] diff --git a/panel/migrations/0630_auto_20251007_1546.py b/panel/migrations/0630_auto_20251007_1546.py new file mode 100644 index 0000000..f61594b --- /dev/null +++ b/panel/migrations/0630_auto_20251007_1546.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-07 15:46 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0629_auto_20251007_1443'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='expire_time_ten_minute', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 64713)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 3976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 3976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 3976)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 3976)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 138216)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 138216)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 7033)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 7033)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 7033)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 7, 15, 46, 9, 18391)), + ), + ] diff --git a/panel/migrations/0631_auto_20251008_1014.py b/panel/migrations/0631_auto_20251008_1014.py new file mode 100644 index 0000000..f7e7e28 --- /dev/null +++ b/panel/migrations/0631_auto_20251008_1014.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-10-08 10:14 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0630_auto_20251007_1546'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='return_trash', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='provincekillrequest', + name='return_trash', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 789867)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 730570)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 730570)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 730570)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 730570)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 864871)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 864871)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 733669)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 733669)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 733669)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 8, 10, 13, 57, 744483)), + ), + ] diff --git a/panel/migrations/0632_auto_20251012_1433.py b/panel/migrations/0632_auto_20251012_1433.py new file mode 100644 index 0000000..28f4cea --- /dev/null +++ b/panel/migrations/0632_auto_20251012_1433.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-10-12 14:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0631_auto_20251008_1014'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='maximum_load_volume_increase', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='maximum_load_volume_reduction', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 4, 867819)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 4, 705366)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 4, 704271)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 4, 705366)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 4, 704271)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 5, 72514)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 5, 72514)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 4, 708358)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 4, 708358)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 4, 708358)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 12, 14, 33, 4, 771072)), + ), + ] diff --git a/panel/migrations/0633_auto_20251018_2111.py b/panel/migrations/0633_auto_20251018_2111.py new file mode 100644 index 0000000..df3882e --- /dev/null +++ b/panel/migrations/0633_auto_20251018_2111.py @@ -0,0 +1,96 @@ +# Generated by Django 3.2.13 on 2025-10-18 21:11 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0632_auto_20251012_1433'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 746369)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 684373)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 684373)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 684373)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 684373)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 825405)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 825405)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 688365)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 688365)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 688365)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 18, 21, 11, 28, 700365)), + ), + migrations.CreateModel( + name='StewardRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('date', models.DateTimeField(null=True)), + ('quantity', models.IntegerField(default=0)), + ('weight', models.IntegerField(default=0)), + ('state', models.CharField(default='pending', max_length=50)), + ('registerer', models.CharField(max_length=250, null=True)), + ('registerer_mobile', models.CharField(max_length=250, null=True)), + ('registerer_role', models.CharField(max_length=250, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardrequest_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='stewardrequest_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_request', to='panel.guilds')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0634_auto_20251021_1331.py b/panel/migrations/0634_auto_20251021_1331.py new file mode 100644 index 0000000..140fb0f --- /dev/null +++ b/panel/migrations/0634_auto_20251021_1331.py @@ -0,0 +1,90 @@ +# Generated by Django 3.2.13 on 2025-10-21 13:31 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0633_auto_20251018_2111'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 167071)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 119669)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 119669)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 119669)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 119669)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 246938)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 246938)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 119669)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 119669)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 119669)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 13, 30, 54, 135359)), + ), + migrations.CreateModel( + name='RestrictionCarcassDistribution', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('allow', models.BooleanField(default=False)), + ('time', models.TimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='restrictioncarcassdistribution_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='restrictioncarcassdistribution_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0635_auto_20251021_1408.py b/panel/migrations/0635_auto_20251021_1408.py new file mode 100644 index 0000000..c4018f0 --- /dev/null +++ b/panel/migrations/0635_auto_20251021_1408.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-10-21 14:08 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0634_auto_20251021_1331'), + ] + + operations = [ + migrations.AddField( + model_name='restrictioncarcassdistribution', + name='distribution_type', + field=models.CharField(default='KillHouse', max_length=50), + ), + migrations.AddField( + model_name='restrictioncarcassdistribution', + name='out', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 212632)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 153437)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 153437)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 153437)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 153437)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 289655)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 289655)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 156272)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 156272)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 156272)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 8, 5, 167631)), + ), + ] diff --git a/panel/migrations/0636_auto_20251021_1424.py b/panel/migrations/0636_auto_20251021_1424.py new file mode 100644 index 0000000..16ecdf9 --- /dev/null +++ b/panel/migrations/0636_auto_20251021_1424.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.13 on 2025-10-21 14:24 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0635_auto_20251021_1408'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='ware_house_remaining_percent_limitation', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='ware_house_remaining_percent_limitation_status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhouse', + name='ware_house_remaining_weight_limitation', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='ware_house_remaining_weight_limitation_status', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 50, 959569)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 49, 842514)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 49, 842514)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 49, 842514)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 49, 842514)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 51, 629552)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 51, 629552)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 49, 846532)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 49, 846532)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 49, 846532)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 14, 23, 50, 71797)), + ), + ] diff --git a/panel/migrations/0637_auto_20251021_1531.py b/panel/migrations/0637_auto_20251021_1531.py new file mode 100644 index 0000000..163fc50 --- /dev/null +++ b/panel/migrations/0637_auto_20251021_1531.py @@ -0,0 +1,129 @@ +# Generated by Django 3.2.13 on 2025-10-21 15:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0636_auto_20251021_1424'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='active_expire_date_time', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='expire_date_time_registration_code', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='logged_registration_code', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='register_date_time_registration_code', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='registration_code', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='system_registration_code', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='active_expire_date_time', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='expire_date_time_registration_code', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='logged_registration_code', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='register_date_time_registration_code', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='registration_code', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='system_registration_code', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 275693)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 217091)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 217091)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 217091)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 217091)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 347575)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 347575)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 220083)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 220083)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 220083)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 31, 35, 231426)), + ), + ] diff --git a/panel/migrations/0638_auto_20251021_1541.py b/panel/migrations/0638_auto_20251021_1541.py new file mode 100644 index 0000000..49e424a --- /dev/null +++ b/panel/migrations/0638_auto_20251021_1541.py @@ -0,0 +1,107 @@ +# Generated by Django 3.2.13 on 2025-10-21 15:41 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0637_auto_20251021_1531'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 478605)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 353081)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 352084)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 353081)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 352084)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 563809)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 563809)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 356074)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 356074)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 356074)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 21, 15, 40, 57, 369039)), + ), + migrations.CreateModel( + name='AllowRegisterCodeForStewardFreeSaleBarInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('time', models.CharField(max_length=50, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allowregistercodeforstewardfreesalebarinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allowregistercodeforstewardfreesalebarinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AllowRegisterCodeForKillHouseFreeSaleBarInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('time', models.CharField(max_length=50, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allowregistercodeforkillhousefreesalebarinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allowregistercodeforkillhousefreesalebarinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0639_auto_20251022_1518.py b/panel/migrations/0639_auto_20251022_1518.py new file mode 100644 index 0000000..914607e --- /dev/null +++ b/panel/migrations/0639_auto_20251022_1518.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-10-22 15:18 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0638_auto_20251021_1541'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='expire_time_ten_minute', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='expire_time_ten_minute', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 585673)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 524375)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 524375)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 524375)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 524375)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 669375)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 669375)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 527472)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 527472)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 527472)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 22, 15, 17, 54, 539125)), + ), + ] diff --git a/panel/migrations/0640_auto_20251025_1110.py b/panel/migrations/0640_auto_20251025_1110.py new file mode 100644 index 0000000..fe14d72 --- /dev/null +++ b/panel/migrations/0640_auto_20251025_1110.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-10-25 11:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0639_auto_20251022_1518'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='production_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='possegmentation', + name='production_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='stewardallocation', + name='distribution_type', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='stewardallocation', + name='production_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='production_date', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 340193)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 292663)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 292663)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 292663)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 292663)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 421445)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 421445)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 292663)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 292663)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 292663)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 10, 22, 308447)), + ), + ] diff --git a/panel/migrations/0641_auto_20251025_1116.py b/panel/migrations/0641_auto_20251025_1116.py new file mode 100644 index 0000000..3e97418 --- /dev/null +++ b/panel/migrations/0641_auto_20251025_1116.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-10-25 11:16 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0640_auto_20251025_1110'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='distribution_type', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='possegmentation', + name='distribution_type', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='distribution_type', + field=models.CharField(max_length=20, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 813258)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 754133)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 754133)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 754133)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 754133)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 884428)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 884428)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 756139)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 756139)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 756139)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 25, 11, 15, 55, 767913)), + ), + ] diff --git a/panel/migrations/0642_auto_20251026_1719.py b/panel/migrations/0642_auto_20251026_1719.py new file mode 100644 index 0000000..a1041aa --- /dev/null +++ b/panel/migrations/0642_auto_20251026_1719.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-26 17:19 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0641_auto_20251025_1116'), + ] + + operations = [ + migrations.AddField( + model_name='stewardallocation', + name='Settlement_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 18, 56237)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 17, 948829)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 17, 948829)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 17, 948829)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 17, 948829)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 18, 195330)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 18, 195330)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 17, 954359)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 17, 954359)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 17, 954359)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 17, 19, 17, 973417)), + ), + ] diff --git a/panel/migrations/0643_auto_20251026_2043.py b/panel/migrations/0643_auto_20251026_2043.py new file mode 100644 index 0000000..248e0a3 --- /dev/null +++ b/panel/migrations/0643_auto_20251026_2043.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-26 20:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0642_auto_20251026_1719'), + ] + + operations = [ + migrations.AddField( + model_name='killrequest', + name='expire_time_ten_minute', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 48, 27713)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 47, 973679)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 47, 973679)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 47, 973679)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 47, 973679)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 48, 91712)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 48, 91712)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 47, 976703)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 47, 976703)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 47, 976703)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 42, 47, 986713)), + ), + ] diff --git a/panel/migrations/0644_auto_20251026_2048.py b/panel/migrations/0644_auto_20251026_2048.py new file mode 100644 index 0000000..5169c3f --- /dev/null +++ b/panel/migrations/0644_auto_20251026_2048.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-10-26 20:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0643_auto_20251026_2043'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 537781)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 481603)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 481603)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 481603)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 481603)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 605814)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 605814)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 484813)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 484813)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 484813)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 26, 20, 48, 12, 494813)), + ), + ] diff --git a/panel/migrations/0645_auto_20251027_0917.py b/panel/migrations/0645_auto_20251027_0917.py new file mode 100644 index 0000000..66fae4c --- /dev/null +++ b/panel/migrations/0645_auto_20251027_0917.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2025-10-27 09:17 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0644_auto_20251026_2048'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='pos_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='pos_free_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='pos_governmental_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='pos_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='pos_free_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='pos_governmental_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 47, 928698)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 47, 867263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 47, 867263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 47, 867263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 47, 867263)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 48, 3628)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 48, 3628)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 47, 867263)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 47, 867263)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 47, 867263)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 9, 16, 47, 877126)), + ), + ] diff --git a/panel/migrations/0646_auto_20251027_1215.py b/panel/migrations/0646_auto_20251027_1215.py new file mode 100644 index 0000000..7ca90b8 --- /dev/null +++ b/panel/migrations/0646_auto_20251027_1215.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-27 12:15 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0645_auto_20251027_0917'), + ] + + operations = [ + migrations.AddField( + model_name='productstransactions', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 715300)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 650085)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 650085)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 650085)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 650085)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 791209)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 791209)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 653086)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 653086)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 653086)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 27, 12, 14, 48, 664749)), + ), + ] diff --git a/panel/migrations/0647_auto_20251028_0856.py b/panel/migrations/0647_auto_20251028_0856.py new file mode 100644 index 0000000..25f0afb --- /dev/null +++ b/panel/migrations/0647_auto_20251028_0856.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-28 08:56 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0646_auto_20251027_1215'), + ] + + operations = [ + migrations.AddField( + model_name='poultryrequestquarantinecode', + name='trafic_code', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 727806)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 665805)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 665805)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 665805)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 665805)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 799279)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 799279)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 667805)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 667805)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 667805)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 55, 52, 679808)), + ), + ] diff --git a/panel/migrations/0648_auto_20251028_0857.py b/panel/migrations/0648_auto_20251028_0857.py new file mode 100644 index 0000000..d3100dc --- /dev/null +++ b/panel/migrations/0648_auto_20251028_0857.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-10-28 08:57 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0647_auto_20251028_0856'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 16, 20073)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 15, 955399)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 15, 955399)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 15, 955399)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 15, 955399)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 16, 98221)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 16, 98221)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 15, 955399)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 15, 955399)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 15, 955399)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 8, 57, 15, 975873)), + ), + ] diff --git a/panel/migrations/0649_auto_20251028_0940.py b/panel/migrations/0649_auto_20251028_0940.py new file mode 100644 index 0000000..d7c1ce7 --- /dev/null +++ b/panel/migrations/0649_auto_20251028_0940.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-10-28 09:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0648_auto_20251028_0857'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 753855)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 691354)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 691354)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 691354)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 691354)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 823825)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 823825)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 706981)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 706981)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 706981)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 9, 40, 1, 706981)), + ), + ] diff --git a/panel/migrations/0650_rename_trafic_to_traffic_code.py b/panel/migrations/0650_rename_trafic_to_traffic_code.py new file mode 100644 index 0000000..e670b28 --- /dev/null +++ b/panel/migrations/0650_rename_trafic_to_traffic_code.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-10-28 09:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0649_auto_20251028_0940'), + ] + + operations = [ + migrations.RenameField( + model_name='poultryrequestquarantinecode', + old_name='trafic_code', + new_name='traffic_code', + ), + ] diff --git a/panel/migrations/0651_auto_20251028_1219.py b/panel/migrations/0651_auto_20251028_1219.py new file mode 100644 index 0000000..9a2b189 --- /dev/null +++ b/panel/migrations/0651_auto_20251028_1219.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-10-28 12:19 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0650_rename_trafic_to_traffic_code'), + ] + + operations = [ + migrations.AddField( + model_name='killhouserequest', + name='amount', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 57, 983589)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 57, 874509)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 57, 874509)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 57, 874509)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 57, 874509)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 58, 73551)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 58, 73551)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 57, 880015)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 57, 880015)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 57, 880015)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 28, 12, 18, 57, 891657)), + ), + ] diff --git a/panel/migrations/0652_auto_20251029_0933.py b/panel/migrations/0652_auto_20251029_0933.py new file mode 100644 index 0000000..3ba1ccf --- /dev/null +++ b/panel/migrations/0652_auto_20251029_0933.py @@ -0,0 +1,90 @@ +# Generated by Django 3.2.13 on 2025-10-29 09:33 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0651_auto_20251028_1219'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 172197)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 125319)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 125319)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 125319)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 125319)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 234696)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 234696)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 125319)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 125319)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 125319)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 32, 55, 140947)), + ), + migrations.CreateModel( + name='LimitationForDirectPurchaseAndBarInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('time', models.CharField(max_length=50, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='limitationfordirectpurchaseandbarinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='limitationfordirectpurchaseandbarinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0653_auto_20251029_0954.py b/panel/migrations/0653_auto_20251029_0954.py new file mode 100644 index 0000000..feec52e --- /dev/null +++ b/panel/migrations/0653_auto_20251029_0954.py @@ -0,0 +1,83 @@ +# Generated by Django 3.2.13 on 2025-10-29 09:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0652_auto_20251029_0933'), + ] + + operations = [ + migrations.RemoveField( + model_name='limitationfordirectpurchaseandbarinformation', + name='time', + ), + migrations.AddField( + model_name='limitationfordirectpurchaseandbarinformation', + name='end_time', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='limitationfordirectpurchaseandbarinformation', + name='start_time', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 718954)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 626320)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 626320)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 626320)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 626320)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 860332)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 860332)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 630318)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 630318)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 630318)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 53, 56, 647317)), + ), + ] diff --git a/panel/migrations/0654_auto_20251029_0955.py b/panel/migrations/0654_auto_20251029_0955.py new file mode 100644 index 0000000..798ac89 --- /dev/null +++ b/panel/migrations/0654_auto_20251029_0955.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-10-29 09:55 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0653_auto_20251029_0954'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 0, 989506)), + ), + migrations.AlterField( + model_name='limitationfordirectpurchaseandbarinformation', + name='end_time', + field=models.TimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='limitationfordirectpurchaseandbarinformation', + name='start_time', + field=models.TimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 0, 918739)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 0, 918739)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 0, 918739)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 0, 918739)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 1, 77944)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 1, 77944)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 0, 922734)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 0, 922734)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 0, 922734)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 9, 55, 0, 932733)), + ), + ] diff --git a/panel/migrations/0655_auto_20251029_1055.py b/panel/migrations/0655_auto_20251029_1055.py new file mode 100644 index 0000000..0bd711c --- /dev/null +++ b/panel/migrations/0655_auto_20251029_1055.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-10-29 10:55 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0654_auto_20251029_0955'), + ] + + operations = [ + migrations.AddField( + model_name='possegmentation', + name='amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='possegmentation', + name='total_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 643043)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 582502)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 582502)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 582502)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 582502)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 705461)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 705461)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 586508)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 586508)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 586508)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 10, 54, 57, 601513)), + ), + ] diff --git a/panel/migrations/0656_auto_20251029_1609.py b/panel/migrations/0656_auto_20251029_1609.py new file mode 100644 index 0000000..d3881aa --- /dev/null +++ b/panel/migrations/0656_auto_20251029_1609.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-10-29 16:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0655_auto_20251029_1055'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='amount', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='total_amount', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 408487)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 338605)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 338605)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 338605)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 338605)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 493757)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 493757)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 343617)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 343617)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 343617)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 10, 29, 16, 9, 33, 356329)), + ), + ] diff --git a/panel/migrations/0657_auto_20251102_1322.py b/panel/migrations/0657_auto_20251102_1322.py new file mode 100644 index 0000000..503da1f --- /dev/null +++ b/panel/migrations/0657_auto_20251102_1322.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-11-02 13:22 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0656_auto_20251029_1609'), + ] + + operations = [ + migrations.AddField( + model_name='posdeviceversion', + name='link', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 223923)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 158243)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 158243)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 158243)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 158243)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 300194)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 300194)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 161785)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 161785)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 161785)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 13, 22, 18, 174907)), + ), + ] diff --git a/panel/migrations/0658_auto_20251102_1437.py b/panel/migrations/0658_auto_20251102_1437.py new file mode 100644 index 0000000..468a2c3 --- /dev/null +++ b/panel/migrations/0658_auto_20251102_1437.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.13 on 2025-11-02 14:37 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0657_auto_20251102_1322'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 598288)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 536939)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 536939)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 536939)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 536939)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 672615)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 672615)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 540512)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 540512)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 540512)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 14, 37, 30, 551672)), + ), + migrations.CreateModel( + name='WarehouseArchive', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('date', models.DateTimeField(null=True)), + ('weight', models.FloatField(default=0)), + ('image', models.CharField(max_length=500, null=True)), + ('quota', models.CharField(max_length=20, null=True)), + ('description', models.TextField(null=True)), + ('registerer', models.CharField(max_length=250, null=True)), + ('registerer_mobile', models.CharField(max_length=250, null=True)), + ('registerer_role', models.CharField(max_length=250, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='warehousearchive_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guild_archive', to='panel.guilds')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_archive', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='warehousearchive_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_archive', to='panel.guilds')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0659_auto_20251102_1614.py b/panel/migrations/0659_auto_20251102_1614.py new file mode 100644 index 0000000..7e2b3e7 --- /dev/null +++ b/panel/migrations/0659_auto_20251102_1614.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-11-02 16:14 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0658_auto_20251102_1437'), + ] + + operations = [ + migrations.AddField( + model_name='posdeviceversion', + name='checksum', + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 7, 27311)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 6, 959689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 6, 959689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 6, 959689)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 6, 959689)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 7, 113497)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 7, 113497)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 6, 962687)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 6, 962687)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 6, 962687)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 16, 14, 6, 976208)), + ), + ] diff --git a/panel/migrations/0660_auto_20251102_2037.py b/panel/migrations/0660_auto_20251102_2037.py new file mode 100644 index 0000000..1840b63 --- /dev/null +++ b/panel/migrations/0660_auto_20251102_2037.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2025-11-02 20:37 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0659_auto_20251102_1614'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 608750)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 477082)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 477082)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 477082)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 477082)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 717026)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 717026)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 485084)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 485084)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 485084)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 36, 34, 520850)), + ), + migrations.CreateModel( + name='SmsRecipient', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('phone_number', models.CharField(max_length=11, unique=True)), + ('name', models.CharField(max_length=100)), + ('is_active', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='smsrecipient_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='smsrecipient_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0661_auto_20251102_2044.py b/panel/migrations/0661_auto_20251102_2044.py new file mode 100644 index 0000000..43ac310 --- /dev/null +++ b/panel/migrations/0661_auto_20251102_2044.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-11-02 20:44 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0660_auto_20251102_2037'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 42, 944418)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 42, 735638)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 42, 735638)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 42, 735638)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 42, 735638)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 43, 178738)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 43, 178738)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 42, 745639)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 42, 745639)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 42, 745639)), + ), + migrations.AlterField( + model_name='smsrecipient', + name='name', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 2, 20, 43, 42, 785380)), + ), + ] diff --git a/panel/migrations/0662_auto_20251103_1453.py b/panel/migrations/0662_auto_20251103_1453.py new file mode 100644 index 0000000..9cbf8b5 --- /dev/null +++ b/panel/migrations/0662_auto_20251103_1453.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-11-03 14:53 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0661_auto_20251102_2044'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 774809)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 714062)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 714062)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 714062)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 714062)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 838938)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 838938)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 714062)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 714062)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 714062)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 14, 53, 39, 714062)), + ), + migrations.CreateModel( + name='PosDeviceSetting', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('pos_machin', models.CharField(max_length=100, null=True)), + ('owner', models.TextField(null=True)), + ('serial', models.TextField(null=True)), + ('key_id', models.TextField(null=True)), + ('key_value', models.TextField(null=True)), + ('last_modify', models.DateTimeField(null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posdevicesetting_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posdevicesetting_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0663_auto_20251103_1525.py b/panel/migrations/0663_auto_20251103_1525.py new file mode 100644 index 0000000..ad33039 --- /dev/null +++ b/panel/migrations/0663_auto_20251103_1525.py @@ -0,0 +1,104 @@ +# Generated by Django 3.2.13 on 2025-11-03 15:25 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0662_auto_20251103_1453'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='ware_house_archive_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='ware_house_archive_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='guilds', + name='ware_house_archive_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='ware_house_archive_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='ware_house_archive_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='killhouse', + name='ware_house_archive_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='rolesproducts', + name='ware_house_archive_weight', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 333127)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 273336)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 273336)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 273336)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 273336)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 407615)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 407615)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 276335)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 276335)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 276335)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 3, 15, 24, 55, 287882)), + ), + ] diff --git a/panel/migrations/0664_auto_20251104_1353.py b/panel/migrations/0664_auto_20251104_1353.py new file mode 100644 index 0000000..6c5c241 --- /dev/null +++ b/panel/migrations/0664_auto_20251104_1353.py @@ -0,0 +1,114 @@ +# Generated by Django 3.2.13 on 2025-11-04 13:53 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0663_auto_20251103_1525'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='company_identifier', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='guilds', + name='company_name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='guilds', + name='has_inquiry', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='has_partner', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='is_foreign_national', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='guilds', + name='license_expire_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='guilds', + name='license_issue_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='guilds', + name='license_status', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='guilds', + name='license_type', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 521248)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 460251)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 460251)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 460251)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 460251)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 593502)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 593502)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 463245)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 463245)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 463245)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 4, 13, 52, 39, 474996)), + ), + ] diff --git a/panel/migrations/0665_auto_20251105_1111.py b/panel/migrations/0665_auto_20251105_1111.py new file mode 100644 index 0000000..c10e5a5 --- /dev/null +++ b/panel/migrations/0665_auto_20251105_1111.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.13 on 2025-11-05 11:11 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0664_auto_20251104_1353'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='national_code', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='guilds', + name='phone_number', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='guilds', + name='union_name', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 191787)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 131593)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 131593)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 131593)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 131593)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 265270)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 265270)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 135340)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 135010)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 135010)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 5, 11, 11, 17, 146507)), + ), + ] diff --git a/panel/migrations/0666_auto_20251109_1151.py b/panel/migrations/0666_auto_20251109_1151.py new file mode 100644 index 0000000..8001ce7 --- /dev/null +++ b/panel/migrations/0666_auto_20251109_1151.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2025-11-09 11:51 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0665_auto_20251105_1111'), + ] + + operations = [ + migrations.AddField( + model_name='posmachinetransactions', + name='guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='transaction_guild', to='panel.guilds'), + ), + migrations.AddField( + model_name='posmachinetransactions', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='transaction_kill_house', to='panel.killhouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 20, 284182)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 18, 31194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 18, 31194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 18, 31194)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 18, 31194)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 20, 434432)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 20, 434432)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 18, 36194)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 18, 36194)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 18, 36194)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 11, 51, 18, 56502)), + ), + ] diff --git a/panel/migrations/0667_auto_20251109_1443.py b/panel/migrations/0667_auto_20251109_1443.py new file mode 100644 index 0000000..ae47692 --- /dev/null +++ b/panel/migrations/0667_auto_20251109_1443.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-11-09 14:43 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0666_auto_20251109_1151'), + ] + + operations = [ + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='national_id', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 450884)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 366396)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 366396)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 366396)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 366396)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 563405)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 563405)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 379397)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 379397)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 379397)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 42, 34, 398820)), + ), + ] diff --git a/panel/migrations/0668_auto_20251109_1448.py b/panel/migrations/0668_auto_20251109_1448.py new file mode 100644 index 0000000..98394ec --- /dev/null +++ b/panel/migrations/0668_auto_20251109_1448.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-11-09 14:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0667_auto_20251109_1443'), + ] + + operations = [ + migrations.AddField( + model_name='outprovincecarcassesbuyer', + name='national_id', + field=models.CharField(max_length=200, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 677143)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 492322)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 492322)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 492322)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 492322)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 848577)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 848577)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 544321)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 544321)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 544321)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 9, 14, 48, 9, 562320)), + ), + ] diff --git a/panel/migrations/0669_auto_20251110_1001.py b/panel/migrations/0669_auto_20251110_1001.py new file mode 100644 index 0000000..d48ba11 --- /dev/null +++ b/panel/migrations/0669_auto_20251110_1001.py @@ -0,0 +1,123 @@ +# Generated by Django 3.2.13 on 2025-11-10 10:01 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0668_auto_20251109_1448'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 173864)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 120951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 120951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 120951)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 120951)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 256896)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 256896)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 124042)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 124042)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 124042)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 10, 0, 47, 126234)), + ), + migrations.CreateModel( + name='EvacuationHatchingDetail', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('PartIdCode', models.CharField(blank=True, max_length=200, null=True)), + ('RequestId', models.CharField(blank=True, max_length=200, null=True)), + ('MoReportId', models.CharField(blank=True, max_length=200, null=True)), + ('ReportType', models.IntegerField(blank=True, null=True)), + ('ReportTypeString', models.CharField(blank=True, max_length=255, null=True)), + ('ReportDate', models.CharField(blank=True, max_length=200, null=True)), + ('ReportDateShamsi', models.CharField(blank=True, max_length=200, null=True)), + ('MoReason', models.TextField(blank=True, null=True)), + ('MoDate', models.CharField(blank=True, max_length=200, null=True)), + ('MoDateShamsi', models.CharField(blank=True, max_length=200, null=True)), + ('MoStartDay', models.IntegerField(blank=True, null=True)), + ('MoEndDay', models.IntegerField(blank=True, null=True)), + ('MoReportSubId', models.CharField(blank=True, max_length=200, null=True)), + ('ReportStatus', models.IntegerField(blank=True, null=True)), + ('GoodCount', models.IntegerField(blank=True, null=True)), + ('Message', models.TextField(blank=True, null=True)), + ('ErrorCode', models.IntegerField(blank=True, null=True)), + ('IsDeleted', models.BooleanField(default=False)), + ('RegDate', models.CharField(blank=True, max_length=200, null=True)), + ('RegDateShamsi', models.CharField(blank=True, max_length=200, null=True)), + ('RegDateShamsiWithTime', models.CharField(blank=True, max_length=200, null=True)), + ('RegDateShamsiOnlyTime', models.CharField(blank=True, max_length=200, null=True)), + ('ExternalId', models.CharField(blank=True, max_length=200, null=True)), + ('StringId', models.CharField(blank=True, max_length=200, null=True)), + ('IsPersisted', models.BooleanField(default=False)), + ('AllowInsert', models.BooleanField(default=False)), + ('AllowUpdate', models.BooleanField(default=False)), + ('ModalCss', models.CharField(blank=True, max_length=255, null=True)), + ('GridContainerParametersModel', models.CharField(blank=True, max_length=255, null=True)), + ('MenuUserAccess', models.CharField(blank=True, max_length=255, null=True)), + ('MenuUserAccessId', models.IntegerField(blank=True, null=True)), + ('LogTableName', models.CharField(blank=True, max_length=255, null=True)), + ('LogTableAlias', models.CharField(blank=True, max_length=255, null=True)), + ('PageTitle', models.CharField(blank=True, max_length=255, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='evacuationhatchingdetail_createdby', to=settings.AUTH_USER_MODEL)), + ('hatching', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='evacuation_details', to='panel.poultryhatching')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='evacuationhatchingdetail_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0670_auto_20251110_1100.py b/panel/migrations/0670_auto_20251110_1100.py new file mode 100644 index 0000000..cca996c --- /dev/null +++ b/panel/migrations/0670_auto_20251110_1100.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.13 on 2025-11-10 11:00 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0669_auto_20251110_1001'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='total_disease_losses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='total_fire_losses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='total_flock_destruction', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='total_force_majeure_losses', + field=models.BigIntegerField(default=0), + ), + migrations.AddField( + model_name='poultryhatching', + name='total_normal_flock_losses', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 22, 39187)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 946660)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 946660)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 946660)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 946660)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 22, 142655)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 22, 142655)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 952987)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 952987)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 952987)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 0, 21, 970666)), + ), + ] diff --git a/panel/migrations/0671_auto_20251110_1101.py b/panel/migrations/0671_auto_20251110_1101.py new file mode 100644 index 0000000..0360739 --- /dev/null +++ b/panel/migrations/0671_auto_20251110_1101.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-11-10 11:01 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0670_auto_20251110_1100'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 837270)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 778235)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 773225)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 773225)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 773225)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 917597)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 917597)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 780244)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 780244)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 780244)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 11, 1, 19, 793296)), + ), + ] diff --git a/panel/migrations/0672_auto_20251110_2116.py b/panel/migrations/0672_auto_20251110_2116.py new file mode 100644 index 0000000..7401e9c --- /dev/null +++ b/panel/migrations/0672_auto_20251110_2116.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.13 on 2025-11-10 21:16 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0671_auto_20251110_1101'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 668019)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 609024)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 609024)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 609024)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 609024)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 761013)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 761013)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 612019)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 612019)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 612019)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 10, 21, 16, 5, 625027)), + ), + migrations.CreateModel( + name='HatchingLossManagement', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('include_total_disease_losses', models.BooleanField(default=False)), + ('include_total_flock_destruction', models.BooleanField(default=False)), + ('include_total_normal_flock_losses', models.BooleanField(default=False)), + ('include_total_force_majeure_losses', models.BooleanField(default=False)), + ('include_total_fire_losses', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hatchinglossmanagement_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hatchinglossmanagement_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0673_auto_20251111_1150.py b/panel/migrations/0673_auto_20251111_1150.py new file mode 100644 index 0000000..ccff71c --- /dev/null +++ b/panel/migrations/0673_auto_20251111_1150.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-11-11 11:50 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0672_auto_20251110_2116'), + ] + + operations = [ + migrations.AddField( + model_name='poultryhatching', + name='unknown', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 135047)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 67747)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 67747)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 67747)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 67747)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 204767)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 204767)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 67747)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 67747)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 67747)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 11, 11, 50, 9, 91702)), + ), + ] diff --git a/panel/migrations/0674_auto_20251115_1354.py b/panel/migrations/0674_auto_20251115_1354.py new file mode 100644 index 0000000..5c48baa --- /dev/null +++ b/panel/migrations/0674_auto_20251115_1354.py @@ -0,0 +1,137 @@ +# Generated by Django 3.2.13 on 2025-11-15 13:54 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0673_auto_20251111_1150'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 637332)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 579858)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 579858)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 579858)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 579858)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 705343)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 705343)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 581869)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 581869)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 581869)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 13, 54, 36, 589635)), + ), + migrations.CreateModel( + name='GuildLegalPersonDetail', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('status', models.BooleanField(default=False)), + ('status_code', models.IntegerField(default=0)), + ('api_log_id', models.CharField(blank=True, max_length=100, null=True)), + ('legal_person_info_dto_id', models.CharField(blank=True, max_length=100, null=True)), + ('parent_legal_person_id', models.CharField(blank=True, max_length=100, null=True)), + ('successful', models.BooleanField(default=False)), + ('message', models.TextField(blank=True, null=True)), + ('name', models.CharField(blank=True, max_length=300, null=True)), + ('national_code', models.CharField(blank=True, max_length=20, null=True)), + ('post_code', models.CharField(blank=True, max_length=20, null=True)), + ('address', models.TextField(blank=True, null=True)), + ('legal_person_type', models.CharField(blank=True, max_length=100, null=True)), + ('register_number', models.CharField(blank=True, max_length=100, null=True)), + ('register_unit', models.CharField(blank=True, max_length=100, null=True)), + ('register_date', models.CharField(blank=True, max_length=100, null=True)), + ('register_date_unix', models.BigIntegerField(default=0)), + ('residency', models.CharField(blank=True, max_length=100, null=True)), + ('state', models.CharField(blank=True, max_length=100, null=True)), + ('is_settle', models.BooleanField(default=False)), + ('settle_date', models.CharField(blank=True, max_length=100, null=True)), + ('is_break_up', models.BooleanField(default=False)), + ('break_up_date', models.CharField(blank=True, max_length=100, null=True)), + ('is_branch', models.BooleanField(default=False)), + ('branch_list', models.JSONField(blank=True, null=True)), + ('parent_legal_person_raw', models.JSONField(blank=True, null=True)), + ('establishment_date', models.CharField(blank=True, max_length=100, null=True)), + ('is_db_result', models.BooleanField(default=False)), + ('service_type', models.IntegerField(default=0)), + ('parent_name', models.CharField(blank=True, max_length=300, null=True)), + ('parent_national_code', models.CharField(blank=True, max_length=20, null=True)), + ('parent_post_code', models.CharField(blank=True, max_length=20, null=True)), + ('parent_address', models.TextField(blank=True, null=True)), + ('parent_legal_person_type', models.CharField(blank=True, max_length=100, null=True)), + ('parent_register_number', models.CharField(blank=True, max_length=100, null=True)), + ('parent_register_unit', models.CharField(blank=True, max_length=100, null=True)), + ('parent_register_date', models.CharField(blank=True, max_length=100, null=True)), + ('parent_register_date_unix', models.BigIntegerField(default=0)), + ('parent_residency', models.CharField(blank=True, max_length=100, null=True)), + ('parent_state', models.CharField(blank=True, max_length=100, null=True)), + ('parent_is_settle', models.BooleanField(default=False)), + ('parent_settle_date', models.CharField(blank=True, max_length=100, null=True)), + ('parent_is_break_up', models.BooleanField(default=False)), + ('parent_break_up_date', models.CharField(blank=True, max_length=100, null=True)), + ('parent_is_branch', models.BooleanField(default=False)), + ('parent_branch_list', models.JSONField(blank=True, null=True)), + ('parent_establishment_date', models.CharField(blank=True, max_length=100, null=True)), + ('parent_is_db_result', models.BooleanField(default=False)), + ('parent_service_type', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildlegalpersondetail_createdby', to=settings.AUTH_USER_MODEL)), + ('guild', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='legal_person_details', to='panel.guilds')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='guildlegalpersondetail_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0675_auto_20251115_1509.py b/panel/migrations/0675_auto_20251115_1509.py new file mode 100644 index 0000000..ffae98d --- /dev/null +++ b/panel/migrations/0675_auto_20251115_1509.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-11-15 15:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0674_auto_20251115_1354'), + ] + + operations = [ + migrations.AddField( + model_name='poultryscience', + name='engineering_code', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 489778)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 382413)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 382413)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 382413)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 382413)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 621129)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 621129)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 385917)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 385917)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 385917)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 15, 8, 25, 413289)), + ), + ] diff --git a/panel/migrations/0676_auto_20251115_1709.py b/panel/migrations/0676_auto_20251115_1709.py new file mode 100644 index 0000000..4e722ae --- /dev/null +++ b/panel/migrations/0676_auto_20251115_1709.py @@ -0,0 +1,329 @@ +# Generated by Django 3.2.13 on 2025-11-15 17:09 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0675_auto_20251115_1509'), + ] + + operations = [ + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='address', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='apiLogId', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='branchList', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='breakUpdate', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='establishmentDate', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='isBranch', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='isBreakUp', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='isDbResult', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='isRealPerson', + field=models.BooleanField(default=True, verbose_name='حقیقی=True / حقوقی=False'), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='isSettle', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='legalPersonInfoDtoId', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='legalPersonType', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='message', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='name', + field=models.CharField(blank=True, max_length=300, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='nationalCode', + field=models.CharField(blank=True, max_length=20, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonAddress', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonBranchList', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonBreakUpdate', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonEstablishmentDate', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonId', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonInfoDtoId', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonIsBranch', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonIsBreakUp', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonIsDbResult', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonIsSettle', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonMessage', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonName', + field=models.CharField(blank=True, max_length=300, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonNationalCode', + field=models.CharField(blank=True, max_length=20, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonParentId', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonPostCode', + field=models.CharField(blank=True, max_length=20, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonRegisterDate', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonRegisterDateUnix', + field=models.BigIntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonRegisterNumber', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonRegisterUnit', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonResidency', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonServiceType', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonSettleDate', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonState', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonSuccessful', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='parentLegalPersonType', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='postCode', + field=models.CharField(blank=True, max_length=20, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='registerDate', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='registerDateUnix', + field=models.BigIntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='registerNumber', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='registerUnit', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='residency', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='serviceType', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='settleDate', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='state', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='status', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='statusCode', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='baseoutprovincecarcassesbuyer', + name='successful', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 382269)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 323418)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 323418)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 323418)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 323418)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 445426)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 445426)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 325426)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 325426)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 325426)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 15, 17, 9, 18, 338650)), + ), + ] diff --git a/panel/migrations/0677_auto_20251116_1459.py b/panel/migrations/0677_auto_20251116_1459.py new file mode 100644 index 0000000..0673bcc --- /dev/null +++ b/panel/migrations/0677_auto_20251116_1459.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.13 on 2025-11-16 14:59 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0676_auto_20251115_1709'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 201648)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 53181)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 53181)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 53181)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 53181)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 469784)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 469784)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 57202)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 57202)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 57202)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 16, 14, 58, 51, 75393)), + ), + ] diff --git a/panel/migrations/0678_auto_20251125_0840.py b/panel/migrations/0678_auto_20251125_0840.py new file mode 100644 index 0000000..ced30bc --- /dev/null +++ b/panel/migrations/0678_auto_20251125_0840.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.13 on 2025-11-25 08:40 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0677_auto_20251116_1459'), + ] + + operations = [ + migrations.AddField( + model_name='posmachinetransactions', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='warehousearchive', + name='warehouse', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 507660)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 420681)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 420681)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 420681)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 420681)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 590737)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 590737)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 424682)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 423681)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 423681)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 39, 53, 437780)), + ), + ] diff --git a/panel/migrations/0679_auto_20251125_0843.py b/panel/migrations/0679_auto_20251125_0843.py new file mode 100644 index 0000000..642bd7d --- /dev/null +++ b/panel/migrations/0679_auto_20251125_0843.py @@ -0,0 +1,75 @@ +# Generated by Django 3.2.13 on 2025-11-25 08:43 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0678_auto_20251125_0840'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='public_killer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_public_killer', to='panel.killhouse'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 372263)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 304262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 304262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 304262)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 304262)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 468290)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 468290)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 307261)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 307261)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 307261)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 25, 8, 43, 19, 322260)), + ), + ] diff --git a/panel/migrations/0680_auto_20251130_1538.py b/panel/migrations/0680_auto_20251130_1538.py new file mode 100644 index 0000000..95ade32 --- /dev/null +++ b/panel/migrations/0680_auto_20251130_1538.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.13 on 2025-11-30 15:38 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('panel', '0679_auto_20251125_0843'), + ] + + operations = [ + migrations.AddField( + model_name='killhouse', + name='ware_house_remaining_weight_archive_percent', + field=models.FloatField(default=0), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 271694)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 175517)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 175517)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 175517)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 175517)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 383358)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 383358)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 179572)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 179572)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 179572)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 11, 30, 15, 37, 59, 201763)), + ), + ] diff --git a/panel/migrations/0681_auto_20251202_1539.py b/panel/migrations/0681_auto_20251202_1539.py new file mode 100644 index 0000000..1f07f5d --- /dev/null +++ b/panel/migrations/0681_auto_20251202_1539.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.13 on 2025-12-02 15:39 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0680_auto_20251130_1538'), + ] + + operations = [ + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 8, 940389)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 8, 866113)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 8, 866113)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 8, 866113)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 8, 866113)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 9, 8437)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 9, 8437)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 8, 866113)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 8, 866113)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 8, 866113)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 2, 15, 39, 8, 882581)), + ), + migrations.CreateModel( + name='MarketDailyLimitation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('quantity', models.IntegerField(default=0)), + ('active', models.BooleanField(default=False)), + ('register_role', models.CharField(max_length=50, null=True)), + ('register_fullname', models.CharField(max_length=100, null=True)), + ('register_mobile', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='marketdailylimitation_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='marketdailylimitation_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0682_auto_20251203_1617.py b/panel/migrations/0682_auto_20251203_1617.py new file mode 100644 index 0000000..ad6ad21 --- /dev/null +++ b/panel/migrations/0682_auto_20251203_1617.py @@ -0,0 +1,100 @@ +# Generated by Django 3.2.13 on 2025-12-03 16:17 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0681_auto_20251202_1539'), + ] + + operations = [ + migrations.AddField( + model_name='killhouseaddcar', + name='archive', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='killhousedriver', + name='archive', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 42, 978726)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 42, 912008)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 42, 912008)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 42, 912008)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 42, 912008)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 43, 57016)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 43, 57016)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 42, 916475)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 42, 916475)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 42, 916475)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 3, 16, 16, 42, 931200)), + ), + migrations.CreateModel( + name='HatchingArchivePercent', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('active', models.BooleanField(default=False)), + ('percent', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hatchingarchivepercent_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hatchingarchivepercent_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0683_auto_20251208_1617.py b/panel/migrations/0683_auto_20251208_1617.py new file mode 100644 index 0000000..cdd1a2f --- /dev/null +++ b/panel/migrations/0683_auto_20251208_1617.py @@ -0,0 +1,91 @@ +# Generated by Django 3.2.13 on 2025-12-08 16:17 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0078_auto_20251208_1617'), + ('panel', '0682_auto_20251203_1617'), + ] + + operations = [ + migrations.AddField( + model_name='guilds', + name='is_real_person', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='report_information', + field=models.JSONField(null=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='reporter_role', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poultry_science_report_user', to='authentication.systemuserprofile'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 47, 521281)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 46, 382345)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 46, 382345)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 46, 382345)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 46, 382345)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 47, 600275)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 47, 600275)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 46, 433770)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 46, 433770)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 46, 433770)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 8, 16, 14, 46, 463107)), + ), + ] diff --git a/panel/migrations/0684_auto_20251213_1632.py b/panel/migrations/0684_auto_20251213_1632.py new file mode 100644 index 0000000..0d58ede --- /dev/null +++ b/panel/migrations/0684_auto_20251213_1632.py @@ -0,0 +1,197 @@ +# Generated by Django 3.2.13 on 2025-12-13 16:32 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0079_auto_20251213_1632'), + ('panel', '0683_auto_20251208_1617'), + ] + + operations = [ + migrations.AddField( + model_name='posdevicesession', + name='pos_unique_id', + field=models.CharField(max_length=6, null=True, unique=True), + ), + migrations.AddField( + model_name='posmachine', + name='current_user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='current_pos', to='authentication.systemuserprofile'), + ), + migrations.AddField( + model_name='posmachine', + name='ip', + field=models.CharField(default='0.0.0.0', max_length=15), + ), + migrations.AddField( + model_name='posmachine', + name='mac', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='posmachine', + name='name', + field=models.TextField(default=''), + ), + migrations.AddField( + model_name='posmachine', + name='owner', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='owned_pos', to='authentication.systemuserprofile'), + ), + migrations.AddField( + model_name='posmachine', + name='pos_unique_id', + field=models.CharField(max_length=6, null=True, unique=True), + ), + migrations.AddField( + model_name='posmachine', + name='sdk', + field=models.TextField(default=''), + ), + migrations.AddField( + model_name='posmachine', + name='version', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='chicken_age', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='poultrysciencereport', + name='report_id', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='steward', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_user', to='authentication.systemuserprofile'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 869998)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 809478)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 809478)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 809478)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 809478)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 944867)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 944867)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 812470)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 812470)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 812470)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 13, 16, 31, 59, 825057)), + ), + migrations.CreateModel( + name='Representative', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('first_name', models.CharField(max_length=200, null=True)), + ('last_name', models.CharField(max_length=200, null=True)), + ('mobile', models.CharField(max_length=15, null=True)), + ('city', models.CharField(max_length=100, null=True)), + ('Kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_representative', to='panel.killhouse')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='representative_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='representative_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_representative', to='panel.steward')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='POSAuditLog', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('action', models.CharField(choices=[('CHANGE_OWNER', 'تغییر مالک'), ('CHANGE_CURRENT_USER', 'تغییر توزیع کننده'), ('CHANGE_CURRENT_REPRESENTATIVE', 'تغییر نماینده'), ('ACCESSLEVEL_UPDATE', 'بروزرسانی سطح دسترسی')], max_length=50)), + ('old_value', models.JSONField(blank=True, null=True)), + ('new_value', models.JSONField(blank=True, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('description', models.TextField(blank=True, null=True)), + ('performed_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ('pos', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='audit_logs', to='panel.posmachine')), + ], + ), + migrations.CreateModel( + name='POSAccessLevel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=100, null=True)), + ('in_province_sale', models.BooleanField(default=True)), + ('out_province_sale', models.BooleanField(default=True)), + ('cutting', models.BooleanField(default=True)), + ('freezing', models.BooleanField(default=True)), + ('warehouse', models.BooleanField(default=True)), + ('retail', models.BooleanField(default=True)), + ('active', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posaccesslevel_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='posaccesslevel_modifiedby', to=settings.AUTH_USER_MODEL)), + ('pos', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='access_levels', to='panel.posmachine')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='posmachine', + name='current_representative', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='representative_pos', to='panel.representative'), + ), + ] diff --git a/panel/migrations/0685_auto_20251214_1635.py b/panel/migrations/0685_auto_20251214_1635.py new file mode 100644 index 0000000..49b33e1 --- /dev/null +++ b/panel/migrations/0685_auto_20251214_1635.py @@ -0,0 +1,80 @@ +# Generated by Django 3.2.13 on 2025-12-14 16:35 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0080_auto_20251214_1635'), + ('panel', '0684_auto_20251213_1632'), + ] + + operations = [ + migrations.RemoveField( + model_name='posauditlog', + name='performed_by', + ), + migrations.AddField( + model_name='posauditlog', + name='performed', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='authentication.systemuserprofile'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 831099)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 765958)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 765958)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 765958)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 765958)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 912737)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 912737)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 769316)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 769316)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 769316)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 14, 16, 35, 24, 782910)), + ), + ] diff --git a/panel/migrations/0686_auto_20251215_1654.py b/panel/migrations/0686_auto_20251215_1654.py new file mode 100644 index 0000000..a142325 --- /dev/null +++ b/panel/migrations/0686_auto_20251215_1654.py @@ -0,0 +1,117 @@ +# Generated by Django 3.2.13 on 2025-12-15 16:54 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0685_auto_20251214_1635'), + ] + + operations = [ + migrations.AddField( + model_name='dispenser', + name='in_use', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='dispenser', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_steward', to='panel.steward'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 644176)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 579426)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 579426)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 579426)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 579426)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 726839)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 726839)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 583940)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 582932)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 582932)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 15, 16, 54, 28, 596473)), + ), + migrations.CreateModel( + name='DispenserInformation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('fullname', models.CharField(max_length=200, null=True)), + ('national_id', models.CharField(max_length=200, null=True)), + ('first_name', models.CharField(max_length=200, null=True)), + ('last_name', models.CharField(max_length=200, null=True)), + ('mobile', models.CharField(max_length=11, null=True)), + ('city', models.CharField(max_length=300, null=True)), + ('province', models.CharField(max_length=300, null=True)), + ('active', models.BooleanField(default=True)), + ('limitation', models.BooleanField(default=False)), + ('free_limitation', models.BooleanField(default=False)), + ('governmental_limitation', models.BooleanField(default=False)), + ('governmental_limitation_weight', models.FloatField(default=0)), + ('free_limitation_weight', models.FloatField(default=0)), + ('total_selling_warehouse_governmental_weight', models.FloatField(default=0)), + ('total_selling_warehouse_free_weight', models.FloatField(default=0)), + ('total_selling_warehouse_weight', models.FloatField(default=0)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenserinformation_createdby', to=settings.AUTH_USER_MODEL)), + ('dispenser', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_info_user', to='panel.dispenser')), + ('kill_house', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_info_kill_house', to='panel.killhouse')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenserinformation_modifiedby', to=settings.AUTH_USER_MODEL)), + ('steward', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispenser_info_steward', to='panel.steward')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/panel/migrations/0687_auto_20251216_1653.py b/panel/migrations/0687_auto_20251216_1653.py new file mode 100644 index 0000000..e2e15d1 --- /dev/null +++ b/panel/migrations/0687_auto_20251216_1653.py @@ -0,0 +1,147 @@ +# Generated by Django 3.2.13 on 2025-12-16 16:53 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('panel', '0686_auto_20251215_1654'), + ] + + operations = [ + migrations.RemoveField( + model_name='representative', + name='Kill_house', + ), + migrations.AddField( + model_name='representative', + name='active', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='representative', + name='free_limitation', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='representative', + name='free_limitation_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='representative', + name='governmental_limitation', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='representative', + name='governmental_limitation_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='representative', + name='kill_house', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='kill_house_representative', to='panel.killhouse'), + ), + migrations.AddField( + model_name='representative', + name='limitation', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='representative', + name='total_selling_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='representative', + name='total_selling_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='representative', + name='total_selling_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='city', + field=models.CharField(max_length=100, null=True), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 840150)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 779153)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 779153)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 779153)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 779153)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 920246)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 920246)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 782902)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 782902)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 782902)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 16, 16, 52, 47, 794666)), + ), + migrations.CreateModel( + name='RequestLog', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('method', models.CharField(max_length=10)), + ('path', models.TextField()), + ('query_params', models.JSONField(blank=True, null=True)), + ('body', models.JSONField(blank=True, null=True)), + ('headers', models.JSONField(blank=True, null=True)), + ('status_code', models.PositiveIntegerField(null=True)), + ('ip_address', models.GenericIPAddressField(blank=True, null=True)), + ('duration', models.FloatField(help_text='Request duration in seconds')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/panel/migrations/0688_auto_20251217_1648.py b/panel/migrations/0688_auto_20251217_1648.py new file mode 100644 index 0000000..5f55dbe --- /dev/null +++ b/panel/migrations/0688_auto_20251217_1648.py @@ -0,0 +1,436 @@ +# Generated by Django 3.2.13 on 2025-12-17 16:48 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0081_auto_20251217_1648'), + ('panel', '0687_auto_20251216_1653'), + ] + + operations = [ + migrations.AddField( + model_name='killhousefreebarinformation', + name='dispenser', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_dispenser', to='panel.dispenser'), + ), + migrations.AddField( + model_name='killhousefreebarinformation', + name='representative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_representative', to='panel.representative'), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='dispenser', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_dispenser', to='panel.dispenser'), + ), + migrations.AddField( + model_name='killhousefreesalebarinformation', + name='representative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_representative', to='panel.representative'), + ), + migrations.AddField( + model_name='otherproducts', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='other_products_steward', to='panel.steward'), + ), + migrations.AddField( + model_name='posmachine', + name='current_dispenser', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='current_dispenser_pos', to='authentication.systemuserprofile'), + ), + migrations.AddField( + model_name='possegmentation', + name='dispenser', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='segmentation_dispenser', to='panel.dispenser'), + ), + migrations.AddField( + model_name='possegmentation', + name='representative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='segmentation_representative', to='panel.representative'), + ), + migrations.AddField( + model_name='possegmentation', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_segmentation', to='panel.steward'), + ), + migrations.AddField( + model_name='possegmentation', + name='to_steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='to_steward_segmentation', to='panel.steward'), + ), + migrations.AddField( + model_name='rolesproducts', + name='steward', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='roles_products_steward', to='panel.steward'), + ), + migrations.AddField( + model_name='steward', + name='cold_house_free_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='cold_house_governmental_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='free_sale_form_governmental_quota', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='steward', + name='free_sale_from_free_quota_in_province', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='steward', + name='free_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='steward', + name='governmental_selling_permission', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='steward', + name='in_province_free_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='in_province_governmental_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='out_province_free_buying_commitment_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='out_province_free_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='pos_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='pos_free_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='pos_governmental_allocated_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='segmentation_free_selling_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='segmentation_governmental_percent', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_cold_house_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_cold_house_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_cold_house_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_cold_house_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_cold_house_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_segmentation_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_segmentation_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_selling_in_province_free_remain_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_selling_in_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_selling_in_province_governmental_remain_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_selling_in_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_selling_out_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_commitment_selling_out_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_in_province_free_bars_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_in_province_free_bars_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_in_province_governmental_bars_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_in_province_governmental_bars_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_input_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_input_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_input_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_out_province_buying_bars_commitment_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_out_province_buying_bars_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_remain_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_remain_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_remain_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_segmentation_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_segmentation_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_segmentation_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_selling_in_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_selling_in_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_selling_out_province_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_selling_out_province_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_selling_warehouse_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_selling_warehouse_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='total_selling_warehouse_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='ware_house_archive_free_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='ware_house_archive_governmental_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='steward', + name='ware_house_archive_weight', + field=models.FloatField(default=0), + ), + migrations.AddField( + model_name='stewardallocation', + name='representative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='allocation_representative', to='panel.representative'), + ), + migrations.AddField( + model_name='stewardfreebarinformation', + name='dispenser', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_steward_dispenser', to='panel.dispenser'), + ), + migrations.AddField( + model_name='stewardfreebarinformation', + name='representative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_steward_representative', to='panel.representative'), + ), + migrations.AddField( + model_name='stewardfreebarinformation', + name='stewards', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_bar_info_stewards', to='panel.steward'), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='dispenser', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_free_sale_bar_info_dispenser', to='panel.dispenser'), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='representative', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='steward_free_sale_bar_info_representative', to='panel.representative'), + ), + migrations.AddField( + model_name='stewardfreesalebarinformation', + name='stewards', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='free_sale_bar_info_stewards', to='panel.steward'), + ), + migrations.AlterField( + model_name='functionexecutor', + name='compare_time', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 528740)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='assignment_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 466244)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='city_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 465252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='kill_house_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 465252)), + ), + migrations.AlterField( + model_name='operatorlasttimeenter', + name='province_operator_last_time_check', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 465252)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_create_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 612049)), + ), + migrations.AlterField( + model_name='posdevicesession', + name='session_last_seen_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 612049)), + ), + migrations.AlterField( + model_name='poultry', + name='date_of_register', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 469757)), + ), + migrations.AlterField( + model_name='poultry', + name='hatching_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 469757)), + ), + migrations.AlterField( + model_name='poultry', + name='last_party_date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 469757)), + ), + migrations.AlterField( + model_name='totalpoultryrequestquantity', + name='date', + field=models.DateTimeField(default=datetime.datetime(2025, 12, 17, 16, 47, 34, 481801)), + ), + ] diff --git a/panel/migrations/__init__.py b/panel/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/models.py b/panel/models.py new file mode 100644 index 0000000..c298e61 --- /dev/null +++ b/panel/models.py @@ -0,0 +1,7444 @@ +import random +import string +from datetime import datetime, timedelta + +from django.conf import settings +from django.contrib.auth.models import User, Group +from django.db import models +from django.utils import timezone +from jdatetime import time + +from LiveStock.models import Cooperative, LiveStockRolseProduct +from authentication.models import ( + BaseModel, + Address, + UserProfile, + SystemAddress, + SystemUserProfile, + BankCard, + Province, ExternalTransaction +) +from authentication.models import UserMessage +from general_urls import base_user_gate_way_id +from notification.models import Notification +# from .KillHouse.views import KillHouseComplaintViewSet +from .ReportingPanel.models import SearchFields + + +class CheckState(BaseModel): + poultry_request = models.ForeignKey( + 'PoultryRequest', + on_delete=models.CASCADE, + null=True, + related_name="poultry_request" + ) + notification = models.ForeignKey( + Notification, + on_delete=models.CASCADE, + null=True, + related_name="check_notification" + ) + user_message = models.ForeignKey( + UserMessage, + on_delete=models.CASCADE, + null=True, + related_name="message_check" + ) + city_operator_check = models.ForeignKey( + 'CityOperatorCheckRequest', + on_delete=models.CASCADE, + null=True, + related_name="city_operator_check_state" + ) + province_operator_check = models.ForeignKey( + 'ProvinceCheckOperatorRequest', + on_delete=models.CASCADE, + null=True, + related_name='province_operator_check_state' + ) + state = models.BooleanField(default=False) + city_state = models.BooleanField(default=False) + city_state_notification = models.BooleanField(default=False) + city_state_modal = models.BooleanField(default=False) + city_state_sms = models.BooleanField(default=False) + province_state = models.BooleanField(default=False) + province_state_notification = models.BooleanField(default=False) + province_state_modal = models.BooleanField(default=False) + province_state_sms = models.BooleanField(default=False) + kill_house_state_notification = models.BooleanField(default=False) + kill_house_state_modal = models.BooleanField(default=False) + kill_house_state_sms = models.BooleanField(default=False) + assignment_state_notification = models.BooleanField(default=False) + assignment_state_modal = models.BooleanField(default=False) + assignment_state_sms = models.BooleanField(default=False) + main_check = models.CharField(max_length=50, null=True) + + +class Wallet(BaseModel): + inventory = models.FloatField(default=0) + state = models.CharField(max_length=120, default='active') + province_name = models.CharField(max_length=50, null=True) + id_number = models.IntegerField(default=1) + + def save(self, *args, **kwargs): + super(Wallet, self).save(*args, **kwargs) + + +class OperatorLastTimeEnter(BaseModel): + city_operator_last_time_check = models.DateTimeField(default=datetime.now()) + province_operator_last_time_check = models.DateTimeField(default=datetime.now()) + kill_house_last_time_check = models.DateTimeField(default=datetime.now()) + assignment_last_time_check = models.DateTimeField(default=datetime.now()) + operator = models.ForeignKey( + UserProfile, + on_delete=models.CASCADE, + null=True, + related_name="operator_last_time_check" + ) + + +# مدل مربوط به قیمت گذاری +class Pricing(BaseModel): + # price = models.FloatField(null=True) + operator = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + null=True, + related_name="pricing_operator" + ) + date = models.DateTimeField(null=True) + live_chicken_price = models.FloatField(null=True) + dead_chicken_price = models.FloatField(null=True) + major_seller_price = models.FloatField(null=True) + retail_seller_price = models.FloatField(null=True) + floor_price = models.FloatField(null=True) + ceiling_price = models.FloatField(null=True) + role = models.CharField(max_length=20, null=True) + lock = models.BooleanField(default=False) + pricing_id_key = models.IntegerField(null=True) + operator_id_foreign_key = models.IntegerField(null=True) + + # partial_seller_price = models.FloatField(null=True) + + def save(self, *args, **kwargs): + super(Pricing, self).save(*args, **kwargs) + + +class ChainCompany(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="chain_company_user", + null=True + ) + + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="chain_company_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="chain_company_wallet", + null=True + ) + name = models.CharField(max_length=200, null=True) + city = models.CharField(max_length=200, null=True) + province = models.CharField(max_length=200, null=True) + postal_code = models.CharField(max_length=200, null=True) + address = models.TextField(null=True) + + def save(self, *args, **kwargs): + super(ChainCompany, self).save(*args, **kwargs) + + +class ChainCompanyTransaction(BaseModel): + chain_company = models.ForeignKey( + ChainCompany, + on_delete=models.CASCADE, + related_name="transaction_chain_company", + null=True + ) + amount = models.BigIntegerField(default=0) + amount_with_tax = models.BigIntegerField(default=0) + transaction = models.IntegerField(null=True) + state = models.CharField(max_length=20, default='pending') + union_share = models.BigIntegerField(default=0) + company_share = models.BigIntegerField(default=0) + guilds_share = models.BigIntegerField(default=0) + city_share = models.BigIntegerField(default=0) + wallet_share = models.BigIntegerField(default=0) + other_share = models.BigIntegerField(default=0) + pay_type = models.CharField(max_length=200, null=True) + saleReferenceId = models.CharField(max_length=100, null=True) + refId = models.CharField(max_length=100, null=True) + orderId = models.CharField(max_length=100, null=True) + cardHolderPan = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ChainCompanyTransaction, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت مرغدار +class Poultry(BaseModel): + owner = models.ForeignKey( + 'self', + null=True, + blank=True, + related_name='poultry_owner', + on_delete=models.CASCADE + ) + owner_id_foreign_key = models.IntegerField(null=True) + + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="poultry_user", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="poultry_system_address", + null=True + ) + + address_id_foreign_key = models.IntegerField(null=True) + + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="poultry_bank_info", + null=True + ) + + has_chain_company = models.BooleanField(default=False) + + user_bank_id_foreign_key = models.IntegerField(null=True) + city_operator = models.CharField(max_length=150, null=True) + unit_name = models.CharField(max_length=100, null=True) + password = models.CharField(max_length=100, null=True) + gis_code = models.CharField(max_length=30, null=True) + operating_licence_capacity = models.BigIntegerField(default=0) + number_of_halls = models.IntegerField(default=0) + tenant = models.BooleanField(default=False, null=True) + has_tenant = models.BooleanField(default=False, null=True) + person_type = models.CharField(max_length=10, null=True) + economic_code = models.CharField(max_length=30, null=True) + system_code = models.CharField(max_length=20, null=True) + epidemiological_code = models.CharField(max_length=20, null=True) + breeding_unique_id = models.CharField(max_length=20, null=True) + total_capacity = models.BigIntegerField(default=0) + licence_number = models.CharField(max_length=20, null=True) + health_certificate_number = models.CharField(max_length=20, null=True) + number_of_requests = models.BigIntegerField(default=0) + hatching_date = models.DateTimeField(default=timezone.now()) + last_party_date = models.DateTimeField(default=timezone.now()) + number_of_incubators = models.BigIntegerField(default=0) + herd_age_by_day = models.IntegerField(default=0) + herd_age_by_week = models.IntegerField(default=0) + number_of_party = models.IntegerField(default=0) + communication_type = models.CharField(max_length=30, null=True) + cooperative = models.CharField(max_length=50, null=True) + date_of_register = models.DateTimeField(default=timezone.now()) + unit_status = models.CharField(max_length=20, null=True) + active = models.BooleanField(default=True) + identity_documents = models.JSONField(null=True) + samasat_user_code = models.CharField(max_length=20, null=True) + base_order = models.BigIntegerField(null=True) + incubation_date = models.DateTimeField(null=True) + wallet_amount = models.BigIntegerField(default=0) + city = models.IntegerField(default=0) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="poultry_wallet", + null=True + ) + wallet_id_foreign_key = models.IntegerField(default=1) + + poultry_id_key = models.IntegerField(default=1) + Lat = models.FloatField(null=True) + Long = models.FloatField(null=True) + date = models.DateTimeField(null=True) + killing_ave_age = models.IntegerField(default=1) + active_left_over = models.IntegerField(default=0) + killing_ave_count = models.IntegerField(default=0) + killing_ave_weight = models.IntegerField(default=0) + killing_live_weight = models.IntegerField(default=0) + killing_carcasses_weight = models.IntegerField(default=0) + killing_loss_weight_percent = models.IntegerField(default=0) + real_killing_ave_weight = models.FloatField(default=0) + real_killing_live_weight = models.FloatField(default=0) + real_killing_carcasses_weight = models.FloatField(default=0) + real_killing_loss_weight_percent = models.FloatField(default=0) + interest_license_id = models.CharField(max_length=100, null=True) + order_limit = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(Poultry, self).save(*args, **kwargs) + + +# مدل مربوط به مستاجر مرغدار +class PoultryTenant(BaseModel): + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + related_name="poultry_tenant", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="poultry_tenant_bank_info", + null=True + ) + fullname = models.CharField(max_length=150, null=True) + first_name = models.CharField(max_length=200, null=True) + last_name = models.CharField(max_length=200, null=True) + natinal_id = models.CharField(max_length=10, null=True) + mobile = models.CharField(max_length=11, null=True, default="") + + def save(self, *args, **kwargs): + super(PoultryTenant, self).save(*args, **kwargs) + + +class PoultryAllowCityProvince(BaseModel): + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + related_name="poultry_allow", + null=True + ) + poultry_id_foreign_key = models.IntegerField(null=True) + poultry_allow_city_province_id_key = models.IntegerField(null=True) + city = models.BooleanField(default=False) + province = models.BooleanField(default=False) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(PoultryAllowCityProvince, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت جوجه ریزی مرغدار +class PoultryHatching(BaseModel): + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + related_name="poultry_hatching_user", + null=True + ) + chain_company = models.ForeignKey( + ChainCompany, + on_delete=models.CASCADE, + related_name="poultry_hatching_chain_company", + null=True + ) + has_chain_company = models.BooleanField(default=False) + poultry_id_foreign_key = models.IntegerField(null=True) + poultry_hatching_id_key = models.IntegerField(null=True) + quantity = models.BigIntegerField(default=0) + losses = models.BigIntegerField(default=0) + left_over = models.BigIntegerField(null=True) + killed_quantity = models.BigIntegerField(default=0) + extra_killed_quantity = models.BigIntegerField(default=0) + governmental_killed_quantity = models.FloatField(default=0) + governmental_quantity = models.FloatField(default=0) + free_killed_quantity = models.FloatField(default=0) + free_quantity = models.FloatField(default=0) + chain_killed_quantity = models.FloatField(default=0) + chain_killed_weight = models.FloatField(default=0) + out_province_killed_weight = models.FloatField(default=0) + out_province_killed_quantity = models.FloatField(default=0) + export_killed_weight = models.FloatField(default=0) + export_killed_quantity = models.FloatField(default=0) + total_commitment = models.FloatField(default=0) + commitment_type = models.CharField(max_length=20, default='govermental') + total_commitment_quantity = models.FloatField(default=0) + total_free_commitment_quantity = models.FloatField(default=0) + total_free_commitment_weight = models.FloatField(default=0) + total_killed_weight = models.FloatField(default=0) + total_average_killed_weight = models.FloatField(default=0) + request_left_over = models.BigIntegerField(default=0) + hall = models.IntegerField(default=0) + date = models.DateTimeField(null=True) + predicate_date = models.DateTimeField(null=True) + chicken_breed = models.CharField(max_length=200, null=True) + period = models.BigIntegerField(default=0, null=True) + allow_hatching = models.CharField(max_length=20, default='pending') + state = models.CharField(max_length=50, default="pending") + archive = models.BooleanField(default=False) + violation = models.BooleanField(default=False) + message = models.CharField(max_length=500, null=True) + registrar = models.JSONField(null=True) + breed = models.JSONField(null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + last_change = models.JSONField(null=True) + chicken_age = models.IntegerField(default=1) + now_age = models.IntegerField(default=1) + latest_hatching_change = models.JSONField(null=True) + violation_report = models.TextField(null=True) + violation_message = models.TextField(null=True) + violation_image = models.JSONField(null=True) + violation_reporter = models.CharField(max_length=200, null=True) + violation_report_date = models.DateTimeField(null=True) + violation_report_editor = models.CharField(max_length=200, null=True) + violation_report_edit_date = models.DateTimeField(null=True) + total_losses = models.BigIntegerField(default=0) + direct_losses = models.BigIntegerField(default=0) + direct_losses_inputer = models.CharField(max_length=200, null=True) + direct_losses_date = models.DateTimeField(null=True) + direct_losses_editor = models.CharField(max_length=200, null=True) + direct_losses_last_edit_date = models.DateTimeField(null=True) + end_period_losses_inputer = models.CharField(max_length=200, null=True) + end_period_losses_date = models.DateTimeField(null=True) + end_period_losses_editor = models.CharField(max_length=200, null=True) + end_period_losses_last_edit_date = models.DateTimeField(null=True) + breeding_unique_id = models.CharField(max_length=20, null=True) + licence_number = models.CharField(max_length=20, null=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + first_date_input_archive = models.DateTimeField(null=True) + second_date_input_archive = models.DateTimeField(null=True) + input_archiver = models.CharField(max_length=20, null=True) + output_archive_date = models.DateTimeField(null=True) + output_archiver = models.CharField(max_length=20, null=True) + bar_difference_request_weight = models.FloatField(default=0) + bar_difference_request_quantity = models.FloatField(default=0) + total_disease_losses = models.BigIntegerField(default=0) # مجموع تلفات ناشی از بیماری + total_flock_destruction = models.BigIntegerField(default=0) # مجموع معدوم‌سازی گله + total_normal_flock_losses = models.BigIntegerField(default=0) # مجموع تلفات عادی گله + total_force_majeure_losses = models.BigIntegerField(default=0) # مجموع تلفات ناشی از عوامل قهری و طبیعی + total_fire_losses = models.BigIntegerField(default=0) # مجموع تلفات ناشی از آتش‌سوزی + health_certificate = models.CharField(max_length=100, null=True) + samasat_discharge_percentage = models.IntegerField(default=0) + PersonTypeName = models.CharField(max_length=200, null=True, blank=True) + InteractTypeName = models.CharField(max_length=200, null=True, blank=True) + UnionTypeName = models.CharField(max_length=200, null=True, blank=True) + CertId = models.CharField(max_length=200, null=True, blank=True) + increase_quantity = models.IntegerField(default=0) + tenant_fullname = models.CharField(max_length=300, null=True, blank=True) + tenant_national_code = models.CharField(max_length=50, null=True, blank=True) + tenant_mobile = models.CharField(max_length=20, null=True, blank=True) + tenant_city = models.CharField(max_length=200, null=True, blank=True) + has_tenant = models.BooleanField(default=False) + archive_date = models.DateTimeField(null=True) + unknown = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + self.total_killed_weight = ( + (self.governmental_killed_quantity or 0) + + (self.free_killed_quantity or 0) + + (self.out_province_killed_weight or 0) + + (self.chain_killed_weight or 0) + + (self.export_killed_weight or 0) + + (self.bar_difference_request_weight or 0) + ) + + managed_losses_total = 0 + management_model = globals().get('HatchingLossManagement') + if management_model: + management = management_model.get_active() + else: + management = None + if management: + for management_field, loss_field in management_model.LOSS_FIELD_MAPPING.items(): + if getattr(management, management_field, False): + managed_losses_total += getattr(self, loss_field, 0) or 0 + + effective_losses = managed_losses_total if managed_losses_total else (self.losses or 0) + self.total_losses = effective_losses + (self.direct_losses or 0) + + self.killed_quantity = ( + (self.governmental_quantity or 0) + + (self.free_quantity or 0) + + (self.out_province_killed_quantity or 0) + + (self.chain_killed_quantity or 0) + + (self.export_killed_quantity or 0) + + (self.bar_difference_request_quantity or 0) + ) + self.total_average_killed_weight = round(self.total_killed_weight / self.killed_quantity, + 2) if self.killed_quantity > 0 else 0 + calculated_left_over = ( + (self.quantity or 0) + + (self.increase_quantity or 0) + - (self.killed_quantity or 0) + - (self.total_losses or 0) + ) + self.left_over = calculated_left_over if calculated_left_over > 0 else 0 + super(PoultryHatching, self).save(*args, **kwargs) + + +class EvacuationHatchingDetail(BaseModel): + # گزارشات تلفات جوجه ریزی + hatching = models.ForeignKey( + PoultryHatching, + on_delete=models.CASCADE, + related_name="evacuation_details", + null=True, + blank=True + ) + PartIdCode = models.CharField(max_length=200, null=True, blank=True) + RequestId = models.CharField(max_length=200, null=True, blank=True) + MoReportId = models.CharField(max_length=200, null=True, blank=True) + ReportType = models.IntegerField(null=True, blank=True) + ReportTypeString = models.CharField(max_length=255, null=True, blank=True) + ReportDate = models.CharField(max_length=200, null=True, blank=True) + ReportDateShamsi = models.CharField(max_length=200, null=True, blank=True) + MoReason = models.TextField(null=True, blank=True) + MoDate = models.CharField(max_length=200, null=True, blank=True) + MoDateShamsi = models.CharField(max_length=200, null=True, blank=True) + MoStartDay = models.IntegerField(null=True, blank=True) + MoEndDay = models.IntegerField(null=True, blank=True) + MoReportSubId = models.CharField(max_length=200, null=True, blank=True) + ReportStatus = models.IntegerField(null=True, blank=True) + GoodCount = models.IntegerField(null=True, blank=True) + Message = models.TextField(null=True, blank=True) + ErrorCode = models.IntegerField(null=True, blank=True) + IsDeleted = models.BooleanField(default=False) + RegDate = models.CharField(max_length=200, null=True, blank=True) + RegDateShamsi = models.CharField(max_length=200, null=True, blank=True) + RegDateShamsiWithTime = models.CharField(max_length=200, null=True, blank=True) + RegDateShamsiOnlyTime = models.CharField(max_length=200, null=True, blank=True) + ExternalId = models.CharField(max_length=200, null=True, blank=True) + StringId = models.CharField(max_length=200, null=True, blank=True) + IsPersisted = models.BooleanField(default=False) + AllowInsert = models.BooleanField(default=False) + AllowUpdate = models.BooleanField(default=False) + ModalCss = models.CharField(max_length=255, null=True, blank=True) + GridContainerParametersModel = models.CharField(max_length=255, null=True, blank=True) + MenuUserAccess = models.CharField(max_length=255, null=True, blank=True) + MenuUserAccessId = models.IntegerField(null=True, blank=True) + LogTableName = models.CharField(max_length=255, null=True, blank=True) + LogTableAlias = models.CharField(max_length=255, null=True, blank=True) + PageTitle = models.CharField(max_length=255, null=True, blank=True) + + def save(self, *args, **kwargs): + super(EvacuationHatchingDetail, self).save(*args, **kwargs) + + +class HatchingLossManagement(BaseModel): + include_total_disease_losses = models.BooleanField(default=False) + include_total_flock_destruction = models.BooleanField(default=False) + include_total_normal_flock_losses = models.BooleanField(default=False) + include_total_force_majeure_losses = models.BooleanField(default=False) + include_total_fire_losses = models.BooleanField(default=False) + + LOSS_FIELD_MAPPING = { + 'include_total_disease_losses': 'total_disease_losses', + 'include_total_flock_destruction': 'total_flock_destruction', + 'include_total_normal_flock_losses': 'total_normal_flock_losses', + 'include_total_force_majeure_losses': 'total_force_majeure_losses', + 'include_total_fire_losses': 'total_fire_losses', + } + + @classmethod + def get_active(cls): + return cls.objects.filter(trash=False).order_by('-modify_date').first() + + def as_dict(self): + return { + field: getattr(self, field, False) + for field in self.LOSS_FIELD_MAPPING.keys() + } + + +# مدل ثبت اپراتور شهرستان +class CityOperator(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="city_operator_user", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + city_operator_id_key = models.IntegerField(null=True) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="city_system_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="city_operator_bank_info", + null=True + ) + wallet_amount = models.BigIntegerField(default=0) + identity_documents = models.JSONField(null=True) + phone = models.CharField(max_length=20, null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="city_wallet", + null=True + ) + unit_name = models.CharField(max_length=50, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(CityOperator, self).save(*args, **kwargs) + + +class OutProvincePoultryRequestBuyer(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="out_province_poultry_user", + null=True + ) + + type = models.CharField(max_length=100, null=True) + fullname = models.CharField(max_length=300, null=True) + mobile = models.CharField(max_length=11, null=True) + unit_name = models.CharField(max_length=300, null=True) + city = models.CharField(max_length=300, null=True) + province = models.CharField(max_length=300, null=True) + kill_house_unique_id = models.CharField(max_length=100, null=True) + active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(OutProvincePoultryRequestBuyer, self).save(*args, **kwargs) + + +class Vet(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + null=True, + related_name="user_profile_vet" + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="vet_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="vet_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="vet_wallet", + null=True + ) + + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + vet_id_key = models.IntegerField(null=True) + + wallet_amount = models.BigIntegerField(default=0) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(Vet, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت درخواست مرغدار +class PoultryRequest(BaseModel): + user = models.ForeignKey( + UserProfile, + on_delete=models.CASCADE, + related_name="poultry_request", + null=True + ) + city_operator = models.ForeignKey( + CityOperator, + on_delete=models.CASCADE, + related_name="poultry_request_city_operator", + null=True + ) + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + related_name="poultry_request_poultry", + null=True + ) + hatching = models.ForeignKey( + PoultryHatching, + on_delete=models.CASCADE, + related_name="poultry_request_hatching", + null=True + ) + out_province_poultry_request_buyer = models.ForeignKey( + OutProvincePoultryRequestBuyer, + on_delete=models.CASCADE, + related_name="poultry_request_hatching", + null=True + ) + vet_farm = models.ForeignKey( + Vet, + on_delete=models.CASCADE, + related_name="vet_poultry_request", + null=True + ) + city_operator_id_foreign_key = models.IntegerField(null=True) + poultry_id_foreign_key = models.IntegerField(null=True) + poultry_hatching_id_foreign_key = models.IntegerField(null=True) + poultry_request_id_key = models.IntegerField(null=True) + quantity = models.BigIntegerField(default=0) + previous_quantity = models.BigIntegerField(default=0) + remain_quantity = models.BigIntegerField(default=0) + first_quantity = models.BigIntegerField(default=0) + losses = models.BigIntegerField(default=0) + send_date = models.DateTimeField(null=True) + chicken_breed = models.CharField(max_length=200, null=True) + financial_operation = models.CharField(max_length=100, null=True) + Index_weight = models.FloatField(null=True) + amount = models.FloatField(default=0) + state = models.JSONField(default=dict, null=True) + state_process = models.CharField(max_length=50, default="pending") + province_state = models.CharField(max_length=50, default="pending") + order_code = models.BigIntegerField(null=True) + general_order_code = models.BigIntegerField(null=True) + message = models.CharField(max_length=500, null=True) + inspector = models.CharField(max_length=30, null=True) + union = models.BooleanField(default=False) + awaiting_payment = models.BooleanField(default=False) + assignment = models.BooleanField(default=False) + auction = models.BooleanField(default=False) + fee = models.FloatField(default=0) + final_state = models.CharField(max_length=50, default="pending") + cell_type = models.JSONField(default=dict, null=True) + kill_house_list = models.JSONField(null=True) + registrar = models.JSONField(null=True) + buyer = models.JSONField(null=True) + out = models.BooleanField(default=False) + export = models.BooleanField(default=False) + free_sale_in_province = models.BooleanField(default=False) + vet = models.BooleanField(default=False) + archive = models.BooleanField(default=False) + direct_buying = models.BooleanField(default=False) + direct_buying_kill_place = models.CharField(max_length=100, null=True) + direct_buying_buyer_info = models.JSONField(null=True) + selling_without_city = models.BooleanField(default=False) + # clearance_code = models.BigIntegerField(null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + quarantine_code = models.CharField(max_length=200, null=True) + quarantine_quantity = models.IntegerField(default=0) + quarantine_code_registrar = models.JSONField(null=True) + + out_province_driver_info = models.JSONField(null=True) + out_province_request_canceller = models.JSONField(null=True) + out_province_request_cancel = models.BooleanField(default=False) + freezing = models.BooleanField(default=False) + approved_price = models.BooleanField(default=False) + wage = models.FloatField(default=0) + total_wage_amount = models.BigIntegerField(default=0) + union_share = models.BigIntegerField(default=0) + union_share_percent = models.FloatField(default=0) + company_share = models.BigIntegerField(default=0) + company_share_percent = models.FloatField(default=0) + guilds_share = models.BigIntegerField(default=0) + guilds_share_percent = models.FloatField(default=0) + city_share = models.BigIntegerField(default=0) + city_share_percent = models.FloatField(default=0) + wallet_share = models.BigIntegerField(default=0) + wallet_share_percent = models.FloatField(default=0) + other_share = models.BigIntegerField(default=0) + other_share_percent = models.FloatField(default=0) + archive_wage = models.BooleanField(default=False) + wage_pay = models.BooleanField(default=False) + has_wage = models.BooleanField(default=False) + sms = models.BooleanField(default=False) + payer_type = models.CharField(max_length=20, null=True) + buyer_mobile = models.CharField(max_length=11, null=True) + buyer_fullname = models.CharField(max_length=200, null=True) + buyer_city = models.CharField(max_length=200, null=True) + buyer_province = models.CharField(max_length=200, null=True) + payer_fullname = models.CharField(max_length=200, null=True) + agent = models.JSONField(null=True) + hatching_left_over = models.IntegerField(default=0) + killing_age = models.IntegerField(default=1) + killer_kill_house_unit_name = models.CharField(max_length=300, null=True) + killer_kill_house_city = models.CharField(max_length=300, null=True) + killer_kill_house_province = models.CharField(max_length=300, null=True) + kill_house_unique_id = models.CharField(max_length=100, null=True) + payment_link = models.CharField(max_length=300, null=True) + interface_number = models.CharField(max_length=11, null=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + price_confirmation = models.BooleanField(default=False) + price_confirmation_code = models.CharField(max_length=10, null=True) + input_price_confirmation_code = models.CharField(max_length=10, null=True) + fine = models.BooleanField(default=False) + fine_amount = models.BigIntegerField(default=0) + fine_coefficient = models.FloatField(default=0) + market = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(PoultryRequest, self).save(*args, **kwargs) + + +class PoultryRequestQuarantineCode(BaseModel): + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="poultry_request_code", + null=True + ) + quarantine_code = models.CharField(max_length=200, null=True) + traffic_code = models.CharField(max_length=200, null=True) + registrar = models.CharField(max_length=200, null=True) + register_date = models.DateTimeField(null=True) + quarantine_quantity = models.IntegerField(default=0) + system_quarantine_quantity = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(PoultryRequestQuarantineCode, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت درخواست مرغدار +class TotalPoultryRequestQuantity(BaseModel): + quantity = models.BigIntegerField(default=0) + accepted_quantity = models.BigIntegerField(default=0) + returned_quantity = models.BigIntegerField(default=0) + first_quantity = models.BigIntegerField(default=0) + city_accepted_quantity = models.BigIntegerField(default=0) + allocated_quantity = models.BigIntegerField(default=0) + direct_buying_quantity = models.BigIntegerField(default=0) + number_of_poultry = models.BigIntegerField(default=0) + rejected_quantity = models.BigIntegerField(default=0) + waiting_quantity = models.BigIntegerField(default=0) + number_of_kill_house = models.BigIntegerField(default=0) + input_quantity = models.BigIntegerField(default=0) + assignableQuantity = models.BigIntegerField(default=0) + kill_requests_quantity = models.BigIntegerField(default=0) + date = models.DateTimeField(default=datetime.now()) + age_up_45 = models.BigIntegerField(default=0, null=True) + total_poultry_request_quantity_id_key = models.IntegerField(null=True) + + def save(self, *args, **kwargs): + super(TotalPoultryRequestQuantity, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت درخواست مزایده مرغدار +class PoultryRequestAuction(BaseModel): + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="poultry_request_auction", + null=True) + pricing = models.ForeignKey( + Pricing, + on_delete=models.CASCADE, + related_name="poultry_request_auction_pricing", + null=True + ) + fee = models.FloatField(default=0, null=True) + hour = models.CharField(max_length=10, null=True) + auction_date = models.DateTimeField(null=True) + state = models.CharField(max_length=10, default='inactive') + + def save(self, *args, **kwargs): + super(PoultryRequestAuction, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت درخواست بورسی مرغدار +class PoultryRequestExchange(BaseModel): + user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name="poultry_request_exchange", null=True) + quantity = models.BigIntegerField(default=0, null=True) + send_date = models.DateTimeField(null=True) + hatching_date = models.DateTimeField(null=True) + chicken_breed = models.CharField(max_length=20, null=True) + Index_weight = models.FloatField(null=True) + fee = models.FloatField(null=True) + order_code = models.IntegerField(null=True) + longitude = models.FloatField(default=0) + latitude = models.FloatField(default=0) + address = models.TextField() + age = models.IntegerField(default=0, null=True) + inspector = models.CharField(max_length=30, null=True) + state = models.CharField(max_length=15, default='pending') + + def save(self, *args, **kwargs): + super(PoultryRequestExchange, self).save(*args, **kwargs) + + +# مدل ثبت اپراتور کشتارگاه +class KillHouseOperator(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="kill_house_operator_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="kill_house_system_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="kill_house_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="kill_house_wallet", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + kill_house_operator_id_key = models.IntegerField(null=True) + wallet_amount = models.BigIntegerField(default=0) + killer = models.BooleanField(default=False) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillHouseOperator, self).save(*args, **kwargs) + + +class Car(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="user_car", + null=True + ) + driver_name = models.CharField(max_length=500, null=True) + driver_mobile = models.CharField(max_length=11, null=True) + type_car = models.CharField(max_length=50, null=True) + type = models.CharField(max_length=50, null=True) + transport_type = models.CharField(max_length=50, null=True) + pelak = models.CharField(max_length=200, null=True) + capocity = models.CharField(max_length=50, null=True) + weight_without_load = models.CharField(max_length=50, null=True) + health_code = models.CharField(max_length=100, null=True) + status = models.CharField(max_length=50, default="inactive") + active = models.BooleanField(default=True) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="car_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="car_wallet", + null=True + ) + wallet_amount = models.BigIntegerField(default=0) + identity_documents = models.JSONField(null=True) + phone = models.CharField(max_length=20, null=True) + registrar = models.JSONField(null=True) + active_state = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(Car, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت کشتارگاه +class KillHouse(BaseModel): + user = models.ForeignKey( + UserProfile, + on_delete=models.CASCADE, + related_name="user_killhouse", + null=True) + userprofile = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + null=True, + related_name="system_user_kill_house" + ) + address = models.ForeignKey( + Address, + on_delete=models.CASCADE, + related_name="killhouse_address", + null=True) + system_address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="killhouse_system_address", + null=True) + kill_house_operator = models.ForeignKey( + KillHouseOperator, + on_delete=models.CASCADE, + related_name="system_kill_house_operator", + null=True) + + cars = models.ManyToManyField( + Car, + related_name='kill_house_car', + null=True, blank=True) + + system_address_id_foreign_key = models.IntegerField(null=True) + kill_house_operator_id_foreign_key = models.IntegerField(null=True) + kill_house_id_key = models.IntegerField(null=True) + shift_work_from = models.CharField(max_length=50, null=True) + shift_work_to = models.CharField(max_length=50, null=True) + name = models.CharField(max_length=50, null=True) + car = models.JSONField(default=dict, null=True) + capacity = models.FloatField(default=0) + killing_race = models.CharField(max_length=20, null=True) + phone = models.CharField(max_length=20, null=True) + alternate_number = models.CharField(max_length=20, null=True) + killer = models.BooleanField(default=False) + wallet_amount = models.BigIntegerField(default=0) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + type = models.CharField(max_length=100, default='public') + out_province = models.BooleanField(default=False) + has_pos = models.BooleanField(default=False) + show_exclusive = models.BooleanField(default=True) + company_gateway_percent = models.IntegerField(default=0) + union_gateway_percent = models.IntegerField(default=0) + guilds_gateway_percent = models.IntegerField(default=0) + other_gateway_percent = models.IntegerField(default=0) + total_kill_capacity = models.FloatField(default=0) + total_kill_capacity_percent = models.FloatField(default=0) + extra_bar_kill_percent = models.FloatField(default=0) + max_kill_limit = models.BooleanField(default=False) + off = models.BigIntegerField(default=0) + unique_identifier = models.CharField(max_length=20, null=True) + share_debt_counting_wage = models.BooleanField(default=False) + out_province_selling_limitation = models.BooleanField(default=False) + out_province_selling_limitation_percent = models.IntegerField(default=0) + in_province_selling_limitation = models.BooleanField(default=False) + in_province_selling_limitation_percent = models.IntegerField(default=0) + market_buying = models.BooleanField(default=False) + market_buying_limitation = models.BooleanField(default=False) + market_buying_capacity_percent_status = models.BooleanField(default=False) + market_capacity_percent = models.FloatField(default=0) + market_light_capacity = models.BooleanField(default=False) + market_light_capacity_percent = models.FloatField(default=0) + poultry_payment_limitation = models.BooleanField(default=False) + quota = models.BooleanField(default=False) + quota_max_kill_limit = models.BooleanField(default=False) + quota_request = models.BooleanField(default=False) + quota_custom = models.BooleanField(default=False) + free_quota = models.FloatField(default=0) + governmental_quota = models.FloatField(default=0) + quota_custom_quantity = models.FloatField(default=0) + out_province_governmental_selling_percent = models.FloatField(default=0) + out_province_free_selling_percent = models.FloatField(default=0) + out_province_free_buying_commitment_percent = models.FloatField(default=0) + in_province_governmental_selling_percent = models.FloatField(default=0) + in_province_free_selling_percent = models.FloatField(default=0) + segmentation_governmental_percent = models.FloatField(default=0) + segmentation_free_selling_percent = models.FloatField(default=0) + cold_house_governmental_percent = models.FloatField(default=0) + cold_house_free_percent = models.FloatField(default=0) + governmental_selling_permission = models.BooleanField(default=False) + free_selling_permission = models.BooleanField(default=False) + free_sale_form_governmental_quota = models.BooleanField(default=False) + free_sale_from_free_quota_in_province = models.BooleanField(default=False) + total_input_warehouse_weight = models.FloatField(default=0) + total_input_warehouse_governmental_weight = models.FloatField(default=0) + total_input_warehouse_free_weight = models.FloatField(default=0) + total_selling_warehouse_governmental_weight = models.FloatField(default=0) + total_selling_warehouse_free_weight = models.FloatField(default=0) + total_remain_warehouse_governmental_weight = models.FloatField(default=0) + total_remain_warehouse_free_weight = models.FloatField(default=0) + total_remain_warehouse_weight = models.FloatField(default=0) + total_selling_in_province_governmental_weight = models.FloatField(default=0) + total_selling_in_province_free_weight = models.FloatField(default=0) + total_selling_out_province_governmental_weight = models.FloatField(default=0) + total_selling_out_province_free_weight = models.FloatField(default=0) + total_segmentation_governmental_weight = models.FloatField(default=0) + total_segmentation_free_weight = models.FloatField(default=0) + total_in_province_governmental_bars_weight = models.FloatField(default=0) + total_in_province_free_bars_weight = models.FloatField(default=0) + total_out_province_buying_bars_weight = models.FloatField(default=0) + pos_allocated_weight = models.FloatField(default=0) + pos_governmental_allocated_weight = models.FloatField(default=0) + pos_free_allocated_weight = models.FloatField(default=0) + total_selling_warehouse_weight = models.FloatField(default=0) + total_segmentation_weight = models.FloatField(default=0) + total_cold_house_weight = models.FloatField(default=0) + total_cold_house_governmental_weight = models.FloatField(default=0) + total_cold_house_free_weight = models.FloatField(default=0) + ware_house_archive_weight = models.FloatField(default=0) + ware_house_archive_governmental_weight = models.FloatField(default=0) + ware_house_archive_free_weight = models.FloatField(default=0) + total_commitment_governmental_weight = models.FloatField(default=0) + total_commitment_free_weight = models.FloatField(default=0) + total_in_province_governmental_bars_commitment_weight = models.FloatField(default=0) + total_in_province_free_bars_commitment_weight = models.FloatField(default=0) + total_out_province_buying_bars_commitment_weight = models.FloatField(default=0) + total_commitment_selling_in_province_governmental_weight = models.FloatField(default=0) + total_commitment_selling_in_province_free_weight = models.FloatField(default=0) + total_commitment_selling_in_province_governmental_remain_weight = models.FloatField(default=0) + total_commitment_selling_in_province_free_remain_weight = models.FloatField(default=0) + total_commitment_selling_out_province_governmental_weight = models.FloatField(default=0) + total_commitment_selling_out_province_free_weight = models.FloatField(default=0) + total_commitment_cold_house_governmental_weight = models.FloatField(default=0) + total_commitment_cold_house_free_weight = models.FloatField(default=0) + total_commitment_segmentation_governmental_weight = models.FloatField(default=0) + total_commitment_segmentation_free_weight = models.FloatField(default=0) + maximum_load_volume_increase = models.FloatField(default=0) + maximum_load_volume_reduction = models.FloatField(default=0) + ware_house_remaining_percent_limitation = models.FloatField(default=0) + ware_house_remaining_percent_limitation_status = models.BooleanField(default=False) + ware_house_remaining_weight_limitation = models.FloatField(default=0) + ware_house_remaining_weight_limitation_status = models.BooleanField(default=False) + ware_house_remaining_weight_archive_percent = models.FloatField(default=0) + + def save(self, *args, **kwargs): + self.total_segmentation_weight = self.total_segmentation_governmental_weight + self.total_segmentation_free_weight + self.total_cold_house_weight = self.total_cold_house_governmental_weight + self.total_cold_house_free_weight + self.total_input_warehouse_governmental_weight = self.total_in_province_governmental_bars_weight + self.total_input_warehouse_free_weight = self.total_in_province_free_bars_weight + self.total_out_province_buying_bars_weight + self.total_input_warehouse_weight = self.total_input_warehouse_governmental_weight + self.total_input_warehouse_free_weight + self.total_selling_warehouse_governmental_weight = self.total_selling_in_province_governmental_weight + self.total_selling_out_province_governmental_weight + self.total_segmentation_governmental_weight + self.total_cold_house_governmental_weight + self.pos_governmental_allocated_weight + self.total_selling_warehouse_free_weight = self.total_selling_in_province_free_weight + self.total_selling_out_province_free_weight + self.total_segmentation_free_weight + self.total_cold_house_free_weight + self.pos_free_allocated_weight + self.total_selling_warehouse_weight = self.total_selling_warehouse_governmental_weight + self.total_selling_warehouse_free_weight + self.total_remain_warehouse_governmental_weight = ( + self.total_input_warehouse_governmental_weight - self.total_selling_warehouse_governmental_weight) - self.ware_house_archive_governmental_weight + self.total_remain_warehouse_free_weight = ( + self.total_input_warehouse_free_weight - self.total_selling_warehouse_free_weight) - self.ware_house_archive_free_weight + self.total_remain_warehouse_weight = self.total_input_warehouse_weight - self.total_selling_warehouse_weight + # self.total_commitment_governmental_weight = int((self.in_province_governmental_selling_percent/100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + self.total_commitment_selling_in_province_governmental_weight = self.total_in_province_governmental_bars_commitment_weight + self.total_commitment_selling_out_province_governmental_weight = int(( + self.out_province_governmental_selling_percent / 100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + self.total_commitment_cold_house_governmental_weight = int(( + self.cold_house_governmental_percent / 100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + self.total_commitment_segmentation_governmental_weight = int(( + self.segmentation_governmental_percent / 100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + # self.total_commitment_free_weight = int((self.in_province_governmental_selling_percent/100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + + self.total_commitment_selling_in_province_free_weight = self.total_in_province_free_bars_commitment_weight + self.total_out_province_buying_bars_commitment_weight + self.total_commitment_selling_out_province_free_weight = int(( + self.out_province_free_selling_percent / 100) * self.total_input_warehouse_free_weight) if self.free_selling_permission else 0 + self.total_commitment_cold_house_free_weight = int(( + self.cold_house_free_percent / 100) * self.total_input_warehouse_free_weight) if self.free_selling_permission else 0 + self.total_commitment_segmentation_free_weight = int(( + self.segmentation_free_selling_percent / 100) * self.total_input_warehouse_free_weight) if self.free_selling_permission else 0 + self.total_commitment_selling_in_province_governmental_remain_weight = self.total_commitment_selling_in_province_governmental_weight - self.total_selling_in_province_governmental_weight if ( + self.total_commitment_selling_in_province_governmental_weight - self.total_selling_in_province_governmental_weight) > 0 else 0 + self.total_commitment_selling_in_province_free_remain_weight = self.total_commitment_selling_in_province_free_weight - self.total_selling_in_province_free_weight if ( + self.total_commitment_selling_in_province_free_weight - self.total_selling_in_province_free_weight) > 0 else 0 + + super(KillHouse, self).save(*args, **kwargs) + + +class ChainAllocation(BaseModel): + poultry_hatching = models.ForeignKey( + PoultryHatching, + on_delete=models.CASCADE, + related_name="poultry_hatching_chain_allocation", + null=True + ) + chain_company = models.ForeignKey( + ChainCompany, + on_delete=models.CASCADE, + related_name="chain_company_allocation", + null=True + ) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="chain_company_allocation_kill_house", + null=True + ) + date = models.DateTimeField(null=True) + state = models.CharField(max_length=50, default="pending") + vet_farm_state = models.CharField(max_length=50, default="pending") + quantity = models.BigIntegerField(default=0) + weight = models.FloatField(default=0) + index_weight = models.FloatField(default=0) + quarantine_code = models.CharField(max_length=200, null=True) + message = models.TextField(null=True) + remover = models.JSONField(null=True) + seconder = models.JSONField(null=True) + registerer = models.JSONField(null=True) + quarantine_code_registrar = models.JSONField(null=True) + wage = models.FloatField(default=0) + total_wage_amount = models.BigIntegerField(default=0) + union_share = models.BigIntegerField(default=0) + union_share_percent = models.FloatField(default=0) + company_share = models.BigIntegerField(default=0) + company_share_percent = models.FloatField(default=0) + guilds_share = models.BigIntegerField(default=0) + guilds_share_percent = models.FloatField(default=0) + city_share = models.BigIntegerField(default=0) + city_share_percent = models.FloatField(default=0) + wallet_share = models.BigIntegerField(default=0) + wallet_share_percent = models.FloatField(default=0) + other_share = models.BigIntegerField(default=0) + other_share_percent = models.FloatField(default=0) + driver_name = models.CharField(max_length=100, null=True) + driver_mobile = models.CharField(max_length=11, null=True) + type_car = models.CharField(max_length=100, null=True) + pelak = models.CharField(max_length=100, null=True) + health_code = models.CharField(max_length=100, null=True) + buyer_name = models.CharField(max_length=100, null=True) + buyer_mobile = models.CharField(max_length=11, null=True) + province = models.CharField(max_length=50, null=True) + city = models.CharField(max_length=50, null=True) + company_name = models.CharField(max_length=100, null=True) + company_user_fullname = models.CharField(max_length=100, null=True) + company_user_mobile = models.CharField(max_length=11, null=True) + company_user_province = models.CharField(max_length=50, null=True) + company_user_city = models.CharField(max_length=50, null=True) + out_province = models.BooleanField(default=False) + archive_wage = models.BooleanField(default=False) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ChainAllocation, self).save(*args, **kwargs) + + +class KillHouseWareHouse(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="ware_house_kill_house", + null=True) + bar_quantity = models.BigIntegerField(default=0) + allocated_quantity = models.BigIntegerField(default=0) + bar_live_weight = models.FloatField(default=0) + number_of_carcasses = models.BigIntegerField(default=0) + updated_number_of_carcasses = models.BigIntegerField(default=0) + weight_of_carcasses = models.FloatField(default=0) + updated_weight_of_carcasses = models.FloatField(default=0) + ave_weight_of_carcasses = models.FloatField(default=0) + update_ave_weight_of_carcasses = models.FloatField(default=0) + free_bar_quantity = models.BigIntegerField(default=0) + number_of_free_carcasses = models.BigIntegerField(default=0) + free_weight_of_carcasses = models.FloatField(default=0) + total_bar_quantity = models.BigIntegerField(default=0) + total_number_of_carcasses = models.BigIntegerField(default=0) + update_total_number_of_carcasses = models.BigIntegerField(default=0) + final_total_number_of_carcasses = models.BigIntegerField(default=0) + total_weight_of_carcasses = models.FloatField(default=0) + update_total_weight_of_carcasses = models.FloatField(default=0) + final_total_weight_of_carcasses = models.FloatField(default=0) + allocated_total_number_of_carcasses = models.BigIntegerField(default=0) + allocated_total_weight_of_carcasses = models.FloatField(default=0) + remain_total_number_of_carcasses = models.BigIntegerField(default=0) + remain_total_weight_of_carcasses = models.FloatField(default=0) + pre_cold_number_of_carcasses_self_ware_house = models.BigIntegerField(default=0) + pre_cold_weight_of_carcasses_self_ware_house = models.FloatField(default=0) + pre_cold_number_of_carcasses_to_ware_house = models.BigIntegerField(default=0) + pre_cold_weight_of_carcasses_to_ware_house = models.FloatField(default=0) + freezing_quantity = models.BigIntegerField(default=0) + freezing_weight = models.FloatField(default=0) + free_sale_quantity = models.BigIntegerField(default=0) + free_sale_weight = models.FloatField(default=0) + final_registration = models.BooleanField(default=False) + + date = models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + super(KillHouseWareHouse, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت کشتارگاه +class KillHouseAllowVet(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_allow", + null=True) + kill_house_id_foreign_key = models.IntegerField(null=True) + kill_house_allow_vet_id_key = models.IntegerField(null=True) + + allow = models.BooleanField(default=False) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillHouseAllowVet, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت کشتارگاه +class KillHousePercentage(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="percent_killhouse", + null=True) + kill_house_for_killer = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="killer_kill_house", + null=True) + + kill_house_for_killer_id_foreign_key = models.IntegerField(null=True) + kill_house_id_foreign_key = models.IntegerField(null=True) + kill_house_percentage_id_key = models.IntegerField(null=True) + percent = models.FloatField(default=0) + last_guilds_update_date = models.CharField(max_length=100, null=True) + guilds_quantity = models.IntegerField(default=0) + guilds_weight = models.FloatField(default=0) + quantity = models.BigIntegerField(default=0) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + change_data = models.JSONField(null=True) + + def save(self, *args, **kwargs): + super(KillHousePercentage, self).save(*args, **kwargs) + + +# مدل مربوط به اضافه کردن راننده به کشتاگاه +class KillHouseDriver(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="user_driver", + null=True + ) + driver_name = models.CharField(max_length=500, null=True) + driver_mobile = models.CharField(max_length=11, null=True) + type_car = models.CharField(max_length=50, null=True) + type = models.CharField(max_length=50, null=True) + pelak = models.CharField(max_length=200, null=True) + capocity = models.CharField(max_length=50, null=True) + weight_without_load = models.CharField(max_length=50, null=True) + health_code = models.CharField(max_length=100, null=True) + status = models.CharField(max_length=50, default="inactive") + active = models.BooleanField(default=True) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="driver_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="driver_wallet", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + kill_house_driver_id_key = models.IntegerField(null=True) + wallet_amount = models.BigIntegerField(default=0) + identity_documents = models.JSONField(null=True) + phone = models.CharField(max_length=20, null=True) + registrar = models.JSONField(null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + active_state = models.BooleanField(default=True) + archive = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(KillHouseDriver, self).save(*args, **kwargs) + + +# مدل مربوط به اضافه کردن ماشین به کشتاگاه +class KillHouseADDCAR(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_add_car", + null=True + ) + driver = models.ForeignKey( + KillHouseDriver, + on_delete=models.CASCADE, + related_name="kill_house_add_car_driver", + null=True + ) + kill_house_id_foreign_key = models.IntegerField(null=True) + driver_id_foreign_key = models.IntegerField(null=True) + kill_house_add_car_id_key = models.IntegerField(null=True) + status = models.CharField(max_length=50, default="inactive") + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + active_state = models.BooleanField(default=True) + archive = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(KillHouseADDCAR, self).save(*args, **kwargs) + + +# مدل بررسی درخواست های شهرستان که شامل تایید یا رد درخواست مرغدار +class CityOperatorCheckRequest(BaseModel): + city_operator = models.ForeignKey( + UserProfile, + on_delete=models.CASCADE, + related_name="user_city_operator", + null=True + ) + city_operator_system = models.ForeignKey( + CityOperator, + on_delete=models.CASCADE, + related_name="system_city_operator", + null=True + ) + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="poultry_check", + null=True + ) + city_operator_system_id_foreign_key = models.IntegerField(null=True) + poultry_request_id_foreign_key = models.IntegerField(null=True) + city_operator_check_request_id_key = models.IntegerField(null=True) + state = models.CharField(max_length=20, null=True) + message = models.CharField(max_length=500, null=True) + allow_hatching = models.BooleanField(null=True) + show_province = models.BooleanField(default=True) + province_accept = models.BooleanField(default=False) + province_state = models.CharField(max_length=20, default='pending') + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(CityOperatorCheckRequest, self).save(*args, **kwargs) + + +# مدل ثبت اپراتور استان +class ProvinceOperator(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="province_operator_user", + null=True + ) + + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="province_system_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="province_operator_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="province_wallet", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + province_operator_id_key = models.IntegerField(null=True) + wallet_amount = models.BigIntegerField(default=0) + identity_documents = models.JSONField(null=True) + phone = models.CharField(max_length=20, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvinceOperator, self).save(*args, **kwargs) + + +class ProvinceCheckOperatorOutRequest(BaseModel): + province_operator_system = models.ForeignKey( + ProvinceOperator, + on_delete=models.CASCADE, + related_name="system_province_operator_out", + null=True + ) + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="province_poultry_out_request", + null=True + ) + + province_operator_system_id_foreign_key = models.IntegerField(null=True) + poultry_request_id_foreign_key = models.IntegerField(null=True) + province_operator_check_out_request_id_key = models.IntegerField(null=True) + state = models.CharField(max_length=50, null=True) + + message = models.CharField(max_length=200, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvinceCheckOperatorOutRequest, self).save(*args, **kwargs) + + +# مدل مربوط به بررسی درخواست های استان که شامل تایید یا رد درخواست های شهرستان +class ProvinceCheckOperatorRequest(BaseModel): + province_operator = models.ForeignKey( + UserProfile, + on_delete=models.CASCADE, + related_name="user_province_operator", + null=True + ) + + province_operator_system = models.ForeignKey( + ProvinceOperator, + on_delete=models.CASCADE, + related_name="system_province_operator", + null=True + ) + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="province_poultry_request", + null=True + ) + city_request_Poultry = models.ForeignKey( + CityOperatorCheckRequest, + on_delete=models.CASCADE, + related_name="Poultry_city_request_to_province", null=True + ) + province_operator_system_id_foreign_key = models.IntegerField(null=True) + poultry_request_id_foreign_key = models.IntegerField(null=True) + city_request_poultry_id_foreign_key = models.IntegerField(null=True) + province_operator_check_request_id_key = models.IntegerField(null=True) + state = models.CharField(max_length=50, null=True) + quantity = models.BigIntegerField(default=0, null=True) + fee = models.FloatField(null=True) + total_weight_at_end = models.FloatField(default=0, null=True) + total_cost_at_end = models.FloatField(null=True) + paid_state = models.CharField(max_length=20, default="pending") + province_show_kill_house = models.CharField(max_length=20, default="pending") + factor_state = models.CharField(max_length=20, default="pending") + message = models.CharField(max_length=200, null=True) + financial_archive = models.CharField(max_length=20, default="pending") + deposit_allocation_archive = models.CharField(max_length=20, default="pending") + end_state = models.CharField(max_length=20, default='active') + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvinceCheckOperatorRequest, self).save(*args, **kwargs) + + +# مدل مربوط به بررسی درخواست های استان که شامل تایید یا رد درخواست های شهرستان +class ProvinceRequestAction(BaseModel): + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="province_request_auction_poultry", + null=True + ) + province_operator_system = models.ForeignKey( + ProvinceOperator, + on_delete=models.CASCADE, + related_name="system_province_operator_auction", + null=True + ) + state = models.CharField(max_length=15, default='pending') + + def save(self, *args, **kwargs): + super(ProvinceRequestAction, self).save(*args, **kwargs) + + +class ProvincePercentLeftOver(BaseModel): + percent = models.FloatField(default=0, null=True) + + def save(self, *args, **kwargs): + super(ProvincePercentLeftOver, self).save(*args, **kwargs) + + +class ShareOfAllocation(BaseModel): + province = models.ForeignKey( + Province, + on_delete=models.CASCADE, + related_name="share_province", + null=True) + province_id_foreign_key = models.IntegerField(null=True) + share_of_allocation_id_key = models.IntegerField(null=True) + central_union = models.FloatField(default=0, null=True) + province_union = models.FloatField(default=0, null=True) + city_union = models.FloatField(default=0, null=True) + fanava = models.FloatField(default=0, null=True) + central_control_system = models.FloatField(default=0, null=True) + company = models.FloatField(default=0, null=True) + vet = models.FloatField(default=0, null=True) + total = models.FloatField(default=0, null=True) + state = models.CharField(max_length=20, null=True) + date = models.DateTimeField(null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + self.total = self.central_union + self.province_union + self.city_union + self.fanava + self.company + super(ShareOfAllocation, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت درخواست بورسی کشتارگاه +class KillHouseRequestExchange(BaseModel): + user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name="kill_house_request_exchange", + null=True) + kill_house = models.ForeignKey(KillHouse, on_delete=models.CASCADE, + related_name="kill_house_exchange_kill_house", + null=True) + quantity = models.BigIntegerField(default=0, null=True) + send_date1 = models.DateTimeField(null=True) + send_date2 = models.DateTimeField(null=True) + chicken_breed = models.JSONField(default=[], null=True) + Index_weight = models.FloatField(default=0, null=True) + fee = models.FloatField(default=0, null=True) + longitude = models.FloatField(default=0) + latitude = models.FloatField(default=0) + address = models.TextField() + age1 = models.IntegerField(default=0, null=True) + age2 = models.IntegerField(default=0, null=True) + state = models.CharField(max_length=15, default='pending') + + def save(self, *args, **kwargs): + super(KillHouseRequestExchange, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت درخواست بورسی رزرو کشتارگاه +class KillHouseRequestExchangeReserve(BaseModel): + kill_house = models.ForeignKey(KillHouse, on_delete=models.CASCADE, + related_name="kill_house_request_exchange_kill_house", + null=True) + # poultry_exchange = models.ForeignKey(PoultryRequestExchange, on_delete=models.CASCADE, + # related_name="kill_house_request_exchange_poultry", + # null=True) + # quantity = models.BigIntegerField(default=0, null=True) + state = models.CharField(max_length=15, default='pending') + + def save(self, *args, **kwargs): + super(KillHouseRequestExchangeReserve, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت درخواست بورسی رزرو کشتارگاه +class KillHouseRequestAction(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_request_auction_kill_house", + null=True) + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="kill_house_request_auction_poultry", + null=True) + fee = models.FloatField(default=0, null=True) + date = models.DateTimeField(null=True) + + state = models.CharField(max_length=15, default='pending') + + def save(self, *args, **kwargs): + super(KillHouseRequestAction, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت درخواست بورسی رزرو کشتارگاه +class KillHouseRequestActionWinner(BaseModel): + kill_house_request_auction = models.ForeignKey( + KillHouseRequestAction, + on_delete=models.CASCADE, + related_name="kill_house_request_auction_kill_house", + null=True) + fee = models.FloatField(default=0, null=True) + quantity = models.BigIntegerField(default=0, null=True) + + def save(self, *args, **kwargs): + super(KillHouseRequestActionWinner, self).save(*args, **kwargs) + + +# مدل مربوط به تایید یا رد درخواست مرغدار که رزرو شده توسط کشتارگاه +class PoultryRequestExchangeAccept(BaseModel): + poultry_request_exchange = models.ForeignKey(PoultryRequestExchange, on_delete=models.CASCADE, + related_name="poultry_request_exchange_accept", null=True) + kill_house_request_exchange_reserve = models.ForeignKey(KillHouseRequestExchangeReserve, on_delete=models.CASCADE, + related_name="poultry_request_exchange_kill_house_accept", + null=True) + state = models.CharField(max_length=15, default='pending') + message = models.CharField(max_length=200, null=True) + + def save(self, *args, **kwargs): + super(PoultryRequestExchangeAccept, self).save(*args, **kwargs) + + +# مدل مربوط اضافه کردن ماشین به درخواست بورسی کشتارگاه +class KillHouseRequestExchangeAddCar(BaseModel): + kill_house_reserve = models.ForeignKey(KillHouseRequestExchangeReserve, on_delete=models.CASCADE, + related_name="kill_house_request_accept_reserve", + null=True) + cars = models.JSONField(default=dict, null=True) + + def save(self, *args, **kwargs): + super(KillHouseRequestExchangeAddCar, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت درخواست کشتار از سمت کشتارگاه +class KillRequest(BaseModel): + kill_house = models.ForeignKey(KillHouse, on_delete=models.CASCADE, related_name="kill", null=True) + slaughter_house = models.ForeignKey(KillHouse, on_delete=models.CASCADE, related_name="slaughter_kill_req", + null=True) + kill_house_id_foreign_key = models.IntegerField(null=True) + slaughter_house_id_foreign_key = models.IntegerField(null=True) + kill_request_id_key = models.IntegerField(null=True) + kill_capacity = models.IntegerField(null=True) + previous_kill_capacity = models.IntegerField(default=0, null=True) + remain_quantity_for_poultry = models.IntegerField(default=0) + remain_quantity = models.IntegerField(null=True) + recive_time = models.CharField(max_length=50, null=True) + recive_date = models.DateTimeField(null=True) + state = models.CharField(max_length=20, default='pending') + province_state = models.CharField(max_length=20, default='pending') + province_quantity = models.IntegerField(null=True) + cars = models.JSONField(null=True, default=dict) + buy_type = models.JSONField(default=dict, null=True) + weight = models.CharField(max_length=200, null=True) + weight_type = models.JSONField(default=dict, null=True) + chicken_breed = models.CharField(max_length=200, null=True) + old_chicken_breed = models.CharField(max_length=200, null=True) + message = models.CharField(max_length=200, null=True) + Index_weight = models.FloatField(null=True) + first_average_weight = models.FloatField(default=0) + second_average_weight = models.FloatField(default=0) + factor_amount = models.FloatField(default=0) + allocated_number = models.FloatField(default=0) + factor_deposit = models.FloatField(default=0) + debt = models.BooleanField(default=False) + priority = models.BooleanField(default=False) + debt_amount = models.FloatField(default=0) + sms_payment = models.BooleanField(default=False) + automatic = models.BooleanField(default=False) + automatic_debt = models.BooleanField(default=False) + payment_info = models.JSONField(null=True) + registrar = models.JSONField(null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + poultry = models.ForeignKey(Poultry, on_delete=models.CASCADE, related_name="poultry_kill_req", null=True) + poultry_hatching = models.ForeignKey(PoultryHatching, on_delete=models.CASCADE, + related_name="poultry_hatching_kill_req", null=True) + poultry_request = models.ForeignKey(PoultryRequest, on_delete=models.CASCADE, + related_name="poultry_request_kill_req", null=True) + free_direct_buying = models.BooleanField(default=False) + direct_buying_state = models.CharField(max_length=20, default='pending') + direct_buying_message = models.CharField(max_length=500, null=True) + direct_buying_code = models.CharField(max_length=20, null=True) + input_direct_buying_code = models.CharField(max_length=20, null=True) + export_status = models.BooleanField(default=False) + export_state = models.CharField(max_length=20, default='pending') + export_message = models.CharField(max_length=500, null=True) + export_code = models.CharField(max_length=20, null=True) + input_export_code = models.CharField(max_length=20, null=True) + export_country = models.CharField(max_length=100, null=True) + accept_reject_date = models.DateTimeField(null=True) + amount = models.FloatField(default=0) + automatic_accept = models.BooleanField(default=False) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + price_confirmation = models.BooleanField(default=False) + final_accept = models.BooleanField(default=False) + poultry_mobile = models.CharField(max_length=20, null=True) + payment_deadline_days = models.IntegerField(default=0) + payment_deadline_date = models.DateTimeField(null=True) + payment_deadline = models.BooleanField(default=False) + extension_payment_deadline_days = models.IntegerField(default=0) + extension_payment_deadline_date = models.DateTimeField(null=True) + market = models.BooleanField(default=False) + market_final_accept = models.BooleanField(default=False) + market_state = models.CharField(max_length=20, default='pending') + market_state_message = models.TextField(null=True) + market_expire_date_time = models.DateTimeField(null=True) + direct_buying_intermediary_mobile = models.CharField(max_length=20, null=True) + market_code_status = models.BooleanField(default=False) + market_code = models.CharField(max_length=20, null=True) + input_market_code = models.CharField(max_length=20, null=True) + expire_time_ten_minute = models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + super(KillRequest, self).save(*args, **kwargs) + + +class AutomaticKillRequest(BaseModel): + active = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(AutomaticKillRequest, self).save(*args, **kwargs) + + +class KillRequestFactor(BaseModel): + kill_request = models.ForeignKey(KillRequest, on_delete=models.CASCADE, related_name="factor_kill_req", null=True) + kill_request_id_foreign_key = models.IntegerField(null=True) + kill_request_factor_id_key = models.IntegerField(null=True) + state = models.CharField(max_length=20, default='pending') + amount = models.FloatField(default=0) + minimum_amount = models.FloatField(default=0) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillRequestFactor, self).save(*args, **kwargs) + + +class KillRequestFactorPayment(BaseModel): + kill_request_factor = models.ForeignKey(KillRequestFactor, on_delete=models.CASCADE, related_name="kill_req_factor", + null=True) + kill_request_factor_id_foreign_key = models.IntegerField(null=True) + kill_request_factor_payment_id_key = models.IntegerField(null=True) + state = models.CharField(max_length=20, default='pending') + image = models.CharField(max_length=200, null=True) + payment_code = models.BigIntegerField(default=0) + amount = models.FloatField(default=0) + remain_amount = models.FloatField(default=0) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillRequestFactorPayment, self).save(*args, **kwargs) + + +# مدل مربوط به تخصیص استان به کشتارگاه +class ProvinceKillRequest(BaseModel): + killhouse_user = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_user", + null=True + ) + kill_request = models.ForeignKey( + KillRequest, + on_delete=models.CASCADE, + related_name="kill_request", + null=True + ) + province_request = models.ForeignKey( + ProvinceCheckOperatorRequest, + on_delete=models.CASCADE, + related_name="kill_house_province", + null=True + ) + + killhouse_user_id_foreign_key = models.IntegerField(null=True) + kill_request_id_foreign_key = models.IntegerField(null=True) + province_request_id_foreign_key = models.IntegerField(null=True) + province_kill_request_id_key = models.IntegerField(null=True) + quantity = models.BigIntegerField(default=0) + main_quantity = models.BigIntegerField(default=0) + total_killed_quantity = models.BigIntegerField(default=0) + first_car_allocated_quantity = models.BigIntegerField(default=0) + extra_killed_quantity = models.BigIntegerField(default=0) + total_killed_weight = models.FloatField(default=0) + extra_killed_weight = models.FloatField(default=0) + fee = models.FloatField(default=0, null=True) + wage = models.FloatField(default=0, null=True) + total_amount = models.FloatField(default=0, null=True) + total_wage_amount = models.FloatField(default=0, null=True) + prev_total_amount = models.FloatField(null=True) + state = models.CharField(max_length=20, default='pending') + vet_state = models.CharField(max_length=20, default='pending') + payment_type = models.CharField(max_length=20, null=True) + payment_dead_line = models.DateTimeField(null=True) + message = models.CharField(max_length=200, null=True) + clearance_code = models.BigIntegerField(null=True) + automatic = models.BooleanField(default=False) + dont_show_kill_house = models.BooleanField(default=False) + reviewer = models.JSONField(null=True) + total_amount_editor = models.JSONField(null=True) + delete_message = models.CharField(max_length=200, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + wage_pay = models.BooleanField(default=False) + depositor = models.JSONField(null=True) + archive_by_province = models.BooleanField(default=False) + archive_wage = models.BooleanField(default=False) + return_to_province = models.BooleanField(default=False) + archive_message = models.CharField(max_length=500, null=True) + archiver = models.JSONField(null=True) + return_archive_message = models.CharField(max_length=500, null=True) + returner = models.JSONField(null=True) + wallet_pay = models.BooleanField(default=False) + union_share = models.BigIntegerField(default=0) + union_share_percent = models.FloatField(default=0) + company_share = models.BigIntegerField(default=0) + company_share_percent = models.FloatField(default=0) + guilds_share = models.BigIntegerField(default=0) + guilds_share_percent = models.FloatField(default=0) + city_share = models.BigIntegerField(default=0) + city_share_percent = models.FloatField(default=0) + wallet_share = models.BigIntegerField(default=0) + wallet_share_percent = models.FloatField(default=0) + other_share = models.BigIntegerField(default=0) + other_share_percent = models.FloatField(default=0) + kill_house_price = models.BigIntegerField(default=0) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + payment_deadline_days = models.IntegerField(default=0) + payment_deadline_date = models.DateTimeField(null=True) + payment_deadline = models.BooleanField(default=False) + payment_deadline_archive = models.BooleanField(default=False) + payment_deadline_state = models.CharField(max_length=50, default='pending') + payment_deadline_checker_fullname = models.CharField(max_length=50, null=True) + payment_deadline_checker_mobile = models.CharField(max_length=50, null=True) + payment_deadline_check_date = models.DateTimeField(null=True) + payment_deadline_archive_message = models.TextField(null=True) + payment_deadline_supporter_message = models.TextField(null=True) + final_accept = models.BooleanField(default=False) + final_accept_registrar = models.CharField(max_length=200, null=True) + final_accept_registrar_mobile = models.CharField(max_length=20, null=True) + final_accept_date = models.DateTimeField(null=True) + payment_deadline_amount = models.BigIntegerField(default=0) + extension_payment_deadline_days = models.IntegerField(default=0) + extension_payment_deadline_date = models.DateTimeField(null=True) + fine = models.BooleanField(default=False) + fine_amount = models.BigIntegerField(default=0) + fine_coefficient = models.FloatField(default=0) + direct_buying_fine = models.BooleanField(default=False) + direct_buying_fine_amount = models.BigIntegerField(default=0) + direct_buying_fine_coefficient = models.FloatField(default=0) + direct_buying = models.BooleanField(default=False) + market = models.BooleanField(default=False) + warehouse = models.BooleanField(default=True) + return_trash = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + self.extra_killed_quantity = self.total_killed_quantity - self.main_quantity if self.total_killed_quantity - self.main_quantity > 0 else 0 + + self.quantity = self.main_quantity - self.first_car_allocated_quantity if self.main_quantity - self.first_car_allocated_quantity > 0 else 0 + super(ProvinceKillRequest, self).save(*args, **kwargs) + + +class BarDocumentStatus(BaseModel): + title = models.CharField(max_length=500, null=True) + description = models.TextField(null=True) + sms = models.BooleanField(default=False) + is_error = models.BooleanField(default=False) + priority_id = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + if self.priority_id == 0: + bar_documents_status = BarDocumentStatus.objects.filter(trash=False).order_by('priority_id').last() + self.priority_id = bar_documents_status.priority_id + 1 if bar_documents_status else 1 + super(BarDocumentStatus, self).save(*args, **kwargs) + + +# مدل ایحاد درخواست کشتار از سمت کشتارگاه با توجه به میزان تخصیص از سمت استان +class KillHouseRequest(BaseModel): + killhouse_user = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_request_user", + null=True + ) + killer = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_request_killer", + null=True + ) + kill_request = models.ForeignKey( + KillRequest, + on_delete=models.CASCADE, + related_name="kill_request_kill_house", + null=True + ) + province_request = models.ForeignKey( + ProvinceCheckOperatorRequest, + on_delete=models.CASCADE, + related_name="kill_house_province_request", + null=True + ) + province_kill_request = models.ForeignKey( + ProvinceKillRequest, + on_delete=models.CASCADE, + related_name="province_kill_house_request", + null=True + ) + kill_house_request_auction_winner = models.ForeignKey( + KillHouseRequestActionWinner, + on_delete=models.CASCADE, + related_name="kill_house_request_winner", + null=True + ) + # driver = models.ForeignKey( + # KillHouseDriver, + # on_delete=models.CASCADE, + # related_name="kill_house_request_driver", + # null=True + # ) + add_car = models.ForeignKey( + KillHouseADDCAR, + on_delete=models.CASCADE, + related_name="kill_house_request_add_car", + null=True + ) + real_add_car = models.ForeignKey( + KillHouseADDCAR, + on_delete=models.CASCADE, + related_name="kill_house_request_real_add_car", + null=True + ) + bar_document_status = models.ForeignKey( + BarDocumentStatus, + on_delete=models.CASCADE, + related_name="kill_house_request_bar_document_status", + null=True + ) + input_warehouse = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_input_warehouse", + null=True + ) + killhouse_user_id_foreign_key = models.IntegerField(null=True) + kill_request_id_foreign_key = models.IntegerField(null=True) + province_request_id_foreign_key = models.IntegerField(null=True) + province_kill_request_id_foreign_key = models.IntegerField(null=True) + add_car_id_foreign_key = models.IntegerField(null=True) + kill_house_request_id_key = models.IntegerField(null=True) + capacity = models.BigIntegerField(default=0) + quantity = models.BigIntegerField(default=0) + bar_code = models.BigIntegerField(null=True) + quarantine_quantity = models.BigIntegerField(null=True) + quarantine_code_state = models.CharField(max_length=500, null=True) + fee = models.FloatField(default=0, null=True) + time = models.CharField(max_length=20, null=True) + state = models.CharField(max_length=20, null=True) + vet_state = models.CharField(max_length=20, default='pending') + active_state = models.CharField(max_length=20, default='active') + assignment_state_archive = models.CharField(max_length=20, default='pending') + show_kill_house = models.CharField(max_length=20, default='pending') + car = models.JSONField(default=dict, null=True) + kill_house_message = models.TextField(max_length=1000, null=True) + allocation_state = models.CharField(max_length=20, null=True) + auction = models.BooleanField(default=False) + role = models.JSONField(null=True) + clearance_code = models.CharField(max_length=200, null=True) + traffic_code = models.CharField(max_length=200, null=True) + registrar_clearance_code = models.JSONField(null=True) + editor_traffic_code = models.JSONField(null=True) + bar_remover = models.JSONField(null=True) + extra_killed_quantity = models.BigIntegerField(default=0) + accepted_real_quantity = models.BigIntegerField(default=0) + accepted_real_weight = models.FloatField(default=0) + extra_killed_weight = models.FloatField(default=0) + vet_accepted_real_quantity = models.BigIntegerField(default=0) + vet_accepted_real_weight = models.FloatField(default=0) + accepted_assignment_real_quantity = models.BigIntegerField(default=0) + accepted_assignment_real_weight = models.FloatField(default=0) + message = models.CharField(max_length=200, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + ware_house_confirmation = models.BooleanField(default=False) + ware_house_accepted_real_quantity = models.BigIntegerField(default=0) + ware_house_accepted_real_weight = models.FloatField(default=0) + date_of_ware_house = models.CharField(max_length=200, null=True) + freezing = models.BooleanField(default=False) + archive_wage = models.BooleanField(default=False) + weight_loss = models.FloatField(default=0) + ware_house_input_type = models.CharField(max_length=100, null=True) + document_status = models.CharField(max_length=500, null=True) + aggregate_code = models.BigIntegerField(null=True) + aggregate_status = models.BooleanField(default=False) + calculate_status = models.BooleanField(default=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + entered_message = models.TextField(null=True) + # فیلد های استعلام از قرنطینه + inquiry_date = models.DateField(null=True) + inquiry_origin = models.CharField(max_length=100, null=True) + inquiry_destination = models.CharField(max_length=100, null=True) + inquiry_driver = models.CharField(max_length=100, null=True) + inquiry_pelak = models.CharField(max_length=100, null=True) + settlement_type = models.CharField(max_length=100, null=True) + price = models.IntegerField(default=0) + description = models.TextField(null=True) + bar_document_description = models.TextField(null=True) + image = models.CharField(max_length=500, null=True) + price_registerar = models.CharField(max_length=200, null=True) + price_registerar_role = models.CharField(max_length=100, null=True) + price_register_date = models.DateTimeField(null=True) + price_editor = models.CharField(max_length=200, null=True) + price_editor_role = models.CharField(max_length=100, null=True) + price_editor_date = models.DateTimeField(null=True) + non_receipt = models.BooleanField(default=False) + non_receipt_return = models.BooleanField(default=False) + non_receipt_return_message = models.TextField(null=True) + non_receipt_message = models.TextField(null=True) + main_non_receipt = models.BooleanField(default=False) + non_receipt_state = models.CharField(max_length=20, default='pending') + non_receipt_checker = models.CharField(max_length=200, null=True) + non_receipt_checker_message = models.TextField(null=True) + non_receipt_checker_mobile = models.CharField(max_length=20, null=True) + non_receipt_check_date = models.DateTimeField(null=True) + non_receipt_returner = models.CharField(max_length=200, null=True) + non_receipt_returner_mobile = models.CharField(max_length=20, null=True) + non_receipt_return_date = models.DateTimeField(null=True) + fine = models.BooleanField(default=False) + fine_amount = models.BigIntegerField(default=0) + fine_coefficient = models.FloatField(default=0) + document_number = models.CharField(max_length=50, null=True) + company_document = models.BooleanField(default=False) + warehouse = models.BooleanField(default=True) + warehouse_commitment_weight = models.FloatField(default=0) + return_trash = models.BooleanField(default=False) + amount = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(KillHouseRequest, self).save(*args, **kwargs) + + +# مدل مربوط به تایید یا رد درخواست کشتار تخصیص داده شده به کشتارگاه توسط کشتارگاه +class KillHouseCheckRequest(BaseModel): + province_kill_request = models.ForeignKey( + ProvinceKillRequest, + on_delete=models.CASCADE, + related_name="province_kill_house_check", + null=True + ) + province_kill_request_id_foreign_key = models.IntegerField(null=True) + kill_house_check_request_id_key = models.IntegerField(null=True) + role = models.JSONField(null=True) + state = models.CharField(max_length=20, null=True) + message = models.CharField(max_length=200, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillHouseCheckRequest, self).save(*args, **kwargs) + + +class MostSearch(BaseModel): + searched_items = models.CharField(max_length=200, null=True) + count = models.IntegerField(default=0) + + +# مدل مربوط به ورود اطلاعات بار توسط کشتارگاه +class KillHouseAssignmentInformation(BaseModel): + kill_house_check = models.ForeignKey( + KillHouseCheckRequest, + on_delete=models.CASCADE, + related_name="kill_house_check_req", + null=True + ) + kill_house_request = models.ForeignKey( + KillHouseRequest, + on_delete=models.CASCADE, + related_name="kill_house_request_assignment", + null=True + ) + + kill_house_check_id_foreign_key = models.IntegerField(null=True) + kill_house_request_id_foreign_key = models.IntegerField(null=True) + kill_house_kill_house_assingment_information_id_key = models.IntegerField(null=True) + car_weight_without_load = models.FloatField(default=0) + car_weight_without_load_image = models.CharField(max_length=500, null=True) + car_weight_with_load = models.FloatField(default=0) + car_weight_with_load_image = models.CharField(max_length=500, null=True) + message = models.CharField(max_length=200, null=True) + net_weight = models.FloatField(default=0) + exploited_carcass = models.FloatField(default=0) + state = models.CharField(max_length=15, default='pending') + poultry = models.BooleanField(default=False) + city = models.BooleanField(default=False) + province = models.BooleanField(default=False) + unusual_casualties = models.BooleanField(default=False) + real_quantity = models.IntegerField(default=0) + importer = models.JSONField(default=dict, null=True) + protest_time = models.DateTimeField(null=True) + weight_withs_losses = models.FloatField(default=0, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + # self.net_weight = float(self.car_weight_with_load) - float(self.car_weight_without_load) + super(KillHouseAssignmentInformation, self).save(*args, **kwargs) + + +# مدل مربوط به ورود اطلاعات بار توسط کشتارگاه +class KillHouseAssignmentImages(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_images", + null=True + ) + health_certificate_image = models.CharField(max_length=500, null=True) + national_card_image = models.CharField(max_length=500, null=True) + birth_certificate_image = models.CharField(max_length=500, null=True) + police_clearance_image = models.CharField(max_length=500, null=True) + no_addiction_image = models.CharField(max_length=500, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillHouseAssignmentImages, self).save(*args, **kwargs) + + +# مدل مربوط به ورود اطلاعات بار توسط مرغدار +class PoultryAssignmentInformation(BaseModel): + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="poultry_assignment", + null=True + ) + car_weight_without_load = models.FloatField(default=0) + car_weight_without_load_image = models.CharField(max_length=500, null=True) + car_weight_with_load = models.FloatField(default=0) + car_weight_with_load_image = models.CharField(max_length=500, null=True) + net_weight = models.FloatField(default=0) + state = models.CharField(max_length=15, default='pending') + + def save(self, *args, **kwargs): + self.net_weight = float(self.car_weight_with_load) - float(self.car_weight_without_load) + super(PoultryAssignmentInformation, self).save(*args, **kwargs) + + +# مدل مربوط به بررسی اطلاعات بار وارد شده +class ProvinceCheckInformation(BaseModel): + kill_house_assignment = models.ForeignKey( + KillHouseAssignmentInformation, + on_delete=models.CASCADE, + related_name="kill_house_assign", + null=True + ) + poultry_assignment = models.ForeignKey( + PoultryAssignmentInformation, + on_delete=models.CASCADE, + related_name="poultry_assign", + null=True + ) + province_operator = models.ForeignKey( + ProvinceOperator, + on_delete=models.CASCADE, + related_name="provinc_operator_check_info", + null=True + ) + kill_house_assignment_id_foreign_key = models.IntegerField(null=True) + province_operator_id_foreign_key = models.IntegerField(null=True) + province_check_information_id_key = models.IntegerField(null=True) + state = models.CharField(max_length=20, null=True) + message = models.CharField(max_length=200, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvinceCheckInformation, self).save(*args, **kwargs) + + +# مدل ایجاد فاکتور توسط استان برای کشتارگاه +class ProvinceFactorToKillHouseForPoultry(BaseModel): + province_check_info = models.ForeignKey( + ProvinceCheckInformation, + on_delete=models.CASCADE, + related_name="province_info_poultry", + null=True + ) + province_check_req = models.ForeignKey( + ProvinceCheckOperatorRequest, + on_delete=models.CASCADE, + related_name="province_check_poultry", + null=True + ) + + total_weight = models.FloatField(default=0) + weight = models.FloatField(default=0) + factor_fee = models.FloatField(default=0) + factor_bar_code = models.BigIntegerField(null=True) + factor_date = models.DateTimeField(null=True) + total_price = models.FloatField(default=0) + today_price = models.FloatField(default=0) + real_weight = models.FloatField(default=0) + shares = models.JSONField(default=dict, null=True) + paid_state = models.CharField(max_length=20, default='pending') + pay_for = models.CharField(max_length=20, null=True) + kill_house_factor_info = models.CharField(max_length=20, default='pending') + bank = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="bank_card_poultry", + null=True + ) + sum_state = models.CharField(max_length=20, default='pending') + out = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + # self.total_price = self.total_weight * self.factor_fee + super(ProvinceFactorToKillHouseForPoultry, self).save(*args, **kwargs) + + +# مدل ایجاد فاکتور توسط استان برای کشتارگاه +class ProvinceFactorToKillHouse(BaseModel): + province_check_info = models.ForeignKey( + ProvinceCheckInformation, + on_delete=models.CASCADE, + related_name="province_info", + null=True + ) + poultry_factor = models.ForeignKey( + ProvinceFactorToKillHouseForPoultry, + on_delete=models.CASCADE, + related_name="province_factor_poultry", + null=True + ) + province_check_req = models.ForeignKey( + ProvinceCheckOperatorRequest, + on_delete=models.CASCADE, + related_name="province_check_province", + null=True + ) + + total_weight = models.FloatField(default=0) + weight = models.FloatField(default=0) + factor_fee = models.FloatField(default=0) + factor_bar_code = models.BigIntegerField(null=True) + factor_date = models.DateTimeField(null=True) + total_price = models.FloatField(default=0) + province_input_amount = models.FloatField(default=0) + province_input_amount_type = models.CharField(max_length=20, null=True) + province_wage = models.FloatField(default=0) + previous_amount = models.FloatField(default=0) + decreasing_amount = models.FloatField(default=0) + today_price = models.FloatField(default=0) + kill_house_factor_payment_remain = models.FloatField(default=0) + real_weight = models.FloatField(default=0) + shares = models.JSONField(default=dict, null=True) + paid_state = models.CharField(max_length=20, default='pending') + pay_for = models.CharField(max_length=20, null=True) + kill_house_factor_info = models.CharField(max_length=20, default='pending') + reason = models.TextField(null=True) + sum_state = models.CharField(max_length=20, default='pending') + factor_person_type = models.CharField(max_length=20, default='pending') + # bank = models.JSONField(default={'bank_info': 'بانک کشاورزی به نام اتحادیه تعاونی کشاورزی محمد رضا کمالوندی', + # 'bank_card': '6037654323417678', 'bank_shaba': '56678876554433223445566'}) + bank = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="bank_card_province", + null=True + ) + province_check_info_id_foreign_key = models.IntegerField(null=True) + province_check_req_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + province_factor_to_kill_house_id_key = models.IntegerField(null=True) + out = models.BooleanField(default=False) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + # self.total_price = self.total_weight * self.factor_fee + super(ProvinceFactorToKillHouse, self).save(*args, **kwargs) + + +class KillHouseFactorToPoultry(BaseModel): + province_factor = models.ForeignKey( + ProvinceFactorToKillHouseForPoultry, + on_delete=models.CASCADE, + related_name="province_factor_info_poultry", + null=True + ) + + payment_code = models.CharField(max_length=100, null=True) + state = models.CharField(max_length=20, default='pending') + payment_state = models.CharField(max_length=50, null=True) + payment_method = models.CharField(max_length=50, null=True) + factor_image = models.CharField(max_length=500, null=True) + message = models.CharField(max_length=500, null=True) + importer = models.CharField(max_length=100, null=True) + archive_state = models.CharField(max_length=50, default='pending') + + def save(self, *args, **kwargs): + super(KillHouseFactorToPoultry, self).save(*args, **kwargs) + + +# مدل ایجاد فاکتور توسط کشتارگاه برای استان +class KillHouseFactorToProvince(BaseModel): + province_factor = models.ForeignKey( + ProvinceFactorToKillHouse, + on_delete=models.CASCADE, + related_name="province_factor_info", + null=True + ) + + province_factor_id_foreign_key = models.IntegerField(null=True) + kill_house_factor_to_province_id_key = models.IntegerField(null=True) + + payment_code = models.CharField(max_length=100, null=True) + state = models.CharField(max_length=20, default='pending') + payment_state = models.CharField(max_length=50, null=True) + payment_method = models.CharField(max_length=50, null=True) + factor_image = models.CharField(max_length=500, null=True) + message = models.CharField(max_length=500, null=True) + importer = models.CharField(max_length=100, null=True) + archive_state = models.CharField(max_length=50, default='pending') + first_payment = models.BooleanField(default=False) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillHouseFactorToProvince, self).save(*args, **kwargs) + + +# مدل بررسی فاکتور کشتارگاه توسط استان +class ProvinceCheckKillHouseFactor(BaseModel): + kill_house_factor = models.ForeignKey( + KillHouseFactorToProvince, + on_delete=models.CASCADE, + related_name="province_check_factor", + null=True + ) + kill_house_factor_poultry = models.ForeignKey( + KillHouseFactorToPoultry, + on_delete=models.CASCADE, + related_name="province_check_factor_poultry", + null=True + ) + kill_house_factor_id_foreign_key = models.IntegerField(null=True) + province_check_kill_house_factor_id_key = models.IntegerField(null=True) + state = models.CharField(max_length=20, null=True) + message = models.CharField(max_length=500, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvinceCheckKillHouseFactor, self).save(*args, **kwargs) + + +class ProvinceImportKillHouseOutFactors(BaseModel): + kill_house_factor = models.ForeignKey( + ProvinceFactorToKillHouse, + on_delete=models.CASCADE, + related_name="province_check_factor_out", + null=True + ) + kill_house_factor_poultry = models.ForeignKey( + ProvinceFactorToKillHouseForPoultry, + on_delete=models.CASCADE, + related_name="province_check_factor_poultry_out", + null=True + ) + province_check = models.ForeignKey( + ProvinceCheckOperatorRequest, + on_delete=models.CASCADE, + related_name="province_check_request", + null=True + ) + image = models.CharField(max_length=500, null=True) + amount = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(ProvinceImportKillHouseOutFactors, self).save(*args, **kwargs) + + +# مدل مریوط به تخصیصات مالی برای مرغدار و شهرستان و استان +class DepositAllocation(BaseModel): + poultry = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="allocations_poultry", + null=True + ) + poultry_request_id_foreign_key = models.IntegerField(null=True) + deposit_allocation_id_key = models.IntegerField(null=True) + + poultry_share = models.FloatField(default=0, null=True) + poultry_share_payment = models.FloatField(default=0, null=True) + poultry_share_payment_info = models.JSONField(default=list, null=True) + city_share = models.FloatField(default=0, null=True) + city_share_payment = models.FloatField(default=0, null=True) + city_share_payment_info = models.JSONField(default=list, null=True) + province_share = models.FloatField(default=0, null=True) + province_share_payment = models.FloatField(default=0, null=True) + province_share_payment_info = models.JSONField(default=list, null=True) + poultry_bank = models.JSONField(default=dict, null=True) + city_bank = models.JSONField(default=dict, null=True) + poultry_image = models.CharField(max_length=200, null=True) + city_image = models.CharField(max_length=200, null=True) + company_share = models.FloatField(default=0, null=True) + company_share_payment = models.FloatField(default=0, null=True) + company_share_payment_info = models.JSONField(default=list, null=True) + company_bank = models.JSONField(default=dict, null=True) + central_union_share = models.FloatField(default=0, null=True) + central_union_share_payment = models.FloatField(default=0, null=True) + central_union_share_payment_info = models.JSONField(default=list, null=True) + fanava_share = models.FloatField(default=0, null=True) + fanava_share_payment = models.FloatField(default=0, null=True) + fanava_share_payment_info = models.JSONField(default=list, null=True) + + deposit_allocation_state = models.CharField(max_length=20, default='pending') + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(DepositAllocation, self).save(*args, **kwargs) + + +class InspectorOperator(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="inspector_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="inspector_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="province_inspector_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="inspector_wallet", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + inspector_operator_id_key = models.IntegerField(null=True) + wallet_amount = models.BigIntegerField(default=0) + active = models.BooleanField(default=True) + identity_documents = models.JSONField(null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + id_number = models.IntegerField(default=1) + + def save(self, *args, **kwargs): + super(InspectorOperator, self).save(*args, **kwargs) + + +# مدل مربوط به تایید یا رد پرونده توسط بازرس استان +class PovinceInspector(BaseModel): + inspector_operator = models.ForeignKey( + InspectorOperator, + on_delete=models.CASCADE, + related_name="inspector", + null=True + ) + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="poultry_request_inspector", + null=True + ) + inspector_operator_id_foreign_key = models.IntegerField(null=True) + poultry_request_id_foreign_key = models.IntegerField(null=True) + province_inspector_id_key = models.IntegerField(null=True) + state = models.CharField(max_length=20, default='pending') + message = models.CharField(max_length=500, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(PovinceInspector, self).save(*args, **kwargs) + + +class FunctionExecutor(BaseModel): + func_name = models.CharField(max_length=200, null=True) + time_type = models.CharField(max_length=100, null=True) + cycle = models.IntegerField(default=0) + compare_time = models.DateTimeField(default=datetime.now()) + + +class ReportingFieldRoleLimitation(BaseModel): + role_name = models.ForeignKey( + Group, + on_delete=models.CASCADE, + null=True, + related_name="report_role" + ) + fields = models.CharField(max_length=200, null=True) + + def save(self, *args, **kwargs): + super(ReportingFieldRoleLimitation, self).save(*args, **kwargs) + + +# مدل مربوط به آنالیز قیمت مرغ +class PriceAnalysis(models.Model): + corn_percent = models.FloatField(default=0, null=True) + corn_free_price = models.FloatField(default=0, null=True) + corn_Ration_free_price = models.FloatField(default=0, null=True) + corn_total_free_price = models.FloatField(default=0, null=True) + Soy_free_price = models.FloatField(default=0, null=True) + Soy_total_free_price = models.FloatField(default=0, null=True) + Soy_Ration_free_price = models.FloatField(default=0, null=True) + Soy_percent = models.FloatField(default=0, null=True) + Oil_percent = models.FloatField(default=0, null=True) + Oil_free_price = models.FloatField(default=0, null=True) + Oil_total_free_price = models.FloatField(default=0, null=True) + Oil_Ration_free_price = models.FloatField(default=0, null=True) + Dicalcium_free_price = models.FloatField(default=0, null=True) + Dicalcium_total_free_price = models.FloatField(default=0, null=True) + Dicalcium_Ration_free_price = models.FloatField(default=0, null=True) + Dicalcium_percent = models.FloatField(default=0, null=True) + Carbonate_free_price = models.FloatField(default=0, null=True) + Carbonate_total_free_price = models.FloatField(default=0, null=True) + Carbonate_Ration_free_price = models.FloatField(default=0, null=True) + Carbonate_percent = models.FloatField(default=0, null=True) + mineral_supplement_percent = models.FloatField(default=0, null=True) + mineral_Ration_supplement_free_price = models.FloatField(default=0, null=True) + mineral_supplement_free_price = models.FloatField(default=0, null=True) + mineral_supplement_total_free_price = models.FloatField(default=0, null=True) + vitamin_supplement_free_price = models.FloatField(default=0, null=True) + vitamin_supplement_total_free_price = models.FloatField(default=0, null=True) + vitamin_supplement_percent = models.FloatField(default=0, null=True) + vitamin_Ration_free_supplement_percent = models.FloatField(default=0, null=True) + baking_soda_free_price = models.FloatField(default=0, null=True) + baking_soda_total_free_price = models.FloatField(default=0, null=True) + baking_Ration_soda_free_price = models.FloatField(default=0, null=True) + baking_soda_percent = models.FloatField(default=0, null=True) + Salt_Ration_free_price = models.FloatField(default=0, null=True) + Salt_Ration_total_free_price = models.FloatField(default=0, null=True) + Salt_free_total_price = models.FloatField(default=0, null=True) + Salt_free_price = models.FloatField(default=0, null=True) + Salt_percent = models.FloatField(default=0, null=True) + metiunin_Ration_free_price = models.FloatField(default=0, null=True) + metiunin_free_price = models.FloatField(default=0, null=True) + metiunin_total_free_price = models.FloatField(default=0, null=True) + metiunin_percent = models.FloatField(default=0, null=True) + Lysine_Ration_free_price = models.FloatField(default=0, null=True) + Lysine_free_price = models.FloatField(default=0, null=True) + Lysine_total_free_price = models.FloatField(default=0, null=True) + Lysine_percent = models.FloatField(default=0, null=True) + threonine_free_price = models.FloatField(default=0, null=True) + threonine_total_free_price = models.FloatField(default=0, null=True) + threonine_Ration_free_price = models.FloatField(default=0, null=True) + threonine_percent = models.FloatField(default=0, null=True) + Antifungal_free_price = models.FloatField(default=0, null=True) + Antifungal_total_free_price = models.FloatField(default=0, null=True) + Antifungal_Ration_free_price = models.FloatField(default=0, null=True) + Antifungal_percent = models.FloatField(default=0, null=True) + inulin_free_price = models.FloatField(default=0, null=True) + inulin_total_free_price = models.FloatField(default=0, null=True) + inulin_Ration_free_price = models.FloatField(default=0, null=True) + inulin_percent = models.FloatField(default=0, null=True) + Fire_emulsion_free_price = models.FloatField(default=0, null=True) + Fire_total_emulsion_free_price = models.FloatField(default=0, null=True) + Fire_emulsion_Ration_free_price = models.FloatField(default=0, null=True) + Fire_emulsion_percent = models.FloatField(default=0, null=True) + Colleen_free_price = models.FloatField(default=0, null=True) + Colleen_total_free_price = models.FloatField(default=0, null=True) + Colleen_Ration_free_price = models.FloatField(default=0, null=True) + Colleen_percent = models.FloatField(default=0, null=True) + total_price = models.FloatField(default=0, null=True) + total_Ration_free_price = models.FloatField(default=0, null=True) + Vaccination_period = models.FloatField(default=0, null=True) + Multivitamin_course = models.FloatField(default=0, null=True) + period_chicken = models.FloatField(default=0, null=True) + directors_office = models.FloatField(default=0, null=True) + Water_gas_electricity_period = models.FloatField(default=0, null=True) + Water_gas_the_current_cost_of_the_period_unit = models.FloatField(default=0, null=True) + Course_repairs = models.FloatField(default=0, null=True) + Course_loss = models.FloatField(default=0, null=True) + motfar_ga_durah = models.FloatField(default=0, null=True) + Paper_reel = models.FloatField(default=0, null=True) + Course_disinfection = models.FloatField(default=0, null=True) + Lamp = models.FloatField(default=0, null=True) + total_percent = models.FloatField(default=0, null=True) + total_ration = models.FloatField(default=0, null=True) + chicken_price = models.FloatField(default=0, null=True) + + def save(self, *args, **kwargs): + super(PriceAnalysis, self).save(*args, **kwargs) + + +# مدل مربوط به ثیت نماینده دامپزشک برای کشتارگاه + + +class KillHouseVet(BaseModel): + vet = models.ForeignKey( + Vet, + on_delete=models.CASCADE, + null=True, + related_name="kill_house_vet_user" + ) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + null=True, + related_name="kill_house_vet" + ) + vet_id_foreign_key = models.IntegerField(null=True) + kill_house_id_foreign_key = models.IntegerField(null=True) + kill_house_vet_id_key = models.IntegerField(null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillHouseVet, self).save(*args, **kwargs) + + +# مدل مربوط به تایید بار رسیده به کشتار گاه توسط نماینده دامپزشکی +class VetCheckRequest(BaseModel): + kill_house_vet = models.ForeignKey( + KillHouseVet, + on_delete=models.CASCADE, + null=True, + related_name="kill_house_user_vet" + ) + + kill_house_request = models.ForeignKey( + KillHouseRequest, + on_delete=models.CASCADE, + null=True, + related_name="kill_house_request_vet" + ) + kill_house_vet_id_foreign_key = models.IntegerField(null=True) + kill_house_request_id_foreign_key = models.IntegerField(null=True) + vet_check_request_id_key = models.IntegerField(null=True) + + state = models.CharField(max_length=20, null=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(VetCheckRequest, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت دامپزشک فارم +class VetFarm(BaseModel): + vet = models.ForeignKey( + Vet, + on_delete=models.CASCADE, + related_name="vet_farm_vet", + null=True + ) + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + related_name="vet_farm_poultry", + null=True + ) + vet_id_foreign_key = models.IntegerField(null=True) + poultry_id_foreign_key = models.IntegerField(null=True) + vet_farm_id_key = models.IntegerField(null=True) + + hall = models.IntegerField(default=0) + vetfarm_losses = models.BigIntegerField(default=0) + state = models.CharField(max_length=20, default='pending') + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(VetFarm, self).save(*args, **kwargs) + + +# مدل مربوط به ثبت دامپزشک فارم +class VetFarmInspection(BaseModel): + vet_farm = models.ForeignKey(VetFarm, + on_delete=models.CASCADE, + related_name="vet_farm_inspection", + null=True + ) + poultry_hatching = models.ForeignKey( + PoultryHatching, + on_delete=models.CASCADE, + related_name="vet_farm_inspection_poultry_hatching", + null=True + ) + + vet_farm_id_foreign_key = models.IntegerField(null=True) + poultry_hatching_id_foreign_key = models.IntegerField(null=True) + vet_farm_inspection_id_key = models.IntegerField(null=True) + + hall = models.IntegerField(default=0) + topic = models.CharField(max_length=500, null=True) + description = models.TextField(null=True) + Losses = models.BigIntegerField(default=0) + image = models.JSONField(null=True) + longitude = models.FloatField(default=0) + latitude = models.FloatField(default=0) + state = models.CharField(max_length=20, default='pending') + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(VetFarmInspection, self).save(*args, **kwargs) + + +# مدل مربوط ثبت درخواست مرغ منجمد +class WareHouseFactor(BaseModel): + customer = models.CharField(max_length=50, null=True) + national_code = models.CharField(max_length=20, null=True) + letter_number = models.BigIntegerField(null=True) + letter_number_jahad = models.BigIntegerField(null=True) + date = models.DateTimeField(null=True) + mobile = models.CharField(max_length=11, null=True) + product_type = models.JSONField(default=dict, null=True) + weight = models.FloatField(default=0, null=True) + fee = models.FloatField(default=0, null=True) + wage = models.FloatField(default=0, null=True) + total_wage = models.FloatField(default=0, null=True) + total_fee = models.FloatField(default=0, null=True) + total_cost = models.FloatField(default=0, null=True) + Complications = models.FloatField(default=0, null=True) + tax = models.FloatField(default=0, null=True) + discount = models.FloatField(default=0, null=True) + name_of_bank_user = models.CharField(max_length=200, null=True) + card = models.CharField(max_length=16, null=True) + shaba = models.CharField(max_length=100, null=True) + state = models.CharField(max_length=100, default='pending') + account = models.CharField(max_length=100, null=True) + mark = models.CharField(max_length=100, default='pending') + considerations = models.TextField(null=True) + first_operator = models.ForeignKey( + UserProfile, + on_delete=models.CASCADE, + null=True, + related_name="user_first_operator" + ) + second_operator = models.ForeignKey( + UserProfile, + on_delete=models.CASCADE, + null=True, + related_name="user_second_operator" + ) + + def save(self, *args, **kwargs): + super(WareHouseFactor, self).save(*args, **kwargs) + + +# مدل مربوط به اضافه کردن راننده به کشتاگاه +class DriverRequestCancel(BaseModel): + Kill_house_add_car = models.ForeignKey( + KillHouseADDCAR, + on_delete=models.CASCADE, + related_name="cancel_request_car", + null=True + ) + kill_house_request = models.ForeignKey( + KillHouseRequest, + on_delete=models.CASCADE, + related_name="cancel_request", + null=True + ) + + message = models.TextField(null=True) + + def save(self, *args, **kwargs): + super(DriverRequestCancel, self).save(*args, **kwargs) + + +class PaymentDeadLine(BaseModel): + days = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(PaymentDeadLine, self).save(*args, **kwargs) + + +class MonthlyProfitPercentage(BaseModel): + days = models.IntegerField(default=0) + percent = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(MonthlyProfitPercentage, self).save(*args, **kwargs) + + +class PercentageOfLosses(BaseModel): + houre = models.IntegerField(default=0) + percent = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(PercentageOfLosses, self).save(*args, **kwargs) + + +class KillHousePercentageOfLosses(BaseModel): + percent = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(KillHousePercentageOfLosses, self).save(*args, **kwargs) + + +class KillHouseComplaint(BaseModel): + bar = models.ForeignKey( + KillHouseAssignmentInformation, + on_delete=models.CASCADE, + related_name="bar_information", + null=True + ) + title = models.CharField(max_length=200, null=True) + description = models.TextField() + image = models.JSONField(null=True) + percent = models.FloatField(default=0) + state = models.CharField(max_length=20, default='pending') + message = models.CharField(max_length=20, null=True) + registrar = models.JSONField(null=True) + + def save(self, *args, **kwargs): + super(KillHouseComplaint, self).save(*args, **kwargs) + + +class CheckKillHouseComplaint(BaseModel): + camplaint = models.ForeignKey( + KillHouseComplaint, + on_delete=models.CASCADE, + related_name="check_complaint", + null=True + ) + state = models.CharField(max_length=20, null=True) + message = models.CharField(max_length=20, null=True) + + def save(self, *args, **kwargs): + super(CheckKillHouseComplaint, self).save(*args, **kwargs) + + +class Itransaction(BaseModel): + wallet = models.ForeignKey(Wallet, + related_name="itranseaction_wallet", + on_delete=models.CASCADE, + null=True) + transfer_amount = models.FloatField(null=True) + transaction_type = models.CharField(max_length=20, null=True) + payment_code = models.BigIntegerField(null=True, default=0) + state = models.CharField(max_length=20, default='pending') + make_location_state = models.CharField(max_length=20, null=True) + file_id = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(Itransaction, self).save(*args, **kwargs) + + +class Debt(BaseModel): + cost = models.IntegerField(null=True) + description = models.TextField(null=True) + image = models.CharField(max_length=300, null=True) + itransaction = models.ForeignKey(Itransaction, + related_name="debtor_itransaction", + on_delete=models.CASCADE, + null=True) + + def save(self, *args, **kwargs): + super(Debt, self).save(*args, **kwargs) + + +class Penalty(BaseModel): + cost = models.IntegerField(null=True) + description = models.TextField(null=True) + image = models.CharField(max_length=300, null=True) + itransaction = models.ForeignKey(Itransaction, + related_name="penalty_itransaction", + on_delete=models.CASCADE, + null=True) + + def save(self, *args, **kwargs): + super(Penalty, self).save(*args, **kwargs) + + +class Deposit(BaseModel): + cost = models.IntegerField(null=True) + description = models.TextField(null=True) + image = models.CharField(max_length=300, null=True) + itransaction = models.ForeignKey(Itransaction, + related_name="deposit_itransaction", + on_delete=models.CASCADE, + null=True) + + def save(self, *args, **kwargs): + super(Deposit, self).save(*args, **kwargs) + + +class FinancialDocument(BaseModel): + transaction_details = models.JSONField(null=True) + type = models.CharField(max_length=30, null=True) + cost = models.FloatField(null=True) + description = models.TextField(null=True) + payment_code = models.IntegerField(null=True) + image = models.JSONField(null=True) + wallet = models.ForeignKey(Wallet, + related_name="financial_wallet", + on_delete=models.CASCADE, + null=True) + + def save(self, *args, **kwargs): + super(FinancialDocument, self).save(*args, **kwargs) + + +class FinancialTransaction(BaseModel): + type = models.CharField(max_length=50, null=True) + cost = models.IntegerField(null=True) + description = models.TextField(null=True) + image = models.JSONField(null=True) + itransaction = models.ForeignKey(Itransaction, + related_name="financial_transaction", + on_delete=models.CASCADE, + null=True) + + def save(self, *args, **kwargs): + super(FinancialTransaction, self).save(*args, **kwargs) + + +class Admin(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + null=True, + related_name="user_profile_admin" + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="admin_address", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + admin_id_key = models.IntegerField(null=True) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(Admin, self).save(*args, **kwargs) + + +class CheckUnusualCasualties(BaseModel): + state = models.CharField(max_length=50, null=True) + message = models.TextField(null=True) + complaint = models.ForeignKey(KillHouseComplaint, + on_delete=models.CASCADE, + null=True, + related_name="losses" + ) + role = models.JSONField(null=True) + + def save(self, *args, **kwargs): + super(CheckUnusualCasualties, self).save(*args, **kwargs) + + +# مدل کاربر جهاد +class Jahad(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="jahad_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="jahad_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="jahad_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="jahad_wallet", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + jahad_id_key = models.IntegerField(null=True) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(Jahad, self).save(*args, **kwargs) + + +class CityJahad(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="city_jahad_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="city_jahad_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="city_jahad_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="city_jahad_wallet", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + city_jahad_id_key = models.IntegerField(null=True) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(CityJahad, self).save(*args, **kwargs) + + +class CityPoultry(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="city_poultry_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="city_poultry_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="city_poultry_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="city_poultry_wallet", + null=True + ) + + def save(self, *args, **kwargs): + super(CityPoultry, self).save(*args, **kwargs) + + +class ProteinGuild(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="protein_guild_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="protein_guild_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="protein_guild_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="protein_guild_wallet", + null=True + ) + + def save(self, *args, **kwargs): + super(ProteinGuild, self).save(*args, **kwargs) + + +# مدل کاربر استانداری +class ProvincialGovernment(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="government_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="government_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="government_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="government_wallet", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + provincial_government_id_key = models.IntegerField(null=True) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvincialGovernment, self).save(*args, **kwargs) + + +class VetSupervisor(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="supervisor_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="supervisor_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="supervisor_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="supervisor_wallet", + null=True + ) + vet = models.ForeignKey( + Vet, + on_delete=models.CASCADE, + related_name="vet_supervisor", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + vet_id_foreign_key = models.IntegerField(null=True) + vet_superviser_id_key = models.IntegerField(null=True) + wallet_amount = models.BigIntegerField(default=0) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(VetSupervisor, self).save(*args, **kwargs) + + +class CityVet(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="city_vet_user", + null=True + ) + vet = models.ForeignKey( + Vet, + on_delete=models.CASCADE, + related_name="vet_city_vet", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="city_vet_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="city_vet_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="city_vet_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(CityVet, self).save(*args, **kwargs) + + +class LiveStockSupport(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="live_stock_support_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="live_stock_support_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="live_stock_support_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="live_stock_support_wallet", + null=True + ) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(LiveStockSupport, self).save(*args, **kwargs) + + +class Commerce(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="commerce_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="commerce_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="commerce_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="commerce_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(Commerce, self).save(*args, **kwargs) + + +class CityCommerce(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="city_commerce_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="city_commerce_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="city_commerce_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="city_commerce_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + +class ProvinceSupervisor(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="province_supervisor_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="province_supervisor_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="province_supervisor_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="province_supervisor_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + +class CitySupervisor(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="city_supervisor_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="city_supervisor_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="city_supervisor_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="city_supervisor_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(CitySupervisor, self).save(*args, **kwargs) + + +class JahadInspector(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="jahad_inspector_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="jahad_inspector_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="jahad_inspector_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="jahad_inspector_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(JahadInspector, self).save(*args, **kwargs) + + +class VetCheckAllocations(BaseModel): + vet = models.ForeignKey( + Vet, + on_delete=models.CASCADE, + related_name="vet_check", + null=True + ) + + kill_house_request = models.ForeignKey( + KillHouseRequest, + on_delete=models.CASCADE, + related_name="check_kill_house_request", + null=True + ) + vet_id_foreign_key = models.IntegerField(null=True) + kill_house_request_id_foreign_key = models.IntegerField(null=True) + vet_chick_allocations_id_key = models.IntegerField(null=True) + + # + # province_kill_request = models.ForeignKey( + # ProvinceKillRequest, + # on_delete=models.CASCADE, + # related_name="check_province_kill_request", + # null=True + # ) + # poultry_request = models.ForeignKey( + # PoultryRequest, + # on_delete=models.CASCADE, + # related_name="vet_check_poultry_request", + # null=True + # ) + state = models.CharField(max_length=50, default='pending') + reviewer = models.JSONField(null=True) + + def save(self, *args, **kwargs): + super(VetCheckAllocations, self).save(*args, **kwargs) + + +class HourLimit(BaseModel): + hour = models.IntegerField(null=True) + active = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(HourLimit, self).save(*args, **kwargs) + + +class KillHouseHourLimit(BaseModel): + hour = models.IntegerField(null=True) + active = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(KillHouseHourLimit, self).save(*args, **kwargs) + + +class SmsLicense(BaseModel): + hatching = models.BooleanField(default=False) + poultry_request = models.BooleanField(default=False) + city_approval = models.BooleanField(default=False) + province_approval = models.BooleanField(default=False) + kill_request = models.BooleanField(default=False) + province_kill_request = models.BooleanField(default=False) + farm_veterinarian_approval = models.BooleanField(default=False) + kill_house_request = models.BooleanField(default=False) + kill_house_house_veterinarian_approval = models.BooleanField(default=False) + assingment_information = models.BooleanField(default=False) + confirmation_of_assingment_information = models.BooleanField(default=False) + invoicing = models.BooleanField(default=False) + invoice_payment = models.BooleanField(default=False) + invoice_payment_confirmation = models.BooleanField(default=False) + inspector_approval = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(SmsLicense, self).save(*args, **kwargs) + + +class KillHouseCreditors(BaseModel): + amount = models.FloatField(default=0) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_creditors", + null=True + ) + + def save(self, *args, **kwargs): + super(KillHouseCreditors, self).save(*args, **kwargs) + + +class ProvinceAllowKillHouseRegisterCar(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="province_allow_kill_house_register", + null=True + ) + kill_house_id_foreign_key = models.IntegerField(null=True) + province_allow_kill_house_register_car_id_key = models.IntegerField(null=True) + allow = models.BooleanField(default=False) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvinceAllowKillHouseRegisterCar, self).save(*args, **kwargs) + + +class ProvinceAllowPoultryChooseKillHouse(BaseModel): + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + related_name="province_allow_kill_house_register", + null=True + ) + poultry_id_foreign_key = models.IntegerField(null=True) + province_allow_poultry_choose_kill_house_id_key = models.IntegerField(null=True) + allow = models.BooleanField(default=False) + mandatory = models.BooleanField(default=False) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvinceAllowPoultryChooseKillHouse, self).save(*args, **kwargs) + + +class ProvinceAllowPoultryChooseKillHouseTotal(BaseModel): + allow = models.BooleanField(default=False) + mandatory = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ProvinceAllowPoultryChooseKillHouseTotal, self).save(*args, **kwargs) + + +class FreeSaleWithinprovince(BaseModel): + allow = models.BooleanField(default=False) + type = models.CharField(max_length=20, null=True) + weight = models.FloatField(default=0) + percent = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(FreeSaleWithinprovince, self).save(*args, **kwargs) + + +class ProvinceAllowPoultrySellFree(BaseModel): + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + related_name="province_allow_poultry_sell_free", + null=True + ) + poultry_id_foreign_key = models.IntegerField(null=True) + province_allow_poultry_sell_free_id_key = models.IntegerField(null=True) + allow = models.BooleanField(default=False) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvinceAllowPoultrySellFree, self).save(*args, **kwargs) + + +class ProvinceAllowPoultrySellFreeTotal(BaseModel): + allow = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ProvinceAllowPoultrySellFreeTotal, self).save(*args, **kwargs) + + +class ProvinceAllowKillHouseDirectBuying(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="province_allow_kill_house_direct_buying", + null=True + ) + allow = models.BooleanField(default=False) + export_status = models.BooleanField(default=False) + freezing_status = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ProvinceAllowKillHouseDirectBuying, self).save(*args, **kwargs) + + +class ProvinceAllowKillHouseDirectBuyingTotal(BaseModel): + allow = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ProvinceAllowKillHouseDirectBuyingTotal, self).save(*args, **kwargs) + + +class ProvinceAllowKillHouseRegisterGuilds(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="province_allow_kill_house_register_guilds", + null=True + ) + allow = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ProvinceAllowKillHouseRegisterGuilds, self).save(*args, **kwargs) + + +class ProvinceAllowKillHouseRegisterGuildsTotal(BaseModel): + allow = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ProvinceAllowKillHouseRegisterGuildsTotal, self).save(*args, **kwargs) + + +class KillHouseDailyQuota(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="percent_killhouse_daily_quota", + null=True) + kill_request = models.ForeignKey( + KillRequest, + on_delete=models.CASCADE, + related_name="percent_kill_request_daily_quota", + null=True) + killer_kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="killer_kill_house_daily_quota", + null=True) + + kill_house_id_foreign_key = models.IntegerField(null=True) + kill_request_id_foreign_key = models.IntegerField(null=True) + killer_kill_house_id_foreign_key = models.IntegerField(null=True) + kill_house_daily_quota_id_key = models.IntegerField(null=True) + percent = models.FloatField(default=0) + quantity = models.BigIntegerField(default=0) + remain_quantity = models.BigIntegerField(default=0) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillHouseDailyQuota, self).save(*args, **kwargs) + + +# class ProvinceAutomaticAllocation(BaseModel): +# daily_quota = models.ForeignKey( +# KillHouseDailyQuota, +# on_delete=models.CASCADE, +# related_name="percent_killhouse_daily_quota_province", +# null=True) +# +# poultry_request = models.ForeignKey( +# PoultryRequest, +# on_delete=models.CASCADE, +# related_name="poultry_request_quantity_province", +# null=True) +# quantity = models.BigIntegerField(default=0) +# +# def save(self, *args, **kwargs): +# super(ProvinceAutomaticAllocation, self).save(*args, **kwargs) + + +class ProvinceAutoAllocation(BaseModel): + daily_quota = models.ForeignKey( + KillHouseDailyQuota, + on_delete=models.CASCADE, + related_name="percent_auto_killhouse_daily_quota_province", + null=True) + + poultry_request = models.ForeignKey( + PoultryRequest, + on_delete=models.CASCADE, + related_name="poultry_request_auto_quantity_province", + null=True) + province_kill_request = models.ForeignKey( + ProvinceKillRequest, + on_delete=models.CASCADE, + related_name="province_kill_request_auto_quantity_province", + null=True) + + daily_quota_id_foreign_key = models.IntegerField(null=True) + poultry_request_id_foreign_key = models.IntegerField(null=True) + province_kill_request_id_foreign_key = models.IntegerField(null=True) + province_auto_allocation_id_key = models.IntegerField(null=True) + + unauthorized_number = models.BooleanField(default=False) + + quantity = models.BigIntegerField(default=0) + allocation_order_code = models.BigIntegerField(default=0) + state = models.CharField(max_length=50, default='temporary') + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(ProvinceAutoAllocation, self).save(*args, **kwargs) + + +class AutoAcceptProvinceKillRequest(BaseModel): + allow = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(AutoAcceptProvinceKillRequest, self).save(*args, **kwargs) + + +class AutoMakeKillHouseRequest(BaseModel): + allow = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(AutoMakeKillHouseRequest, self).save(*args, **kwargs) + + +class Hall(models.Model): + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + related_name="poultry_hall", + null=True + ) + + hall_number = models.IntegerField(default=1) + + def save(self, *args, **kwargs): + super(Hall, self).save(*args, **kwargs) + + +class PoultryHallProfile(models.Model): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="user_poultry_profile", + null=True + ) + hall = models.ForeignKey( + Hall, + on_delete=models.CASCADE, + related_name="hall_poultry_profile", + null=True + ) + start_date = models.DateTimeField(null=True) + end_date = models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + super(PoultryHallProfile, self).save(*args, **kwargs) + + +class TypeActivity(BaseModel): + title = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(TypeActivity, self).save(*args, **kwargs) + + +class AreaActivity(BaseModel): + title = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(AreaActivity, self).save(*args, **kwargs) + + +class GuildSteward(BaseModel): + guild = models.ForeignKey('Guilds', on_delete=models.CASCADE, related_name='guild_to_stewards') + steward = models.ForeignKey('Guilds', on_delete=models.CASCADE, related_name='steward_to_guilds') + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + unique_together = ('guild', 'steward') + + def save(self, *args, **kwargs): + super(GuildSteward, self).save(*args, **kwargs) + + +class DistributionUserLevel(BaseModel): + fa_title = models.CharField(max_length=200, null=True) + en_title = models.CharField(max_length=200, null=True) + + def save(self, *args, **kwargs): + super(DistributionUserLevel, self).save(*args, **kwargs) + + +class GuildsGeneralConfigs(BaseModel): + active = models.BooleanField(default=False) + activator = models.CharField(max_length=200, null=True) + out_province_governmental_selling_percent = models.FloatField(default=0) + out_province_free_selling_percent = models.FloatField(default=0) + out_province_free_buying_commitment_percent = models.FloatField(default=0) + in_province_governmental_selling_percent = models.FloatField(default=0) + in_province_free_selling_percent = models.FloatField(default=0) + segmentation_governmental_percent = models.FloatField(default=0) + segmentation_free_selling_percent = models.FloatField(default=0) + cold_house_governmental_percent = models.FloatField(default=0) + cold_house_free_percent = models.FloatField(default=0) + governmental_selling_permission = models.BooleanField(default=False) + free_selling_permission = models.BooleanField(default=False) + free_sale_form_governmental_quota = models.BooleanField(default=False) + free_sale_from_free_quota_in_province = models.BooleanField(default=False) + total_input_warehouse_weight = models.FloatField(default=0) + total_input_warehouse_governmental_weight = models.FloatField(default=0) + total_input_warehouse_free_weight = models.FloatField(default=0) + total_selling_warehouse_governmental_weight = models.FloatField(default=0) + total_selling_warehouse_free_weight = models.FloatField(default=0) + total_remain_warehouse_governmental_weight = models.FloatField(default=0) + total_remain_warehouse_free_weight = models.FloatField(default=0) + total_remain_warehouse_weight = models.FloatField(default=0) + total_selling_in_province_governmental_weight = models.FloatField(default=0) + total_selling_in_province_free_weight = models.FloatField(default=0) + total_selling_out_province_governmental_weight = models.FloatField(default=0) + total_selling_out_province_free_weight = models.FloatField(default=0) + total_segmentation_governmental_weight = models.FloatField(default=0) + total_segmentation_free_weight = models.FloatField(default=0) + total_in_province_governmental_bars_weight = models.FloatField(default=0) + total_in_province_free_bars_weight = models.FloatField(default=0) + total_out_province_buying_bars_weight = models.FloatField(default=0) + total_selling_warehouse_weight = models.FloatField(default=0) + total_segmentation_weight = models.FloatField(default=0) + total_cold_house_weight = models.FloatField(default=0) + total_cold_house_governmental_weight = models.FloatField(default=0) + total_cold_house_free_weight = models.FloatField(default=0) + total_commitment_governmental_weight = models.FloatField(default=0) + total_commitment_free_weight = models.FloatField(default=0) + total_in_province_governmental_bars_commitment_weight = models.FloatField(default=0) + total_in_province_free_bars_commitment_weight = models.FloatField(default=0) + total_out_province_buying_bars_commitment_weight = models.FloatField(default=0) + total_commitment_selling_in_province_governmental_weight = models.FloatField(default=0) + total_commitment_selling_in_province_free_weight = models.FloatField(default=0) + total_commitment_selling_in_province_governmental_remain_weight = models.FloatField(default=0) + total_commitment_selling_in_province_free_remain_weight = models.FloatField(default=0) + total_commitment_selling_out_province_governmental_weight = models.FloatField(default=0) + total_commitment_selling_out_province_free_weight = models.FloatField(default=0) + total_commitment_cold_house_governmental_weight = models.FloatField(default=0) + total_commitment_cold_house_free_weight = models.FloatField(default=0) + total_commitment_segmentation_governmental_weight = models.FloatField(default=0) + total_commitment_segmentation_free_weight = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(GuildsGeneralConfigs, self).save(*args, **kwargs) + + +class Guilds(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="guilds_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="guilds_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="guilds_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="guilds_wallet", + null=True + ) + guild_area_activity = models.ForeignKey( + AreaActivity, + on_delete=models.CASCADE, + related_name="guilds_area_activity", + null=True + ) + guild_type_activity = models.ForeignKey( + TypeActivity, + on_delete=models.CASCADE, + related_name="guilds_type_activity", + null=True + ) + cars = models.ManyToManyField( + Car, + related_name='guild_car', + null=True, blank=True) + kill_house = models.ManyToManyField( + KillHouse, + related_name='guild_kill_houses', + null=True, blank=True) + steward_kill_house = models.ManyToManyField( + KillHouse, + related_name='steward_kill_houses', + null=True, blank=True) + stewards = models.ManyToManyField( + 'self', + through='GuildSteward', + symmetrical=False, + related_name='guild_stewards', blank=True) + user_level = models.ManyToManyField( + DistributionUserLevel, + related_name='guild_user_level', + null=True, blank=True) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + provincial_government_id_key = models.IntegerField(null=True) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + guilds_id = models.CharField(max_length=50, null=True) + license_number = models.CharField(max_length=50, null=True) + guilds_name = models.CharField(max_length=100, null=True) + phone = models.CharField(max_length=100, null=True) + type_activity = models.CharField(max_length=100, null=True) + area_activity = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + steward = models.BooleanField(default=False) + has_pos = models.BooleanField(default=False) + centers_allocation = models.JSONField(null=True) + kill_house_centers_allocation = models.JSONField(null=True) + allocation_limit = models.BigIntegerField(null=True) + limitation_allocation = models.BooleanField(default=False) + # province_accept = models.BooleanField(default=True) + registerar_role = models.CharField(max_length=50, null=True) + registerar_fullname = models.CharField(max_length=100, null=True) + registerar_mobile = models.CharField(max_length=11, null=True) + kill_house_register = models.BooleanField(default=False) + steward_register = models.BooleanField(default=False) + guilds_room_register = models.BooleanField(default=False) + pos_company_register = models.BooleanField(default=False) + province_accept_state = models.CharField(max_length=20, default='accepted') + province_message = models.CharField(max_length=500, null=True) + condition = models.CharField(max_length=500, null=True) + description_condition = models.TextField(null=True) + steward_active = models.BooleanField(default=True) + steward_allocation_limit = models.BigIntegerField(null=True) + steward_limitation_allocation = models.BooleanField(default=False) + license = models.BooleanField(default=False) + license_form = models.CharField(max_length=500, null=True) + license_file = models.CharField(max_length=500, null=True) + reviewer_role = models.CharField(max_length=50, null=True) + reviewer_fullname = models.CharField(max_length=100, null=True) + reviewer_mobile = models.CharField(max_length=11, null=True) + checker_message = models.TextField(null=True) + final_accept = models.BooleanField(default=False) + temporary_registration = models.BooleanField(default=False) + role_activation = models.CharField(max_length=100, null=True) + register_code = models.CharField(max_length=100, null=True) + logged_register_code = models.CharField(max_length=100, null=True) + active_register_code = models.BooleanField(default=False) + expire_time_register_code = models.DateTimeField(null=True) + register_date_register_code = models.DateTimeField(null=True) + is_registered = models.BooleanField(default=False) + out_province_governmental_selling_percent = models.FloatField(default=0) + out_province_free_selling_percent = models.FloatField(default=0) + out_province_free_buying_commitment_percent = models.FloatField(default=0) + in_province_governmental_selling_percent = models.FloatField(default=0) + in_province_free_selling_percent = models.FloatField(default=0) + segmentation_governmental_percent = models.FloatField(default=0) + segmentation_free_selling_percent = models.FloatField(default=0) + cold_house_governmental_percent = models.FloatField(default=0) + cold_house_free_percent = models.FloatField(default=0) + governmental_selling_permission = models.BooleanField(default=False) + free_selling_permission = models.BooleanField(default=False) + free_sale_form_governmental_quota = models.BooleanField(default=False) + free_sale_from_free_quota_in_province = models.BooleanField(default=False) + total_input_warehouse_weight = models.FloatField(default=0) + total_input_warehouse_governmental_weight = models.FloatField(default=0) + total_input_warehouse_free_weight = models.FloatField(default=0) + total_selling_warehouse_governmental_weight = models.FloatField(default=0) + total_selling_warehouse_free_weight = models.FloatField(default=0) + total_remain_warehouse_governmental_weight = models.FloatField(default=0) + total_remain_warehouse_free_weight = models.FloatField(default=0) + total_remain_warehouse_weight = models.FloatField(default=0) + total_selling_in_province_governmental_weight = models.FloatField(default=0) + total_selling_in_province_free_weight = models.FloatField(default=0) + total_selling_out_province_governmental_weight = models.FloatField(default=0) + total_selling_out_province_free_weight = models.FloatField(default=0) + total_segmentation_governmental_weight = models.FloatField(default=0) + total_segmentation_free_weight = models.FloatField(default=0) + total_in_province_governmental_bars_weight = models.FloatField(default=0) + total_in_province_free_bars_weight = models.FloatField(default=0) + total_out_province_buying_bars_weight = models.FloatField(default=0) + pos_allocated_weight = models.FloatField(default=0) + pos_governmental_allocated_weight = models.FloatField(default=0) + pos_free_allocated_weight = models.FloatField(default=0) + total_selling_warehouse_weight = models.FloatField(default=0) + total_segmentation_weight = models.FloatField(default=0) + total_cold_house_weight = models.FloatField(default=0) + total_cold_house_governmental_weight = models.FloatField(default=0) + total_cold_house_free_weight = models.FloatField(default=0) + ware_house_archive_weight = models.FloatField(default=0) + ware_house_archive_governmental_weight = models.FloatField(default=0) + ware_house_archive_free_weight = models.FloatField(default=0) + total_commitment_governmental_weight = models.FloatField(default=0) + total_commitment_free_weight = models.FloatField(default=0) + total_in_province_governmental_bars_commitment_weight = models.FloatField(default=0) + total_in_province_free_bars_commitment_weight = models.FloatField(default=0) + total_out_province_buying_bars_commitment_weight = models.FloatField(default=0) + total_commitment_selling_in_province_governmental_weight = models.FloatField(default=0) + total_commitment_selling_in_province_free_weight = models.FloatField(default=0) + total_commitment_selling_in_province_governmental_remain_weight = models.FloatField(default=0) + total_commitment_selling_in_province_free_remain_weight = models.FloatField(default=0) + total_commitment_selling_out_province_governmental_weight = models.FloatField(default=0) + total_commitment_selling_out_province_free_weight = models.FloatField(default=0) + total_commitment_cold_house_governmental_weight = models.FloatField(default=0) + total_commitment_cold_house_free_weight = models.FloatField(default=0) + total_commitment_segmentation_governmental_weight = models.FloatField(default=0) + total_commitment_segmentation_free_weight = models.FloatField(default=0) + license_type = models.CharField(max_length=100, null=True) # نوع مجوز + license_status = models.CharField(max_length=50, null=True) # وضعیت مجوز + license_issue_date = models.DateTimeField(null=True) # تاریخ صدور مجوز + license_expire_date = models.DateTimeField(null=True) # تاریخ انقضا مجوز + company_name = models.CharField(max_length=200, null=True) # نام شرکت + union_name = models.CharField(max_length=200, null=True) + national_code = models.CharField(max_length=200, null=True) + phone_number = models.CharField(max_length=200, null=True) + company_identifier = models.CharField(max_length=100, null=True) # شناسه شرکت + is_foreign_national = models.BooleanField(default=False) # آیا اتباع است + has_partner = models.BooleanField(default=False) # آیا شریک دارد + has_inquiry = models.BooleanField(default=False) # آیا استعلام دارد + is_real_person = models.BooleanField(default=True) # حقیقی یا حقوقی + + def save(self, *args, **kwargs): + self.total_segmentation_weight = self.total_segmentation_governmental_weight + self.total_segmentation_free_weight + self.total_cold_house_weight = self.total_cold_house_governmental_weight + self.total_cold_house_free_weight + self.total_input_warehouse_governmental_weight = self.total_in_province_governmental_bars_weight + self.total_input_warehouse_free_weight = self.total_in_province_free_bars_weight + self.total_out_province_buying_bars_weight + self.total_input_warehouse_weight = self.total_input_warehouse_governmental_weight + self.total_input_warehouse_free_weight + self.total_selling_warehouse_governmental_weight = self.total_selling_in_province_governmental_weight + self.total_selling_out_province_governmental_weight + self.total_segmentation_governmental_weight + self.total_cold_house_governmental_weight + self.pos_governmental_allocated_weight + self.total_selling_warehouse_free_weight = self.total_selling_in_province_free_weight + self.total_selling_out_province_free_weight + self.total_segmentation_free_weight + self.total_cold_house_free_weight + self.pos_free_allocated_weight + self.total_selling_warehouse_weight = self.total_selling_warehouse_governmental_weight + self.total_selling_warehouse_free_weight + self.total_remain_warehouse_governmental_weight = ( + self.total_input_warehouse_governmental_weight - self.total_selling_warehouse_governmental_weight) - self.ware_house_archive_governmental_weight + self.total_remain_warehouse_free_weight = ( + self.total_input_warehouse_free_weight - self.total_selling_warehouse_free_weight) - self.ware_house_archive_free_weight + self.total_remain_warehouse_weight = self.total_input_warehouse_weight - self.total_selling_warehouse_weight + self.total_commitment_selling_in_province_governmental_weight = int( + self.total_input_warehouse_governmental_weight * (self.in_province_governmental_selling_percent / 100)) + self.total_commitment_selling_out_province_governmental_weight = int(( + self.out_province_governmental_selling_percent / 100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + self.total_commitment_cold_house_governmental_weight = int(( + self.cold_house_governmental_percent / 100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + self.total_commitment_segmentation_governmental_weight = int(( + self.segmentation_governmental_percent / 100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + self.total_commitment_selling_in_province_free_weight = int( + self.total_input_warehouse_free_weight * (self.in_province_free_selling_percent / 100)) + self.total_commitment_selling_out_province_free_weight = int(( + self.out_province_free_selling_percent / 100) * self.total_input_warehouse_free_weight) if self.free_selling_permission else 0 + self.total_commitment_cold_house_free_weight = int(( + self.cold_house_free_percent / 100) * self.total_input_warehouse_free_weight) if self.free_selling_permission else 0 + self.total_commitment_segmentation_free_weight = int(( + self.segmentation_free_selling_percent / 100) * self.total_input_warehouse_free_weight) if self.free_selling_permission else 0 + self.total_commitment_selling_in_province_governmental_remain_weight = self.total_commitment_selling_in_province_governmental_weight - self.total_selling_in_province_governmental_weight if ( + self.total_commitment_selling_in_province_governmental_weight - self.total_selling_in_province_governmental_weight) > 0 else 0 + self.total_commitment_selling_in_province_free_remain_weight = self.total_commitment_selling_in_province_free_weight - self.total_selling_in_province_free_weight if ( + self.total_commitment_selling_in_province_free_weight - self.total_selling_in_province_free_weight) > 0 else 0 + super(Guilds, self).save(*args, **kwargs) + + +class GuildLegalPersonDetail(BaseModel): + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="legal_person_details", + null=True, + blank=True, + ) + status = models.BooleanField(default=False) + status_code = models.IntegerField(default=0) + api_log_id = models.CharField(max_length=100, null=True, blank=True) + + legal_person_info_dto_id = models.CharField(max_length=100, null=True, blank=True) + parent_legal_person_id = models.CharField(max_length=100, null=True, blank=True) + successful = models.BooleanField(default=False) + message = models.TextField(null=True, blank=True) + name = models.CharField(max_length=300, null=True, blank=True) + national_code = models.CharField(max_length=20, null=True, blank=True) + post_code = models.CharField(max_length=20, null=True, blank=True) + address = models.TextField(null=True, blank=True) + legal_person_type = models.CharField(max_length=100, null=True, blank=True) + register_number = models.CharField(max_length=100, null=True, blank=True) + register_unit = models.CharField(max_length=100, null=True, blank=True) + register_date = models.CharField(max_length=100, null=True, blank=True) + register_date_unix = models.BigIntegerField(default=0) + residency = models.CharField(max_length=100, null=True, blank=True) + state = models.CharField(max_length=100, null=True, blank=True) + is_settle = models.BooleanField(default=False) + settle_date = models.CharField(max_length=100, null=True, blank=True) + is_break_up = models.BooleanField(default=False) + break_up_date = models.CharField(max_length=100, null=True, blank=True) + is_branch = models.BooleanField(default=False) + branch_list = models.JSONField(null=True, blank=True) + parent_legal_person_raw = models.JSONField(null=True, blank=True) + establishment_date = models.CharField(max_length=100, null=True, blank=True) + is_db_result = models.BooleanField(default=False) + service_type = models.IntegerField(default=0) + + parent_name = models.CharField(max_length=300, null=True, blank=True) + parent_national_code = models.CharField(max_length=20, null=True, blank=True) + parent_post_code = models.CharField(max_length=20, null=True, blank=True) + parent_address = models.TextField(null=True, blank=True) + parent_legal_person_type = models.CharField(max_length=100, null=True, blank=True) + parent_register_number = models.CharField(max_length=100, null=True, blank=True) + parent_register_unit = models.CharField(max_length=100, null=True, blank=True) + parent_register_date = models.CharField(max_length=100, null=True, blank=True) + parent_register_date_unix = models.BigIntegerField(default=0) + parent_residency = models.CharField(max_length=100, null=True, blank=True) + parent_state = models.CharField(max_length=100, null=True, blank=True) + parent_is_settle = models.BooleanField(default=False) + parent_settle_date = models.CharField(max_length=100, null=True, blank=True) + parent_is_break_up = models.BooleanField(default=False) + parent_break_up_date = models.CharField(max_length=100, null=True, blank=True) + parent_is_branch = models.BooleanField(default=False) + parent_branch_list = models.JSONField(null=True, blank=True) + parent_establishment_date = models.CharField(max_length=100, null=True, blank=True) + parent_is_db_result = models.BooleanField(default=False) + parent_service_type = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(GuildLegalPersonDetail, self).save(*args, **kwargs) + + +class GuildsWareHouse(BaseModel): + guilds = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="ware_house_guilds", + null=True) + bar_quantity = models.BigIntegerField(default=0) + allocated_quantity = models.BigIntegerField(default=0) + number_of_carcasses = models.BigIntegerField(default=0) + real_number_of_carcasses = models.BigIntegerField(default=0) + weight_of_carcasses = models.FloatField(default=0) + real_weight_of_carcasses = models.FloatField(default=0) + ave_weight_of_carcasses = models.FloatField(default=0) + allocated_total_number_of_carcasses = models.BigIntegerField(default=0) + allocated_total_weight_of_carcasses = models.FloatField(default=0) + remain_total_number_of_carcasses = models.BigIntegerField(default=0) + remain_total_weight_of_carcasses = models.FloatField(default=0) + final_registration = models.BooleanField(default=False) + date = models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + self.remain_total_number_of_carcasses = ( + self.number_of_carcasses - self.allocated_total_number_of_carcasses) if self.real_number_of_carcasses == 0 else ( + self.real_number_of_carcasses - self.allocated_total_number_of_carcasses) + self.remain_total_weight_of_carcasses = ( + self.weight_of_carcasses - self.allocated_total_weight_of_carcasses) if self.real_weight_of_carcasses == 0 else ( + self.real_weight_of_carcasses - self.allocated_total_weight_of_carcasses) + super(GuildsWareHouse, self).save(*args, **kwargs) + + +class Steward(BaseModel): + guilds = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="steward_guilds", + null=True + ) + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="steward_user", + null=True + ) + active = models.BooleanField(default=True) + allocation_limit = models.BigIntegerField(null=True) + limitation_allocation = models.BooleanField(default=False) + centers_allocation = models.JSONField(null=True) + kill_house_register = models.BooleanField(default=False) + province_accept_state = models.CharField(max_length=20, default='accepted') + city = models.CharField(max_length=100, null=True) + out_province_free_selling_percent = models.FloatField(default=0) + out_province_free_buying_commitment_percent = models.FloatField(default=0) + in_province_governmental_selling_percent = models.FloatField(default=0) + in_province_free_selling_percent = models.FloatField(default=0) + segmentation_governmental_percent = models.FloatField(default=0) + segmentation_free_selling_percent = models.FloatField(default=0) + cold_house_governmental_percent = models.FloatField(default=0) + cold_house_free_percent = models.FloatField(default=0) + governmental_selling_permission = models.BooleanField(default=False) + free_selling_permission = models.BooleanField(default=False) + free_sale_form_governmental_quota = models.BooleanField(default=False) + free_sale_from_free_quota_in_province = models.BooleanField(default=False) + total_input_warehouse_weight = models.FloatField(default=0) + total_input_warehouse_governmental_weight = models.FloatField(default=0) + total_input_warehouse_free_weight = models.FloatField(default=0) + total_selling_warehouse_governmental_weight = models.FloatField(default=0) + total_selling_warehouse_free_weight = models.FloatField(default=0) + total_remain_warehouse_governmental_weight = models.FloatField(default=0) + total_remain_warehouse_free_weight = models.FloatField(default=0) + total_remain_warehouse_weight = models.FloatField(default=0) + total_selling_in_province_governmental_weight = models.FloatField(default=0) + total_selling_in_province_free_weight = models.FloatField(default=0) + total_selling_out_province_governmental_weight = models.FloatField(default=0) + total_selling_out_province_free_weight = models.FloatField(default=0) + total_segmentation_governmental_weight = models.FloatField(default=0) + total_segmentation_free_weight = models.FloatField(default=0) + total_in_province_governmental_bars_weight = models.FloatField(default=0) + total_in_province_free_bars_weight = models.FloatField(default=0) + total_out_province_buying_bars_weight = models.FloatField(default=0) + pos_allocated_weight = models.FloatField(default=0) + pos_governmental_allocated_weight = models.FloatField(default=0) + pos_free_allocated_weight = models.FloatField(default=0) + total_selling_warehouse_weight = models.FloatField(default=0) + total_segmentation_weight = models.FloatField(default=0) + total_cold_house_weight = models.FloatField(default=0) + total_cold_house_governmental_weight = models.FloatField(default=0) + total_cold_house_free_weight = models.FloatField(default=0) + ware_house_archive_weight = models.FloatField(default=0) + ware_house_archive_governmental_weight = models.FloatField(default=0) + ware_house_archive_free_weight = models.FloatField(default=0) + total_commitment_governmental_weight = models.FloatField(default=0) + total_commitment_free_weight = models.FloatField(default=0) + total_in_province_governmental_bars_commitment_weight = models.FloatField(default=0) + total_in_province_free_bars_commitment_weight = models.FloatField(default=0) + total_out_province_buying_bars_commitment_weight = models.FloatField(default=0) + total_commitment_selling_in_province_governmental_weight = models.FloatField(default=0) + total_commitment_selling_in_province_free_weight = models.FloatField(default=0) + total_commitment_selling_in_province_governmental_remain_weight = models.FloatField(default=0) + total_commitment_selling_in_province_free_remain_weight = models.FloatField(default=0) + total_commitment_selling_out_province_governmental_weight = models.FloatField(default=0) + total_commitment_selling_out_province_free_weight = models.FloatField(default=0) + total_commitment_cold_house_governmental_weight = models.FloatField(default=0) + total_commitment_cold_house_free_weight = models.FloatField(default=0) + total_commitment_segmentation_governmental_weight = models.FloatField(default=0) + total_commitment_segmentation_free_weight = models.FloatField(default=0) + + # province_accept = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + self.total_segmentation_weight = self.total_segmentation_governmental_weight + self.total_segmentation_free_weight + self.total_cold_house_weight = self.total_cold_house_governmental_weight + self.total_cold_house_free_weight + self.total_input_warehouse_governmental_weight = self.total_in_province_governmental_bars_weight + self.total_input_warehouse_free_weight = self.total_in_province_free_bars_weight + self.total_out_province_buying_bars_weight + self.total_input_warehouse_weight = self.total_input_warehouse_governmental_weight + self.total_input_warehouse_free_weight + self.total_selling_warehouse_governmental_weight = self.total_selling_in_province_governmental_weight + self.total_selling_out_province_governmental_weight + self.total_segmentation_governmental_weight + self.total_cold_house_governmental_weight + self.pos_governmental_allocated_weight + self.total_selling_warehouse_free_weight = self.total_selling_in_province_free_weight + self.total_selling_out_province_free_weight + self.total_segmentation_free_weight + self.total_cold_house_free_weight + self.pos_free_allocated_weight + self.total_selling_warehouse_weight = self.total_selling_warehouse_governmental_weight + self.total_selling_warehouse_free_weight + self.total_remain_warehouse_governmental_weight = ( + self.total_input_warehouse_governmental_weight - self.total_selling_warehouse_governmental_weight) - self.ware_house_archive_governmental_weight + self.total_remain_warehouse_free_weight = ( + self.total_input_warehouse_free_weight - self.total_selling_warehouse_free_weight) - self.ware_house_archive_free_weight + self.total_remain_warehouse_weight = self.total_input_warehouse_weight - self.total_selling_warehouse_weight + self.total_commitment_selling_in_province_governmental_weight = int( + self.total_input_warehouse_governmental_weight * (self.in_province_governmental_selling_percent / 100)) + self.total_commitment_selling_out_province_governmental_weight = int(( + self.out_province_governmental_selling_percent / 100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + self.total_commitment_cold_house_governmental_weight = int(( + self.cold_house_governmental_percent / 100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + self.total_commitment_segmentation_governmental_weight = int(( + self.segmentation_governmental_percent / 100) * self.total_input_warehouse_governmental_weight) if self.governmental_selling_permission else 0 + self.total_commitment_selling_in_province_free_weight = int( + self.total_input_warehouse_free_weight * (self.in_province_free_selling_percent / 100)) + self.total_commitment_selling_out_province_free_weight = int(( + self.out_province_free_selling_percent / 100) * self.total_input_warehouse_free_weight) if self.free_selling_permission else 0 + self.total_commitment_cold_house_free_weight = int(( + self.cold_house_free_percent / 100) * self.total_input_warehouse_free_weight) if self.free_selling_permission else 0 + self.total_commitment_segmentation_free_weight = int(( + self.segmentation_free_selling_percent / 100) * self.total_input_warehouse_free_weight) if self.free_selling_permission else 0 + self.total_commitment_selling_in_province_governmental_remain_weight = self.total_commitment_selling_in_province_governmental_weight - self.total_selling_in_province_governmental_weight if ( + self.total_commitment_selling_in_province_governmental_weight - self.total_selling_in_province_governmental_weight) > 0 else 0 + self.total_commitment_selling_in_province_free_remain_weight = self.total_commitment_selling_in_province_free_weight - self.total_selling_in_province_free_weight if ( + self.total_commitment_selling_in_province_free_weight - self.total_selling_in_province_free_weight) > 0 else 0 + super(Steward, self).save(*args, **kwargs) + + +class StewardWareHouse(BaseModel): + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="ware_house_steward", + null=True) + bar_quantity = models.BigIntegerField(default=0) + allocated_quantity = models.BigIntegerField(default=0) + number_of_carcasses = models.BigIntegerField(default=0) + real_number_of_carcasses = models.BigIntegerField(default=0) + weight_of_carcasses = models.FloatField(default=0) + real_weight_of_carcasses = models.FloatField(default=0) + free_bar_quantity = models.BigIntegerField(default=0) + number_of_free_carcasses = models.BigIntegerField(default=0) + weight_of_free_carcasses = models.FloatField(default=0) + ave_weight_of_carcasses = models.FloatField(default=0) + allocated_total_number_of_carcasses = models.BigIntegerField(default=0) + allocated_total_weight_of_carcasses = models.FloatField(default=0) + remain_total_number_of_carcasses = models.BigIntegerField(default=0) + remain_total_weight_of_carcasses = models.FloatField(default=0) + final_registration = models.BooleanField(default=False) + free_sale_quantity = models.BigIntegerField(default=0) + free_sale_weight = models.FloatField(default=0) + + date = models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + super(StewardWareHouse, self).save(*args, **kwargs) + + +class Dispenser(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="dispenser_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="dispenser_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="dispenser_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="dispenser_wallet", + null=True + ) + + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="dispenser_kill_house", + null=True + ) + + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="dispenser_guild", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="dispenser_steward", + null=True + ) + dispenser_type = models.CharField(max_length=100, null=True) + limitation_amount = models.FloatField(default=0) + car = models.CharField(max_length=100, null=True) + pelak = models.CharField(max_length=100, null=True) + registrar = models.CharField(max_length=200, null=True) + active = models.BooleanField(default=True) + free_sale = models.BooleanField(default=False) + free_guilds = models.BooleanField(default=False) + free_stewards = models.BooleanField(default=False) + in_use = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(Dispenser, self).save(*args, **kwargs) + + +class DispenserInformation(BaseModel): + dispenser = models.ForeignKey( + Dispenser, + on_delete=models.CASCADE, + related_name="dispenser_info_user", + null=True + ) + + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="dispenser_info_kill_house", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="dispenser_info_steward", + null=True + ) + fullname = models.CharField(max_length=200, null=True) + national_id = models.CharField(max_length=200, null=True) + first_name = models.CharField(max_length=200, null=True) + last_name = models.CharField(max_length=200, null=True) + mobile = models.CharField(max_length=11, null=True) + city = models.CharField(max_length=300, null=True) + province = models.CharField(max_length=300, null=True) + active = models.BooleanField(default=True) + limitation = models.BooleanField(default=False) + free_limitation = models.BooleanField(default=False) + governmental_limitation = models.BooleanField(default=False) + governmental_limitation_weight = models.FloatField(default=0) + free_limitation_weight = models.FloatField(default=0) + total_selling_warehouse_governmental_weight = models.FloatField(default=0) + total_selling_warehouse_free_weight = models.FloatField(default=0) + total_selling_warehouse_weight = models.FloatField(default=0) + def save(self, *args, **kwargs): + super(DispenserInformation, self).save(*args, **kwargs) + + +class NewProduct(BaseModel): + product_id = models.IntegerField(default=0) + name = models.CharField(max_length=200, null=True) + image = models.CharField(max_length=500, null=True) + sale_type = models.CharField(max_length=100, null=True) + sale_type_package_weight = models.FloatField(default=0) + approved_price_status = models.BooleanField(default=False) + approved_price = models.IntegerField(default=0) + sale_limitation_status = models.BooleanField(default=False) + sale_limitation_maximum_weight_status = models.BooleanField(default=False) + sale_limitation_maximum_weight = models.FloatField(default=0) + sale_limitation_maximum_package_status = models.BooleanField(default=False) + sale_limitation_maximum_package = models.FloatField(default=0) + sale_limitation_maximum_number_of_purchases_status = models.BooleanField(default=False) + sale_limitation_maximum_number_of_purchases = models.FloatField(default=0) + sale_limitation_maximum_number_of_purchases_type = models.CharField(max_length=100, null=True) + sale_limitation_maximum_inquiry_status = models.BooleanField(default=False) + sale_limitation_maximum_inquiry_type = models.CharField(max_length=100, null=True) + Conventional_sales_status = models.BooleanField(default=False) + Conventional_sales_weight = models.FloatField(default=0) + Conventional_sales_package = models.FloatField(default=0) + selling_more_than_inventory = models.BooleanField(default=False) + parent = models.ForeignKey( + 'self', + on_delete=models.CASCADE, + related_name="child", + null=True + ) + + def save(self, *args, **kwargs): + super(NewProduct, self).save(*args, **kwargs) + + +class RolesProducts(BaseModel): + parent_product = models.ForeignKey( + NewProduct, + on_delete=models.CASCADE, + related_name="roles_products_new_product", + null=True + ) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="roles_products_kill_house", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="roles_products_steward", + null=True + ) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="roles_products_guild", + null=True + ) + name = models.CharField(max_length=300, null=True) + province_governmental_carcasses_quantity = models.BigIntegerField(default=0) + province_governmental_carcasses_weight = models.BigIntegerField(default=0) + province_free_carcasses_quantity = models.BigIntegerField(default=0) + province_free_carcasses_weight = models.BigIntegerField(default=0) + receive_governmental_carcasses_quantity = models.BigIntegerField(default=0) + receive_governmental_carcasses_weight = models.BigIntegerField(default=0) + receive_free_carcasses_quantity = models.BigIntegerField(default=0) + receive_free_carcasses_weight = models.BigIntegerField(default=0) + free_buying_carcasses_quantity = models.BigIntegerField(default=0) + free_buying_carcasses_weight = models.BigIntegerField(default=0) + total_governmental_carcasses_quantity = models.BigIntegerField(default=0) + total_governmental_carcasses_weight = models.BigIntegerField(default=0) + total_free_bars_carcasses_quantity = models.BigIntegerField(default=0) + total_free_bars_carcasses_weight = models.BigIntegerField(default=0) + weight_average = models.FloatField(default=0) + total_carcasses_quantity = models.BigIntegerField(default=0) + total_carcasses_weight = models.BigIntegerField(default=0) + freezing_quantity = models.BigIntegerField(default=0) + freezing_weight = models.BigIntegerField(default=0) + loss_weight = models.BigIntegerField(default=0) + out_province_allocated_quantity = models.BigIntegerField(default=0) + out_province_allocated_weight = models.BigIntegerField(default=0) + province_allocated_quantity = models.BigIntegerField(default=0) + province_allocated_weight = models.BigIntegerField(default=0) + province_governmental_allocated_weight = models.BigIntegerField(default=0) + province_free_allocated_weight = models.BigIntegerField(default=0) + real_allocated_quantity = models.BigIntegerField(default=0) + real_allocated_weight = models.BigIntegerField(default=0) + cold_house_allocated_weight = models.BigIntegerField(default=0) + pos_allocated_weight = models.BigIntegerField(default=0) + segmentation_weight = models.BigIntegerField(default=0) + ware_house_archive_weight = models.BigIntegerField(default=0) + total_remain_quantity = models.BigIntegerField(default=0) + total_remain_weight = models.BigIntegerField(default=0) + free_price = models.IntegerField(default=0) + approved_price = models.IntegerField(default=0) + approved_price_status = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + self.total_governmental_carcasses_quantity = self.province_governmental_carcasses_quantity + self.receive_governmental_carcasses_quantity + self.total_governmental_carcasses_weight = self.province_governmental_carcasses_weight + self.receive_governmental_carcasses_weight + self.total_free_bars_carcasses_quantity = self.province_free_carcasses_quantity + self.receive_free_carcasses_quantity + self.free_buying_carcasses_quantity + self.total_free_bars_carcasses_weight = self.province_free_carcasses_weight + self.receive_free_carcasses_weight + self.free_buying_carcasses_weight + self.total_carcasses_quantity = self.total_governmental_carcasses_quantity + self.total_free_bars_carcasses_quantity + self.total_carcasses_weight = self.total_governmental_carcasses_weight + self.total_free_bars_carcasses_weight + self.real_allocated_quantity = self.province_allocated_quantity + self.out_province_allocated_quantity + self.freezing_quantity + self.real_allocated_weight = self.province_allocated_weight + self.out_province_allocated_weight + self.loss_weight + self.cold_house_allocated_weight + self.segmentation_weight + int( + self.pos_allocated_weight / 1000) + self.total_remain_quantity = self.total_carcasses_quantity - self.real_allocated_quantity + self.total_remain_weight = ( + self.total_carcasses_weight - self.real_allocated_weight) - self.ware_house_archive_weight + self.weight_average = round(self.total_carcasses_weight / self.total_carcasses_quantity, + 2) if self.total_carcasses_quantity > 0 else 0 + super(RolesProducts, self).save(*args, **kwargs) + + +class OtherProducts(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="other_products_kill_house", + null=True + ) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="other_products_guild", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="other_products_steward", + null=True + ) + name = models.CharField(max_length=300, null=True) + unit = models.CharField(max_length=100, default='kg') + targetunit = models.CharField(max_length=100, default='g') + image = models.CharField(max_length=500, null=True) + price = models.BigIntegerField(default=0) + active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(OtherProducts, self).save(*args, **kwargs) + + +class BaseOutProvinceCarcassesBuyer(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="base_buyer_user", + null=True) + fullname = models.CharField(max_length=200, null=True) + national_id = models.CharField(max_length=200, null=True) + first_name = models.CharField(max_length=200, null=True) + last_name = models.CharField(max_length=200, null=True) + mobile = models.CharField(max_length=11, null=True) + unit_name = models.CharField(max_length=300, null=True) + city = models.CharField(max_length=300, null=True) + province = models.CharField(max_length=300, null=True) + isRealPerson = models.BooleanField( + default=True, + verbose_name="حقیقی=True / حقوقی=False") + status = models.BooleanField(default=False) + statusCode = models.IntegerField(null=True, blank=True) + legalPersonInfoDtoId = models.CharField( + max_length=100, + null=True, + blank=True) + parentLegalPersonId = models.CharField( + max_length=100, + null=True, + blank=True) + successful = models.BooleanField(default=False) + message = models.TextField(null=True, blank=True) + name = models.CharField(max_length=300, null=True, blank=True) + nationalCode = models.CharField( + max_length=20, + null=True, + blank=True) + postCode = models.CharField( + max_length=20, + null=True, + blank=True) + address = models.TextField(null=True, blank=True) + legalPersonType = models.CharField( + max_length=100, + null=True, + blank=True) + registerNumber = models.CharField(max_length=50, null=True, blank=True) + registerUnit = models.CharField(max_length=100, null=True, blank=True) + registerDate = models.CharField(max_length=50, null=True, blank=True) + registerDateUnix = models.BigIntegerField(null=True, blank=True) + residency = models.CharField(max_length=100, null=True, blank=True) + state = models.CharField(max_length=100, null=True, blank=True) + isSettle = models.BooleanField(default=False) + settleDate = models.CharField(max_length=50, null=True, blank=True) + isBreakUp = models.BooleanField(default=False) + breakUpdate = models.CharField(max_length=50, null=True, blank=True) + isBranch = models.BooleanField(default=False) + branchList = models.TextField(null=True, blank=True) + establishmentDate = models.CharField(max_length=50, null=True, blank=True) + isDbResult = models.BooleanField(default=False) + serviceType = models.IntegerField(null=True, blank=True) + parentLegalPersonInfoDtoId = models.CharField( + max_length=100, + null=True, + blank=True) + parentLegalPersonParentId = models.CharField( + max_length=100, + null=True, + blank=True) + parentLegalPersonSuccessful = models.BooleanField(default=False) + parentLegalPersonMessage = models.TextField(null=True, blank=True) + parentLegalPersonName = models.CharField( + max_length=300, + null=True, + blank=True) + parentLegalPersonNationalCode = models.CharField( + max_length=20, + null=True, + blank=True) + parentLegalPersonPostCode = models.CharField( + max_length=20, + null=True, + blank=True) + parentLegalPersonAddress = models.TextField(null=True, blank=True) + parentLegalPersonType = models.CharField( + max_length=100, + null=True, + blank=True) + parentLegalPersonRegisterNumber = models.CharField( + max_length=50, + null=True, + blank=True) + parentLegalPersonRegisterUnit = models.CharField( + max_length=100, + null=True, + blank=True) + parentLegalPersonRegisterDate = models.CharField( + max_length=50, + null=True, + blank=True) + parentLegalPersonRegisterDateUnix = models.BigIntegerField( + null=True, + blank=True) + parentLegalPersonResidency = models.CharField( + max_length=100, + null=True, + blank=True) + parentLegalPersonState = models.CharField( + max_length=100, + null=True, + blank=True) + parentLegalPersonIsSettle = models.BooleanField(default=False) + parentLegalPersonSettleDate = models.CharField( + max_length=50, + null=True, + blank=True) + parentLegalPersonIsBreakUp = models.BooleanField(default=False) + parentLegalPersonBreakUpdate = models.CharField( + max_length=50, + null=True, + blank=True) + parentLegalPersonIsBranch = models.BooleanField(default=False) + parentLegalPersonBranchList = models.TextField(null=True, blank=True) + parentLegalPersonEstablishmentDate = models.CharField( + max_length=50, + null=True, + blank=True) + parentLegalPersonIsDbResult = models.BooleanField(default=False) + parentLegalPersonServiceType = models.IntegerField( + null=True, + blank=True) + apiLogId = models.CharField(max_length=100, null=True, blank=True) + active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + self.fullname = self.first_name + " " + self.last_name + super(BaseOutProvinceCarcassesBuyer, self).save(*args, **kwargs) + + +class OutProvinceCarcassesBuyer(BaseModel): + buyer = models.ForeignKey( + BaseOutProvinceCarcassesBuyer, + on_delete=models.CASCADE, + related_name="base_buyer", + null=True) + type_activity = models.ForeignKey( + TypeActivity, + on_delete=models.CASCADE, + related_name="buyer_activity", + null=True) + Kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_buyer", + null=True) + steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="steward_buyer", + null=True) + fullname = models.CharField(max_length=200, null=True) + first_name = models.CharField(max_length=200, null=True) + last_name = models.CharField(max_length=200, null=True) + national_id = models.CharField(max_length=200, null=True) + mobile = models.CharField(max_length=11, null=True) + unit_name = models.CharField(max_length=300, null=True) + city = models.CharField(max_length=300, null=True) + province = models.CharField(max_length=300, null=True) + active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + self.fullname = self.first_name + " " + self.last_name + super(OutProvinceCarcassesBuyer, self).save(*args, **kwargs) + + +class Representative(BaseModel): + + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_representative", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="steward_representative", + null=True + ) + first_name = models.CharField(max_length=200, null=True) + last_name = models.CharField(max_length=200, null=True) + mobile = models.CharField(max_length=15, null=True) + city = models.CharField(max_length=100, null=True) + active = models.BooleanField(default=True) + limitation = models.BooleanField(default=False) + free_limitation = models.BooleanField(default=False) + governmental_limitation = models.BooleanField(default=False) + governmental_limitation_weight = models.FloatField(default=0) + free_limitation_weight = models.FloatField(default=0) + total_selling_warehouse_governmental_weight = models.FloatField(default=0) + total_selling_warehouse_free_weight = models.FloatField(default=0) + total_selling_warehouse_weight = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(Representative, self).save(*args, **kwargs) + + +class KillHouseFreeSaleBarInformation(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="free_sale_bar_info_kill_house", + null=True) + + product = models.ForeignKey( + RolesProducts, + on_delete=models.CASCADE, + related_name="free_sale_bar_info_kill_house_product", + null=True) + buyer = models.ForeignKey( + OutProvinceCarcassesBuyer, + on_delete=models.CASCADE, + related_name="free_sale_bar_info_buyer", + null=True) + dispenser = models.ForeignKey( + Dispenser, + on_delete=models.CASCADE, + related_name="free_sale_bar_info_dispenser", + null=True + ) + representative = models.ForeignKey( + Representative, + on_delete=models.CASCADE, + related_name="free_sale_bar_info_representative", + null=True + ) + registerar_fullname = models.CharField(max_length=100, null=True) + permission_type = models.CharField(max_length=100, null=True) + status = models.CharField(max_length=300, default='pending') + buyer_name = models.CharField(max_length=100, null=True) + buyer_mobile = models.CharField(max_length=11, null=True) + province = models.CharField(max_length=50, null=True) + city = models.CharField(max_length=50, null=True) + driver_name = models.CharField(max_length=100, null=True) + driver_mobile = models.CharField(max_length=11, null=True) + type_car = models.CharField(max_length=100, null=True) + pelak = models.CharField(max_length=100, null=True) + clearance_code = models.CharField(max_length=50, null=True) + number_of_carcasses = models.BigIntegerField(default=0) + weight_of_carcasses = models.FloatField(default=0) + real_number_of_carcasses = models.BigIntegerField(default=0) + real_weight_of_carcasses = models.FloatField(default=0) + quarantine_weight_of_carcasses = models.FloatField(default=0) + accepted_number_of_carcasses = models.BigIntegerField(default=0) + accepted_weight_of_carcasses = models.FloatField(default=0) + date = models.DateTimeField(null=True) + wage = models.FloatField(default=0) + archive_wage = models.BooleanField(default=False) + total_wage_amount = models.BigIntegerField(default=0) + union_share = models.BigIntegerField(default=0) + union_share_percent = models.FloatField(default=0) + company_share = models.BigIntegerField(default=0) + company_share_percent = models.FloatField(default=0) + guilds_share = models.BigIntegerField(default=0) + guilds_share_percent = models.FloatField(default=0) + city_share = models.BigIntegerField(default=0) + city_share_percent = models.FloatField(default=0) + wallet_share = models.BigIntegerField(default=0) + wallet_share_percent = models.FloatField(default=0) + other_share = models.BigIntegerField(default=0) + other_share_percent = models.FloatField(default=0) + calculate_status = models.BooleanField(default=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + sale_type = models.CharField(max_length=20, null=True) + quota = models.CharField(max_length=20, null=True) + warehouse = models.BooleanField(default=True) + registration_code = models.IntegerField(null=True) + logged_registration_code = models.IntegerField(null=True) + expire_date_time_registration_code = models.DateTimeField(null=True) + register_date_time_registration_code = models.DateTimeField(null=True) + active_expire_date_time = models.BooleanField(default=False) + system_registration_code = models.BooleanField(default=False) + expire_time_ten_minute = models.DateTimeField(null=True) + production_date = models.DateTimeField(null=True) + distribution_type = models.CharField(max_length=20, null=True) + amount = models.BigIntegerField(default=0) + total_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(KillHouseFreeSaleBarInformation, self).save(*args, **kwargs) + + +class KillHouseFreeBarInformation(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="free_bar_info_kill_house", + null=True) + exclusive_killer = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="free_bar_info_exclusive_killer", + null=True) + public_killer = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="free_bar_info_public_killer", + null=True) + product = models.ForeignKey( + RolesProducts, + on_delete=models.CASCADE, + related_name="free_bar_info_kill_house_product", + null=True) + input_warehouse = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="free_bar_input_warehouse", + null=True + ) + dispenser = models.ForeignKey( + Dispenser, + on_delete=models.CASCADE, + related_name="free_bar_dispenser", + null=True + ) + representative = models.ForeignKey( + Representative, + on_delete=models.CASCADE, + related_name="free_bar_representative", + null=True + ) + poultry_name = models.CharField(max_length=100, null=True) + poultry_mobile = models.CharField(max_length=11, null=True) + seller_name = models.CharField(max_length=100, null=True) + seller_mobile = models.CharField(max_length=11, null=True) + province = models.CharField(max_length=50, null=True) + city = models.CharField(max_length=50, null=True) + vet_farm_name = models.CharField(max_length=100, null=True) + vet_farm_mobile = models.CharField(max_length=11, null=True) + driver_name = models.CharField(max_length=100, null=True) + driver_mobile = models.CharField(max_length=11, null=True) + car = models.JSONField(null=True) + clearance_code = models.JSONField(null=True) + bar_clearance_code = models.CharField(max_length=100, null=True) + quantity = models.BigIntegerField(default=0) + number_of_carcasses = models.BigIntegerField(default=0) + weight_of_carcasses = models.FloatField(default=0) + kill_house_vet_quantity = models.BigIntegerField(default=0) + kill_house_vet_weight = models.FloatField(default=0) + kill_house_vet_state = models.CharField(max_length=50, default="pending") + date_of_accept_reject = models.DateTimeField(null=True) + acceptor_rejector = models.CharField(max_length=200, null=True) + live_weight = models.FloatField(default=0) + bar_image = models.CharField(max_length=200, null=True) + buy_type = models.CharField(max_length=50, null=True) + ware_house = models.BooleanField(default=False) + date = models.DateTimeField(null=True) + wage = models.FloatField(default=0) + total_wage_amount = models.BigIntegerField(default=0) + union_share = models.BigIntegerField(default=0) + union_share_percent = models.FloatField(default=0) + company_share = models.BigIntegerField(default=0) + company_share_percent = models.FloatField(default=0) + guilds_share = models.BigIntegerField(default=0) + guilds_share_percent = models.FloatField(default=0) + city_share = models.BigIntegerField(default=0) + city_share_percent = models.FloatField(default=0) + wallet_share = models.BigIntegerField(default=0) + wallet_share_percent = models.FloatField(default=0) + other_share = models.BigIntegerField(default=0) + other_share_percent = models.FloatField(default=0) + archive_wage = models.BooleanField(default=False) + weight_loss = models.FloatField(default=0) + calculate_status = models.BooleanField(default=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + entered_message = models.TextField(null=True) + bar_code = models.BigIntegerField(null=True) + register_type = models.CharField(max_length=250, default='manual') + register_date = models.DateTimeField(null=True) + warehouse = models.BooleanField(default=True) + warehouse_commitment_weight = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(KillHouseFreeBarInformation, self).save(*args, **kwargs) + + +class StewardFreeBarInformation(BaseModel): + steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="free_bar_info_steward", + null=True) + stewards = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="free_bar_info_stewards", + null=True) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="free_bar_info_guild", + null=True) + product = models.ForeignKey( + RolesProducts, + on_delete=models.CASCADE, + related_name="free_bar_info_steward_product", + null=True) + dispenser = models.ForeignKey( + Dispenser, + on_delete=models.CASCADE, + related_name="free_bar_info_steward_dispenser", + null=True + ) + representative = models.ForeignKey( + Representative, + on_delete=models.CASCADE, + related_name="free_bar_info_steward_representative", + null=True + ) + kill_house_name = models.CharField(max_length=100, null=True) + kill_house_mobile = models.CharField(max_length=11, null=True) + kill_house_vet_name = models.CharField(max_length=100, null=True) + kill_house_vet_mobile = models.CharField(max_length=11, null=True) + province = models.CharField(max_length=50, null=True) + city = models.CharField(max_length=50, null=True) + driver_name = models.CharField(max_length=100, null=True) + driver_mobile = models.CharField(max_length=11, null=True) + car = models.CharField(max_length=100, null=True) + pelak = models.CharField(max_length=100, null=True) + number_of_carcasses = models.BigIntegerField(default=0) + weight_of_carcasses = models.FloatField(default=0) + bar_image = models.CharField(max_length=200, null=True) + date = models.DateTimeField(null=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + warehouse = models.BooleanField(default=True) + quota = models.CharField(max_length=20, null=True) + + def save(self, *args, **kwargs): + super(StewardFreeBarInformation, self).save(*args, **kwargs) + + +class StewardFreeSaleBarInformation(BaseModel): + steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="free_sale_bar_info_steward", + null=True) + stewards = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="free_sale_bar_info_stewards", + null=True) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="free_sale_bar_info_guild", + null=True) + + product = models.ForeignKey( + RolesProducts, + on_delete=models.CASCADE, + related_name="free_sale_bar_info_steward_product", + null=True) + buyer = models.ForeignKey( + OutProvinceCarcassesBuyer, + on_delete=models.CASCADE, + related_name="steward_free_sale_bar_info_buyer", + null=True) + dispenser = models.ForeignKey( + Dispenser, + on_delete=models.CASCADE, + related_name="steward_free_sale_bar_info_dispenser", + null=True + ) + representative = models.ForeignKey( + Representative, + on_delete=models.CASCADE, + related_name="steward_free_sale_bar_info_representative", + null=True + ) + buyer_name = models.CharField(max_length=100, null=True) + buyer_mobile = models.CharField(max_length=11, null=True) + province = models.CharField(max_length=50, null=True) + city = models.CharField(max_length=50, null=True) + driver_name = models.CharField(max_length=100, null=True) + driver_mobile = models.CharField(max_length=11, null=True) + type_car = models.CharField(max_length=100, null=True) + pelak = models.CharField(max_length=100, null=True) + clearance_code = models.CharField(max_length=50, null=True) + number_of_carcasses = models.BigIntegerField(default=0) + weight_of_carcasses = models.FloatField(default=0) + date = models.DateTimeField(null=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + warehouse = models.BooleanField(default=True) + quota = models.CharField(max_length=20, null=True) + sale_type = models.CharField(max_length=20, null=True) + registration_code = models.IntegerField(null=True) + logged_registration_code = models.IntegerField(null=True) + expire_date_time_registration_code = models.DateTimeField(null=True) + register_date_time_registration_code = models.DateTimeField(null=True) + active_expire_date_time = models.BooleanField(default=False) + system_registration_code = models.BooleanField(default=False) + expire_time_ten_minute = models.DateTimeField(null=True) + production_date = models.DateTimeField(null=True) + distribution_type = models.CharField(max_length=20, null=True) + + def save(self, *args, **kwargs): + super(StewardFreeSaleBarInformation, self).save(*args, **kwargs) + + +class ColdHouse(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="cold_house_kill_house", + null=True + ) + live_stock_support = models.ForeignKey( + LiveStockSupport, + on_delete=models.CASCADE, + related_name="cold_house_live_stock_support", + null=True + ) + steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="steward_cold_house", + null=True + ) + + name = models.CharField(max_length=500, null=True) + province = models.CharField(max_length=200, null=True) + city = models.CharField(max_length=200, null=True) + address = models.CharField(max_length=500, null=True) + total_quantity = models.BigIntegerField(default=0) + total_weight = models.FloatField(default=0) + total_input_weight = models.BigIntegerField(default=0) + total_allocated_weight = models.BigIntegerField(default=0) + total_remain_weight = models.BigIntegerField(default=0) + active = models.BooleanField(default=True) + broadcast = models.BooleanField(default=True) + relocate = models.BooleanField(default=True) + capacity = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + self.total_remain_weight = self.total_input_weight - self.total_allocated_weight + super(ColdHouse, self).save(*args, **kwargs) + + +class StewardAllocation(BaseModel): + ware_house = models.ForeignKey( + KillHouseWareHouse, + on_delete=models.CASCADE, + related_name="ware_house_steward_allocation", + null=True + ) + steward_ware_house = models.ForeignKey( + StewardWareHouse, + on_delete=models.CASCADE, + related_name="steward_ware_house_steward_guilds_allocation", + null=True + ) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_steward_allocation", + null=True + ) + steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="steward_steward_allocation", + null=True + ) + + guilds = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="steward_allocation_guilds", + null=True + ) + to_steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="allocation_to_steward", + null=True + ) + to_guilds = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="allocation_to_guilds", + null=True + ) + to_kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="allocation_to_kill_house", + null=True + ) + + to_cold_house = models.ForeignKey( + ColdHouse, + on_delete=models.CASCADE, + related_name="allocation_to_cold_house", + null=True + ) + other_cold_house = models.ForeignKey( + ColdHouse, + on_delete=models.CASCADE, + related_name="allocation_to_other_cold_house", + null=True + ) + + car = models.ForeignKey( + Car, + on_delete=models.CASCADE, + related_name="steward_allocation_car", + null=True + ) + dispenser = models.ForeignKey( + Dispenser, + on_delete=models.CASCADE, + related_name="allocation_dispenser", + null=True + ) + representative = models.ForeignKey( + Representative, + on_delete=models.CASCADE, + related_name="allocation_representative", + null=True + ) + product = models.ForeignKey( + RolesProducts, + on_delete=models.CASCADE, + related_name="allocation_product", + null=True + ) + number_of_carcasses = models.BigIntegerField(default=0) + real_number_of_carcasses = models.BigIntegerField(default=0) + receiver_real_number_of_carcasses = models.BigIntegerField(default=0) + weight_of_carcasses = models.FloatField(default=0) + real_weight_of_carcasses = models.FloatField(default=0) + receiver_real_weight_of_carcasses = models.FloatField(default=0) + weight_loss_of_carcasses = models.FloatField(default=0) + final_registration = models.BooleanField(default=False) + sell_type = models.CharField(max_length=100, null=True) + product_name = models.CharField(max_length=200, null=True) + seller_type = models.CharField(max_length=100, null=True) + type = models.CharField(max_length=100, null=True) + sale_type = models.CharField(max_length=100, null=True) + allocation_type = models.CharField(max_length=100, null=True) + system_registration_code = models.BooleanField(default=False) + registration_code = models.IntegerField(null=True) + amount = models.BigIntegerField(default=0) + total_amount = models.BigIntegerField(default=0) + total_amount_paid = models.BigIntegerField(default=0) + total_amount_remain = models.BigIntegerField(default=0) + logged_registration_code = models.IntegerField(null=True) + state = models.CharField(max_length=50, default='pending') + receiver_state = models.CharField(max_length=50, default='pending') + allocation_state = models.CharField(max_length=50, default='pending') + date = models.DateTimeField(null=True) + role = models.JSONField(null=True) + steward_temp_key = models.IntegerField(null=True) + approved_price_status = models.BooleanField(default=True) + calculate_status = models.BooleanField(default=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + overhead = models.BooleanField(default=False) + image = models.CharField(max_length=500, null=True) + quota = models.CharField(max_length=20, null=True) + warehouse = models.BooleanField(default=True) + steward_warehouse = models.BooleanField(default=True) + expire_date_time_registration_code = models.DateTimeField(null=True) + register_date_time_registration_code = models.DateTimeField(null=True) + active_expire_date_time = models.BooleanField(default=False) + return_trash = models.BooleanField(default=False) + return_trash_date = models.DateTimeField(null=True) + returner_trash = models.CharField(max_length=200, null=True) + interface_number = models.CharField(max_length=11, null=True) + expire_time_ten_minute = models.DateTimeField(null=True) + production_date = models.DateTimeField(null=True) + distribution_type = models.CharField(max_length=20, null=True) + Settlement_type = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + # allow = AllowRegisterCodeForStewardAllocation.objects.filter(trash=False, active=True).first() + # if allow: + # if allow and self.registration_code and self.expire_date_time_registration_code is None: + # self.expire_date_time_registration_code = datetime.now() + timedelta(minutes=int(allow.time)) + # self.active_expire_date_time = True + self.total_amount_remain = self.total_amount - self.total_amount_paid if self.total_amount - self.total_amount_paid > 0 else 0 + super(StewardAllocation, self).save(*args, **kwargs) + + +class AutomaticStewardAllocation(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_automatic_allocation", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="automatic_steward_allocation", + null=True + ) + guilds = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="automatic_guilds_allocation", + null=True + ) + number_of_carcasses = models.BigIntegerField(default=0) + real_number_of_carcasses = models.BigIntegerField(default=0) + weight_of_carcasses = models.FloatField(default=0) + real_weight_of_carcasses = models.FloatField(default=0) + final_registration = models.BooleanField(default=False) + registration_code = models.IntegerField(null=True) + logged_registration_code = models.IntegerField(null=True) + state = models.CharField(max_length=50, default='pending') + date = models.DateTimeField(null=True) + role = models.JSONField(null=True) + + def save(self, *args, **kwargs): + super(AutomaticStewardAllocation, self).save(*args, **kwargs) + + +class ProvinceAllowKillHouseChooseStewardGuilds(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="allow_kill_house_steward_guilds", + null=True + ) + + steward = models.BooleanField(default=False) + guilds = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ProvinceAllowKillHouseChooseStewardGuilds, self).save(*args, **kwargs) + + +class LastUpdate(models.Model): + poultry_hatching = models.JSONField(null=True) + update_date = models.DateTimeField(null=True) + + +class HatchingLossesPermission(BaseModel): + percent = models.FloatField(default=0) + allow = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(HatchingLossesPermission, self).save(*args, **kwargs) + + +class WagePayment(BaseModel): + province_kill_request = models.JSONField(null=True) + payment_type = models.CharField(max_length=50, null=True) + type = models.CharField(max_length=100, null=True) + total_amount = models.BigIntegerField(default=0) + total_amount_with_tax = models.BigIntegerField(default=0) + payer = models.JSONField(null=True) + tracking_code = models.CharField(max_length=100, null=True) + refId = models.CharField(max_length=100, null=True) + orderId = models.CharField(max_length=100, null=True) + authority = models.CharField(max_length=100, null=True) + cardHolderPan = models.CharField(max_length=100, null=True) + payer_info = models.CharField(max_length=200, null=True) + state = models.CharField(max_length=20, default='pending') + message = models.TextField(null=True) + link_pay = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(WagePayment, self).save(*args, **kwargs) + + +class KillHousePurchaseRequest(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_purchase_request", + null=True + ) + allow = models.BooleanField(default=True) + limitation = models.BooleanField(default=False) + total_limitation = models.BooleanField(default=False) + limitation_number = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(KillHousePurchaseRequest, self).save(*args, **kwargs) + + +class Observatory(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="observatory_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="observatory_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="observatory_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="observatory_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(Observatory, self).save(*args, **kwargs) + + +class PosCompany(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="pos_company_user", + null=True + ) + name = models.CharField(max_length=100, null=True) + active = models.BooleanField(default=True) + en_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(PosCompany, self).save(*args, **kwargs) + + +class PosDeviceVersion(BaseModel): + company = models.ForeignKey( + PosCompany, + on_delete=models.CASCADE, + related_name="pos_version_company", + null=True + ) + name = models.CharField(max_length=200, null=True) + code = models.IntegerField() + description = models.TextField(null=True) + enable = models.BooleanField(default=True) + remove = models.BooleanField(default=False) + link = models.TextField(null=True) + checksum = models.TextField(null=True) + + def save(self, *args, **kwargs): + super(PosDeviceVersion, self).save(*args, **kwargs) + + class Meta: + unique_together = ('company', 'code') + + +class POSId(BaseModel): + pos_id = models.CharField(max_length=12, null=True) + info = models.JSONField(null=True) + + def save(self, *args, **kwargs): + super(POSId, self).save(*args, **kwargs) + + + + +class POSMachine(BaseModel): + pos_id = models.CharField(max_length=12, null=True) + pos_unique_id = models.CharField(max_length=6, unique=True, null=True) + token = models.CharField(max_length=36, null=True) + receiver_number = models.CharField(max_length=100, null=True) + terminal_number = models.CharField(max_length=100, null=True) + active = models.BooleanField(default=True) + multi_device = models.BooleanField(default=False) + server_register = models.BooleanField(default=False) + Lat = models.FloatField(null=True) + Long = models.FloatField(null=True) + company_name = models.CharField(max_length=200, null=True) + last_check = models.DateTimeField(null=True) + serial = models.TextField(default="") + mac = models.CharField(max_length=50, null=True) + password = models.CharField(max_length=10, null=True) + ip = models.CharField(max_length=15, default='0.0.0.0') + name = models.TextField(default="") + sdk = models.TextField(default="") + version = models.IntegerField(default=0) + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="user_pos", + null=True + ) + + owner = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="owned_pos", + null=True + ) + + current_user = models.ForeignKey( + SystemUserProfile, + on_delete=models.SET_NULL, + null=True, + related_name="current_pos" + ) + current_dispenser = models.ForeignKey( + SystemUserProfile, + on_delete=models.SET_NULL, + null=True, + related_name="current_dispenser_pos" + ) + current_representative = models.ForeignKey( + Representative, + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name="representative_pos" + ) + pos_company = models.ForeignKey( + PosCompany, + on_delete=models.CASCADE, + related_name="company_pos", + null=True + ) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_pos", + null=True + ) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="guild_pos", + null=True + ) + + cooperative = models.ForeignKey( + Cooperative, + on_delete=models.CASCADE, + related_name="cooperative_pos", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="steward_pos", + null=True + ) + dispenser = models.ForeignKey( + Dispenser, + on_delete=models.CASCADE, + related_name="dispenser_pos", + null=True + ) + + def save(self, *args, **kwargs): + super(POSMachine, self).save(*args, **kwargs) + + +class POSAccessLevel(BaseModel): + pos = models.ForeignKey(POSMachine, on_delete=models.CASCADE, related_name='access_levels') + name = models.CharField(max_length=100, null=True) + in_province_sale = models.BooleanField(default=True) + out_province_sale = models.BooleanField(default=True) + cutting = models.BooleanField(default=True) + freezing = models.BooleanField(default=True) + warehouse = models.BooleanField(default=True) + retail = models.BooleanField(default=True) + active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(POSAccessLevel, self).save(*args, **kwargs) + + +class POSAuditLog(models.Model): + ACTION_CHOICES = ( + ('CHANGE_OWNER', 'تغییر مالک'), + ('CHANGE_CURRENT_USER', 'تغییر توزیع کننده'), + ('CHANGE_CURRENT_REPRESENTATIVE', 'تغییر نماینده'), + ('ACCESSLEVEL_UPDATE', 'بروزرسانی سطح دسترسی'), + ) + pos = models.ForeignKey(POSMachine, on_delete=models.CASCADE, related_name='audit_logs') + action = models.CharField(max_length=50, choices=ACTION_CHOICES) + performed = models.ForeignKey(SystemUserProfile, on_delete=models.SET_NULL, null=True) + old_value = models.JSONField(null=True, blank=True) + new_value = models.JSONField(null=True, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + description = models.TextField(null=True, blank=True) + + def save(self, *args, **kwargs): + super(POSAuditLog, self).save(*args, **kwargs) + + +class POSDeviceSession(BaseModel): + pos = models.ForeignKey( + POSMachine, + on_delete=models.CASCADE, + related_name="pos_device_session", + null=True, + ) + pos_unique_id = models.CharField(max_length=6, unique=True, null=True) + version = models.IntegerField() + mac = models.CharField(max_length=50) + name = models.TextField(default="") + sdk = models.TextField(default="") + serial = models.TextField(default="") + ip = models.CharField(max_length=15, default='0.0.0.0') + password = models.CharField(max_length=10) + session_create_date = models.DateTimeField(default=datetime.now()) + session_last_seen_date = models.DateTimeField(default=datetime.now()) + lng = models.FloatField(default=0) + lot = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(POSDeviceSession, self).save(*args, **kwargs) + + +class POSTransactions(BaseModel): + pos_machine = models.ForeignKey( + POSMachine, + on_delete=models.CASCADE, + related_name="pos_machine_transaction", + null=True + ) + + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="user_pos_transaction", + null=True + ) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_pos_transaction", + null=True + ) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="guild_pos_transaction", + null=True + ) + cooperative = models.ForeignKey( + Cooperative, + on_delete=models.CASCADE, + related_name="cooperative_pos_transaction", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="steward_pos_transaction", + null=True + ) + cart = models.CharField(max_length=20, null=True) + mobile = models.CharField(max_length=20, null=True) + terminal = models.CharField(max_length=100, null=True) + posid = models.CharField(max_length=100, null=True) + result = models.CharField(max_length=500, null=True) + refnum = models.CharField(max_length=200, null=True) + resnum = models.CharField(max_length=200, null=True) + natcode = models.CharField(max_length=20, null=True) + fullname = models.CharField(max_length=200, null=True) + buy_date = models.BigIntegerField(null=True) + date = models.BigIntegerField(null=True) + product = models.JSONField(null=True) + state = models.IntegerField(null=True) + amount = models.FloatField(null=True) + price = models.FloatField(null=True) + lng = models.FloatField(null=True) + lot = models.FloatField(null=True) + checkout = models.BooleanField(null=True) + registered = models.BooleanField(null=True) + paid = models.BooleanField(null=True) + + def save(self, *args, **kwargs): + super(POSTransactions, self).save(*args, **kwargs) + + +class AdditionalProducts(BaseModel): + name = models.CharField(max_length=200, null=True) + image = models.CharField(max_length=500, null=True) + unit_of_measurement = models.CharField(max_length=20, null=True) + selling_free_price = models.BooleanField(default=False) + selling_approved_price = models.BooleanField(default=False) + selling_more_than_inventory = models.BooleanField(default=False) + selling_other_products = models.BooleanField(default=False) + price = models.FloatField(default=0) + priority = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(AdditionalProducts, self).save(*args, **kwargs) + + +class Product(BaseModel): + name = models.CharField(max_length=200, null=True) + image = models.CharField(max_length=500, null=True) + unit_of_measurement = models.CharField(max_length=20, null=True) + quantity = models.BigIntegerField(default=0) + priority = models.IntegerField(default=0) + sale_quantity = models.BigIntegerField(default=0) + extra_sale_quantity = models.BigIntegerField(default=0) + remain_quantity = models.BigIntegerField(default=0) + weight = models.FloatField(default=0) + sale_weight = models.FloatField(default=0) + extra_sale_weight = models.FloatField(default=0) + remain_weight = models.FloatField(default=0) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_product", + null=True + ) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="guild_product", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="steward_product", + null=True + ) + selling_free_price = models.BooleanField(default=False) + selling_approved_price = models.BooleanField(default=False) + selling_more_than_inventory = models.BooleanField(default=False) + selling_other_products = models.BooleanField(default=False) + general = models.BooleanField(default=False) + show = models.BooleanField(default=False) + price = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(Product, self).save(*args, **kwargs) + + +class PosVersion(BaseModel): + build_id = models.BigIntegerField(default=0) + latest_downloadlink = models.TextField() + + def save(self, *args, **kwargs): + super(PosVersion, self).save(*args, **kwargs) + + +class PosItem(BaseModel): + name = models.CharField(max_length=100, null=True) + value = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(PosItem, self).save(*args, **kwargs) + + +class GuildRoom(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="guild_room_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="guild_room_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="guild_room_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="guild_room_wallet", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(GuildRoom, self).save(*args, **kwargs) + + +class EvacuationPermit(BaseModel): + type = models.CharField(max_length=100, default='optional') + + def save(self, *args, **kwargs): + super(EvacuationPermit, self).save(*args, **kwargs) + + +class SellForFreezing(BaseModel): + permission = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(SellForFreezing, self).save(*args, **kwargs) + + +class ColdHouseAllocations(BaseModel): + cold_house = models.ForeignKey( + ColdHouse, + on_delete=models.CASCADE, + related_name="cold_house_allocations_cold_house", + null=True + ) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="cold_house_allocations_kill_house", + null=True + ) + kill_house_request = models.ForeignKey( + KillHouseRequest, + on_delete=models.CASCADE, + related_name="cold_house_allocations_kill_house_request", + null=True + ) + kill_house_ware_house = models.ForeignKey( + KillHouseWareHouse, + on_delete=models.CASCADE, + related_name="cold_house_allocations_kill_house_ware_house", + null=True + ) + product = models.ForeignKey( + RolesProducts, + on_delete=models.CASCADE, + related_name="cold_house_allocations_product", + null=True + ) + quantity = models.BigIntegerField(default=0) + accepted_quantity = models.BigIntegerField(default=0) + real_quantity = models.BigIntegerField(default=0) + weight = models.FloatField(default=0) + accepted_weight = models.FloatField(default=0) + real_weight = models.FloatField(default=0) + state = models.CharField(max_length=20, default='pending') + allocation_type = models.CharField(max_length=50, null=True) + reviewer = models.JSONField(null=True) + date = models.DateTimeField(null=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ColdHouseAllocations, self).save(*args, **kwargs) + + +class OperationLimitation(BaseModel): + vet_farm_out_province_limitation = models.BooleanField(default=False) + province_allocation_limitation = models.BooleanField(default=False) + kill_house_allocation_limitation = models.BooleanField(default=False) + kill_house_assignment_limitation = models.BooleanField(default=False) + vet_check_kill_house_assignment_limitation = models.BooleanField(default=False) + kill_house_input_bar_limitation = models.BooleanField(default=False) + kill_house_steward_guild_allocation_limitation = models.BooleanField(default=False) + kill_house_freezing_limitation = models.BooleanField(default=False) + kill_house_free_sale_limitation = models.BooleanField(default=False) + kill_house_free_buy_limitation = models.BooleanField(default=False) + kill_house_vet_limitation = models.BooleanField(default=False) + vet_farm_limitation = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(OperationLimitation, self).save(*args, **kwargs) + + +class ApprovedPrice(BaseModel): + approved = models.BooleanField(default=False) + lowest_price = models.FloatField(default=0) + highest_price = models.FloatField(default=0) + lowest_weight = models.FloatField(default=0) + highest_weight = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(ApprovedPrice, self).save(*args, **kwargs) + + +class Announcements(BaseModel): + active = models.BooleanField(default=False) + description = models.TextField(max_length=2000, null=True) + role = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(Announcements, self).save(*args, **kwargs) + + +class ChickenAgeRange(BaseModel): + active = models.BooleanField(default=False) + maximum = models.IntegerField(default=0) + minimum = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(ChickenAgeRange, self).save(*args, **kwargs) + + +class TimeRange(BaseModel): + time_range = models.JSONField(null=True) + + def save(self, *args, **kwargs): + super(TimeRange, self).save(*args, **kwargs) + + +class SystemWallet(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="system_wallet_kill_house", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="system_wallet_steward", + null=True + ) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="system_wallet_guild", + null=True + ) + balance = models.BigIntegerField(default=0) + active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(SystemWallet, self).save(*args, **kwargs) + + +class SuperAdmin(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="super_admin_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="super_admin_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="super_admin_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="super_admin_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(SuperAdmin, self).save(*args, **kwargs) + + +class PaymentGatewayPercentage(BaseModel): + company = models.IntegerField(default=0) + union = models.IntegerField(default=0) + guilds = models.IntegerField(default=0) + other = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(PaymentGatewayPercentage, self).save(*args, **kwargs) + + +class TotalPaymentGatewayPercentage(BaseModel): + company = models.IntegerField(default=0) + union = models.IntegerField(default=0) + guilds = models.IntegerField(default=0) + other = models.IntegerField(default=0) + type = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(TotalPaymentGatewayPercentage, self).save(*args, **kwargs) + + +class SlaughterHouseTransaction(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="slaughter_house_transaction_kill_house", + null=True + ) + parent_kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="slaughter_house_transaction_parent_kill_house", + null=True + ) + amount = models.BigIntegerField(default=0) + amount_with_tax = models.BigIntegerField(default=0) + transaction = models.IntegerField(null=True) + type = models.CharField(max_length=100, null=True) + state = models.CharField(max_length=20, default='pending') + union_share = models.BigIntegerField(default=0) + company_share = models.BigIntegerField(default=0) + guilds_share = models.BigIntegerField(default=0) + city_share = models.BigIntegerField(default=0) + wallet_share = models.BigIntegerField(default=0) + other_share = models.BigIntegerField(default=0) + pay_type = models.CharField(max_length=200, null=True) + saleReferenceId = models.CharField(max_length=100, null=True) + refId = models.CharField(max_length=100, null=True) + orderId = models.CharField(max_length=100, null=True) + cardHolderPan = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(SlaughterHouseTransaction, self).save(*args, **kwargs) + + +class ShareType(BaseModel): + name = models.CharField(max_length=500, null=True) + en_name = models.CharField(max_length=500, null=True) + account_id = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(ShareType, self).save(*args, **kwargs) + + +class WageType(BaseModel): + name = models.CharField(max_length=500, null=True) + en_name = models.CharField(max_length=500, null=True) + amount = models.BigIntegerField(default=0) + status = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(WageType, self).save(*args, **kwargs) + + +class PercentageOfWageType(BaseModel): + wage_type = models.ForeignKey( + WageType, + on_delete=models.CASCADE, + related_name="wage_type_percentage", + null=True + ) + share_type = models.ForeignKey( + ShareType, + on_delete=models.CASCADE, + related_name="share_type_percentage", + null=True + ) + percent = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(PercentageOfWageType, self).save(*args, **kwargs) + + +class SubSectorPercentageOfWageType(BaseModel): + percentage_of_wage_type = models.ForeignKey( + PercentageOfWageType, + on_delete=models.CASCADE, + related_name="sub_sector_wage_type", + null=True + ) + city = models.BooleanField(default=False) + percent = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(SubSectorPercentageOfWageType, self).save(*args, **kwargs) + + +class TotalWageInformation(BaseModel): + total_amount = models.BigIntegerField(default=0) + total_unpaid_amount = models.BigIntegerField(default=0) + total_paid_amount = models.BigIntegerField(default=0) + total_weight = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(TotalWageInformation, self).save(*args, **kwargs) + + +class InternalTransaction(BaseModel): + date = models.DateTimeField(auto_now_add=True) + amount = models.BigIntegerField(default=0) + amount_with_tax = models.BigIntegerField(default=0) + status = models.CharField(max_length=100, default='pending') + transaction_type = models.CharField(max_length=100, null=True) + type = models.CharField(max_length=100, null=True) + payer_type = models.CharField(max_length=100, null=True) + message = models.TextField(null=True) + saleReferenceId = models.CharField(max_length=100, null=True) + refId = models.CharField(max_length=100, null=True) + authority = models.CharField(max_length=100, null=True) + orderId = models.CharField(max_length=100, null=True) + cardHolderPan = models.CharField(max_length=100, null=True) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + null=True, + related_name="internal_transaction_kill_house_user" + ) + parent_kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="internal_transaction_parent_kill_house", + null=True + ) + chain_company = models.ForeignKey( + ChainCompany, + on_delete=models.CASCADE, + null=True, + related_name="internal_transaction_chain_company_user" + ) + poultry_request = models.ManyToManyField( + PoultryRequest, + related_name='poutry_request_transactions', + null=True, blank=True) + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + null=True, + related_name="internal_transaction_poultry" + ) + out_province_poultry_request_buyer = models.ForeignKey( + OutProvincePoultryRequestBuyer, + on_delete=models.CASCADE, + null=True, + related_name="internal_transaction_out_province_poultry_request_buyer" + ) + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + null=True, + related_name="internal_transaction_user" + ) + + union_share = models.BigIntegerField(default=0) + union_account = models.CharField(max_length=50, null=True) + company_share = models.BigIntegerField(default=0) + company_account = models.CharField(max_length=50, null=True) + guilds_share = models.BigIntegerField(default=0) + guilds_account = models.CharField(max_length=50, null=True) + city_share = models.BigIntegerField(default=0) + city_account = models.CharField(max_length=50, null=True) + wallet_share = models.BigIntegerField(default=0) + wallet_account = models.CharField(max_length=50, null=True) + other_share = models.BigIntegerField(default=0) + other_account = models.CharField(max_length=50, null=True) + link_pay = models.BooleanField(default=False) + description = models.TextField(null=True) + image = models.CharField(max_length=500, null=True) + payer_fullname = models.CharField(max_length=200, null=True) + payer_mobile = models.CharField(max_length=11, null=True) + temporary_trash = models.BooleanField(default=False) + temporary_deleted = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(InternalTransaction, self).save(*args, **kwargs) + + +class CityLivestock(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="city_livestock_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="city_livestock_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="city_livestock_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="city_livestock_wallet", + null=True + ) + user_id_foreign_key = models.IntegerField(null=True) + address_id_foreign_key = models.IntegerField(null=True) + user_bank_id_foreign_key = models.IntegerField(null=True) + wallet_id_foreign_key = models.IntegerField(null=True) + city_jahad_id_key = models.IntegerField(null=True) + identity_documents = models.JSONField(null=True) + active = models.BooleanField(default=True) + city_number = models.IntegerField(default=0) + city_name = models.CharField(max_length=100, null=True) + province_number = models.IntegerField(default=0) + province_name = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(CityLivestock, self).save(*args, **kwargs) + + +class ImprovingLivestock(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="improving_livestock_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="improving_livestock_address", + null=True + ) + user_bank_info = models.ForeignKey(BankCard, on_delete=models.CASCADE, related_name="improving_livestock_bank_info", + null=True) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="improving_livestock_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(ImprovingLivestock, self).save(*args, **kwargs) + + +class ReportSubmissionTime(BaseModel): + type = models.CharField(max_length=100, null=True) + hour = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(ReportSubmissionTime, self).save(*args, **kwargs) + + +class Reports(BaseModel): + title = models.CharField(max_length=500, null=True) + end_point = models.CharField(max_length=50, null=True) + active = models.BooleanField(default=False) + description = models.TextField(null=True) + + def save(self, *args, **kwargs): + super(Reports, self).save(*args, **kwargs) + + +class ReportsUsers(BaseModel): + active = models.BooleanField(default=True) + firstname = models.CharField(max_length=100, null=True) + lastname = models.CharField(max_length=100, null=True) + fullname = models.CharField(max_length=100, null=True) + city = models.CharField(max_length=100, null=True) + position = models.CharField(max_length=100, null=True) + mobile = models.CharField(max_length=11, null=True) + user_token = models.CharField(max_length=4, null=True, unique=True) + + def save(self, *args, **kwargs): + + self.fullname = self.firstname + " " + self.lastname + if self.user_token is None: + while (True): + res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=3)) + res = base_user_gate_way_id + res + if not ReportsUsers.objects.filter(user_token=res).exists(): + break + self.user_token = res + super(ReportsUsers, self).save(*args, **kwargs) + + +class UserReports(BaseModel): + active = models.BooleanField(default=True) + user = models.ForeignKey( + ReportsUsers, + on_delete=models.CASCADE, + related_name="user_reports_user", + null=True + ) + report = models.ForeignKey( + Reports, + on_delete=models.CASCADE, + related_name="report_user_reports", + null=True + ) + + def save(self, *args, **kwargs): + super(UserReports, self).save(*args, **kwargs) + + +class MovingTextDashboardStatus(BaseModel): + active = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(MovingTextDashboardStatus, self).save(*args, **kwargs) + + +class MovingTextRole(BaseModel): + role = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(MovingTextRole, self).save(*args, **kwargs) + + +class MovingText(BaseModel): + moving_text = models.TextField(null=True) + active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(MovingText, self).save(*args, **kwargs) + + +class MovingTextWithRole(BaseModel): + moving_text = models.ForeignKey( + MovingText, + on_delete=models.CASCADE, + related_name="role_moving_text", + null=True + ) + role = models.ForeignKey( + MovingTextRole, + on_delete=models.CASCADE, + related_name="moving_text_role", + null=True + ) + active = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(MovingTextWithRole, self).save(*args, **kwargs) + + +class AdminX(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="admin_x_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="admin_x_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="admin_x_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="admin_x_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(AdminX, self).save(*args, **kwargs) + + +class Supporter(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="supporter_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="supporter_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="supporter_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="supporter_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(Supporter, self).save(*args, **kwargs) + + +class ZarinPalAccounts(BaseModel): + name = models.CharField(max_length=50, null=True) + en_name = models.CharField(max_length=50, null=True) + account = models.CharField(max_length=50, null=True) + + def save(self, *args, **kwargs): + super(ZarinPalAccounts, self).save(*args, **kwargs) + + +class PoultryExport(BaseModel): + allow = models.BooleanField(default=False) + limitation_status = models.BooleanField(default=False) + limitation = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(PoultryExport, self).save(*args, **kwargs) + + +class PoultryOutProvinceRequest(BaseModel): + allow = models.BooleanField(default=False) + limitation_status = models.BooleanField(default=False) + limitation = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(PoultryOutProvinceRequest, self).save(*args, **kwargs) + + +class VetFarmAggregatePermission(BaseModel): + allow = models.BooleanField(default=False) + limitation = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(VetFarmAggregatePermission, self).save(*args, **kwargs) + + +class KillHouseBarLimitation(BaseModel): + allow = models.BooleanField(default=False) + limitation = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(KillHouseBarLimitation, self).save(*args, **kwargs) + + +class KillHouseStewardGuildRelation(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_relation", + null=True + ) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="guild_relation", + null=True + ) + steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="steward_relation", + null=True + ) + + allocation_limit = models.IntegerField(default=0) + allocation_type = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(KillHouseStewardGuildRelation, self).save(*args, **kwargs) + + +class OutOfProvinceSellingCarcassesPermission(BaseModel): + active = models.BooleanField(default=False) + type = models.CharField(max_length=100, null=True) + percent = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(OutOfProvinceSellingCarcassesPermission, self).save(*args, **kwargs) + + +class ProductPricingType(BaseModel): + province = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ProductPricingType, self).save(*args, **kwargs) + + +class KillHousePricePermission(BaseModel): + allow = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(KillHousePricePermission, self).save(*args, **kwargs) + + +class IranProvinces(models.Model): + name = models.CharField(max_length=250) + slug = models.CharField(max_length=250) + tel_prefix = models.CharField(max_length=3, null=True) + + +class IranCities(models.Model): + name = models.CharField(max_length=250) + slug = models.CharField(max_length=250) + province_id = models.ForeignKey(IranProvinces, on_delete=models.CASCADE) + + +class AutomaticDirectBuyingPermission(models.Model): + allow = models.BooleanField(default=False) + start_time = models.TimeField(null=True) + end_time = models.TimeField(null=True) + + def save(self, *args, **kwargs): + super(AutomaticDirectBuyingPermission, self).save(*args, **kwargs) + + +class AgeNotificationPoultry(BaseModel): + message = models.TextField() + poultry_age = models.CharField(max_length=2) + losses_percent = models.IntegerField(null=True) + + def save(self, *args, **kwargs): + super(AgeNotificationPoultry, self).save(*args, **kwargs) + + +class PosMachineTransactions(BaseModel): + pos = models.ForeignKey( + POSMachine, + on_delete=models.CASCADE, + related_name="roles_products_pos_transactions", + null=True + ) + + product = models.ForeignKey( + RolesProducts, + on_delete=models.CASCADE, + related_name="roles_products_pos_transactions", + null=True + ) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="transaction_kill_house", + null=True + ) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="transaction_guild", + null=True + ) + check_id = models.CharField(max_length=100, null=True, unique=True) + mobile = models.CharField(max_length=100, null=True, blank=True) + natcode = models.CharField(max_length=100, null=True, blank=True) + fullname = models.CharField(max_length=100, null=True, blank=True) + date = models.DateTimeField(null=True) + pos_date = models.BigIntegerField(default=0) + price = models.BigIntegerField(default=0) + price_paid = models.BigIntegerField(default=0) + price_type = models.CharField(max_length=50, null=True, blank=True) + paid = models.BooleanField(default=False) + state = models.IntegerField(default=0) + posProvider = models.CharField(max_length=100, null=True) + result = models.CharField(max_length=1000, null=True) + refnum = models.CharField(max_length=100, null=True, blank=True) + terminal = models.CharField(max_length=100, null=True, blank=True) + cart = models.CharField(max_length=100, null=True, blank=True) + lng = models.FloatField(default=0) + lot = models.FloatField(default=0) + # additional = models.CharField(max_length=200, null=True, blank=True) + additional = models.TextField(null=True, blank=True) + current_price = models.IntegerField(default=0) + checkout = models.BooleanField(default=False) + weight = models.IntegerField(default=0) + hasTry = models.BooleanField(default=False) + live_stock = models.BooleanField(default=False) + warehouse = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(PosMachineTransactions, self).save(*args, **kwargs) + + +class ProductsTransactions(BaseModel): + product = models.ForeignKey( + RolesProducts, + on_delete=models.CASCADE, + related_name="products_transactions_product", + null=True + ) + other_product = models.ForeignKey( + OtherProducts, + on_delete=models.CASCADE, + related_name="products_transactions_other_product", + null=True + ) + transaction = models.ForeignKey( + PosMachineTransactions, + on_delete=models.CASCADE, + related_name="transaction_products_transactions", + null=True + ) + live_stack_products = models.ForeignKey( + LiveStockRolseProduct, + on_delete=models.CASCADE, + related_name="products_transactions_live_stack_products", + null=True + ) + price = models.BigIntegerField(default=0) + cur_price = models.BigIntegerField(default=0) + cur_weight = models.BigIntegerField(default=0) + total_price = models.BigIntegerField(default=0) + price_approved = models.BooleanField(default=False) + name = models.CharField(max_length=300, null=True) + image = models.CharField(max_length=500, null=True) + unit = models.CharField(max_length=10, null=True) + targetunit = models.CharField(max_length=10, null=True) + warehouse = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(ProductsTransactions, self).save(*args, **kwargs) + + +class PosAllocationTransactions(BaseModel): + pos = models.ForeignKey( + POSMachine, + on_delete=models.CASCADE, + related_name="steward_allocation_pos_transactions", + null=True + ) + + allocation = models.ForeignKey( + StewardAllocation, + on_delete=models.CASCADE, + related_name="steward_allocation_transactions", + null=True + ) + check_id = models.CharField(max_length=100, null=True) + date = models.DateTimeField(null=True) + price = models.BigIntegerField(default=0) + paid = models.BooleanField(default=False) + state = models.IntegerField(default=0) + posProvider = models.CharField(max_length=100, null=True) + result = models.TextField(null=True) + refnum = models.CharField(max_length=100, null=True, blank=True) + terminal = models.CharField(max_length=100, null=True, blank=True) + cart = models.CharField(max_length=100, null=True, blank=True) + lng = models.FloatField(default=0) + lot = models.FloatField(default=0) + additional = models.CharField(max_length=200, null=True, blank=True) + + def save(self, *args, **kwargs): + super(PosAllocationTransactions, self).save(*args, **kwargs) + + +class BroadcastPrice(BaseModel): + active = models.BooleanField(default=False) + kill_house_price = models.FloatField(default=0) + steward_price = models.FloatField(default=0) + guild_price = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(BroadcastPrice, self).save(*args, **kwargs) + + +class OutProvinceSaleLimitation(BaseModel): + active = models.BooleanField(default=False) + kill_house = models.FloatField(default=0) + steward = models.FloatField(default=0) + guild = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(OutProvinceSaleLimitation, self).save(*args, **kwargs) + + +class ParentCompany(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="parent_company_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="parent_company_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="parent_company_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="parent_company_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(ParentCompany, self).save(*args, **kwargs) + + +class CityGuild(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="city_guild_user", + null=True + ) + address = models.ForeignKey( + SystemAddress, + on_delete=models.CASCADE, + related_name="city_guild_address", + null=True + ) + user_bank_info = models.ForeignKey( + BankCard, + on_delete=models.CASCADE, + related_name="city_guild_bank_info", + null=True + ) + wallet = models.ForeignKey( + Wallet, + on_delete=models.CASCADE, + related_name="city_guild_wallet", + null=True + ) + + wallet_amount = models.BigIntegerField(default=0) + unit_name = models.CharField(max_length=200, null=True) + + def save(self, *args, **kwargs): + super(CityGuild, self).save(*args, **kwargs) + + +class SubSectorTransactions(BaseModel): + city_operator = models.ForeignKey( + CityOperator, + on_delete=models.CASCADE, + related_name="city_operator_transactions", + null=True + ) + vet = models.ForeignKey( + Vet, + on_delete=models.CASCADE, + related_name="vet_transactions", + null=True + ) + city_guild = models.ForeignKey( + CityGuild, + on_delete=models.CASCADE, + related_name="city_guild_transactions", + null=True + ) + date = models.DateTimeField(null=True) + from_account = models.CharField(max_length=200, null=True) + to_account = models.CharField(max_length=200, null=True) + type = models.CharField(max_length=50, null=True) + amount = models.BigIntegerField(default=0) + image = models.CharField(max_length=500, null=True) + + def save(self, *args, **kwargs): + super(SubSectorTransactions, self).save(*args, **kwargs) + + +class PosSegmentation(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_segmentation", + null=True + ) + steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="steward_segmentation", + null=True + ) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="guild_segmentation", + null=True + ) + product = models.ForeignKey( + RolesProducts, + on_delete=models.CASCADE, + related_name="product_segmentation", + null=True + ) + + to_guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="to_guild_segmentation", + null=True + ) + to_steward = models.ForeignKey( + Steward, + on_delete=models.CASCADE, + related_name="to_steward_segmentation", + null=True + ) + dispenser = models.ForeignKey( + Dispenser, + on_delete=models.CASCADE, + related_name="segmentation_dispenser", + null=True + ) + representative = models.ForeignKey( + Representative, + on_delete=models.CASCADE, + related_name="segmentation_representative", + null=True + ) + date = models.DateTimeField(null=True) + weight = models.BigIntegerField(default=0) + sale_type = models.CharField(max_length=20, null=True) + quota = models.CharField(max_length=20, null=True) + warehouse = models.BooleanField(default=True) + production_date = models.DateTimeField(null=True) + distribution_type = models.CharField(max_length=20, null=True) + amount = models.BigIntegerField(default=0) + total_amount = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(PosSegmentation, self).save(*args, **kwargs) + + +class PoultryPrediction(BaseModel): + poultry = models.ForeignKey( + Poultry, + on_delete=models.CASCADE, + related_name="prediction_poultry", + null=True + ) + date = models.DateTimeField(null=True) + killing_ave_age = models.IntegerField(default=1) + active_left_over = models.IntegerField(default=0) + killing_ave_count = models.IntegerField(default=0) + killing_ave_weight = models.IntegerField(default=0) + killing_loss_weight_percent = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(PoultryPrediction, self).save(*args, **kwargs) + + +class BarDifferenceRequest(BaseModel): + hatching = models.ForeignKey( + PoultryHatching, + on_delete=models.CASCADE, + related_name="difference_hatching", + null=True + ) + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="difference_kill_house", + null=True + ) + state = models.CharField(max_length=20, default='pending') + register_fullname = models.CharField(max_length=200, null=True) + register_mobile = models.CharField(max_length=200, null=True) + register_message = models.TextField(null=True) + quantity = models.IntegerField(default=0) + real_quantity = models.IntegerField(default=0) + weight = models.IntegerField(default=0) + real_weight = models.IntegerField(default=0) + violation_image = models.JSONField(null=True) + acceptor_image = models.JSONField(null=True) + acceptor_fullname = models.CharField(max_length=200, null=True) + acceptor_mobile = models.CharField(max_length=200, null=True) + acceptor_date = models.DateTimeField(null=True) + acceptor_message = models.TextField(null=True) + + def save(self, *args, **kwargs): + super(BarDifferenceRequest, self).save(*args, **kwargs) + + +class CookieSamasat(models.Model): + cookie = models.TextField(null=True) + table_name = models.CharField(max_length=100, null=True, blank=True) + + def save(self, *args, **kwargs): + super(CookieSamasat, self).save(*args, **kwargs) + + +class LiveChickenTransportDetails(BaseModel): + kill_house = models.ForeignKey(KillHouse, on_delete=models.CASCADE, null=True) + hatching = models.ForeignKey(PoultryHatching, on_delete=models.CASCADE, null=True) + quarantine_code = models.CharField(max_length=100, null=True) + rejester_date = models.DateTimeField(null=True) + quantity = models.IntegerField(null=True) + state = models.CharField(max_length=100, null=True) + product_name = models.CharField(max_length=200, null=True) + kill_house_unique_identifier = models.CharField(max_length=100, null=True) + kill_house_name = models.CharField(max_length=100, null=True) + status_registration_date = models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + super(LiveChickenTransportDetails, self).save(*args, **kwargs) + + +class RequestLimitation(BaseModel): + limitation = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(RequestLimitation, self).save(*args, **kwargs) + + +class PriceConfirmation(BaseModel): + poultry_status = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(PriceConfirmation, self).save(*args, **kwargs) + + +class ArchiveWageInfo(BaseModel): + start_year = models.DateTimeField(null=True) + end_year = models.DateTimeField(null=True) + total_wage = models.BigIntegerField(default=0) + total_paid_wage = models.BigIntegerField(default=0) + total_company_paid_wage = models.BigIntegerField(default=0) + total_union_paid_wage = models.BigIntegerField(default=0) + total_guild_paid_wage = models.BigIntegerField(default=0) + total_vet_paid_wage = models.BigIntegerField(default=0) + + def save(self, *args, **kwargs): + super(ArchiveWageInfo, self).save(*args, **kwargs) + + +class CompanyBeneficiaryAccount(BaseModel): + name = models.CharField(max_length=200, null=True) + shaba = models.CharField(max_length=200, null=True) + percent = models.BigIntegerField(default=0) + in_province = models.BooleanField(default=False) + out_province = models.BooleanField(default=False) + unique_code = models.IntegerField(null=True) + + def save(self, *args, **kwargs): + if self.unique_code is None: + last_uniq = CompanyBeneficiaryAccount.objects.filter().last().unique_code + self.unique_code = last_uniq + 1 + super(CompanyBeneficiaryAccount, self).save(*args, **kwargs) + + +class HatchingIncreaseRequest(BaseModel): + hatching = models.ForeignKey(PoultryHatching, on_delete=models.CASCADE, + related_name="increase_hatching", + null=True) + + hatching_quantity = models.IntegerField(null=True) + quantity = models.IntegerField(null=True) + hatching_kill_quantity = models.IntegerField(null=True) + hatching_left_over = models.IntegerField(null=True) + hatching_losses = models.IntegerField(null=True) + message = models.TextField(null=True) + registerer_name = models.CharField(max_length=250, null=True) + registerer_role = models.CharField(max_length=50, null=True) + registerer_mobile = models.CharField(max_length=20, null=True) + date = models.DateTimeField(auto_now_add=True) + + def save(self, *args, **kwargs): + super(HatchingIncreaseRequest, self).save(*args, **kwargs) + + +class ChickenCommissionPrices(BaseModel): + kill_house_price = models.IntegerField(default=15000) + wholesaler_price = models.IntegerField(default=20000) + retailer_price = models.IntegerField(default=40000) + chicken_average_price = models.IntegerField(default=0) + province_kill_request_amount = models.IntegerField(default=0) + poultry_request_amount = models.IntegerField(default=0) + kill_request_amount = models.IntegerField(default=0) + date = models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + super(ChickenCommissionPrices, self).save(*args, **kwargs) + + +class CommonlyUsed(BaseModel): + kill_house = models.ForeignKey(KillHouse, on_delete=models.CASCADE, + related_name="commonly_used_kill_house", + null=True) + + guild = models.ForeignKey(Guilds, on_delete=models.CASCADE, + related_name="commonly_used_guild", + null=True) + + steward = models.ForeignKey(Guilds, on_delete=models.CASCADE, + related_name="commonly_used_steward", + null=True) + priority = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(CommonlyUsed, self).save(*args, **kwargs) + + +class PercentageDropLimitation(BaseModel): + kill_house_limit_percent_down = models.IntegerField(default=0) + kill_house_limit_percent_up = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(PercentageDropLimitation, self).save(*args, **kwargs) + + +class UploadImageLimitation(BaseModel): + kill_house_allocation = models.BooleanField(default=False) + kill_house_free_sale = models.BooleanField(default=False) + steward_allocation = models.BooleanField(default=False) + steward_free_sale = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(UploadImageLimitation, self).save(*args, **kwargs) + + +class ApkInfo(BaseModel): + info = models.JSONField(null=True) + download_link = models.CharField(max_length=700, null=True, blank=True) + + def save(self, *args, **kwargs): + super(ApkInfo, self).save(*args, **kwargs) + + +class DirectBuyingVerification(BaseModel): + poultry_code_mandatory = models.BooleanField(default=False) + payment_deadline = models.BooleanField(default=False) + payment_deadline_days = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + super(DirectBuyingVerification, self).save(*args, **kwargs) + + +class DirectBuyingPayment(BaseModel): + province_kill_request = models.ForeignKey(ProvinceKillRequest, on_delete=models.CASCADE, + related_name="direct_buying_province_kill_request", + null=True) + amount = models.BigIntegerField(default=0) + image = models.CharField(max_length=700, null=True) + date = models.DateTimeField(null=True) + payment_registrar = models.CharField(max_length=200, null=True) + payment_registrar_mobile = models.CharField(max_length=20, null=True) + payment_deadline_supporter_message = models.TextField(null=True) + + def save(self, *args, **kwargs): + super(DirectBuyingPayment, self).save(*args, **kwargs) + + +class FinePermission(BaseModel): + out_poultry_request = models.BooleanField(default=False) + out_poultry_request_start_time = models.TimeField(null=True) + out_poultry_request_end_time = models.TimeField(null=True) + out_poultry_request_fine_coefficient = models.FloatField(default=0) + direct_buying = models.BooleanField(default=False) + direct_buying_start_time = models.TimeField(null=True) + direct_buying_end_time = models.TimeField(null=True) + direct_buying_fine_coefficient = models.FloatField(default=0) + in_province_allocations = models.BooleanField(default=False) + in_province_allocations_fine_coefficient = models.FloatField(default=0) + in_province_bars = models.BooleanField(default=False) + in_province_bars_fine_coefficient = models.FloatField(default=0) + name = models.CharField(max_length=200, null=True) + start_time = models.TimeField(null=True) + end_time = models.TimeField(null=True) + fine_coefficient = models.FloatField(default=0) + fine = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(FinePermission, self).save(*args, **kwargs) + + +class ManagementSendSms(BaseModel): + name = models.CharField(max_length=100, null=True) + username = models.CharField(max_length=100, null=True) + password = models.CharField(max_length=100, null=True) + + +class ShowMarketRequest(BaseModel): + allow = models.BooleanField(default=False) + start_time = models.TimeField(null=True) + end_time = models.TimeField(null=True) + + def save(self, *args, **kwargs): + super(ShowMarketRequest, self).save(*args, **kwargs) + + +class ManagementHatchingAgeRange(BaseModel): + from_age = models.SmallIntegerField(default=0, max_length=3) + to_age = models.SmallIntegerField(default=0, max_length=3) + from_weight = models.FloatField(default=0) + to_weight = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(ManagementHatchingAgeRange, self).save(*args, **kwargs) + + +class IndexWeightCategory(BaseModel): + name = models.CharField(max_length=100, null=True) + min_value = models.FloatField(default=0) + max_value = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(IndexWeightCategory, self).save(*args, **kwargs) + + +class PoultryScience(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="poultry_science_user", + null=True + ) + poultry = models.ManyToManyField( + Poultry, + related_name="poultry_entries", + ) + engineering_code = models.CharField(max_length=50, null=True, blank=True) + + def save(self, *args, **kwargs): + super(PoultryScience, self).save(*args, **kwargs) + + +class PoultryScienceReport(BaseModel): + poultry_science = models.ForeignKey( + PoultryScience, + on_delete=models.CASCADE, + related_name="poultry_science_reporter", + null=True + ) + hatching = models.ForeignKey( + PoultryHatching, + on_delete=models.CASCADE, + related_name="poultry_science_hatching", + null=True + ) + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="poultry_science_report_user", + null=True + ) + date = models.DateTimeField(null=True) + image = models.JSONField(null=True) + lat = models.FloatField(null=True) + log = models.FloatField(null=True) + reporter_fullname = models.CharField(null=True, max_length=50) + reporter_mobile = models.CharField(null=True, max_length=11) + reporter_role = models.CharField(null=True, max_length=50) + state = models.CharField(default='pending', max_length=50) + real_quantity_ai = models.IntegerField(null=True) + message_ai = models.CharField(null=True, max_length=250) + real_quantity = models.IntegerField(null=True) + message = models.CharField(null=True, max_length=250) + message_registerer_fullname = models.CharField(null=True, max_length=50) + message_registerer_mobile = models.CharField(null=True, max_length=11) + message_registerer_role = models.CharField(null=True, max_length=50) + report_information = models.JSONField(null=True) + report_id = models.IntegerField(null=True) + chicken_age = models.IntegerField(null=True) + + def save(self, *args, **kwargs): + if self.report_id is None: + last = PoultryScienceReport.objects.filter().last() + if last: + last_report = last.report_id + else: + last_report = 1000 + self.report_id = last_report + 1 + super(PoultryScienceReport, self).save(*args, **kwargs) + + +class TokenEitaaForEachVet(models.Model): + token = models.CharField(max_length=250) + vet_fullname = models.CharField(max_length=50) + vet_mobile = models.CharField(max_length=11) + group_name = models.CharField(max_length=250) + + def save(self, *args, **kwargs): + super(TokenEitaaForEachVet, self).save(*args, **kwargs) + + +class UserLoginLog(models.Model): + user_profile = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="login_logs_user" + ) + headers = models.JSONField(null=True, blank=True) + ip_address = models.CharField(max_length=500, null=True, blank=True) + user_agent = models.CharField(max_length=500, null=True, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + + def save(self, *args, **kwargs): + super(UserLoginLog, self).save(*args, **kwargs) + + +class AllowRegisterCodeForStewardAllocation(BaseModel): + active = models.BooleanField(default=False) + time = models.CharField(max_length=50, null=True) + + def save(self, *args, **kwargs): + super(AllowRegisterCodeForStewardAllocation, self).save(*args, **kwargs) + + +class AllowRegisterCodeForGuilds(BaseModel): + active = models.BooleanField(default=False) + time = models.CharField(max_length=50, null=True) + has_time = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(AllowRegisterCodeForGuilds, self).save(*args, **kwargs) + + +class StewardAppLogin(BaseModel): + steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="steward_login", + null=True) + created_at = models.DateTimeField(auto_now_add=True) + device_name = models.CharField(max_length=200, null=True) + + def save(self, *args, **kwargs): + super(StewardAppLogin, self).save(*args, **kwargs) + + +class StewardRequest(BaseModel): + steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="steward_request", + null=True) + date = models.DateTimeField(null=True) + quantity = models.IntegerField(default=0) + weight = models.IntegerField(default=0) + state = models.CharField(default='pending', max_length=50) + registerer = models.CharField(null=True, max_length=250) + registerer_mobile = models.CharField(null=True, max_length=250) + registerer_role = models.CharField(null=True, max_length=250) + + def save(self, *args, **kwargs): + super(StewardRequest, self).save(*args, **kwargs) + + +class RestrictionCarcassDistribution(BaseModel): + allow = models.BooleanField(default=False) + time = models.TimeField(null=True) + distribution_type = models.CharField(max_length=50, default='KillHouse') + out = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(RestrictionCarcassDistribution, self).save(*args, **kwargs) + + +class AllowRegisterCodeForKillHouseFreeSaleBarInformation(BaseModel): + active = models.BooleanField(default=False) + time = models.CharField(max_length=50, null=True) + + def save(self, *args, **kwargs): + super(AllowRegisterCodeForKillHouseFreeSaleBarInformation, self).save(*args, **kwargs) + + +class AllowRegisterCodeForStewardFreeSaleBarInformation(BaseModel): + active = models.BooleanField(default=False) + time = models.CharField(max_length=50, null=True) + + def save(self, *args, **kwargs): + super(AllowRegisterCodeForStewardFreeSaleBarInformation, self).save(*args, **kwargs) + + +class LimitationForDirectPurchaseAndBarInformation(BaseModel): + active = models.BooleanField(default=False) + start_time = models.TimeField(null=True, blank=True) + end_time = models.TimeField(null=True, blank=True) + + def save(self, *args, **kwargs): + super(LimitationForDirectPurchaseAndBarInformation, self).save(*args, **kwargs) + + +class WarehouseArchive(BaseModel): + kill_house = models.ForeignKey( + KillHouse, + on_delete=models.CASCADE, + related_name="kill_house_archive", + null=True) + steward = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="steward_archive", + null=True) + guild = models.ForeignKey( + Guilds, + on_delete=models.CASCADE, + related_name="guild_archive", + null=True) + date = models.DateTimeField(null=True) + weight = models.FloatField(default=0) + image = models.CharField(max_length=500, null=True) + quota = models.CharField(max_length=20, null=True) + description = models.TextField(null=True) + registerer = models.CharField(null=True, max_length=250) + registerer_mobile = models.CharField(null=True, max_length=250) + registerer_role = models.CharField(null=True, max_length=250) + warehouse = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(WarehouseArchive, self).save(*args, **kwargs) + + +class SmsRecipient(BaseModel): + phone_number = models.CharField(max_length=11, unique=True) + name = models.CharField(max_length=100, null=True) + is_active = models.BooleanField(default=True) + + def save(self, *args, **kwargs): + super(SmsRecipient, self).save(*args, **kwargs) + + +class PosDeviceSetting(BaseModel): + pos_machin = models.CharField(max_length=100, null=True) + owner = models.TextField(null=True) + serial = models.TextField(null=True) + key_id = models.TextField(null=True) + key_value = models.TextField(null=True) + last_modify = models.DateTimeField(null=True) + + def save(self, *args, **kwargs): + super(PosDeviceSetting, self).save(*args, **kwargs) + + +class MarketDailyLimitation(BaseModel): + quantity = models.IntegerField(default=0) + active = models.BooleanField(default=False) + register_role = models.CharField(max_length=50, null=True) + register_fullname = models.CharField(max_length=100, null=True) + register_mobile = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(MarketDailyLimitation, self).save(*args, **kwargs) + + +class HatchingArchivePercent(BaseModel): + active = models.BooleanField(default=False) + percent = models.FloatField(default=0) + + def save(self, *args, **kwargs): + super(HatchingArchivePercent, self).save(*args, **kwargs) + + + +class RequestLog(models.Model): + user = models.ForeignKey( + settings.AUTH_USER_MODEL, + null=True, + blank=True, + on_delete=models.SET_NULL + ) + method = models.CharField(max_length=10) + path = models.TextField() + query_params = models.JSONField(null=True, blank=True) + body = models.JSONField(null=True, blank=True) + headers = models.JSONField(null=True, blank=True) + + status_code = models.PositiveIntegerField(null=True) + ip_address = models.GenericIPAddressField(null=True, blank=True) + + duration = models.FloatField(help_text="Request duration in seconds") + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"{self.method} {self.path} ({self.status_code})" \ No newline at end of file diff --git a/panel/pos_helper.py b/panel/pos_helper.py new file mode 100644 index 0000000..2f77f67 --- /dev/null +++ b/panel/pos_helper.py @@ -0,0 +1,263 @@ +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import AllowAny +from rest_framework.response import Response +from rest_framework import status +from django.views.decorators.csrf import csrf_exempt + +from general_urls import BASE_URL +from .ProvinceOperator.serializers import POSAccessLevelSerializer +from .models import POSMachine, RolesProducts, PosDeviceVersion, POSAccessLevel +import requests +from requests.exceptions import RequestException + +from .validate_headers import PosDeviceValidator + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def Check_server(request): + data = {"server": [ + { + "key": "Test", + "name": "تست", + "address": "https://testbackend.rasadyar.com" + }, + { + "key": "Hamedan", + "name": "همدان", + "address": "https://habackend.rasadyar.com" + }, + { + "key": "Markazi", + "name": "مرکزی", + "address": "https://mabackend.rasadyar.com" + } + ] + } + return Response(data, status=status.HTTP_200_OK) + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def pos_finder(request): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + validation_device = validator.validation_device() + if not validation_device: + return Response({"result": "نشست شما منقضی شده لطفا محدد وارد شوید!"}, status=status.HTTP_401_UNAUTHORIZED) + + pos_machine = ( + POSMachine.objects + .select_related('user__province') + .only('pos_id', 'user__fullname', 'user__province__name') + .filter(pos_id=validation_device) + ) + if not pos_machine.exists(): + return Response({"result": "صنفی با این شناسه یافت نشد!"}, status=status.HTTP_404_NOT_FOUND) + url = BASE_URL.replace('api/', '') + pos_machine = pos_machine.first() + version = PosDeviceVersion.objects.filter(company=pos_machine.pos_company).order_by('code').last() + name=version.name if version else None + code=version.code if version else None + link=version.link if version else None + checksum=version.checksum if version else None + if pos_machine.guild: + store_name = pos_machine.guild.guilds_name + phone = pos_machine.guild.phone + key = pos_machine.guild.key + type_activity = pos_machine.guild.type_activity + area_activity = pos_machine.guild.area_activity + seller_type = "Guild" if pos_machine.guild.steward == False else "Steward" + product = RolesProducts.objects.filter(guild=pos_machine.guild, trash=False, name='مرغ گرم').first() + product_name = product.parent_product.name if product else None + product_image = product.parent_product.image if product else None + product_key = product.key if product else None + other_product = True + + + + + elif pos_machine.cooperative: + store_name = pos_machine.cooperative.name + phone = pos_machine.cooperative.mobile + key = pos_machine.cooperative.key + seller_type = "cooperative" + type_activity = "تعاونی" + area_activity = "تعاونی" + product_name = None + product_image = None + product_key = None + other_product = True + else: + store_name = pos_machine.kill_house.name + phone = pos_machine.kill_house.phone + key = pos_machine.kill_house.key + seller_type = "KillHouse" + type_activity = "کشتارگاه" + area_activity = "کشتارگاه" + product = RolesProducts.objects.filter(kill_house=pos_machine.kill_house, trash=False, name='مرغ گرم').first() + product_name = product.parent_product.name if product else None + product_image = product.parent_product.image if product else None + product_key = product.key if product else None + other_product = True + + data = { + "type": seller_type, + "name": store_name, + "type_activity": type_activity, + "area_activity": area_activity, + "phone": phone, + "mobile": pos_machine.user.mobile, + "fullname": pos_machine.user.fullname, + "firstname": pos_machine.user.first_name, + "lastname": pos_machine.user.last_name, + "city": pos_machine.user.city.name, + "province": pos_machine.user.province.name, + "national_code": pos_machine.user.national_code, + "national_id": pos_machine.user.national_id, + "birthday": pos_machine.user.birthday, + "url": url, + "key": key, + "server": "Test", + "segmentation": True, + "product_name": product_name, + "product_image": product_image, + "product_key": product_key, + "other_product": other_product, + "version_name": name, + "code": code, + "link": link, + "checksum": checksum, + + } + return Response(data, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def pos_get_finder(request): + pos_id = request.GET.get('pos-id') + if not pos_id: + return Response({"result": "شناسه POS مشخص نشده است!"}, status=status.HTTP_400_BAD_REQUEST) + + pos_machine = ( + POSMachine.objects + .select_related('user__province') + .only('pos_id', 'user__fullname', 'user__province__name') + .filter(pos_id=pos_id) + ) + if not pos_machine.exists(): + return Response({"result": "صنفی با این شناسه یافت نشد!"}, status=status.HTTP_404_NOT_FOUND) + url = BASE_URL.replace('api/', '') + pos_machine = pos_machine.first() + if pos_machine.guild: + store_name = pos_machine.guild.guilds_name + phone = pos_machine.guild.guilds_name + key = pos_machine.guild.key + seller_type = "Guild" if pos_machine.guild.steward == False else "Steward" + + + elif pos_machine.cooperative: + store_name = pos_machine.cooperative.name + phone = pos_machine.cooperative.mobile + key = pos_machine.cooperative.key + seller_type = "cooperative" + + + else: + store_name = pos_machine.kill_house.name + phone = pos_machine.kill_house.phone + key = pos_machine.kill_house.key + seller_type = "KillHouse" + data = { + "type": seller_type, + "name": store_name, + "phone": phone, + "mobile": pos_machine.user.mobile, + "fullname": pos_machine.user.fullname, + "firstname": pos_machine.user.first_name, + "lastname": pos_machine.user.last_name, + "city": pos_machine.user.city.name, + "province": pos_machine.user.province.name, + "national_code": pos_machine.user.national_code, + "national_id": pos_machine.user.national_id, + "birthday": pos_machine.user.birthday, + "url": url, + "key": key, + "server": "Test", + } + return Response(data, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@csrf_exempt +@permission_classes([AllowAny]) +def pos_login(request): + validator = PosDeviceValidator(request) + validation_error = validator.validation_version() + if validation_error: + return validation_error + + pos_machine = validator.manage_device() + + if not pos_machine.owner: + return Response({"result": f"برای این دستگاه مالکی تعیین نشده!شناسه پوز:{pos_machine.pos_unique_id}"}, + status=status.HTTP_403_FORBIDDEN) + + if not pos_machine.active: + return Response({"result": f"دستگاه غیر فعال میباشد!شناسه پوز:{pos_machine.pos_unique_id}"}, + status=status.HTTP_403_FORBIDDEN) + url = BASE_URL.replace('api/', '') + version = PosDeviceVersion.objects.filter(company=pos_machine.pos_company).order_by('code').last() + name = version.name if version else None + code = version.code if version else None + link = version.link if version else None + checksum = version.checksum if version else None + access_levels = POSAccessLevel.objects.filter(pos=pos_machine) + access_levels = POSAccessLevelSerializer(access_levels,many=True).data + agent = True if (pos_machine.current_user or pos_machine.current_representative) else False + agent_fullname =None + agent_mobile =None + agent_type =None + if agent: + if pos_machine.current_user: + agent_fullname = pos_machine.current_user.fullname + agent_mobile = pos_machine.current_user.mobile + agent_type = 'dispenser' + + else: + agent_fullname = pos_machine.current_representative.first_name + "" +pos_machine.current_representative.last_name + agent_mobile = pos_machine.current_representative.mobile + agent_type = 'representative' + + data = { + "mobile": pos_machine.owner.mobile, + "fullname": pos_machine.owner.fullname, + "firstname": pos_machine.owner.first_name, + "lastname": pos_machine.owner.last_name, + "city": pos_machine.owner.city.name, + "province": pos_machine.owner.province.name, + "national_code": pos_machine.owner.national_code, + "national_id": pos_machine.owner.national_id, + "birthday": pos_machine.owner.birthday, + "url": url, + "key": pos_machine.key, + "server": "Markazi", + "pos_unique_id": pos_machine.pos_unique_id, + "version_name": name, + "code": code, + "link": link, + "checksum": checksum, + "access_levels": access_levels, + "agent": agent, + "agent_type": agent_type, + "agent_fullname": agent_fullname, + "agent_mobile": agent_mobile, + + } + return Response(data, status=status.HTTP_200_OK) diff --git a/panel/poultry/__init__.py b/panel/poultry/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/poultry/excel_processing.py b/panel/poultry/excel_processing.py new file mode 100644 index 0000000..1e96642 --- /dev/null +++ b/panel/poultry/excel_processing.py @@ -0,0 +1,10772 @@ +import datetime +from io import BytesIO + +import jdatetime +import openpyxl +from django.db.models import Sum, Q, F +from openpyxl import Workbook +from openpyxl.styles import PatternFill, Alignment, Font +from openpyxl.utils import get_column_letter +from django.http import HttpResponse, QueryDict + +from panel.KillHouse.serializers import BarDifferenceRequestSerializer +from panel.convert_date import convert_to_shamsi +from panel.filterset import PoultryHatchingFilterSet, PoultryManageFilterSet, BarDifferenceRequestFilterSet, \ + PoultryRequestDirectBuyingFilterSet +from panel.helper import build_query +from panel.helper_excel import shamsi_date, create_header, excel_description, create_header_freez, create_value, \ + add_chart, convert_str_to_date +from panel.models import Poultry, PoultryHatching, CityOperator, VetFarm, PoultryRequest, KillHouseRequest, \ + ProvinceKillRequest, KillHouseAssignmentInformation, KillHouseVet, VetCheckRequest, BarDifferenceRequest, KillHouse, \ + FreeSaleWithinprovince, ShowMarketRequest +from authentication.models import ( + SystemUserProfile, +) +from panel.poultry.helpers import poultry_prediction_helper +from panel.poultry.serializers import PoultryHatchingForPredictionSerializer, PoultryRequestForDirectBuyingSerializer + + +def management_poultry(request): + filterset_class = PoultryManageFilterSet + poultreis = Poultry.objects.filter(trash=False).select_related('user', 'address__province', 'address__city') + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + poultrys = poultreis.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultrys = poultreis.filter(poultry__user__city=user.city) + else: + poultrys = Poultry.objects.filter(trash=False).select_related('user', 'address__province', 'address__city') + else: + poultrys = poultreis + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + poultrys = poultreis.filter( + build_query(filterset_class, value) + ) + excel_options = [ + 'ردیف', + 'نام واحد', + 'مالک', + 'تلفن', + 'شناسه یکتا', + 'کد اپیدمیولوژیک', + 'کد بهداشتی', + 'تعداد سالن', + 'ظرفیت فارم', + 'استان/شهر', + 'تعاونی', + 'دامپزشک فارم/موبایل', + 'جوجه ریزی فعال', + 'تعداد دوره جوجه ریزی', + 'مجموع جوجه ریزی', + 'میانگین جوجه ریزی', + 'تعداد درخواست کشتار', + 'حجم درخواست کشتار', + 'تعداد بار', + 'حجم بار', + 'وزن بار', + 'میانگین وزن', + 'تعداد بار مستند', + 'حجم بار مستند', + 'وزن بار مستند', + 'میانگین وزنی بار مستند', + 'تعداد بار خارج استان', + 'حجم بار خارج استان', + 'وزن تقریبی بار', + 'میانگین وزن', + 'تعداد بار ورودی به انبار', + 'حجم ورودی به انبار', + 'وزن ورودی به انبار', + 'میانگین درصد افت', + ] + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[5].height = 18 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + + header_list2 = [ + 'تعداد فارم ها', + 'تعداد کل دوره جوجه ریزی ', + 'میانگین کل دوره جوجه ریزی فارم ها ', + 'حجم کل جوجه ریزی ', + 'جوجه ریزی های فعال', + 'حجم جوجه ریزی فعال ', + 'حجم مانده در سالن فعال', + 'تعداد کل درخواست کشتار', + 'حجم کل درخواست کشتار', + 'تعداد کل بار', + 'حجم کل بار', + 'وزن کل بار', + 'میانگین کل وزن', + 'تعداد کل بار مستند', + 'حجم کل بار مستند', + 'وزن کل بار مستند', + 'میانگین وزنی کل بار مستند', + 'تعداد کل بار خارج استان', + 'حجم کل بار خارج استان', + 'وزن کل تقریبی بار خارج استان', + 'میانگین وزن کل بار خارج استان', + 'تعداد بار ورودی به انبار', + 'حجم ورودی به انبار', + 'وزن ورودی به انبار', + 'میانگین درصد افت', + + ] + for col_num, option in enumerate(header_list2, 3): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + l = 4 + m = 1 + + all_hatching_pending = 0 + all_total_quantity = 0 + all_poultry_request = 0 + all_kill_request = 0 + all_kill_request_quantity = 0 + all_kill_request_weight = 0 + all_kill_request_has_assigment = 0 + all_kill_request_quantity_assigment = 0 + all_kill_request_weight_assigment = 0 + all_total_quantity_poultry_hatching_pending = 0 + all_total_left_over_poultry_hatching_pending = 0 + all_total_quantity_poultry_request = 0 + all_len_out_poultry_request = 0 + all_total_out_quantity_poultry_request = 0 + all_total_out_weight_poultry_request = 0 + all_period = 0 + len_werhouse_enter = 0 + all_werhouse_enter_quantity = 0 + all_werhouse_enter_weight = 0 + all_all_weight_loss = 0 + for poultry in poultrys: + user_mobile = poultry.user.mobile if poultry.user else '-' + user_name = poultry.user.fullname if poultry.user else '-' + city_operator = poultry.city_operator if poultry.city_operator else '-' + health_certificate_number = poultry.health_certificate_number if poultry.health_certificate_number else '-' + epidemiological_code = poultry.epidemiological_code if poultry.epidemiological_code else '-' + vet_farm = VetFarm.objects.filter(poultry=poultry, trash=False).select_related('vet__user').last() + vet_name = '-' + mobile_vet = '-' + if vet_farm: + vet_name = vet_farm.vet.user.fullname + mobile_vet = vet_farm.vet.user.mobile + poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, trash=False).only('quantity', 'left_over' + ) + + poultry_hatching_pending = poultry_hatching.filter(state='pending', allow_hatching='pending', + archive=False).last() + if poultry_hatching_pending: + all_hatching_pending += 1 + hatching = 'ندارد' if not poultry_hatching_pending else f'دارد' + period = 0 + if poultry_hatching_pending: + period = poultry_hatching_pending.period + else: + if poultry_hatching: + period = poultry_hatching.last().period + all_period += period + poultry_hatching_pending1 = poultry_hatching.filter(state='pending', allow_hatching='pending', + archive=False) + total_quantity = \ + poultry_hatching.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_quantity_poultry_hatching_pending = \ + poultry_hatching_pending1.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_left_over_poultry_hatching_pending = \ + poultry_hatching_pending1.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + all_total_quantity += total_quantity + all_total_quantity_poultry_hatching_pending += total_quantity_poultry_hatching_pending + all_total_left_over_poultry_hatching_pending += total_left_over_poultry_hatching_pending + poultry_request = PoultryRequest.objects.filter(trash=False, poultry=poultry, + state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending')).only('quantity', + 'Index_weight') + kill_request = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__in=poultry_request).only( + 'accepted_real_quantity', 'accepted_real_weight') + + out_poultry_request = poultry_request.filter(out=True, out_province_request_cancel=False).only( + 'quantity', 'Index_weight' + ) + total_out_quantity_poultry_request = \ + out_poultry_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_out_weight_poultry_request = \ + out_poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + all_total_out_quantity_poultry_request += total_out_quantity_poultry_request + all_total_out_weight_poultry_request += total_out_weight_poultry_request + all_len_out_poultry_request += len(out_poultry_request) + total_quantity_poultry_request = \ + poultry_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + all_total_quantity_poultry_request += total_quantity_poultry_request + all_poultry_request += len(poultry_request) + all_kill_request += len(kill_request) + kill_request_quantity = kill_request.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + all_kill_request_quantity += kill_request_quantity + kill_request_weight = kill_request.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + all_kill_request_weight += int(kill_request_weight) + kill_request_has_assigment = kill_request.filter(assignment_state_archive='True').only('accepted_real_quantity', + 'accepted_real_weight') + + all_kill_request_has_assigment += len(kill_request_has_assigment) + + kill_request_quantity_assigment = kill_request_has_assigment.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + all_kill_request_quantity_assigment += kill_request_quantity_assigment + kill_request_weight_assigment = kill_request_has_assigment.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + all_kill_request_weight_assigment += int(kill_request_weight_assigment) + + werhouse_enter = kill_request.filter(ware_house_confirmation=True).only('ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss') + werhouse_enter_quantity = werhouse_enter.aggregate( + total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + werhouse_enter_weight = werhouse_enter.aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + all_weight_loss = werhouse_enter.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_all_weight_loss += all_weight_loss + + all_weight_loss = round(int(all_weight_loss) / len(werhouse_enter), 2) if len(werhouse_enter) > 0 else 0 + + len_werhouse_enter += len(werhouse_enter) + all_werhouse_enter_quantity += werhouse_enter_quantity + all_werhouse_enter_weight += int(werhouse_enter_weight) + province = poultry.user.province.name if poultry.user else '-' + city = poultry.user.city.name if poultry.user else '-' + list1 = [ + m, + poultry.unit_name, + user_name, + user_mobile, + poultry.breeding_unique_id, + epidemiological_code, + health_certificate_number, + poultry.number_of_halls, + poultry.total_capacity, + province + '/' + city, + city_operator, + vet_name + '/' + mobile_vet, + hatching, + period, + total_quantity, + round(total_quantity / period) if period > 0 else 0, + len(poultry_request), + total_quantity_poultry_request, + len(kill_request), + kill_request_quantity, + int(kill_request_weight), + round(kill_request_weight / kill_request_quantity, 1) if kill_request_weight > 0 else 0, + len(kill_request_has_assigment), + kill_request_quantity_assigment, + int(kill_request_weight_assigment), + round(kill_request_weight_assigment / kill_request_quantity_assigment, + 1) if kill_request_weight_assigment > 0 else 0, + len(out_poultry_request), + total_out_quantity_poultry_request, + int(total_out_weight_poultry_request), + str(round(total_out_weight_poultry_request / total_out_quantity_poultry_request, + 1)) if total_out_quantity_poultry_request > 0 else 0, + + len(werhouse_enter), + werhouse_enter_quantity, + int(werhouse_enter_weight), + f'%{all_weight_loss}', + + ] + l += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + m += 1 + row_1 = m - 1 + + value_header_list = [ + m - 1, + all_period, + round(all_period / row_1) if m > 1 else 0, + all_total_quantity, + all_hatching_pending, + all_total_quantity_poultry_hatching_pending, + all_total_left_over_poultry_hatching_pending, + all_poultry_request, + all_total_quantity_poultry_request, + all_kill_request, + all_kill_request_quantity, + all_kill_request_weight, + (round(all_kill_request_weight / all_kill_request_quantity, 1)) if all_kill_request_quantity > 0 else 0, + + all_kill_request_has_assigment, + all_kill_request_quantity_assigment, + all_kill_request_weight_assigment, + str(round(all_kill_request_weight_assigment / all_kill_request_quantity_assigment, + 1)) if all_kill_request_quantity_assigment > 0 else 0, + + all_len_out_poultry_request, + all_total_out_quantity_poultry_request, + int(all_total_out_weight_poultry_request), + str(round(all_total_out_weight_poultry_request / all_total_out_quantity_poultry_request, + 1)) if all_total_out_quantity_poultry_request > 0 else 0, + len_werhouse_enter, + all_werhouse_enter_quantity, + all_werhouse_enter_weight, + f'%{round(int(all_all_weight_loss) / len_werhouse_enter, 2) if len_werhouse_enter > 0 else 0}', + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 3, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_total_quantity, + '', + all_poultry_request, + all_total_quantity_poultry_request, + all_kill_request, + all_kill_request_quantity, + all_kill_request_weight, + '', + all_kill_request_has_assigment, + all_kill_request_quantity_assigment, + all_kill_request_weight_assigment, + '', + all_len_out_poultry_request, + all_total_out_quantity_poultry_request, + int(all_total_out_weight_poultry_request), + str(round(all_total_out_weight_poultry_request / all_total_out_quantity_poultry_request, + 1)) if all_total_out_quantity_poultry_request > 0 else 0, + len_werhouse_enter, + all_werhouse_enter_quantity, + all_werhouse_enter_weight, + f'%{round(int(all_all_weight_loss) / len_werhouse_enter, 2) if len_werhouse_enter > 0 else 0}', + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + 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 + + +def hatching_excel(request): + filterset_class = PoultryHatchingFilterSet + unknown = True if 'unknown' in request.GET else False + poultry_hatch = PoultryHatching.objects.filter(archive=False, + allow_hatching='pending', + trash=False,unknown=unknown).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + filterset_fields = [ + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__mobile', + 'poultry__unit_name', + 'poultry__address__city__name', + 'chicken_age', + 'poultry__breeding_unique_id', + + ] + + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_poultry_hatch = poultry_hatch.filter(poultry__address__city=user.city) + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + filtered_poultry_hatch = poultry_hatch.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] == 'ProvinceOperator': + if 'chain' in request.GET: + filtered_poultry_hatch = poultry_hatch.filter(has_chain_company=True) + else: + filtered_poultry_hatch = poultry_hatch + else: + filtered_poultry_hatch = poultry_hatch + else: + filtered_poultry_hatch = poultry_hatch + if 'age2' in request.GET: + if int(request.GET.get('age2')) > 0: + age1 = int(request.GET.get('age1')) + age2 = int(request.GET.get('age2')) + filtered_poultry_hatch = filtered_poultry_hatch.filter(trash=False, chicken_age__gte=age1, + chicken_age__lte=age2) + else: + filtered_poultry_hatch = filtered_poultry_hatch + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', # وضعیت + '', # شماره مجوز جوجه ریزی + '', # شناسه یکتا + '', # مجوز بهداشتی جوجه ریزی + '', # نام فارم + '', # مرغدار + '', # بهره برداری + '', # مالکیت + '', # ارتباط + '', # شهر/تعاونی + '', # دامپزشک فارم + '', # سالن + '', # دوره جوجه ریزی + '', # تاریخ ثبت جوجه ریزی + '', # تاریخ جوجه ریزی + '', # میانگین سن کشتار + '', # پیش بینی تاریخ کشتار + '', # نژاد + '', # سن ورود به بایگانی + '', # تاریخ ورود به بایگانی + '', # سن فعلی + all_quantity, # حجم جوجه ریزی + '', # حجم افزایشی + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def get_vet_farm_name(poultry): + """Get vet farm name for poultry""" + try: + from panel.models import VetFarm + vet_farm = VetFarm.objects.filter(poultry=poultry, trash=False).first() + if vet_farm and vet_farm.vet: + return vet_farm.vet.user.fullname + except: + pass + return '-' + +def calculate_predicted_kill_date(poultry_hatching): + """Calculate predicted kill date based on age and average kill age""" + try: + if poultry_hatching.poultry.killing_ave_age and poultry_hatching.chicken_age: + remaining_days = poultry_hatching.poultry.killing_ave_age - poultry_hatching.chicken_age + if remaining_days > 0: + predicted_date = poultry_hatching.date + datetime.timedelta(days=remaining_days) + return convert_to_shamsi(year=predicted_date.year, month=predicted_date.month, day=predicted_date.day) + except: + pass + return '-' + +def calculate_current_age(poultry_hatching): + """Calculate current age of chickens""" + try: + if poultry_hatching.date: + current_date = datetime.datetime.now().date() + age = (current_date - poultry_hatching.date.date()).days + return age + except: + pass + return poultry_hatching.chicken_age + +def calculate_governmental_killed_weight(poultry_hatching): + """Calculate governmental killed weight""" + try: + if poultry_hatching.governmental_killed_quantity and poultry_hatching.total_average_killed_weight: + return round(poultry_hatching.governmental_killed_quantity * poultry_hatching.total_average_killed_weight, 2) + except: + pass + return 0 + +def calculate_free_killed_weight(poultry_hatching): + """Calculate free killed weight""" + try: + if poultry_hatching.free_killed_quantity and poultry_hatching.total_average_killed_weight: + return round(poultry_hatching.free_killed_quantity * poultry_hatching.total_average_killed_weight, 2) + except: + pass + return 0 + +def calculate_governmental_commitment_weight(poultry_hatching): + """Calculate governmental commitment weight""" + try: + if poultry_hatching.governmental_quantity and poultry_hatching.total_average_killed_weight: + return round(poultry_hatching.governmental_quantity * poultry_hatching.total_average_killed_weight, 2) + except: + pass + return 0 + +def calculate_unloaded_allocations(poultry_hatching): + """Calculate unloaded allocations count""" + try: + from panel.models import ProvinceKillRequest + unloaded = ProvinceKillRequest.objects.filter( + trash=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching, + first_car_allocated_quantity=0, + return_to_province=False + ).count() + return unloaded + except: + pass + return 0 + +def calculate_unloaded_allocations_quantity(poultry_hatching): + """Calculate unloaded allocations quantity""" + try: + from panel.models import ProvinceKillRequest + from django.db.models import Sum + quantity = ProvinceKillRequest.objects.filter( + trash=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching, + first_car_allocated_quantity=0, + return_to_province=False + ).aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + return quantity + except: + pass + return 0 + +def calculate_unloaded_allocations_weight(poultry_hatching): + """Calculate unloaded allocations weight""" + try: + from panel.models import ProvinceKillRequest + from django.db.models import Sum + weight = ProvinceKillRequest.objects.filter( + trash=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching, + first_car_allocated_quantity=0, + return_to_province=False + ).aggregate(total=Sum('total_killed_weight'))['total'] or 0 + return weight + except: + pass + return 0 + +def calculate_radar_discharge_confirmation(poultry_hatching): + """Calculate radar discharge confirmation""" + # This would need to be implemented based on your specific radar system + return '-' + +def calculate_active_kill_count(poultry_hatching): + """Calculate active kill count""" + try: + from panel.models import PoultryRequest + active_count = PoultryRequest.objects.filter( + trash=False, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + out_province_request_cancel=False, + hatching=poultry_hatching + ).count() + return active_count + except: + pass + return 0 + +def calculate_kill_request_count(poultry_hatching): + """Calculate total kill request count""" + try: + from panel.models import ProvinceKillRequest, KillHouseRequest + province_count = ProvinceKillRequest.objects.filter( + trash=False, + province_request__poultry_request__hatching=poultry_hatching + ).count() + kill_house_count = KillHouseRequest.objects.filter( + trash=False, + province_request__poultry_request__hatching=poultry_hatching + ).count() + return province_count + kill_house_count + except: + pass + return 0 + + +def archive_hatching_excel(request): + filterset_class = PoultryHatchingFilterSet + filterset_fields = [ + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__mobile', + 'poultry__unit_name', + 'poultry__address__city__name', + 'chicken_age', + 'poultry__breeding_unique_id', + + ] + filtered_poultry_hatch = PoultryHatching.objects.filter( + Q(allow_hatching=True, state='complete') | Q(archive=True), + trash=False + ).select_related('poultry', 'poultry__user').order_by('-create_date') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + filtered_poultry_hatch = filtered_poultry_hatch.filter(date__date__gte=date1, date__date__lte=date2) + user = SystemUserProfile.objects.get(key=request.GET['key']) + if 'chain' in request.GET: + filtered_poultry_hatch = filtered_poultry_hatch.filter(has_chain_company=True) + + if request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_poultry_hatch = filtered_poultry_hatch.filter(poultry__address__city=user.city) + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + filtered_poultry_hatch = filtered_poultry_hatch.filter(poultry__city_operator=city_operator.unit_name) + else: + filtered_poultry_hatch = filtered_poultry_hatch + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'دامپزشک فارم', + 'سالن', + 'دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیش بینی تاریخ کشتار', + 'نژاد', + 'سن ورود به بایگانی', + 'تاریخ ورود به بایگانی', + 'سن فعلی', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک', + 'تلفات اتحادیه', + 'تلفات کل', + 'حجم تعهد دولتی', + 'حجم تعهد آزاد', + 'حجم کشتار دولتی', + 'وزن کشتار دولتی', + 'حجم کشتار آزاد', + 'وزن کشتار شده آزاد', + 'حجم فروش به خارج استان', + 'وزن فروش به خارج استان', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'حجم کشتار شده', + 'حجم مانده در سالن', + 'تلفات', + 'کشتار شده', + 'باقی مانده در سالن', + 'تایید تخلیه رصدیار', + 'تایید تخلیه در سماصط', + 'وزن تعهد دولتی', + 'وزن کشتار دولتی', + 'وزن کشتار آزاد', + 'میانگین وزن کشتار', + 'وزن کل کشتار شده', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + 'تعداد بارها', + 'حجم بارها', + 'وزن بارها', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'بارهای ورودی به انبار', + 'حجم لاشه های انبار', + 'وزن لاشه های انبار', + 'درصد افت بارها', + 'آخرین تغییر', + 'سازنده جوجه ریزی' + ] + date1 = datetime.datetime.now().date() + from_date_1 = shamsi_date(date1) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = convert_to_shamsi(year=poultry_hatching.create_date.year, + month=poultry_hatching.create_date.month, + day=poultry_hatching.create_date.day, ) + + date = convert_to_shamsi( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = poultry_hatching.chicken_age + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + + list1 = [ + m, # ردیف + farm_state, # وضعیت + poultry_hatching.licence_number, # شماره مجوز جوجه ریزی + poultry_hatching.poultry.breeding_unique_id, # شناسه یکتا + poultry_hatching.poultry.health_certificate_number if poultry_hatching.poultry.health_certificate_number else '-', # مجوز بهداشتی جوجه ریزی + poultry_hatching.poultry.unit_name, # نام فارم + poultry_hatching.poultry.user.fullname, # مرغدار + poultry_hatching.poultry.person_type if poultry_hatching.poultry.person_type else '-', # بهره برداری + 'مالک' if not poultry_hatching.poultry.has_tenant else 'مستاجر', # مالکیت + poultry_hatching.poultry.communication_type if poultry_hatching.poultry.communication_type else '-', # ارتباط + f"{poultry_hatching.poultry.user.city.name}/{poultry_hatching.poultry.city_operator}" if poultry_hatching.poultry.city_operator else poultry_hatching.poultry.user.city.name, # شهر/تعاونی + get_vet_farm_name(poultry_hatching.poultry), # دامپزشک فارم + poultry_hatching.hall, # سالن + poultry_hatching.period, # دوره جوجه ریزی + str(create_date), # تاریخ ثبت جوجه ریزی + str(date), # تاریخ جوجه ریزی + poultry_hatching.poultry.killing_ave_age, # میانگین سن کشتار + calculate_predicted_kill_date(poultry_hatching), # پیش بینی تاریخ کشتار + poultry_hatching.chicken_breed, # نژاد + poultry_hatching.chicken_age, # سن ورود به بایگانی + convert_to_shamsi(year=poultry_hatching.archive_date.year, month=poultry_hatching.archive_date.month, day=poultry_hatching.archive_date.day) if poultry_hatching.archive_date else '-', # تاریخ ورود به بایگانی + calculate_current_age(poultry_hatching), # سن فعلی + poultry_hatching.quantity, # حجم جوجه ریزی + poultry_hatching.increase_quantity if hasattr(poultry_hatching, 'increase_quantity') else 0, # حجم افزایشی + poultry_hatching.losses, # تلفات دامپزشک + poultry_hatching.direct_losses, # تلفات اتحادیه + poultry_hatching.total_losses, # تلفات کل + poultry_hatching.total_commitment, # حجم تعهد دولتی + poultry_hatching.free_quantity, # حجم تعهد آزاد + poultry_hatching.governmental_killed_quantity, # حجم کشتار دولتی + calculate_governmental_killed_weight(poultry_hatching), # وزن کشتار دولتی + poultry_hatching.free_killed_quantity, # حجم کشتار آزاد + calculate_free_killed_weight(poultry_hatching), # وزن کشتار شده آزاد + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else 0, # حجم فروش به خارج استان + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else 0, # وزن فروش به خارج استان + calculate_unloaded_allocations(poultry_hatching), # تخصیصات بدون بار + calculate_unloaded_allocations_quantity(poultry_hatching), # حجم تخصیصات بدون بار + calculate_unloaded_allocations_weight(poultry_hatching), # وزن تخصیصات بدون بار + poultry_hatching.killed_quantity, # حجم کشتار شده + poultry_hatching.left_over, # حجم مانده در سالن + poultry_hatching.total_losses, # تلفات + poultry_hatching.killed_quantity, # کشتار شده + poultry_hatching.left_over, # باقی مانده در سالن + calculate_radar_discharge_confirmation(poultry_hatching), # تایید تخلیه رصدیار + poultry_hatching.samasat_discharge_percentage if hasattr(poultry_hatching, 'samasat_discharge_percentage') else 0, # تایید تخلیه در سماصط + calculate_governmental_commitment_weight(poultry_hatching), # وزن تعهد دولتی + calculate_governmental_killed_weight(poultry_hatching), # وزن کشتار دولتی + calculate_free_killed_weight(poultry_hatching), # وزن کشتار آزاد + str(poultry_hatching.total_average_killed_weight), # میانگین وزن کشتار + poultry_hatching.total_killed_weight, # وزن کل کشتار شده + calculate_active_kill_count(poultry_hatching), # تعداد کشتار فعال + calculate_kill_request_count(poultry_hatching), # تعداد درخواست کشتار + len(kill_house_requests), # تعداد بارها + first_quantity, # حجم بارها + first_weight, # وزن بارها + accepted_real_quantity_final, # حجم بارهای تحویلی + accepted_real_wight_final, # وزن بارهای تحویلی + poultry_hatching.chain_killed_quantity if hasattr(poultry_hatching, 'chain_killed_quantity') else 0, # حجم زنجیره + poultry_hatching.chain_killed_weight if hasattr(poultry_hatching, 'chain_killed_weight') else 0, # وزن زنجیره + poultry_hatching.export_killed_quantity if hasattr(poultry_hatching, 'export_killed_quantity') else 0, # حجم صادرات + poultry_hatching.export_killed_weight if hasattr(poultry_hatching, 'export_killed_weight') else 0, # وزن صادرات + len(ware_house_bars), # بارهای ورودی به انبار + ware_house_bars_quantity, # حجم لاشه های انبار + ware_house_bars_weight, # وزن لاشه های انبار + str(round(ware_house_bars_weight_lose / len(ware_house_bars), 2) if ware_house_bars else 0), # درصد افت بارها + shamsi_date(convert_str_to_date(poultry_hatching.last_change.get('date', ''))) if poultry_hatching.last_change and poultry_hatching.last_change.get('date') else '', # آخرین تغییر + creator, # سازنده جوجه ریزی + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 + + +def hatching_age_range_excel(request): + filtered_poultry_hatchs = PoultryHatching.objects.filter(state__in=('pending', 'complete'), archive=False, + allow_hatching='pending', + trash=False).order_by('-create_date').select_related( + 'poultry') + + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + filtered_poultry_hatch = filtered_poultry_hatchs.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_poultry_hatch = filtered_poultry_hatchs.filter(poultry__user__city=user.city) + else: + filtered_poultry_hatch = filtered_poultry_hatchs + else: + filtered_poultry_hatch = filtered_poultry_hatchs + + excel_options = [ + 'ردیف', + 'نام فارم', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'کشتار شده', + 'مانده در سالن', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد کل فارم ها', + 'مجموع جوجه ریزی', + 'مجموع کشتار شده', + 'مجموع مانده در سالن', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + ] + for col_num, option in enumerate(header_list, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=10, bold=True, color='FFFFFF') + worksheet.row_dimensions[2].height = 30 + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=5, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + worksheet.column_dimensions[col_letter].width = 20.01 + worksheet.row_dimensions[1].height = 18 + worksheet.freeze_panes = worksheet['A6'] + max_col = worksheet.max_column + range_str = f'A5:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + l = 4 + m = 1 + for poultry_hatching in filtered_poultry_hatch: + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + poultry_requests = PoultryRequest.objects.filter(hatching=poultry_hatching, trash=False).only('quantity') + age = (datetime.datetime.now().date() - poultry_hatching.date.date()).days + 1 + quantity_sum = 0 + for poultry_request in poultry_requests: + if poultry_request and hasattr(poultry_request, 'quantity'): + quantity_sum += poultry_request.quantity + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + list1 = [ + m, + poultry_hatching.poultry.unit_name, + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.losses, + poultry_hatching.killed_quantity, + poultry_hatching.left_over, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + cell.alignment = Alignment(horizontal='center') + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + m += 1 + total_poultry_hatchings_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + total_poultry_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity') or 0 + total_poultry_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity') or 0 + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + value_list = [ + m - 1, + total_poultry_hatchings_quantity, + total_poultry_killed_quantity, + total_poultry_left_over, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + + ] + for item in range(len(value_list)): + cell = worksheet.cell(row=3, column=item + 3, value=value_list[item]) + cell.alignment = Alignment(horizontal='center') + value = value_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + 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 + + +def poultry_monitoring_excel(request): + poultreis = Poultry.objects.filter(trash=False, key=request.GET['key']).select_related('user', 'address__province', + 'address__city').first() + hatchings = PoultryHatching.objects.filter(trash=False, poultry=poultreis).order_by('id') + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_name = ['اطلاعات کلی', 'مدیریت بارها'] + for sheet_names in sheet_name: + worksheet = workbook.create_sheet(sheet_names) + if sheet_names == 'اطلاعات کلی': + excel_options = [ + ' جوجه ریزی مرحله', + 'نام واحد', + 'نام مالک', + 'تاریخ جوجه ریزی', + 'تعداد جوجه ریزی', + 'نود درصد جوجه ریزی', + + 'مجموع تلفات', + 'مانده در سالن', + 'متوسط سن کشتار', + 'تعداد ثبت سفارش', + 'تعداد درخواست کشتار (قطعه)', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد تخصیصی استان به خریدار(قطعه)', + 'وزن تخصیصی استان به خریدار(کیلوگرم)', + 'درصد کشتار نسبت به نود درصد', + 'مجموع تخصیصی به ماشین(قطعه)', + 'مجموع وزن تخصیصی به ماشین(کیلوگرم)', + 'تعداد تخلیه شده دامپزشک', + 'وزن تخلیه شده دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه', + 'حجم کشتار', + 'وزن کشتار', + 'عملکرد فارم', + + ] + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + for col_num, option in enumerate(excel_options, 3): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=3, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="31869B", fill_type="solid") + cell.font = Font(size=9, bold=True, color='FFFFFF') + worksheet.row_dimensions[3].height = 36 + worksheet.column_dimensions[col_letter].width = 14 + + now = datetime.datetime.now().date() + now_date = jdatetime.date.fromgregorian( + year=now.year, + month=now.month, + day=now.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(now_date.split("-")) + separate = "-" + date_now = separate.join(reversed_date) + + row_list2 = len(hatchings) + 10 + row_city = len(hatchings) + 8 + + province = poultreis.user.province.name + worksheet[ + f'F1'] = f'گزارش پایش اطلاعاتی {poultreis.unit_name} سامانه رصدیار استان {province} در تاریخ{date_now} ' + worksheet[f'F1'].font = Font(color="C00000", bold=True, size=12) + worksheet[f'F1'].alignment = Alignment(horizontal='center', vertical='center', + wrap_text=True) + merge_range1 = f'F1:I2' + worksheet.merge_cells(merge_range1) + l = 4 + + all_quantity_of_car1 = 0 + average_age_list1 = [] + all_weight1 = [] + + all_weight_of_car1 = 0 + all_main_quantity1 = 0 + sum_all_quantity_vet_kill1 = 0 + sum_all_wight_vet_kill1 = 0 + sum_net_weight1 = 0 + sum_real_quantity_assigment1 = 0 + sum_accepted_real_quantity1 = 0 + sum_accepted_real_weight1 = 0 + all_loses1 = 0 + all_all_quantity_of_request1 = 0 + len_werhouse_enter1 = 0 + all_werhouse_enter_quantity1 = 0 + all_werhouse_enter_weight1 = 0 + all_all_weight_loss1 = 0 + + for hatching in hatchings: + final_left_over = [] + all_quantity_of_car = 0 + average_age_list = [] + all_percent = 0 + m = 1 + all_weight = [] + all_quantity_of_car_vet_state_accepted = 0 + request_weight = [] + all_request_weight = [] + all_free_sale_in_province_true = 0 + all_kill_province_request_poultry_request_Index_weight = [] + all_weight_of_car = 0 + all_weight_of_car_vet_state_accepted = 0 + all_main_quantity = 0 + sum_quantity_qarantineh = 0 + sum_all_quantity_vet_kill = 0 + sum_all_wight_vet_kill = 0 + sum_net_weight = 0 + sum_real_quantity_assigment = 0 + sum_accepted_real_quantity = 0 + sum_accepted_real_weight = 0 + all_free_sale_in_province_false = 0 + all_loses = 0 + all_province_quantity = 0 + quantity = hatching.quantity + ninety_percent = hatching.quantity + all_len_werhouse_enter = 0 + all_werhouse_enter_quantity = 0 + all_werhouse_enter_weight = 0 + all_all_weight_loss = 0 + killed = 0 + hatch_date = jdatetime.date.fromgregorian( + day=hatching.date.day, + month=hatching.date.month, + year=hatching.date.year + ) + poultry_requests = PoultryRequest.objects.filter(out_province_request_cancel=False, trash=False, + hatching=hatching, + archive=False, + state_process__in=('accepted', 'pending')).order_by( + 'id') + + werhouse_enter1 = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=hatching, + ware_house_confirmation=True) + werhouse_enter_quantity1 = werhouse_enter1.aggregate( + total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + werhouse_enter_weight1 = werhouse_enter1.aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + all_weight_loss2 = werhouse_enter1.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_all_weight_loss1 += all_weight_loss2 + + all_weight_loss1 = round(int(all_weight_loss2) / len(werhouse_enter1), 2) if len( + werhouse_enter1) > 0 else 0 + + len_werhouse_enter1 += len(werhouse_enter1) + all_werhouse_enter_quantity1 += werhouse_enter_quantity1 + all_werhouse_enter_weight1 += int(werhouse_enter_weight1) + excel_options = [ + 'ردیف', + 'کد سفارش', + 'تاریخ ثبت درخواست', + 'تاریخ کشتار', + 'سن کشتار', + 'نوع درخواست', + 'فروش', + 'تعداد درخواست کشتار', + 'میانگین وزنی درخواست', + 'وزن کل درخواست ', + 'ماهیت خریدار', + 'خریدار', + 'تلفن خریدار', + 'تعداد تخصیصی استان به خریدار(قطعه)', + 'وزن تخصیصی استان به خریدار', + 'مانده در سالن', + ' تعداد بار', + 'تعداد بار قطعه', + 'وزن بار', + 'تعداد قطعه وارد شده در قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'تعداد بار ورود به انبار', + 'حجم بار ورود به انبار', + 'وزن بار ورود به انبار', + 'درصد افت', + 'حجم کشتار', + 'وزن کشتار', + + ] + + if poultry_requests: + worksheet[f'E{row_list2 - 2}'] = f'اطلاعات جوجه ریزی {hatching.period}' + worksheet[f'E{row_list2 - 2}'].font = Font(color="C00000", bold=True, size=12) + worksheet[f'E{row_list2 - 2}'].alignment = Alignment(horizontal='center', vertical='center', + wrap_text=True) + merge_range1 = f'E{row_list2 - 2}:I{row_list2 - 1}' + worksheet.merge_cells(merge_range1) + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=row_list2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + + worksheet.column_dimensions[col_letter].width = 20 + + worksheet.row_dimensions[row_list2].height = 36 + for poultry_request in poultry_requests: + + all_loses += poultry_request.hatching.losses + all_loses1 += poultry_request.hatching.losses + kill_request = ProvinceKillRequest.objects.filter( + province_request__poultry_request=poultry_request, + trash=False, + state__in=('pending', 'accepted'), + return_to_province=False).select_related( + 'killhouse_user', 'province_request__poultry_request').order_by('-create_date') + + car_date = jdatetime.date.fromgregorian( + day=poultry_request.send_date.day, + month=poultry_request.send_date.month, + year=poultry_request.send_date.year + ) + create_date = jdatetime.date.fromgregorian( + day=poultry_request.create_date.day, + month=poultry_request.create_date.month, + year=poultry_request.create_date.year + ) + average_age = (poultry_request.send_date.date() - hatching.date.date()).days + 1 + average_age_list.append(average_age) + average_age_list1.append(average_age) + + if poultry_request.direct_buying == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + free_sale_in_province_false = 0 + Index_weight_sale_in_province_false = 0 + free_sale_in_province_true = 0 + + all_province_quantity += poultry_request.quantity + if poultry_request.out == True: + sale_type = 'خارج از استان' + elif poultry_request.free_sale_in_province == False: + free_sale_in_province_false = poultry_request.quantity + all_free_sale_in_province_false += free_sale_in_province_false + Index_weight_sale_in_province_false = poultry_request.Index_weight + sale_type = 'دولتی' + else: + sale_type = 'آزاد' + free_sale_in_province_true = poultry_request.quantity + + all_free_sale_in_province_true += free_sale_in_province_true + + all_request_weight.append(poultry_request.Index_weight * poultry_request.quantity) + list1 = [ + m, + str(poultry_request.order_code), + str(create_date), + str(car_date), + average_age, + type, + sale_type, + poultry_request.quantity, + poultry_request.Index_weight, + round(poultry_request.quantity * poultry_request.Index_weight, 2), + # poultry_request.quantity, + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=row_list2 + 1, column=item + 1, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + # worksheet.column_dimensions[get_column_letter(item + 1)].width = 17.01 + worksheet.row_dimensions[row_list2 + 1].height = 21 + if m % 2 == 0: + cell.fill = PatternFill(start_color="DAE1F6", fill_type="solid") + # l += 1 + if kill_request.exists(): + o = row_list2 + 1 + if len(kill_request) > 1: + s = len(kill_request) - 1 + + for col in range(ord('A'), ord('J') + 1): + # rng = chr(col) + '7:{}'.format(r) + rng = f'{chr(col)}{o}:{chr(col)}{o + s}' + worksheet.merge_cells(rng) + worksheet[chr(col) + f'{o}'].alignment = Alignment(horizontal='center', + vertical='center') + for kill in kill_request: + + all_main_quantity += kill.main_quantity + all_main_quantity1 += kill.main_quantity + state_s = '' + if kill.state == 'pending': + state_s = 'درانتظار تایید' + elif kill.state == 'accepted': + state_s = ' تایید شده' + quantity_of_car_vet_state_accepted = 0 + weight_of_car_vet_state_accepted = 0 + quantity_of_car = 0 + weight_of_car = 0 + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_kill_request=kill).order_by( + 'id').only('create_date', 'vet_state') + all_net_weight = 0 + all_real_quantity_assigment = 0 + werhouse_enter = kill_house_requests.filter(ware_house_confirmation=True).only( + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss') + len_werhouse_enter = len(werhouse_enter) + werhouse_enter_quantity = werhouse_enter.aggregate( + total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + werhouse_enter_weight = werhouse_enter.aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + all_weight_loss = werhouse_enter.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + + all_len_werhouse_enter += len_werhouse_enter + all_werhouse_enter_quantity += werhouse_enter_quantity + all_werhouse_enter_weight += werhouse_enter_weight + all_all_weight_loss += all_weight_loss + all_weight_loss = round(int(all_weight_loss) / len(werhouse_enter), 2) if len( + werhouse_enter) > 0 else 0 + + if kill_house_requests: + for kill_house_request in kill_house_requests: + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_request, trash=False).only('net_weight', + 'real_quantity').first() + if assignment: + all_net_weight += assignment.net_weight if assignment.net_weight != None else 0 + all_real_quantity_assigment += assignment.real_quantity if assignment.real_quantity != None else 0 + quantity_of_car += kill_house_request.quantity + all_quantity_of_car += kill_house_request.quantity + all_quantity_of_car1 += kill_house_request.quantity + weight_of_car += int( + kill_house_request.quantity * kill_house_request.province_request.poultry_request.Index_weight) + + if kill_house_request.vet_state == 'accepted': + quantity_of_car_vet_state_accepted += kill_house_request.quantity + weight_of_car_vet_state_accepted += kill_house_request.accepted_real_weight + all_quantity_of_car_vet_state_accepted += kill_house_request.quantity + + killed += kill.main_quantity + all_quantity_qarantineh = kill_house_requests.aggregate( + total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + + all_quantity_vet_kill = kill_house_requests.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity', 0) + all_weight_vet_kill = kill_house_requests.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity', 0) + all_accepted_real_quantity = kill_house_requests.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) + all_accepted_real_weight = kill_house_requests.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity', 0) + sum_all_wight_vet_kill += all_weight_vet_kill if all_weight_vet_kill != None else 0 + sum_all_wight_vet_kill1 += all_weight_vet_kill if all_weight_vet_kill != None else 0 + sum_all_quantity_vet_kill += all_quantity_vet_kill if all_quantity_vet_kill != None else 0 + sum_all_quantity_vet_kill1 += all_quantity_vet_kill if all_quantity_vet_kill != None else 0 + sum_quantity_qarantineh += all_quantity_qarantineh if all_quantity_qarantineh != None else 0 + sum_accepted_real_quantity += all_accepted_real_quantity if all_accepted_real_quantity != None else 0 + sum_accepted_real_quantity1 += all_accepted_real_quantity if all_accepted_real_quantity != None else 0 + sum_accepted_real_weight += all_accepted_real_weight if all_accepted_real_weight != None else 0 + sum_accepted_real_weight1 += all_accepted_real_weight if all_accepted_real_weight != None else 0 + left_over = (quantity - killed) + final_left_over.append(left_over) + percent_after_assigment = (quantity_of_car_vet_state_accepted * 100) / quantity + all_percent += percent_after_assigment + + all_weight.append( + kill.main_quantity * kill.province_request.poultry_request.Index_weight) + all_weight1.append( + kill.main_quantity * kill.province_request.poultry_request.Index_weight) + killer = 'کشتارکن' if kill.killhouse_user.killer == True else 'کشتارگاه' + + request_weight.append(Index_weight_sale_in_province_false) + all_kill_province_request_poultry_request_Index_weight.append( + kill.province_request.poultry_request.Index_weight) + + all_weight_of_car_vet_state_accepted += weight_of_car_vet_state_accepted + all_weight_of_car += weight_of_car + all_weight_of_car1 += weight_of_car + list1 = [ + killer, + kill.killhouse_user.name, + kill.killhouse_user.kill_house_operator.user.mobile, + kill.main_quantity, + kill.province_request.poultry_request.Index_weight, + left_over, + len(kill_house_requests) if kill_house_requests else 0, + quantity_of_car, + weight_of_car, + all_quantity_qarantineh if all_quantity_qarantineh else '-', + all_quantity_vet_kill if all_quantity_vet_kill else '-', + all_weight_vet_kill if all_weight_vet_kill else '-', + all_real_quantity_assigment if all_real_quantity_assigment > 0 else '-', + all_net_weight if all_net_weight > 0 else '-', + len_werhouse_enter, + werhouse_enter_quantity, + int(werhouse_enter_weight), + f'%{all_weight_loss}', + all_accepted_real_quantity if all_accepted_real_quantity else '-', + all_accepted_real_weight if all_accepted_real_weight else '-', + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=row_list2 + 1, column=item + 11, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + # worksheet.column_dimensions[get_column_letter(item + 11)].width = 17.01 + # worksheet.column_dimensions[get_column_letter(item + 11)].height = 20.01 + if m % 2 == 0: + cell.fill = PatternFill(start_color="DAE1F6", fill_type="solid") + row_list2 += 1 + + sum_net_weight += all_net_weight + sum_net_weight1 += all_net_weight + sum_real_quantity_assigment += all_real_quantity_assigment + sum_real_quantity_assigment1 += all_real_quantity_assigment + else: + if poultry_request.out == True: + left_over = (quantity - killed) + list1 = [ + 'خارج از استان', + poultry_request.buyer_fullname, + poultry_request.buyer_mobile, + poultry_request.quantity, + int(poultry_request.Index_weight), + left_over, + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + poultry_request.quantity, + int(poultry_request.quantity * poultry_request.Index_weight), + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=row_list2 + 1, column=item + 11, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + # worksheet.column_dimensions[get_column_letter(item + 11)].width = 17.01 + # worksheet.column_dimensions[get_column_letter(item + 11)].height = 20.01 + + if m % 2 == 0: + cell.fill = PatternFill(start_color="DAE1F6", fill_type="solid") + sum_accepted_real_weight += int( + poultry_request.quantity * poultry_request.Index_weight) + sum_accepted_real_weight1 += int( + poultry_request.quantity * poultry_request.Index_weight) + sum_accepted_real_quantity += poultry_request.quantity + sum_accepted_real_quantity1 += poultry_request.quantity + else: + list1 = [ + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + '-', + + ] + for item in range(len(list1)): + cell = worksheet.cell(row=row_list2 + 1, column=item + 11, value=list1[item]) + value = list1[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + # worksheet.column_dimensions[get_column_letter(item + 11)].width = 17.01 + # worksheet.column_dimensions[get_column_letter(item + 11)].height = 20.01 + + if m % 2 == 0: + cell.fill = PatternFill(start_color="DAE1F6", fill_type="solid") + row_list2 += 1 + try: + dd = round(sum(all_kill_province_request_poultry_request_Index_weight) / len( + all_kill_province_request_poultry_request_Index_weight)) + except: + dd = 0 + list2 = [ + 'مجموع==>', + '', + '', + '', + f'', + '', + '', + int(all_province_quantity), + '', + int(sum(all_request_weight)), + '', + '', + '', + int(all_main_quantity), + int(dd), + f'', + '', + + int(all_quantity_of_car), + int(all_weight_of_car), + int(sum_quantity_qarantineh), + int(sum_all_quantity_vet_kill), + int(sum_all_wight_vet_kill), + int(sum_real_quantity_assigment), + int(sum_net_weight), + all_len_werhouse_enter, + all_werhouse_enter_quantity, + all_werhouse_enter_weight, + f'%{round(int(all_all_weight_loss) / all_len_werhouse_enter, 2) if all_len_werhouse_enter > 0 else 0}', + int(sum_accepted_real_quantity), + int(sum_accepted_real_weight), + + ] + + for item in range(len(list2)): + cell = worksheet.cell(row=row_list2 + 2, column=item + 1, value=list2[item]) + value = list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + row_list2 += 8 + row_city += 6 + + try: + avrage_age1 = round((sum(average_age_list) / len(average_age_list))) + except: + avrage_age1 = 0 + all_quantity_of_request = poultry_requests.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + row_header = 1 + all_all_quantity_of_request1 += all_quantity_of_request + value_header_list = [ + hatching.period, + hatching.poultry.unit_name, + hatching.poultry.user.fullname, + str(hatch_date), + quantity, + ninety_percent, + + all_loses, + hatching.left_over, + avrage_age1, + len(poultry_requests), + all_quantity_of_request, + hatching.out_province_killed_quantity, + hatching.out_province_killed_weight, + all_main_quantity, + sum(all_weight), + round((hatching.killed_quantity * 100) / ninety_percent), + all_quantity_of_car, + all_weight_of_car, + sum_all_quantity_vet_kill, + sum_all_wight_vet_kill, + sum_real_quantity_assigment, + int(sum_net_weight), + len(werhouse_enter1), + werhouse_enter_quantity1, + werhouse_enter_weight1, + f'%{round(all_weight_loss2 / len(werhouse_enter1), 2) if len(werhouse_enter1) > 0 else 0}', + sum_accepted_real_quantity, + sum_accepted_real_weight, + f'%{int((sum_accepted_real_quantity * 100) / quantity if quantity > 0 else 0)}', + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=l, column=item + 3, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + # worksheet.column_dimensions[get_column_letter(item + 11)].width = 17.01 + # worksheet.column_dimensions[get_column_letter(item + 11)].height = 20.01 + + l += 1 + row_header += 1 + else: + all_left_over = hatchings.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity') or 0 + all_quantity = hatchings.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + out_province_killed_quantity = hatchings.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity') or 0 + out_province_killed_weight = hatchings.aggregate(total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity') or 0 + + ninety_percent = (all_quantity * 90) / 100 + value_header_list = [ + 'مجموع==>', + '', + '', + '', + all_quantity, + ninety_percent, + + all_loses1, + all_left_over, + '', + '', + all_all_quantity_of_request1, + out_province_killed_quantity, + out_province_killed_weight, + all_main_quantity1, + sum(all_weight1), + '', + all_quantity_of_car1, + all_weight_of_car1, + sum_all_quantity_vet_kill1, + sum_all_wight_vet_kill1, + sum_real_quantity_assigment1, + int(sum_net_weight1), + len_werhouse_enter1, + all_werhouse_enter_quantity1, + all_werhouse_enter_weight1, + '', + sum_accepted_real_quantity1, + sum_accepted_real_weight1, + '', + + ] + nn = len(hatchings) + 4 + for item in range(len(value_header_list)): + cell = worksheet.cell(row=nn, column=item + 3, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int, float)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.border = openpyxl.styles.Border( + left=openpyxl.styles.Side(style='thin'), + right=openpyxl.styles.Side(style='thin'), + top=openpyxl.styles.Side(style='thin'), + bottom=openpyxl.styles.Side(style='thin') + ) + else: + filtered_kill_request = KillHouseRequest.objects.filter( + trash=False, province_request__poultry_request__poultry=poultreis + ).order_by( + '-create_date').select_related( + 'killhouse_user', 'province_request__poultry_request__poultry__user', + 'province_request__poultry_request', + 'province_request__poultry_request__poultry', 'add_car__driver', + 'killhouse_user__system_address__city', + 'kill_request__slaughter_house').only('ware_house_confirmation', + 'document_status', 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', 'weight_loss', 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', 'traffic_code', + 'assignment_state_archive', + 'province_request__poultry_request__hatching__chicken_age', + 'killhouse_user__kill_house_operator__user__province__name', + 'killhouse_user', + 'killhouse_user__name', + 'province_request__poultry_request__amount', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', 'quarantine_quantity', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', 'killer').values('document_status', + 'ware_house_confirmation', + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss', + 'message', + 'province_request__poultry_request__freezing', + 'province_request__poultry_request', + 'killhouse_user', + 'killhouse_user__name', + 'killhouse_user__kill_house_operator__user__mobile', + 'killhouse_user__system_address__city__name', + 'killhouse_user__killer', + 'kill_request__slaughter_house', + 'kill_request__slaughter_house__name', + 'province_request__poultry_request__poultry', + 'province_request__poultry_request__order_code', + 'province_request__poultry_request__chicken_breed', + 'province_request__poultry_request__poultry__user__city__name', + 'province_request__poultry_request__poultry__unit_name', + 'province_request__poultry_request__poultry__user__mobile', + 'province_request__poultry_request__send_date', + 'add_car__driver__driver_name', + 'add_car__driver__driver_mobile', + 'add_car__driver__type_car', + 'add_car__driver__health_code', + 'key', + 'province_kill_request__province_request__poultry_request__Index_weight', + 'clearance_code', + 'quantity', + 'bar_code', + 'accepted_real_weight', + 'accepted_real_quantity', + 'vet_state', + 'vet_accepted_real_quantity', + 'vet_accepted_real_weight', + 'quarantine_quantity', + 'killhouse_user__kill_house_operator__user__province__name', + 'province_request__poultry_request__hatching__chicken_age', + 'province_request__poultry_request__amount', + 'assignment_state_archive', + 'traffic_code', + 'province_kill_request__province_request__poultry_request__free_sale_in_province', + 'province_kill_request__province_request__poultry_request__union', + 'province_kill_request__province_request__poultry_request__direct_buying', + 'quarantine_code_state', + 'province_request__poultry_request__send_date', + 'province_request__poultry_request__hatching__date', + 'killer__kill_house_operator__user__mobile', + 'killer__name', + 'killhouse_user__type', + 'killer', + ) + + filtered_kill_reqs = filtered_kill_request + + poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=filtered_kill_reqs.values( + 'province_request__poultry_request')) + .only('quantity', 'Index_weight')).annotate( + total_quantity=Sum('quantity'), + total_weight=Sum(F('quantity') * F('Index_weight')) + ) + + total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total'] or 0 + total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total'] or 0 + excel_options = [ + 'ردیف', + 'کد بار', + ' تاریخ کشتار', + 'کشتار', + 'کدسفارش مرغدار', + 'مرغدار', + 'تلفن مرغدار', + ' شهر مرغدار', + 'فروش', + + 'سن مرغ', + 'قیمت پیشنهادی مرغدار(ریال)', + ' نژاد', + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + ' ماهیت خریدار', + 'خریدار', + ' تلفن خریدار', + ' آدرس ', + 'کشتارکن اختصاصی', + 'تلفن کشتارکن اختصاصی', + ' محل کشتار ', + 'نوع تخصیص', + 'دامپزشک کشتارگاه ', + ' تلفن دامپزشک کشتارگاه ', + 'راننده', + 'موبایل راننده', + 'نوع خودرو', + 'کد بهداشتی حمل و نقل', + 'تعداد قطعه بار ', + 'وزن بار', + 'کد رهگیری سامانه قرنطینه', + 'تعداد قطعه وارد شده در قرنطینه', + 'وضعیت تخلیه', + 'تاریخ تخلیه (کشتارگاه)', + 'تعداد تخلیه شده دامپزشک', + 'وزن بار تخلیه شده(کیلوگرم)دامپزشک', + 'تعداد نهایی در کشتارگاه', + 'وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'وضعیت', + 'وضعیت سند', + 'وضعیت ورود انبار', + 'تعداد لاشه', + 'وزن لاشه', + 'درصد افت', + + ] + + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + for col_num, option in enumerate(excel_options, 1): + col_letter = get_column_letter(col_num) + cell = worksheet.cell(row=6, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = blue_fill + cell.font = Font(size=10, bold=True, color='D9FFFFFF') + if len(option) > worksheet.column_dimensions[col_letter].width: + worksheet.column_dimensions[col_letter].width = len(option) + 3 + + # تنظیم ارتفاع سطر + # ارتفاع سطر را برابر با ارتفاع آخرین سطر قرار می‌دهیم + worksheet.row_dimensions[6].height = 19 + worksheet.freeze_panes = worksheet['A7'] + max_col = worksheet.max_column + range_str = f'A6:{get_column_letter(max_col)}{worksheet.max_row}' + worksheet.auto_filter.ref = range_str + header_list = [ + 'تعداد بارهای ایجاد شده', + 'تعداد بارهای دارای کشتارکن اختصاصی', + 'مجموع تعداد قطعه بارها', + 'مجموع وزن بارها', + 'تعداد بارهای دارای کد قرنطینه', + 'تعداد بار احراز شده از قرنطینه', + 'مجموع تعداد قطعه احراز شده از قرنطینه', + 'تعداد تخلیه شده دامپزشک', + 'مجموع تعداد تخلیه شده دامپزشک', + 'مجموع وزن تخلیه شده دامپزشک', + 'تعداد بارهای تکمیل شده', + 'مجموع تعداد نهایی در کشتارگاه', + 'مجموع وزن نهایی در کشتار گاه', + 'ملاک قطعه کشتار شده', + 'ملاک وزن کشتار شده', + 'تعداد بار های وارد شده در انبار', + 'مجموع تعداد لاشه', + 'مجموع وزن لاشه', + 'میانگین درصد افت لاشه', + + ] + for col_num, option in enumerate(header_list, 9): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="0070C0", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + header_list2 = [ + 'تعداد درخواست مرغداران', + ' مجموع تعداد قطعه درخواست مرغداران', + ' مجموع وزن درخواست مرغداران', + + ] + for col_num, option in enumerate(header_list2, 6): + cell = worksheet.cell(row=2, column=col_num, value=option) + cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + cell.font = Font(size=9, bold=True, color='D9FFFFFF') + worksheet.row_dimensions[2].height = 20.8 + + worksheet['B1'] = f'گزارش بارهای ایجاد شده در فرآیند کشتار مرغ گوشتی' + + if filtered_kill_reqs.exists(): + name = filtered_kill_reqs.first()['killhouse_user__kill_house_operator__user__province__name'] + worksheet['B2'] = f'استان {name}' + + # worksheet['B3'] = f'از تاریخ:({from_date_1}) تا تاریخ:({to_date_1})' + + worksheet['B3'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B1'].alignment = Alignment(horizontal='center', vertical='center') + worksheet['B2'].alignment = Alignment(horizontal='center', vertical='center') + merge_range1 = 'B1:D1' + merge_range2 = 'B2:D2' + merge_range = 'B3:D3' + worksheet.merge_cells(merge_range1) + worksheet.merge_cells(merge_range) + worksheet.merge_cells(merge_range2) + worksheet['B1'].font = red_font + worksheet['B3'].font = Font(size=11) + worksheet['B2'].font = Font(size=10, bold=True, color="C00000") + + l = 5 + m = 1 + all_quantity = 0 + all_real_quantity = 0 + all_net_weighte = 0 + all_weighte = 0 + all_vet_state_accepted = len( + filtered_kill_reqs.filter(vet_state='accepted')) + bar_complete = filtered_kill_reqs.filter(assignment_state_archive='True') + accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + accepted_real_wight = filtered_kill_reqs.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + all_kill_request_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_vet_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('vet_accepted_real_weight')).get( + 'total_quantity') or 0 + killer_exclusive = 0 + all_assignment_state_archive_state = 0 + len_weight_loss = 0 + all_state_ware_house_confirmation = 0 + if filtered_kill_reqs: + for kill in filtered_kill_reqs: + if (kill['assignment_state_archive'] == 'True' and kill['vet_state'] == 'pending') or kill[ + 'vet_state'] == 'accepted': + state = 'تخلیه شده' + else: + state = 'درانتظار تخلیه' + l += 1 + date_of_inner_bar = '-' + vet_farm = VetFarm.objects.filter( + poultry=kill.get('province_request__poultry_request__poultry'), + trash=False).select_related('vet__user').only('vet__user__fullname', + 'vet__user__mobile').values( + 'vet__user__fullname', + 'vet__user__mobile').first() + vet_farm_name = vet_farm.get('vet__user__fullname') if vet_farm else '-' + vet_farm_mobile = vet_farm.get('vet__user__mobile') if vet_farm else '-' + kil_house_vet = KillHouseVet.objects.filter(kill_house=kill.get('killhouse_user'), + trash=False).select_related( + 'vet__user').only('vet__user__fullname', + 'vet__user__mobile').values('vet__user__fullname', + 'vet__user__mobile').first() + vet_checks = VetCheckRequest.objects.filter(trash=False, + kill_house_request__key=kill.get('key')).only( + 'create_date').values( + 'create_date').first() + kill_house_vet_name = kil_house_vet.get('vet__user__fullname') if kil_house_vet else '-' + kill_house_vet_mobile = kil_house_vet.get('vet__user__mobile') if kil_house_vet else '-' + code = kill.get('clearance_code') if kill.get('clearance_code') else '-' + if kill.get('quantity'): + quantity = kill.get('quantity') + + else: + quantity = '-' + send_date = kill.get('province_request__poultry_request__send_date') + date_of_poultry_request = jdatetime.date.fromgregorian( + day=send_date.day, + month=send_date.month, + year=send_date.year + ) + killers = 'کشتارکن' + name_killer_exclusive = '-' + mobile_killer_exclusive = '-' + if kill.get('killhouse_user__killer') == False: + killers = 'کشتارگاه' + if kill.get('killer') != None: + name_killer_exclusive = kill['killer__name'] + mobile_killer_exclusive = str(kill['killer__kill_house_operator__user__mobile']) + killer_exclusive += 1 + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request__key=kill.get('key'), trash=False).only('create_date', 'net_weight', + 'real_quantity').values( + 'net_weight', 'real_quantity', 'create_date').first() + if assignment: + net_weighte = int(assignment.get('net_weight')) + real_quantity = assignment.get('real_quantity') + + vet_check_date = assignment.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + else: + net_weighte = '-' + real_quantity = '-' + if vet_checks: + vet_check_date = vet_checks.get('create_date') + date_of_inner_bar = convert_to_shamsi( + datetime=vet_check_date + ) + + if kill.get('kill_request__slaughter_house') is not None: + kill_place = kill.get('kill_request__slaughter_house__name') + else: + kill_place = '-' + + vet_quantity = kill['vet_accepted_real_quantity'] if kill['vet_accepted_real_quantity'] else '-' + vet_wight = int(kill['vet_accepted_real_weight']) if kill['vet_accepted_real_weight'] else '-' + + weight = int(kill.get('quantity') * kill.get( + 'province_kill_request__province_request__poultry_request__Index_weight')) + + quarantine_quantity = '-' + + if kill['quarantine_quantity'] != None: + quarantine_quantity = kill['quarantine_quantity'] + else: + if kill['quarantine_code_state'] == 'contradiction': + quarantine_quantity = 'مغایرت کد رهگیری' + elif kill['quarantine_code_state'] == 'noclearance': + quarantine_quantity = 'فاقد کد رهگیری' + elif kill['quarantine_code_state'] == 'notconfirmed': + quarantine_quantity = 'عدم تایید راهداری' + + sale_type = 'دولتی' if kill[ + 'province_kill_request__province_request__poultry_request__free_sale_in_province'] == False else 'آزاد' + + if kill['province_kill_request__province_request__poultry_request__union'] == True: + type = 'فروش آزاد' + elif kill['province_kill_request__province_request__poultry_request__direct_buying'] == True: + type = 'خرید مستقیم' + else: + type = 'اتحادیه' + age = (kill.get('province_request__poultry_request__send_date').date() - + kill.get('province_request__poultry_request__hatching__date').date()).days + 1 + + freez_state = 'منجمد' if kill['province_request__poultry_request__freezing'] == True else 'عادی' + if kill['message'] is not None: + state_delete = 'بار حذف شده' + else: + state_delete = 'فعال' + all_quantity += quantity + all_weighte += weight + all_real_quantity += real_quantity if real_quantity != '-' else 0 + all_net_weighte += net_weighte if net_weighte != '-' else 0 + + ware_house_accepted_real_quantity = kill['ware_house_accepted_real_quantity'] + ware_house_accepted_real_weight = kill['ware_house_accepted_real_weight'] + weight_loss = round(kill['weight_loss'], 2) if kill['weight_loss'] > 0 else 0 + if weight_loss > 0: + len_weight_loss += 1 + if kill['ware_house_confirmation'] == True: + state_ware_house_confirmation = 'ورود به انبار' + all_state_ware_house_confirmation += 1 + + else: + state_ware_house_confirmation = '-' + list1 = [ + m, + str(kill.get('bar_code')), + str(date_of_poultry_request), + freez_state, + str(kill.get('province_request__poultry_request__order_code')), + kill.get('province_request__poultry_request__poultry__unit_name'), + str(kill.get('province_request__poultry_request__poultry__user__mobile')), + kill.get('province_request__poultry_request__poultry__user__city__name'), + sale_type, + age, + kill.get('province_request__poultry_request__amount') if kill.get( + 'province_request__poultry_request__amount') else '-', + kill.get('province_request__poultry_request__chicken_breed'), + vet_farm_name, + vet_farm_mobile, + killers, + kill.get('killhouse_user__name'), + kill.get('killhouse_user__kill_house_operator__user__mobile'), + kill.get('killhouse_user__system_address__city__name'), + name_killer_exclusive, + mobile_killer_exclusive, + kill_place, + type, + kill_house_vet_name, + kill_house_vet_mobile, + kill.get('add_car__driver__driver_name'), + kill.get('add_car__driver__driver_mobile'), + kill.get('add_car__driver__type_car'), + str(kill.get('traffic_code')), + quantity, + weight, + code, + quarantine_quantity, + state, + str(date_of_inner_bar), + vet_quantity, + vet_wight, + real_quantity, + net_weighte, + kill['accepted_real_quantity'], + int(kill['accepted_real_weight']), + state_delete, + kill['document_status'] if kill['document_status'] else '-', + state_ware_house_confirmation, + ware_house_accepted_real_quantity, + int(ware_house_accepted_real_weight), + f'{weight_loss}%', + + ] + m += 1 + for item in range(len(list1)): + cell = worksheet.cell(row=l + 1, column=item + 1, value=list1[item]) + value = list1[item] + + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + if list1[40] == 'بار حذف شده': + cell.fill = PatternFill(start_color="FCDFDC", fill_type="solid") + worksheet.row_dimensions[l + 1].height = 20 + cell.alignment = Alignment(horizontal='center', vertical='center') + + has_code = len(filtered_kill_reqs.filter(clearance_code__isnull=False)) + all_quarantine_quantity = filtered_kill_reqs.aggregate(total_quantity=Sum('quarantine_quantity')).get( + 'total_quantity', 0) + has_qarantine = len(filtered_kill_reqs.filter(quarantine_quantity__isnull=False)) + all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_quantity')).get( + 'total_quantity') or 0 + all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate( + total_quantity=Sum('ware_house_accepted_real_weight')).get( + 'total_quantity', 0) or 0 + all_weight_loss = filtered_kill_reqs.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_weight_loss = round(int(all_weight_loss) / len_weight_loss, 2) if len_weight_loss > 0 else 0 + value_header_list = [ + len(filtered_kill_reqs), + killer_exclusive, + all_quantity, + int(all_weighte), + has_code, + has_qarantine, + + all_quarantine_quantity if all_quarantine_quantity != None else 0, + all_vet_state_accepted, + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + len(bar_complete), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + all_state_ware_house_confirmation, + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + for item in range(len(value_header_list)): + cell = worksheet.cell(row=3, column=item + 9, value=value_header_list[item]) + value = value_header_list[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + value_header_list2 = [ + len(poultry_request), + total_requests_quantity, + int(total_requests_weight) + + ] + for item in range(len(value_header_list2)): + cell = worksheet.cell(row=3, column=item + 6, value=value_header_list2[item]) + value = value_header_list2[item] + # Check if the value is a number before formatting + if isinstance(value, (int)): + if value != 0: + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_kill_request_quantity, + int(all_weighte), + '', + all_quarantine_quantity if all_quarantine_quantity != None else 0, + '', + '', + all_vet_accepted_real_quantity, + int(all_vet_accepted_real_weight), + all_real_quantity, + int(all_net_weighte), + accepted_real_quantity if accepted_real_quantity != None else 0, + int(accepted_real_wight) if accepted_real_wight != None else 0, + '', + '', + '', + all_ware_house_accepted_real_quantity, + int(all_ware_house_accepted_real_weight), + f'%{all_weight_loss}' + + ] + for item in range(len(list2)): + cell = worksheet.cell(row=l + 3, column=item + 1, value=list2[item]) + value = list2[item] + if isinstance(value, (int)): + cell.number_format = '#,###' # Apply general number format + else: + cell.value = value # Keep as text for other values + + cell.alignment = Alignment(horizontal='center') + cell.font = Font(size=10, bold=True) + cell.font = Font(bold=True) + cell.fill = PatternFill(start_color="00B050", fill_type="solid") + + name = poultreis.unit_name + + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="پایش کلی اطلاعاتی مرغدار {name}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def poultry_hatching_prediction_chart_excel(request): + consumption_limit_type = request.GET.get('consumption_limit_type') + consumption_limit = request.GET.get('consumption_limit') + killing_age_external_type = request.GET.get('killing_age_external_type') + killing_age_internal_type = request.GET.get('killing_age_internal_type') + killing_age = request.GET.get('killing_age') + time_frame_type = request.GET.get('time_frame_type') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + date_list = [] + final_list = [] + + poultries = Poultry.objects.filter(killing_ave_age__gt=1, trash=False) + if killing_age_external_type == 'poultry_ave_killing_age': + if killing_age_internal_type == 'poultry': + if time_frame_type == 'all': + hatchings = PoultryHatching.objects.filter(trash=False, state='pending', + archive=False, temporary_trash=False, + temporary_deleted=False, predicate_date__isnull=False) + date_list = hatchings.values_list('predicate_date', flat=True).distinct() + for date in date_list: + n_hatchings = hatchings.filter(predicate_date=date) + poultries = Poultry.objects.filter(pk__in=n_hatchings.values_list('poultry', flat=True)) + ages = poultries.values_list('killing_ave_age', flat=True).distinct() + + index_weight = poultries.aggregate(total=Sum('real_killing_ave_weight'))[ + 'total'] or 0 + quantity = n_hatchings.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + + result = { + "date": date, + "quantity": quantity, + "poultry": len(poultries), + "age": ages, + "hatchings": n_hatchings.values_list('id', flat=True), + "weight": int(quantity * index_weight) if consumption_limit_type in ( + 'quantity', 'live_weight') else int((quantity * index_weight) * 0.75), + } + final_list.append(result) + + else: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + hatchings = PoultryHatching.objects.filter(trash=False, state='pending', + archive=False, temporary_trash=False, + temporary_deleted=False, predicate_date__date__gte=date1, + predicate_date__date__lte=date2) + # poultries = poultries.filter(date__gte=date1,date__lte=date2).order_by('date') + date_list = poultries.values_list('date', flat=True).distinct() + + for date in date_list: + n_hatchings = hatchings.filter(predicate_date__date=date) + poultries = Poultry.objects.filter(pk__in=n_hatchings.values_list('poultry', flat=True)) + ages = poultries.values_list('killing_ave_age', flat=True).distinct() + + index_weight = poultries.aggregate(total=Sum('real_killing_ave_weight'))[ + 'total'] or 0 + quantity = n_hatchings.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + result = { + "date": date, + "quantity": quantity, + "poultry": len(poultries.filter(date=date)), + "age": ages, + "hatchings": n_hatchings.values_list('id', flat=True), + "weight": int(quantity * index_weight) if consumption_limit_type in ( + 'quantity', 'live_weight') else int((quantity * index_weight) * 0.75), + } + final_list.append(result) + + else: + sum_of_ages = poultries.aggregate(total=Sum('killing_ave_age'))[ + 'total'] or 0 + ave_killing_age = int(sum_of_ages / len(poultries)) + if time_frame_type == 'all': + final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type) + + + else: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type, date1, date2) + + else: + if killing_age_internal_type == 'poultry': + if time_frame_type == 'all': + final_list = poultry_prediction_helper(int(killing_age), consumption_limit_type) + # poultries = poultries.filter(killing_ave_age=int(killing_age)) + # date_list = poultries.values_list('date', flat=True).distinct() + # for date in date_list: + # index_weight = poultries.filter(date=date).aggregate(total=Sum('killing_ave_weight'))[ + # 'total'] or 0 + # quantity = poultries.filter(date=date).aggregate(total=Sum('active_left_over'))[ + # 'total'] or 0 + # + # result = { + # "date": date, + # "quantity": quantity, + # "poultry": len(poultries.filter(date=date)), + # "age": int(killing_age), + # "wight": quantity * index_weight, + # } + # final_list.append(result) + + else: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + final_list = poultry_prediction_helper(int(killing_age), consumption_limit_type, date1, date2) + + # poultries = poultries.filter(killing_ave_age=int(killing_age),date__gte=date1,date__lte=date2) + # date_list = poultries.values_list('date', flat=True) + # for date in date_list: + # index_weight = poultries.filter(date=date).aggregate(total=Sum('killing_ave_weight'))[ + # 'total'] or 0 + # quantity = poultries.filter(date=date).aggregate(total=Sum('active_left_over'))[ + # 'total'] or 0 + # + # result = { + # "date": date, + # "quantity": quantity, + # "poultry": len(poultries.filter(date=date)), + # "age": int(killing_age), + # "wight": quantity * index_weight, + # } + # final_list.append(result) + + else: + + ave_killing_age = int(killing_age) + + if time_frame_type == 'all': + final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type) + + + + else: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type, date1, date2) + + excel_options = [ + 'ردیف', + 'تاریخ', + 'تعداد مرغداران', + 'حجم(قطعه)', + 'وزن(کیلوگرم)', + 'سن', + + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد مرغداران', + 'مجموع حجم', + 'مجموع وزن', + + ] + + create_header(worksheet, header_list, 4, 2, height=20) + if "date1" in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + excel_description(worksheet, 'B1', + f'پیشبینی موجودی از تاریخ {shamsi_date(date1)} تا تاریخ {shamsi_date(date2)}', color='red', + row2='C3') + else: + excel_description(worksheet, 'B1', f'پیشبینی موجودی', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + + if final_list: + for data in final_list: + if type(data['age']) is str or type(data['age']) is int: + age = data['age'] + + else: + if len(data['age']) > 1: + age = '-'.join(map(str, data['age'])) + elif len(data['age']) == 1: + age = str(data['age'][0]) + else: + age = '' + if type(data['date']) is str: + try: + str_date = datetime.datetime.strptime(str(data['date']), "%Y-%m-%dT%H:%M:%S").date() + except: + str_date = datetime.datetime.strptime(str(data['date']), '%Y-%m-%d').date() + date = convert_to_shamsi(date=str_date) + elif data['date'] is None: + date = '-' + else: + date = convert_to_shamsi(date=data['date']) + list1 = [ + m, + date, + data['poultry'], + data['quantity'], + data['weight'], + age, + + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', width=15) + poultry = sum(item['poultry'] for item in final_list) + quantity = sum(item['quantity'] for item in final_list) + weight = sum(item['weight'] for item in final_list) + value_header_list = [ + poultry, + quantity, + weight, + ] + create_value(worksheet, value_header_list, 3, 4) + + list2 = [ + 'مجموع==>', + '', + poultry, + quantity, + weight, + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + if consumption_limit_type == 'quantity': + data_columns = 4 + y_axis_title = 'حجم موجودی (قطعه)' + else: + data_columns = 5 + y_axis_title = "وزن موجودی (کیلوگرم)" + add_chart( + worksheet=worksheet, + chart_type='line', + data_columns=data_columns, + category_column=2, + start_row=7, + end_row=l + 1, + chart_position="H7", + chart_title="داده های تجمیعی", + x_axis_title="تاریخ", + y_axis_title=y_axis_title + ) + 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 + + +def hatching_report_from_age_excel(request): + input_age1 = int(request.GET['age1']) + input_age2 = int(request.GET['age2']) + filtered_poultry_hatch = PoultryHatching.objects.filter(chicken_age__gte=input_age1, chicken_age__lte=input_age2, + archive=False, + allow_hatching='pending', + trash=False).select_related('poultry', + 'poultry__user').order_by( + 'create_date') + user = SystemUserProfile.objects.get(key=request.GET['key']) + + if 'chain' in request.GET: + filtered_poultry_hatch = filtered_poultry_hatch.filter(has_chain_company=True) + + if request.GET['role'] in ['CityJahad', 'CityPoultry']: + filtered_poultry_hatch = filtered_poultry_hatch.filter(poultry__address__city=user.city) + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + filtered_poultry_hatch = filtered_poultry_hatch.filter(poultry__city_operator=city_operator.unit_name) + else: + filtered_poultry_hatch = filtered_poultry_hatch + excel_options = [ + 'ردیف', + 'وضعیت فارم', + 'زنجیره/شرکت', + 'نام و خانوادگی', + 'نام فارم', + 'موبایل', + 'شهرستان', + 'کد یکتا', + 'کد سیستمی واحد', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'نژاد', + 'سن', + 'تعداد جوجه ریزی', + 'تلفات دوره', + 'تعداد کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'تعداد کشتار خارج از استان(قطعه)', + 'وزن کشتار خارج از استان(کیلوگرم)', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ ثبت گزارش', + ] + date1 = datetime.datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + blue_fill = PatternFill(start_color="1E487B", fill_type="solid") + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + red_font = Font(color="C00000", bold=True) + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(وجود فارم فعال دیگر)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + list1 = [ + m, + farm_state, + chain_company, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.mobile, + poultry_hatching.poultry.user.city.name, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.poultry.system_code, + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.losses, + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + all_quantity, + all_losses, + all_killed_quantity, + all_total_killed_weight, + all_left_over, + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="جوجه ریزی بر اساس بازه {input_age1} تا {input_age2} روز.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def poultry_hatching_prediction_excel(request): + filterset_class = PoultryHatchingFilterSet + filterset_fields = [ + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__mobile', + 'poultry__unit_name', + 'poultry__address__city__name', + 'chicken_age', + 'poultry__breeding_unique_id', + + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + if 'hatching_list' in request.GET: + poultry_hatchings = PoultryHatching.objects.filter(id__in=(request.GET['hatching_list']).split(',')).order_by( + 'date') + else: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', + poultry__city_operator=city_operator.unit_name, + trash=False).order_by('date') + + elif request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', + poultry__address__city=user.city, + trash=False).order_by('date') + + else: + poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', + trash=False).order_by('date') + if 'search' in request.GET: + hatching_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=poultry_hatchings + ) + ).filter(): + ps = filterset_class(data=query, queryset=poultry_hatchings) + hatching_list = ps.filter() + poultry_hatchings = [] if len(hatching_list) == 0 else hatching_list + excel_options = [ + 'ردیف', + 'نام واحد', + 'مالک', + 'موبایل', + 'شهر', + 'میانگین سن کشتار', + 'میانگین وزن کشتار', + 'دوره', + 'تاریخ جوجه ریزی', + 'حجم جوجه ریزی', + 'سن', + 'نژاد', + 'حجم کشتار شده', + 'وزن کشتار شده', + 'تخصیص بدون بار', + 'حجم تخصیص بدون بار', + 'وزن تخصیص بدون بار', + 'مانده سالن(حجم)', + 'مانده سالن(وزن زنده)', + 'مانده سالن(وزن لاشه)', + + ] + date1 = datetime.datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + '', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'جزئیات پایش اطلاعات تاریخ {from_date_1}', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + serializer = PoultryHatchingForPredictionSerializer(poultry_hatchings, many=True).data + if serializer: + for data in serializer: + datetime_object = datetime.datetime.strptime(data['date'], "%Y-%m-%dT%H:%M:%S") + + list1 = [ + m, + data['poultry']['unit_name'], + data['poultry']['fullname'], + data['poultry']['mobile'], + data['poultry']['city'], + data['general_info']['ave_age'], + data['general_info']['ave_weight'], + data['period'], + convert_to_shamsi(date=datetime_object), + data['quantity'], + data['general_info']['age'], + data['chicken_breed'], + data['general_info']['total_quantity'], + data['general_info']['total_weight'], + data['general_info']['province_kill_requests'], + data['general_info']['province_kill_requests_quantity'], + data['general_info']['province_kill_requests_weight'], + data['left_over'], + round(data['left_over'] * data['poultry']['killing_ave_weight']), + round(data['left_over'] * data['poultry']['killing_ave_weight'] * 0.75), + + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + quantity = sum( + item['quantity'] for item in serializer) + + total_quantity = sum( + item['general_info'].get('total_quantity', 0) for item in serializer) + total_weight = sum( + item['general_info'].get('total_weight', 0) for item in serializer) + province_kill_requests = sum( + item['general_info'].get('province_kill_requests', 0) for item in serializer) + province_kill_requests_quantity = sum( + item['general_info'].get('province_kill_requests_quantity', 0) for item in serializer) + province_kill_requests_weight = sum( + item['general_info'].get('province_kill_requests_weight', 0) for item in serializer) + killing_ave_weight = sum( + item['poultry'].get('killing_ave_weight', 0) for item in serializer) + killing_ave_weight = killing_ave_weight / len(serializer) if serializer else 0 + + left_over = sum( + item['left_over'] for item in serializer) + + value_header_list = [ + + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + quantity, + '', + '', + total_quantity, + total_weight, + province_kill_requests, + province_kill_requests_quantity, + province_kill_requests_weight, + left_over, + round(left_over * killing_ave_weight), + round(left_over * killing_ave_weight * 0.75), + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="جزئیات پایش اطلاعات تاریخ {from_date_1}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def bar_difference_reques_excel(request): + filterset_class = BarDifferenceRequestFilterSet + filterset_fields = [ + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__mobile', + 'hatching__poultry__user__fullname', + 'hatching__poultry__user__mobile' + ] + user = SystemUserProfile.objects.get(key=request.GET['key'], trash=False) + if request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + if request.GET['state'] == 'pending': + state = 'جدید' + bar_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, + state='pending').order_by('id') + else: + state = 'بایگانی شده' + bar_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, + state__in=('accepted', 'rejected')).order_by('id') + else: + if request.GET['state'] == 'pending': + state = 'جدید' + bar_requests = BarDifferenceRequest.objects.filter(trash=False, state='pending').order_by('id') + else: + bar_requests = BarDifferenceRequest.objects.filter(trash=False, + state__in=('accepted', 'rejected')).order_by('id') + state = 'بایگانی شده' + + if 'search' in request.GET: + bar_requests_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=bar_requests + ) + ).filter(): + ps = filterset_class(data=query, queryset=bar_requests) + bar_requests_list = ps.filter() + bar_requests = [] if len(bar_requests_list) == 0 else bar_requests_list + excel_options = [ + 'ردیف', + 'وضعیت', + 'ثبت کننده', + 'تاریخ ثبت', + 'مرغدار', + 'کشتارگاه', + 'حجم', + 'حجم کم شده از سالن مرغدار', + 'وزن تقریبی کشتار(کیلوگرم)', + 'حجم سفارشات دریافتی توسط کشتارگاه', + 'اختلاف کشتار(حجم)', + + ] + date1 = datetime.datetime.now().date() + from_date = jdatetime.date.fromgregorian( + year=date1.year, + month=date1.month, + day=date1.day + ).strftime('%Y-%m-%d') + reversed_date = reversed(from_date.split("-")) + separate = "-" + from_date_1 = separate.join(reversed_date) + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'حجم', + 'حجم کم شده از سالن مرغدار', + 'وزن تقریبی کشتار(کیلوگرم)', + 'حجم سفارشات دریافتی توسط کشتارگاه', + 'اختلاف کشتار(حجم)', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'اختلاف کشتار {state}', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + serializer = BarDifferenceRequestSerializer(bar_requests, many=True).data + if serializer: + for data in serializer: + datetime_object = datetime.datetime.strptime(data['create_date'], "%Y-%m-%dT%H:%M:%S.%f") + if data['state'] == 'pending': + status = 'در انتظار تایید' + elif data['state'] == 'accepted': + status = 'تایید شده' + else: + status = 'رد شده' + list1 = [ + m, + status, + data['register_fullname'], + str(convert_to_shamsi(date=datetime_object.date())), + data['hatching']['poultry']['unit_name'] + '(' + data['hatching']['poultry']['user']['mobile'] + ')', + data['kill_house']['name'] + '(' + data['kill_house']['kill_house_operator']['user']['mobile'] + ')', + data['quantity'], + data['bar_info']['total_quantity'], + data['bar_info']['total_weight'], + data['bar_info']['first_total_quantity'], + data['bar_info']['difference_quantity'], + + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + quantity = sum( + item['quantity'] for item in serializer) + + total_quantity = sum( + item['bar_info'].get('total_quantity', 0) for item in serializer) + total_weight = sum( + item['bar_info'].get('total_weight', 0) for item in serializer) + first_total_quantity = sum( + item['bar_info'].get('first_total_quantity', 0) for item in serializer) + difference_quantity = sum( + item['bar_info'].get('difference_quantity', 0) for item in serializer) + + value_header_list = [ + quantity, + total_quantity, + total_weight, + first_total_quantity, + difference_quantity, + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + quantity, + total_quantity, + total_weight, + first_total_quantity, + difference_quantity, + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + workbook.save(output) + output.seek(0) + + response = HttpResponse( + content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + response[ + 'Content-Disposition'] = f'attachment; filename="اختلاف کشتار {state}.xlsx"'.encode( + 'utf-8') + response.write(output.getvalue()) + return response + + +def direct_buying_poultry_requests(request): + filterset_class = PoultryRequestDirectBuyingFilterSet + role = request.GET.get('role') + now = datetime.datetime.now() + + show_market = ShowMarketRequest.objects.filter(trash=False, allow=True).first() + now_time = now.time().replace(second=0, microsecond=0) + if show_market and role == 'KillHouse': + if show_market.start_time < \ + now_time < show_market.end_time: + + queryset = PoultryRequest.objects.filter( + send_date__date=now.date(), + state_process='accepted', + province_state='accepted', + temporary_trash=False, + trash=False, + out=False, + final_state='pending', + market=True, + ) + else: + + queryset = [] + else: + queryset = PoultryRequest.objects.filter( + send_date__date=now.date(), + state_process='accepted', + province_state='accepted', + temporary_trash=False, + trash=False, + out=False, + final_state='pending', + market=True, + ) + + breed = request.GET.get('breed') + city = request.GET.get('city') + remain = request.GET.get('remain') + min_amount = request.GET.get('min_amount') + max_amount = request.GET.get('max_amount') + weight = request.GET.get('weight') + min_age = request.GET.get('min_age') + max_age = request.GET.get('max_age') + value = request.GET.get('value') + search = request.GET.get('search') + + if breed: + queryset = queryset.filter(chicken_breed__in=breed.split(',')) + + if city: + queryset = queryset.filter(poultry__user__city__name__in=city.split(',')) + + if remain == 'true': + queryset = queryset.filter(remain_quantity__gt=0) + + if min_amount: + queryset = queryset.filter(amount__gte=min_amount) + if max_amount: + queryset = queryset.filter(amount__lte=max_amount) + + if weight: + if weight == 'سبک': + queryset = queryset.filter(Index_weight__gte=2, Index_weight__lt=2.7) + elif weight == 'متوسط': + + queryset = queryset.filter(Index_weight__gte=2.7, Index_weight__lt=3) + elif weight == 'سنگین': + queryset = queryset.filter(Index_weight__gte=3) + + if min_age: + queryset = queryset.filter(hatching__chicken_age__gte=min_age) + if max_age: + queryset = queryset.filter(hatching__chicken_age__lte=max_age) + + if value and search == 'filter' and value.strip() and value != 'undefined': + queryset = queryset.filter(build_query(filterset_class, value)) + + excel_options = [ + "ردیف", + "نام و نام خانوادگی", + "تلفن", + "استان", + "شهر", + "نژاد", + "سن جوجه", + "میانگین وزنی (کیلوگرم)", + "تاریخ کشتار", + "تعداد قطعه", + "مانده قابل خرید", + "فروش رفته", + "مبلغ هر کیلو (ریال)", + ] + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + cell = worksheet.cell(row=1, column=1) + cell.alignment = Alignment(horizontal='center', vertical='center') + + header_list = [ + 'تعداد قطعه', + 'مانده قابل خرید', + 'فروش رفته', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'لیست اعلام کشتار های مرغداران', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + l = 5 + m = 1 + serializer = PoultryRequestForDirectBuyingSerializer(queryset, many=True).data + if serializer: + for data in serializer: + if type(data['send_date']) is str: + try: + str_date = datetime.datetime.strptime(str(data['send_date']), "%Y-%m-%dT%H:%M:%S").date() + except: + str_date = datetime.datetime.strptime(str(data['send_date']), '%Y-%m-%d').date() + date = shamsi_date(str_date, in_value=True) + elif data['send_date'] is None: + date = '-' + else: + date = shamsi_date(data['send_date'], in_value=True) + + list1 = [ + m, + data['poultry']['unit_name'], + data['poultry']['mobile'], + data['poultry']['province'], + data['poultry']['city'], + data['chicken_breed'], + data['age']['age'], + str(data['Index_weight']), + str(date), + data['quantity'], + data['remain_quantity'], + data['total_allocated'], + data['amount'], + + ] + m += 1 + l += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin') + + quantity = sum( + item['quantity'] for item in serializer) + remain_quantity = sum( + item['remain_quantity'] for item in serializer) + total_allocated = sum( + item['total_allocated'] for item in serializer) + + value_header_list = [ + quantity, + remain_quantity, + total_allocated, + + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + quantity, + remain_quantity, + total_allocated, + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + 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 + + +def hatching_for_every_age_range(request): + filterset_class = PoultryHatchingFilterSet + poultry_hatch = PoultryHatching.objects.filter(archive=False, + allow_hatching='pending', + trash=False).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + filterset_fields = [ + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__mobile', + 'poultry__unit_name', + 'poultry__address__city__name', + 'chicken_age', + 'poultry__breeding_unique_id', + + ] + + date1 = datetime.datetime.now().date() + + output = BytesIO() + workbook = Workbook() + worksheet = workbook.active + workbook.remove(worksheet) + + sheet_name = [ + "کمتر از 35 روز", + "بین 35 تا 40 روز", + "بین 40 تا 45 روز", + "بین 45 تا 50 روز", + "بین 50 تا 55 روز", + "بین 55 تا 60 روز", + "بین 60 تا 65 روز", + "بین 65 تا 70 روز", + "بیش از 70 روز" + ] + for sheet_names in sheet_name: + worksheet = workbook.create_sheet(sheet_names) + worksheet.sheet_view.rightToLeft = True + worksheet.insert_rows(1) + if sheet_names == 'کمتر از 35 روز': + filtered_poultry_hatch =poultry_hatch.filter(chicken_age__lt=35).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_names == 'بین 35 تا 40 روز': + filtered_poultry_hatch =poultry_hatch.filter(chicken_age__range=(35, 39)).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_names == 'بین 40 تا 45 روز': + filtered_poultry_hatch =poultry_hatch.filter(chicken_age__range=(40, 44)).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_names == 'بین 45 تا 50 روز': + filtered_poultry_hatch =poultry_hatch.filter(chicken_age__range=(45, 49)).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_names == 'بین 45 تا 50 روز': + filtered_poultry_hatch =poultry_hatch.filter(chicken_age__range=(45, 49)).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_names == 'بین 50 تا 55 روز': + filtered_poultry_hatch = poultry_hatch.filter(chicken_age__range=(50, 54)).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_names == 'بین 55 تا 60 روز': + filtered_poultry_hatch = poultry_hatch.filter(chicken_age__range=(55, 59)).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_names == 'بین 60 تا 65 روز': + filtered_poultry_hatch = poultry_hatch.filter(chicken_age__range=(60, 64)).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_names == 'بین 65 تا 70 روز': + filtered_poultry_hatch = poultry_hatch.filter(chicken_age__range=(65, 70)).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + elif sheet_names == 'بیش از 70 روز': + filtered_poultry_hatch = poultry_hatch.filter(chicken_age__gt=70).select_related('poultry', + 'poultry__user').order_by( + '-chicken_age') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (filterset_class( + data=query, + queryset=filtered_poultry_hatch + ) + ).filter(): + ps = filterset_class(data=query, queryset=filtered_poultry_hatch) + filtered_poultry_hatch = ps.filter() + date1 = datetime.datetime.now().date() + excel_options = [ + 'ردیف', + 'وضعیت', + 'شماره مجوز جوجه ریزی', + 'شناسه یکتا', + 'مجوز بهداشتی جوجه ریزی', + 'نام فارم', + 'مرغدار', + 'تلفن مرغدار', + 'بهره برداری', + 'مالکیت', + 'ارتباط', + 'شهر/تعاونی', + 'سالن', + ' دوره جوجه ریزی', + 'تاریخ ثبت جوجه ریزی', + 'تاریخ جوجه ریزی', + 'میانگین سن کشتار', + 'پیشبینی تاریخ کشتار', + 'نژاد', + 'سن', + 'حجم جوجه ریزی', + 'حجم افزایشی', + 'تلفات دامپزشک(قطعه)', + 'تلفات اتحادیه(قطعه)', + 'تلفات کل(قطعه)', + + 'زنجیره/شرکت', + + 'دامپزشک فارم', + 'تلفن دامپزشک فارم', + 'کد سیستمی واحد', + + 'حجم کشتار شده(قطعه)', + 'وزن کل کشتارشده(کیلوگرم)', + 'مانده در سالن', + 'درصد مانده در سالن', + 'نود درصد جوجه ریزی', + 'وزن تعهد دولتی(کیلوگرم)', + 'تعداد کشتار دولتی(قطعه)', + 'وزن کشتار دولتی(کیلوگرم)', + 'وزن تعهد آزاد(کیلوگرم)', + 'تعداد کشتار آزاد(قطعه)', + 'وزن کشتار آزاد(کیلوگرم)', + 'میانگین وزن کشتار(کیلوگرم)', + 'سازنده جوجه ریزی', + 'کد اپیدمیولوژیک', + 'حجم فروش به خارج از استان(قطعه)', + 'حجم فروش به خارج از استان(کیلوگرم)', + 'تخصیصات بدون بار', + 'حجم تخصیصات بدون بار', + 'وزن تخصیصات بدون بار', + 'تایید تخلیه در سماصط', + 'تعداد کشتار فعال', + 'تعداد درخواست کشتار', + + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بارهای تحویلی', + 'حجم بارهای تحویلی', + 'وزن بارهای تحویلی', + + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + 'ثبت کننده گزارش', + 'متن گزارش', + 'تاریخ گزارش', + ] + from_date_1 = shamsi_date(date1) + + header_list = [ + 'تعداد فارم فعال', + 'تعداد فارم دارای زنجیره فعال', + 'مجموع جوجه ریزی', + 'مجموع تلفات دامپزشک(قطعه)', + 'مجموع تلفات اتحادیه(قطعه)', + 'مجموع تلفات کل(قطعه)', + 'مجموع قطعه کشتار شده', + 'مجموع وزن کل کشتارشده', + 'مانده در سالن(قطعه)', + 'مانده در سالن از نود درصد(قطعه)', + 'کمترین سن', + 'بیشترین سن', + 'مجموع وزن تعهد دولتی', + ' مجموع قطعه کشتار دولتی', + ' مجموع وزن کشتار دولتی', + ' مجموع قطعه کشتار آزاد', + ' مجموع وزن کشتار آزاد', + 'مجموع تعداد کشتار خارج از استان', + 'مجموع وزن کشتار خارج از استان', + 'تعداد فارم های متخلف', + 'تعداد بار ایجاد شده', + 'حجم بار ایجاد شده', + 'وزن بار ایجاد شده', + 'تعداد بار کشتار شده', + 'حجم بار کشتار شده', + 'وزن بار کشتار شده', + 'حجم زنجیره', + 'وزن زنجیره', + 'حجم صادرات', + 'وزن صادرات', + 'تعداد بار ورودی به انبار', + 'حجم لاشه ها', + 'وزن لاشه ها', + 'درصد افت بارها', + + ] + + create_header(worksheet, header_list, 5, 2, height=20) + + excel_description(worksheet, 'B1', f'این گزارش در مورخ {from_date_1} صادر شده است.', color='red', row2='C3') + + create_header_freez(worksheet, excel_options, 1, 6, 7, height=22) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + poultry_ids = poultry_hatch.values_list('poultry', flat=True).distinct() + vet_farms = VetFarm.objects.filter(poultry__in=poultry_ids, trash=False).select_related('vet__user') + vet_farm_mapping = { + vet_farm.poultry: (vet_farm.vet.user.fullname, vet_farm.vet.user.mobile) + for vet_farm in vet_farms + } + l = 5 + m = 1 + all_poultry_hatching_quantity = 0 + all_poultry_hatching_killed_quantity = 0 + all_poultry_hatching_left_over = 0 + min_list = [] + all_left_over_ninty_percent = 0 + violation = 0 + all_chain_company = 0 + for poultry_hatching in filtered_poultry_hatch: + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=poultry_hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, + final_state='archive', + hatching=poultry_hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = poultry_hatching.left_over + + elif poultry_hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if poultry_hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = poultry_hatching.left_over + else: + left_total_free_commitment_quantity = poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + poultry_hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + # return { + # "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + # "total_commitment_quantity": obj.total_commitment_quantity, + # "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + # "total_free_commitment_quantity": obj.total_free_commitment_quantity, + # "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + # + # } + + vet_farm_id = poultry_hatching.poultry + vet_farm_name, vet_farm_mobile = vet_farm_mapping.get(vet_farm_id, ('-', '-')) + all_poultry_hatching_quantity += poultry_hatching.quantity + all_poultry_hatching_killed_quantity += poultry_hatching.killed_quantity + all_poultry_hatching_left_over += poultry_hatching.left_over + if poultry_hatching.chicken_age not in min_list: + min_list.append(poultry_hatching.chicken_age) + + l += 1 + create_date = jdatetime.date.fromgregorian( + day=poultry_hatching.create_date.day, + month=poultry_hatching.create_date.month, + year=poultry_hatching.create_date.year + ) + date = jdatetime.date.fromgregorian( + day=poultry_hatching.date.day, + month=poultry_hatching.date.month, + year=poultry_hatching.date.year + ) + predicate_date = jdatetime.date.fromgregorian( + day=poultry_hatching.predicate_date.day, + month=poultry_hatching.predicate_date.month, + year=poultry_hatching.predicate_date.year + ) if poultry_hatching.predicate_date else '-' + date1 = datetime.datetime.strptime(str(poultry_hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.datetime.now() - date1).days + 1 + + creator = '-' + if poultry_hatching.registrar: + if poultry_hatching.registrar['fullname'] != '': + creator = poultry_hatching.registrar['fullname'] + else: + creator = 'پنجره واحد' + left_over_ninty_percent = ((poultry_hatching.quantity * 90) / 100) + all_left_over_ninty_percent += left_over_ninty_percent + farm_state = 'عادی' + if poultry_hatching.violation == True: + farm_state = 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' + violation += 1 + if poultry_hatching.chain_company: + chain_company = poultry_hatching.chain_company.name + all_chain_company += 1 + else: + chain_company = '-' + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + violation_report_date = shamsi_date( + poultry_hatching.violation_report_date.date()) if poultry_hatching.violation_report_date else '-' + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + wothout_bar = province_kill_requests.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0) + province_kill_requests_quantity_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight_wothout_bar = \ + wothout_bar.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + active_kill = 'ندارد' + count_of_request = 0 + + province_kill_request_active = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='accepted') + if province_kill_request_active.count() > 0: + count_of_request = province_kill_request_active.count() + + if ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=poultry_hatching, + state='pending').exists(): + active_kill = 'دارد' + + list1 = [ + m, + farm_state, + poultry_hatching.licence_number, + poultry_hatching.poultry.breeding_unique_id, + poultry_hatching.CertId, + poultry_hatching.poultry.unit_name, + poultry_hatching.poultry.user.fullname, + poultry_hatching.poultry.user.mobile, + poultry_hatching.InteractTypeName, + poultry_hatching.PersonTypeName, + poultry_hatching.UnionTypeName, + f'{poultry_hatching.poultry.user.city.name if poultry_hatching.poultry.user.city else "-"} ' + f'/ {poultry_hatching.poultry.city_operator if poultry_hatching.poultry.city_operator else "-"}', + poultry_hatching.hall, + poultry_hatching.period, + str(create_date), + str(date), + poultry_hatching.poultry.killing_ave_age, + str(predicate_date), + poultry_hatching.chicken_breed, + age, + poultry_hatching.quantity, + poultry_hatching.increase_quantity, + poultry_hatching.losses, + poultry_hatching.direct_losses, + poultry_hatching.total_losses, + + chain_company, + # poultry_hatching.poultry.city_operator, + # + # + # + vet_farm_name, + vet_farm_mobile, + poultry_hatching.poultry.system_code, + + poultry_hatching.killed_quantity, + poultry_hatching.total_killed_weight, + poultry_hatching.left_over, + f'{int(poultry_hatching.left_over * 100 / poultry_hatching.quantity)}%', + left_over_ninty_percent, + poultry_hatching.total_commitment, + poultry_hatching.governmental_quantity, + poultry_hatching.governmental_killed_quantity, + poultry_hatching.total_free_commitment_quantity, + poultry_hatching.free_quantity, + poultry_hatching.free_killed_quantity, + str(poultry_hatching.total_average_killed_weight), + creator, + poultry_hatching.poultry.epidemiological_code if poultry_hatching.poultry.epidemiological_code else '-', + poultry_hatching.out_province_killed_quantity if poultry_hatching.out_province_killed_quantity > 0 else '-', + poultry_hatching.out_province_killed_weight if poultry_hatching.out_province_killed_weight > 0 else '-', + len(wothout_bar), + province_kill_requests_quantity_wothout_bar, + province_kill_requests_weight_wothout_bar, + poultry_hatching.samasat_discharge_percentage, + active_kill, + count_of_request, + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + poultry_hatching.chain_killed_quantity, + poultry_hatching.chain_killed_weight, + poultry_hatching.export_killed_quantity, + poultry_hatching.export_killed_weight, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + poultry_hatching.violation_reporter if poultry_hatching.violation_reporter else '-', + poultry_hatching.violation_report if poultry_hatching.violation_report else '-', + str(violation_report_date), + + ] + m += 1 + create_value(worksheet, list1, l + 1, 1, border_style='thin', different_cell=1, + different_value='متخلف' + ' ' + '(وجود فارم فعال دیگر)') + + min_list = sorted(min_list) + all_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + all_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity', 0) + all_direct_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity', 0) + all_total_losses = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity', 0) + all_killed_quantity = filtered_poultry_hatch.aggregate(total_quantity=Sum('killed_quantity')).get( + 'total_quantity', 0) + all_left_over = filtered_poultry_hatch.aggregate(total_quantity=Sum('left_over')).get( + 'total_quantity', 0) + all_total_commitment = filtered_poultry_hatch.aggregate(total_quantity=Sum('total_commitment')).get( + 'total_quantity', 0) + all_governmental_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_killed_quantity')).get( + 'total_quantity', 0) + all_free_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_killed_quantity')).get( + 'total_quantity', 0) + all_total_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_killed_weight')).get( + 'total_quantity', 0) + all_governmental_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('governmental_quantity')).get( + 'total_quantity', 0) + all_free_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('free_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_quantity')).get( + 'total_quantity', 0) + all_out_province_killed_weight = filtered_poultry_hatch.aggregate( + total_quantity=Sum('out_province_killed_weight')).get( + 'total_quantity', 0) + all_increase_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('increase_quantity')).get( + 'total_quantity', 0) + all_total_free_commitment_quantity = filtered_poultry_hatch.aggregate( + total_quantity=Sum('total_free_commitment_quantity')).get( + 'total_quantity', 0) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=filtered_poultry_hatch) + + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + chain_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_weight')).get( + 'total_quantity', 0) or 0 + chain_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('chain_killed_quantity')).get( + 'total_quantity', 0) or 0 + extra_killed_quantity_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_quantity')).get( + 'total_quantity', 0) or 0 + export_killed_weight_final = filtered_poultry_hatch.aggregate( + total_quantity=Sum('export_killed_weight')).get( + 'total_quantity', 0) or 0 + value_header_list = [ + len(filtered_poultry_hatch), + all_chain_company, + all_poultry_hatching_quantity, + all_losses, + all_direct_losses, + all_total_losses, + all_poultry_hatching_killed_quantity, + all_total_killed_weight, + all_poultry_hatching_left_over, + all_left_over_ninty_percent, + min_list[0] if len(min_list) > 0 else '-', + min_list[len(min_list) - 1] if len(min_list) > 0 else '-', + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_free_quantity, + all_free_killed_quantity, + all_out_province_killed_quantity, + all_out_province_killed_weight, + violation, + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0) + ] + create_value(worksheet, value_header_list, 3, 5) + + list2 = [ + 'مجموع==>', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + + all_quantity, + all_increase_quantity, + all_losses, + all_direct_losses, + all_total_losses, + + '', + '', + '', + '', + all_killed_quantity, + all_total_killed_weight, + all_left_over, + '', + all_left_over_ninty_percent, + all_total_commitment, + all_governmental_quantity, + all_governmental_killed_quantity, + all_total_free_commitment_quantity, + all_free_quantity, + all_free_killed_quantity, + '', + '', + '', + all_out_province_killed_quantity, + all_out_province_killed_weight, + '', + '', + '', + '', + '', + '', + + len(kill_house_requests), + first_quantity, + first_weight, + len(bar_complete_with_kill_house), + accepted_real_quantity_final, + accepted_real_wight_final, + chain_killed_quantity_final, + chain_killed_weight_final, + extra_killed_quantity_final, + export_killed_weight_final, + len(ware_house_bars), + ware_house_bars_quantity, + ware_house_bars_weight, + str(round(ware_house_bars_weight_lose / len( + ware_house_bars), 2) if ware_house_bars else 0), + '', + '', + '', + + ] + create_value(worksheet, list2, l + 3, 1, color='green') + + 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 \ No newline at end of file diff --git a/panel/poultry/helpers.py b/panel/poultry/helpers.py new file mode 100644 index 0000000..c84777e --- /dev/null +++ b/panel/poultry/helpers.py @@ -0,0 +1,304 @@ +import datetime +from collections import defaultdict +from datetime import timedelta + +from django.db.models import Sum, Q +from django.http import HttpResponse + +from authentication.sahandsms.sms import kill_house_price +from panel.models import PoultryRequest, PoultryHatching, KillHouseRequest, ProvinceKillRequest, \ + HatchingIncreaseRequest, ChickenCommissionPrices, KillRequest, PoultryRequestQuarantineCode, MarketDailyLimitation + + +def poultry_prediction(poultry): + total_quantity = 0 + total_weight = 0 + total_count = 0 + killing_ave_weight = 0 + + hatchings = PoultryHatching.objects.filter(poultry=poultry, trash=False, state='pending', + archive=False, temporary_trash=False, + temporary_deleted=False) + + poultry_requests = PoultryRequest.objects.filter(poultry=poultry, trash=False, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + out_province_request_cancel=False, killing_age__gt=30, + killing_age__lte=70, temporary_trash=False, + temporary_deleted=False) + sum_killing_ages = poultry_requests.aggregate(total=Sum('killing_age'))[ + 'total'] or 0 + ave_killing_age = int(sum_killing_ages / len(poultry_requests)) if len(poultry_requests) > 0 else 1 + if hatchings: + for hatching in hatchings: + if hatching.now_age <= ave_killing_age: + difference = ave_killing_age - hatching.now_age + predicate_date = datetime.datetime.now().date() + timedelta(days=difference) + hatching.predicate_date = predicate_date + hatching.save() + poultry.killing_ave_age = ave_killing_age + + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__poultry=poultry, + state__in=('pending', 'accepted'), + return_to_province=False, first_car_allocated_quantity=0 + , temporary_trash=False, + temporary_deleted=False) + + sum_province_kill_requests_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + sum_kill_province_kill_requests_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[ + 'total'] or 0 + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__poultry=poultry, + temporary_trash=False, + temporary_deleted=False) + sum_kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + sum_kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + loss_percent = kill_house_requests.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + ave_loss_percent = round(loss_percent / len(kill_house_requests), 2) if len(kill_house_requests) > 0 else 0 + total_quantity = sum_province_kill_requests_quantity + sum_kill_house_requests_quantity + total_weight = sum_kill_province_kill_requests_weight + sum_kill_house_requests_weight + total_count = len(province_kill_requests) + len(kill_house_requests) + killing_ave_count = total_quantity / total_count if total_count > 0 else 0 + killing_ave_weight = round(total_weight / total_quantity, 2) if total_quantity > 0 else 0 + + poultry.killing_ave_count = killing_ave_count + poultry.real_killing_ave_weight = killing_ave_weight + poultry.real_killing_loss_weight_percent = ave_loss_percent + poultry.save() + + +def poultry_prediction_helper(ave_killing_age, consumption_limit_type, date1=None, date2=None): + # دریافت جوجه‌ریزی‌ها + hatchings = PoultryHatching.objects.filter( + trash=False, state='pending', archive=False, now_age__lte=ave_killing_age + ).order_by('date').select_related('poultry').only('poultry', 'left_over', 'now_age') + + grouped_data = defaultdict(lambda: { + "quantity": 0, + "weight": 0, + "poultry_count": 0, + "poultry_ids": set(), + "hatching_ids": set(), + }) + + for hatching in hatchings: + if hatching.now_age <= ave_killing_age: + if date1: + target_date = ( + datetime.datetime.now().date() + timedelta(days=ave_killing_age - hatching.now_age)).isoformat() + obj_date = datetime.datetime.strptime(target_date, '%Y-%m-%d').date() + if obj_date > date2 or obj_date < date1: + continue + else: + target_date = ( + datetime.datetime.now().date() + timedelta(days=ave_killing_age - hatching.now_age)).isoformat() + grouped_data[target_date]["quantity"] += hatching.left_over + grouped_data[target_date]["weight"] += int( + hatching.left_over * hatching.poultry.real_killing_ave_weight) if consumption_limit_type in ( + 'quantity', 'live_weight') else int( + (hatching.left_over * hatching.poultry.real_killing_ave_weight) * 0.75) + grouped_data[target_date]["hatching_ids"].add(hatching.id) + grouped_data[target_date]["poultry_ids"].add(hatching.poultry.id) + grouped_data[target_date]["poultry_count"] = len(grouped_data[target_date]["poultry_ids"]) + + result = [ + { + "age": ave_killing_age, + "poultry": data['poultry_count'], + "quantity": data["quantity"], + "weight": data["weight"], + "hatchings": data["hatching_ids"], + "date": date + } + for date, data in grouped_data.items() + ] + + return result + + +def calculate_hatching_increase(hatching): + hatching_increase = HatchingIncreaseRequest.objects.filter(trash=False, hatching=hatching) + quantity = hatching_increase.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + hatching.increase_quantity = quantity + hatching.save() + + +def create_update_chicken_commission_prices(): + now = datetime.datetime.now().date() + chicken_commission = ChickenCommissionPrices.objects.get_or_create(date__date=now, + defaults={'date': datetime.datetime.now(), + 'kill_house_price': kill_house_price})[ + 0] + # poultry_request + poultry_request = PoultryRequest.objects.filter(trash=False, send_date__date=now, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=False, + amount__gt=0).only( + 'amount') + poultry_request_amount = poultry_request.aggregate(total=Sum('amount'))[ + 'total'] or 0 + # ProvinceKillRequest + province_kill_req = ProvinceKillRequest.objects.filter(trash=False, kill_request__recive_date__date=now, + state__in=('pending', 'accepted'), + kill_house_price__gt=0).only( + 'kill_house_price') + + province_kill_req_kill_house_price = province_kill_req.aggregate(total=Sum('kill_house_price'))[ + 'total'] or 0 + + # KillRequest + kill_req = KillRequest.objects.filter(trash=False, recive_date__date=now, province_state__in=('accepted', 'pending') + , poultry__isnull=False, + direct_buying_state__in=('accepted', 'pending'), amount__gt=0).only( + 'amount') + kill_req_amount = kill_req.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + kill_request_amount = round( + kill_req_amount / kill_req.count()) if kill_req.count() > 0 else 0 + + province_kill_request_amount = round(province_kill_req_kill_house_price / province_kill_req.count()) \ + if province_kill_req.count() > 0 else 0 + + poultry_req_amount = round(poultry_request_amount / poultry_request.count()) if poultry_request.count() > 0 \ + else 0 + + amount = round( + kill_req_amount + province_kill_req_kill_house_price + poultry_request_amount) + + counts = poultry_request.count() + province_kill_req.count() + kill_req.count() + + chicken_commission.chicken_average_price = round(amount / counts) if counts > 0 else 0 + chicken_commission.kill_request_amount = kill_request_amount + chicken_commission.province_kill_request_amount = province_kill_request_amount + chicken_commission.poultry_request_amount = poultry_req_amount + + chicken_commission.save() + + +def create_update_chicken_commission_prices_manual(request): + now = datetime.datetime.now().date() + for day in range(7): + past_date = now - timedelta(days=day) + past_datetime = datetime.datetime.combine(past_date, datetime.time.min) + + chicken_commission = ChickenCommissionPrices.objects.get_or_create(date__date=past_date, + defaults={'date': past_datetime, + 'kill_house_price': kill_house_price})[ + 0] + # # poultry_request + poultry_request = PoultryRequest.objects.filter(trash=False, send_date__date=past_date, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=False, + amount__gt=0).only( + 'amount') + print(len(poultry_request)) + poultry_request_amount = poultry_request.aggregate(total=Sum('amount'))[ + 'total'] or 0 + # ProvinceKillRequest + province_kill_req = ProvinceKillRequest.objects.filter(trash=False, kill_request__recive_date__date=past_date, + state__in=('pending', 'accepted'), + kill_house_price__gt=0).only( + 'kill_house_price') + + province_kill_req_kill_house_price = province_kill_req.aggregate(total=Sum('kill_house_price'))[ + 'total'] or 0 + + # KillRequest + kill_req = KillRequest.objects.filter(trash=False, recive_date__date=past_date, + province_state__in=('accepted', 'pending') + , poultry__isnull=False, + direct_buying_state__in=('accepted', 'pending'), amount__gt=0).only( + 'amount') + kill_req_amount = kill_req.aggregate(total=Sum('amount'))[ + 'total'] or 0 + + kill_request_amount = round( + kill_req_amount / kill_req.count()) if kill_req.count() > 0 else 0 + + province_kill_request_amount = round(province_kill_req_kill_house_price / province_kill_req.count()) \ + if province_kill_req.count() > 0 else 0 + + poultry_req_amount = round(poultry_request_amount / poultry_request.count()) if poultry_request.count() > 0 \ + else 0 + + amount = round( + kill_req_amount + province_kill_req_kill_house_price + poultry_request_amount) + + counts = poultry_request.count() + province_kill_req.count() + kill_req.count() + + chicken_commission.chicken_average_price = round(amount / counts) if counts > 0 else 0 + chicken_commission.kill_request_amount = kill_request_amount + chicken_commission.province_kill_request_amount = province_kill_request_amount + chicken_commission.poultry_request_amount = poultry_req_amount + + chicken_commission.save() + + +def add_poultry_request_quarantine_code(request): + poultry_requests = PoultryRequest.objects.filter( + trash=False, + quarantine_code__isnull=False, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted') + ).only('id', 'quarantine_code', 'quarantine_quantity') + + codes = [ + PoultryRequestQuarantineCode( + poultry_request=poultry_request, + quarantine_code=poultry_request.quarantine_code, + system_quarantine_quantity=poultry_request.quarantine_quantity, + quarantine_quantity=poultry_request.quarantine_quantity, + ) + for poultry_request in poultry_requests + ] + + PoultryRequestQuarantineCode.objects.bulk_create(codes) + + return HttpResponse('ok') + + +def update_archive_date_poultry_hatching(request): + poultry_hatchings = PoultryHatching.objects.filter(Q(allow_hatching='True', state='complete') | Q(archive=True), + trash=False, + ) + for p in poultry_hatchings: + p.archive_date = p.date + timedelta(p.chicken_age) + p.save() + return HttpResponse('ok') + + +def market_daily_limitation_info(): + limitation_quantity = 0 + market_request_quantity = 0 + limitation = MarketDailyLimitation.objects.filter().first() + if limitation: + limitation_quantity = limitation.quantity + + poultry_Requests = PoultryRequest.objects.filter( + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + temporary_trash=False, + trash=False, + out=False, + send_date__date=datetime.datetime.now().date(), + final_state='pending', + market=True + ).aggregate( + total_quantity=Sum('quantity') + ) + market_request_quantity = poultry_Requests['total_quantity'] or 0 + + result = { + "max_limitation_quantity": limitation_quantity, + "market_request_quantity": market_request_quantity, + "remain_quantity" : limitation_quantity - market_request_quantity if (limitation_quantity - market_request_quantity) else 0 + + } + return result diff --git a/panel/poultry/serializers.py b/panel/poultry/serializers.py new file mode 100644 index 0000000..e7c835c --- /dev/null +++ b/panel/poultry/serializers.py @@ -0,0 +1,3367 @@ +from django.contrib.auth.models import Group +from django.db.models import Sum, Q, F, Prefetch +from rest_framework import serializers +# from rest_framework.response import Response +from rest_framework.response import Response +from authentication.models import UserProfile, SystemUserProfile, CityUnit, SystemAddress +from authentication.serializer.serializer import SystemUserProfileSerializer, \ + SystemUserProfileForAutoAllocationSerializer, SystemUserProfileForPoultryLocSerializer, \ + SystemUserProfileForGuildSerializer, SystemUserProfileForPoultryScienceWithoutRoleSerializer +from authentication.serializers import UserProfileSerializer, SystemAddressSerializer, \ + SystemAddressForLocSerializer, CityForLocSerializer +from authentication.serializer.serializer import BankCardSerializer +# from panel.KillHouse.serializers import KillHouseRequestExchangeReserveSerializer +# from panel.VetFarm.serializers import VetFarmForPoultrySerializer +from panel.models import PoultryRequest, PoultryAssignmentInformation, KillHouseRequest, KillHouseCheckRequest, \ + CityOperatorCheckRequest, ProvinceCheckOperatorRequest, KillHouseAssignmentInformation, ProvinceFactorToKillHouse, \ + KillHouseFactorToProvince, DepositAllocation, PovinceInspector, VetCheckRequest, PoultryRequestExchange, \ + ProvinceKillRequest, Poultry, PoultryTenant, PoultryHatching, PoultryRequestAuction, Pricing, \ + KillHouseRequestAction, ProvinceRequestAction, ProvinceOperator, VetFarmInspection, InspectorOperator, \ + KillHouseRequestActionWinner, CityOperator, VetFarm, ShareOfAllocation, ProvinceFactorToKillHouseForPoultry, \ + KillHouseFactorToPoultry, KillHouseComplaint, CheckUnusualCasualties, PercentageOfLosses, \ + ProvinceImportKillHouseOutFactors, TotalPoultryRequestQuantity, PoultryAllowCityProvince, \ + ProvinceAllowPoultryChooseKillHouse, ProvinceAllowPoultrySellFree, Vet, LastUpdate, ChainCompany, ChainAllocation, \ + ChainCompanyTransaction, InternalTransaction, KillHouseOperator, KillHouse, OutProvincePoultryRequestBuyer, \ + PoultryExport, PoultryOutProvinceRequest, FreeSaleWithinprovince, PoultryPrediction, HatchingIncreaseRequest, \ + ChickenCommissionPrices, PoultryRequestQuarantineCode, ManagementHatchingAgeRange, PoultryScienceReport, \ + EvacuationHatchingDetail +# PoultryRequestExchangeAccept +from datetime import datetime +import pytz +from num2fawords import words, ordinal_words + +utc = pytz.UTC + + +class OutProvincePoultryRequestBuyerSerializer(serializers.ModelSerializer): + class Meta: + model = OutProvincePoultryRequestBuyer + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by' + ) + + +class OutProvincePoultryRequestBuyerForBuyerRequestSerializer(serializers.ModelSerializer): + requests_info = serializers.SerializerMethodField('get_requests_info') + + class Meta: + model = OutProvincePoultryRequestBuyer + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by' + ) + + def get_requests_info(self, obj): + total_quantity = 0 + total_weight = 0 + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True, out_province_request_cancel=False) | Q(state_process='accepted', province_state='accepted', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False), trash=False, + out=True, out_province_poultry_request_buyer=obj) + + total_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + return { + "number_of_requests": len(poultry_requests), + "total_quantity": total_quantity, + "total_weight": total_weight, + } + + +class ChainCompanySerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + + class Meta: + model = ChainCompany + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by' + ) + + +class ChainCompanyForCompanyRequestSerializer(serializers.ModelSerializer): + user = SystemUserProfileSerializer(read_only=True) + user_bank_info = BankCardSerializer(required=False) + requests_info = serializers.SerializerMethodField('get_requests_info') + + class Meta: + model = ChainCompany + exclude = ( + 'id', + 'create_date', + 'modify_date', + 'created_by', + 'modified_by' + ) + + def get_requests_info(self, obj): + total_quantity = 0 + total_weight = 0 + chain_allocations = ChainAllocation.objects.filter(chain_company=obj, state='accepted', trash=False).order_by( + '-id') + + total_quantity = chain_allocations.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight = chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + + return { + "number_of_requests": len(chain_allocations), + "total_quantity": total_quantity, + "total_weight": total_weight, + } + + +class ChainCompanyForTotalWageAllocationWithDAteSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = ChainCompany + fields = ['key', 'info'] + + def get_info(self, obj): + total_quantity = 0 + total_weight = 0 + total_wage = 0 + date1 = datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() + role = self.context.get('request').GET['role'] + if role in ['ChainCompany', 'SuperAdmin', 'AdminX', 'Supporter']: + wage_type = 'total_wage_amount' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + date__date__gte=date1, + date__date__lte=date2, + archive_wage=False, + trash=False).order_by('id') + elif role == 'ProvinceOperator': + wage_type = 'union_share' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + date__date__gte=date1, + date__date__lte=date2, + union_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + elif role == 'Company': + wage_type = 'company_share' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + date__date__gte=date1, + date__date__lte=date2, + company_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + elif role == 'Guilds': + wage_type = 'guilds_share' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + date__date__gte=date1, + date__date__lte=date2, + guilds_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + else: + wage_type = 'wallet_share' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + date__date__gte=date1, + date__date__lte=date2, + archive_wage=False, + trash=False).order_by('id') + + total_quantity += chain_allocations.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight += chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + total_wage += chain_allocations.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + + return { + "company": obj.name, + "company_user_fullname": obj.user.fullname, + "company_user_mobile": obj.user.mobile, + "company_user_city": obj.user.city.name, + "total_count": len(chain_allocations), + "total_quantity": total_quantity, + "total_weight": total_weight, + "total_wage": total_wage, + + } + + +class ChainCompanyForTotalWageTransactionSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = ChainCompany + fields = ['key', 'info'] + + def get_info(self, obj): + total_paid_wage = 0 + role = self.context.get('request').GET['role'] + if role in ['ChainCompany', 'SuperAdmin', 'AdminX', 'Supporter']: + wage_type = 'amount' + transactions = InternalTransaction.objects.filter( + chain_company=obj, + status='completed', + trash=False).order_by('id') + elif role == 'ProvinceOperator': + wage_type = 'union_share' + transactions = InternalTransaction.objects.filter( + chain_company=obj, + status='completed', + union_share__gt=0, + trash=False).order_by('id') + elif role == 'Company': + wage_type = 'company_share' + transactions = InternalTransaction.objects.filter( + chain_company=obj, + status='completed', + company_share__gt=0, + trash=False).order_by('id') + elif role == 'Guilds': + wage_type = 'guilds_share' + transactions = InternalTransaction.objects.filter( + chain_company=obj, + status='completed', + guilds_share__gt=0, + trash=False).order_by('id') + else: + wage_type = 'wallet_share' + + total_paid_wage += transactions.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + + return { + "company": obj.name, + "company_user_fullname": obj.user.fullname, + "company_user_mobile": obj.user.mobile, + "company_user_city": obj.user.city.name, + "total_paid_count": len(transactions), + "total_paid_wage": total_paid_wage, + + } + + +class ChainCompanyForTotalWageTransactionTransactionWithDAteSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = ChainCompany + fields = ['key', 'info'] + + def get_info(self, obj): + total_paid_wage = 0 + date1 = datetime.strptime(str(self.context.get('request').GET['date1']), '%Y-%m-%d').date() + date2 = datetime.strptime(str(self.context.get('request').GET['date2']), '%Y-%m-%d').date() + role = self.context.get('request').GET['role'] + if role in ['ChainCompany', 'SuperAdmin', 'AdminX', 'Supporter']: + wage_type = 'amount' + transactions = InternalTransaction.objects.filter( + chain_company=obj, + date__date__gte=date1, + date__date__lte=date2, + status='completed', + trash=False).order_by('id') + elif role == 'ProvinceOperator': + wage_type = 'union_share' + transactions = InternalTransaction.objects.filter( + chain_company=obj, + date__date__gte=date1, + date__date__lte=date2, + status='completed', + union_share__gt=0, + trash=False).order_by('id') + elif role == 'Company': + wage_type = 'company_share' + transactions = InternalTransaction.objects.filter( + chain_company=obj, + date__date__gte=date1, + date__date__lte=date2, + status='completed', + company_share__gt=0, + trash=False).order_by('id') + elif role == 'Guilds': + wage_type = 'guilds_share' + transactions = InternalTransaction.objects.filter( + chain_company=obj, + date__date__gte=date1, + date__date__lte=date2, + status='completed', + guilds_share__gt=0, + trash=False).order_by('id') + else: + wage_type = 'wallet_share' + + total_paid_wage += transactions.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + + return { + "company": obj.name, + "company_user_fullname": obj.user.fullname, + "company_user_mobile": obj.user.mobile, + "company_user_city": obj.user.city.name, + "total_paid_count": len(transactions), + "total_paid_wage": total_paid_wage, + + } + + +class ChainCompanyForTotalWageAllocationSerializer(serializers.ModelSerializer): + info = serializers.SerializerMethodField('get_info') + + class Meta: + model = ChainCompany + fields = ['key', 'info'] + + def get_info(self, obj): + total_quantity = 0 + total_weight = 0 + total_wage = 0 + role = self.context.get('request').GET['role'] + if role in ['ChainCompany', 'SuperAdmin', 'AdminX', 'Supporter']: + wage_type = 'total_wage_amount' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + archive_wage=False, + trash=False).order_by('id') + elif role == 'ProvinceOperator': + wage_type = 'union_share' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + union_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + elif role == 'Company': + wage_type = 'company_share' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + company_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + elif role == 'Guilds': + wage_type = 'guilds_share' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + guilds_share__gt=0, + archive_wage=False, + trash=False).order_by('id') + else: + wage_type = 'wallet_share' + chain_allocations = ChainAllocation.objects.filter( + chain_company=obj, + archive_wage=False, + trash=False).order_by('id') + + total_quantity += chain_allocations.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_weight += chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + total_wage += chain_allocations.aggregate(total=Sum(wage_type))[ + 'total'] or 0 + + return { + "company": obj.name, + "company_user_fullname": obj.user.fullname, + "company_user_mobile": obj.user.mobile, + "company_user_city": obj.user.city.name, + "total_count": len(chain_allocations), + "total_quantity": total_quantity, + "total_weight": total_weight, + "total_wage": total_wage, + + } + + +class PoultryForAutoAllocationSerializer(serializers.ModelSerializer): + class Meta: + model = Poultry + fields = ['unit_name'] + + +class PoultryForPoultryRequestLetterSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = Poultry + fields = ['unit_name', 'user', 'breeding_unique_id'] + + +class PoultryForBarDifferenceRequestSerializer(serializers.ModelSerializer): + user = SystemUserProfileForGuildSerializer(read_only=True) + + class Meta: + model = Poultry + fields = ['unit_name', 'user'] + + +class PoultryForBarManagementSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + address = SystemAddressSerializer(required=False) + + class Meta: + model = Poultry + fields = ['unit_name', 'city_operator', 'user', 'total_capacity', 'address', 'breeding_unique_id', + 'system_code'] + + +class TotalPoultrySerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + address = SystemAddressSerializer(required=False) + hatching_info = serializers.SerializerMethodField('get_hatching_info') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + + class Meta: + model = Poultry + fields = ['key', 'user', 'address', 'unit_name', 'breeding_unique_id', 'epidemiological_code', 'system_code', + 'total_capacity', 'number_of_halls', 'health_certificate_number', 'city_operator', 'hatching_info', + 'vet_farm', 'order_limit'] + + def get_hatching_info(self, obj): + hatching = PoultryHatching.objects.filter(poultry__exact=obj, state='pending', archive=False, + trash=False).last() + period = None + active_hatching = False + if hatching: + period = hatching.period + if hatching.state == 'pending': + active_hatching = True + return {"period": period, "active_hatching": active_hatching} + + def get_vet_farm(self, obj): + vet_farm_name = None + vet_farm_mobile = None + vet_farm = VetFarm.objects.filter(poultry__exact=obj, trash=False).select_related('vet__user').last() + if vet_farm: + vet_farm_name = vet_farm.vet.user.fullname + vet_farm_mobile = vet_farm.vet.user.mobile + + return {"vet_farm_name": vet_farm_name, "vet_farm_mobile": vet_farm_mobile} + + +class PoultryForPoultryHatchingForKillInformationSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + last_hatching_remain_quantity = serializers.SerializerMethodField('get_last_hatching_remain_quantity') + last_hatching_diffrent_request_quantity = serializers.SerializerMethodField( + 'get_last_hatching_diffrent_request_quantity') + chain_company = serializers.SerializerMethodField('get_chain_company') + province_allow_sell_free = serializers.SerializerMethodField('get_allow_sell_free') + free_governmental_info = serializers.SerializerMethodField('get_free_governmental_info') + + address = SystemAddressSerializer(required=False) + + class Meta: + model = Poultry + fields = ['user', 'key', 'unit_name', 'address', + 'last_hatching_remain_quantity', 'province_allow_sell_free', 'chain_company', + 'last_hatching_diffrent_request_quantity', 'free_governmental_info'] + + def get_last_hatching_remain_quantity(self, obj): + hatching = PoultryHatching.objects.filter(poultry=obj, state='pending', archive=False, + allow_hatching='pending', trash=False).order_by('left_over').last() + remain = hatching.left_over if hatching else 0 + return remain + + def get_last_hatching_diffrent_request_quantity(self, obj): + left_export_quantity = None + left_poultry_out_province = None + age = None + breed = None + left_over = 0 + + hatching = PoultryHatching.objects.filter(poultry=obj, state='pending', archive=False, + allow_hatching='pending', trash=False).order_by('left_over').last() + poultry_export = PoultryExport.objects.get(trash=False) + if poultry_export.limitation_status == True: + total_export = int(hatching.quantity * (poultry_export.limitation / 100)) + hatching_export_quantity = hatching.export_killed_quantity + left_export_quantity = hatching.left_over if hatching.left_over <= ( + total_export - hatching_export_quantity) else total_export - hatching_export_quantity + + poultry_out_province = PoultryOutProvinceRequest.objects.get(trash=False) + if poultry_out_province.limitation_status == True: + total_poultry_out_province = int(hatching.quantity * (poultry_out_province.limitation / 100)) + hatching_poultry_out_province_quantity = hatching.out_province_killed_quantity + left_poultry_out_province = hatching.left_over if hatching.left_over <= ( + total_poultry_out_province - hatching_poultry_out_province_quantity) else total_poultry_out_province - hatching_poultry_out_province_quantity + if hatching: + age = hatching.chicken_age + breed = hatching.chicken_breed + left_over = hatching.left_over + return { + "left_export_quantity": left_export_quantity, + "left_poultry_out_province": left_poultry_out_province, + "age": age, + "breed": breed, + "left_over": left_over, + } + + def get_chain_company(self, obj): + hatching = PoultryHatching.objects.filter(poultry=obj, state='pending', archive=False, + allow_hatching='pending', trash=False).order_by('left_over').last() + chain_company = False if hatching.has_chain_company == False else True + return { + "chain_company": chain_company, + "hatching-key": hatching.key + } + + def get_allow_sell_free(self, instance): + allow_state = None + province_allow = ProvinceAllowPoultrySellFree.objects.filter(poultry=instance).first() + if province_allow: + allow_state = province_allow.allow + return allow_state + + def get_free_governmental_info(self, obj): + left_total_free_commitment_quantity = 0 + hatching = PoultryHatching.objects.filter(poultry=obj, state='pending', archive=False, + allow_hatching='pending', trash=False).order_by('left_over').last() + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=hatching) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, final_state='archive', + hatching=hatching) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = hatching.left_over + elif hatching.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if hatching.total_commitment_quantity == 0: + left_total_free_commitment_quantity = hatching.left_over + else: + left_total_free_commitment_quantity = hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + hatching.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + return { + "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + "total_commitment_quantity": hatching.total_commitment_quantity, + "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + "total_free_commitment_quantity": hatching.total_free_commitment_quantity, + "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + + } + + +class PoultryForPoultryHatchingSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + address = SystemAddressSerializer(required=False) + province_allow_choose_kill_house = serializers.SerializerMethodField('get_allow_choose_kill_house') + last_hatching_remain_quantity = serializers.SerializerMethodField('get_last_hatching_remain_quantity') + province_allow_sell_free = serializers.SerializerMethodField('get_allow_sell_free') + hatching_age = serializers.SerializerMethodField('get_hatching_age') + + class Meta: + model = Poultry + fields = ['user', 'key', 'address', 'province_allow_choose_kill_house', 'unit_name', + 'last_hatching_remain_quantity', 'province_allow_sell_free', + 'hatching_age'] + + def get_last_hatching_remain_quantity(self, obj): + hatching = PoultryHatching.objects.filter(poultry__exact=obj, state='pending', archive=False, + allow_hatching='pending', trash=False).order_by('left_over').last() + remain = hatching.left_over if hatching else 0 + return remain + + def get_hatching_age(self, obj): + hatching = PoultryHatching.objects.filter(poultry__exact=obj, state='pending', archive=False, + allow_hatching='pending', trash=False).last() + if hatching: + date = datetime.strptime(str(hatching.date), '%Y-%m-%d %H:%M:%S') + age = (datetime.now() - date).days + 1 + breed = hatching.chicken_breed + else: + age = None + breed = None + return {"age": age, "breed": breed} + + def get_allow_choose_kill_house(self, instance): + allow_state = None + mandatory = None + province_allow = ProvinceAllowPoultryChooseKillHouse.objects.filter(poultry=instance).first() + if province_allow: + allow_state = province_allow.allow + mandatory = province_allow.mandatory + return {"allow_state": allow_state, "mandatory": mandatory} + + def get_allow_sell_free(self, instance): + allow_state = None + province_allow = ProvinceAllowPoultrySellFree.objects.filter(poultry=instance).first() + if province_allow: + allow_state = province_allow.allow + return allow_state + + +# class PoultryForAllUserSerializer(serializers.ModelSerializer): +# user_bank_info = BankCardSerializer(required=False) +# address = SystemAddressSerializer(required=False) +# +# class Meta: +# model = Poultry +# fields = ['breeding_unique_id', 'unit_name', 'address', 'number_of_halls', 'total_capacity', +# 'user_bank_info', 'city_operator','active','identity_documents'] + + +class VetForPoultrySerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = Vet + fields = ['user'] + + +class VetFarmForPoultrySerializer(serializers.ModelSerializer): + vet = VetForPoultrySerializer(read_only=True) + + class Meta: + model = VetFarm + fields = ['vet'] + + +class PoultryForAllUserSerializer(serializers.ModelSerializer): + user_bank_info = BankCardSerializer(required=False) + address = SystemAddressSerializer(required=False) + tenants = serializers.SerializerMethodField('get_tenants') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + + class Meta: + model = Poultry + + fields = ['breeding_unique_id', 'unit_name', 'address', 'number_of_halls', 'total_capacity', + 'user_bank_info', 'city_operator', 'active', 'identity_documents', 'tenants', 'vet_farm'] + + def get_tenants(self, obj): + owner_poultry = Poultry.objects.filter(owner__exact=obj) + return PoultryForAllUserSerializer(owner_poultry, many=True).data + + def get_vet_farm(self, obj): + vet_farm = VetFarm.objects.filter(poultry__exact=obj, trash=False) + return VetFarmForPoultrySerializer(vet_farm, many=True).data + + +# سریالایزر مربوط به درخواست بورسی مرغدار +class PoultrySerializer(serializers.ModelSerializer): + userprofile = serializers.SerializerMethodField('get_userprofile') + address = SystemAddressSerializer(read_only=True) + poultry_owner = serializers.SerializerMethodField('get_owner') + poultry_tenant = serializers.SerializerMethodField('get_poultry_tenant') + hatching = serializers.SerializerMethodField('get_hatching') + register_vet_halls = serializers.SerializerMethodField('get_busy_halls') + allow = serializers.SerializerMethodField('get_allow_city_province') + province_allow_choose_kill_house = serializers.SerializerMethodField('get_allow_choose_kill_house') + province_allow_sell_free = serializers.SerializerMethodField('get_allow_sell_free') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + last_hatching_diffrent_request_quantity = serializers.SerializerMethodField( + 'get_last_hatching_diffrent_request_quantity') + user_bank_info = BankCardSerializer(required=False) + left_over_own_hatching = serializers.SerializerMethodField('get_left_over_own_hatching') + + class Meta: + model = Poultry + exclude = ( + 'user', + 'id', + 'create_date', + 'modify_date', + # 'trash', + 'password', + 'created_by', + 'modified_by', + ) + + def get_userprofile(self, instance): + user = SystemUserProfile.objects.get(id=instance.user.id, trash=False) + internal_dictionary = { + "user_key": user.key, + "base_order": user.base_order, + "full_name": user.fullname, + "mobile": user.mobile, + "city": user.city.name, + "province": user.province.name, + "breeding_unique_id": instance.breeding_unique_id, + + } + + return internal_dictionary + + def get_vet_farm(self, instance): + internal_dictionary = {} + vet_farm = VetFarm.objects.filter(poultry=instance, trash=False) + if vet_farm.count() > 0: + vet_farm = vet_farm.last() + + internal_dictionary = { + "full_name": vet_farm.vet.user.fullname, + "mobile": vet_farm.vet.user.mobile, + "city": vet_farm.vet.user.city.name, + "province": vet_farm.vet.user.province.name, + + } + + return internal_dictionary + + def get_allow_choose_kill_house(self, instance): + allow_state = None + mandatory = None + province_allow = ProvinceAllowPoultryChooseKillHouse.objects.filter(poultry=instance).first() + if province_allow: + allow_state = province_allow.allow + mandatory = province_allow.mandatory + return {"allow_state": allow_state, "mandatory": mandatory} + + def get_allow_sell_free(self, instance): + allow_state = None + province_allow = ProvinceAllowPoultrySellFree.objects.filter(poultry=instance).first() + if province_allow: + allow_state = province_allow.allow + return allow_state + + def get_allow_city_province(self, instance): + internal_dictionary = {} + allow = PoultryAllowCityProvince.objects.filter(poultry=instance, trash=False) + if allow.count() > 0: + allow = allow.last() + internal_dictionary = { + "city": allow.city, + "province": allow.province, + } + + return internal_dictionary + + def get_last_hatching_diffrent_request_quantity(self, obj): + left_export_quantity = None + left_poultry_out_province = None + + hatching = PoultryHatching.objects.filter(poultry=obj, state='pending', archive=False, + allow_hatching='pending', trash=False).order_by('left_over').last() + if hatching: + poultry_export = PoultryExport.objects.get(trash=False) + if poultry_export.limitation_status == True: + total_export = int(hatching.quantity * (poultry_export.limitation / 100)) + hatching_export_quantity = hatching.export_killed_quantity + left_export_quantity = hatching.left_over if hatching.left_over <= ( + total_export - hatching_export_quantity) else total_export - hatching_export_quantity + + poultry_out_province = PoultryOutProvinceRequest.objects.get(trash=False) + if poultry_out_province.limitation_status == True: + total_poultry_out_province = int(hatching.quantity * (poultry_out_province.limitation / 100)) + hatching_poultry_out_province_quantity = hatching.out_province_killed_quantity + left_poultry_out_province = hatching.left_over if hatching.left_over <= ( + total_poultry_out_province - hatching_poultry_out_province_quantity) else total_poultry_out_province - hatching_poultry_out_province_quantity + remain = hatching.left_over if hatching else 0 + + return { + "left_export_quantity": left_export_quantity, + "left_poultry_out_province": left_poultry_out_province, + "last_hatching_remain_quantity": remain, + } + + def get_busy_halls(self, instance): + list1 = [] + vet_farms = VetFarm.objects.filter(poultry=instance, state='pending', trash=False) + if vet_farms.count() > 0: + for vet_farm in vet_farms: + list1.append(vet_farm.hall) + + return list1 + + def get_owner(self, instance): + if instance.owner != None: + owner = Poultry.objects.filter(id=instance.owner.id, trash=False) + if owner.count() > 0: + owner = owner.last() + internal_dictionary = { + "full_name": owner.user.fullname, + "mobile": owner.user.mobile, + "unit_name": owner.unit_name, + "number_of_halls": owner.number_of_halls, + "breeding_unique_id": owner.breeding_unique_id, + + } + else: + internal_dictionary = {} + + return internal_dictionary + + def get_poultry_tenant(self, instance): + tenant = Poultry.objects.filter(owner_id=instance.id, trash=False) + if tenant.count() > 0: + tenant = tenant.last() + internal_dictionary = { + "key": tenant.key, + "first_name": tenant.user.first_name, + "last_name": tenant.user.last_name, + "full_name": tenant.user.first_name + " " + tenant.user.last_name, + "mobile": tenant.user.mobile, + "national_id": tenant.user.national_id, + "breeding_unique_id": tenant.breeding_unique_id, + } + else: + internal_dictionary = {} + + return internal_dictionary + + def get_hatching(self, instance): + hatching_list = [] + for hatching in PoultryHatching.objects.filter(poultry=instance, trash=False): + age = (datetime.now().date() - hatching.date.date()).days + 1 + internal_dictionary = { + "poultry_key": hatching.poultry.key, + "poultry_hatching_key": hatching.key, + "poultry": hatching.poultry.unit_name, + "quantity": hatching.quantity, + "losses": hatching.losses, + "left_over": hatching.left_over, + "out_province_killed_quantity": hatching.out_province_killed_quantity, + "export_killed_quantity": hatching.export_killed_quantity, + "hall": hatching.hall, + "date": hatching.date, + "period": hatching.period, + "state": hatching.state, + "age": age, + + } + hatching_list.append(internal_dictionary) + + return hatching_list + + def get_left_over_own_hatching(self, instance): + hatching = PoultryHatching.objects.filter(state='pending', archive=False, + allow_hatching='pending', poultry=instance, trash=False).order_by( + 'chicken_age').first() + if hatching: + left_over = hatching.left_over + else: + left_over = None + return left_over + + +class PoultryForPredictionSerializer(serializers.ModelSerializer): + fullname = serializers.CharField(source='user.fullname') + mobile = serializers.CharField(source='user.mobile') + city = serializers.CharField(source='user.city.name') + userprofile = serializers.SerializerMethodField('get_userprofile') + + + class Meta: + model = Poultry + fields = ['key', 'fullname', 'mobile', 'city', 'unit_name', 'killing_ave_age', 'active_left_over', + 'killing_ave_count', 'real_killing_ave_weight', 'real_killing_live_weight', + 'real_killing_carcasses_weight', 'real_killing_loss_weight_percent','userprofile'] + + def get_userprofile(self, instance): + user = SystemUserProfile.objects.get(id=instance.user.id, trash=False) + internal_dictionary = { + "user_key": user.key, + "base_order": user.base_order, + "full_name": user.fullname, + "mobile": user.mobile, + "city": user.city.name, + "province": user.province.name, + "breeding_unique_id": instance.breeding_unique_id, + + } + + return internal_dictionary + + +class PoultryForDirectBuyingSerializer(serializers.ModelSerializer): + fullname = serializers.CharField(source='user.fullname') + mobile = serializers.CharField(source='user.mobile') + province = serializers.CharField(source='user.province.name') + city = serializers.CharField(source='user.city.name') + + class Meta: + model = Poultry + fields = ['key', 'fullname', 'mobile', 'province', 'city', 'unit_name'] + + +# سریالایزر مربوط به مستاجر مرغدار +class PoultryTenantSerializer(serializers.ModelSerializer): + poultry = PoultrySerializer(read_only=True) + + class Meta: + model = PoultryTenant + fields = '__all__' + + +class TotalPoultryRequestQuantitySerializer(serializers.ModelSerializer): + class Meta: + model = TotalPoultryRequestQuantity + fields = '__all__' + + +# سریالایزر مربوط به درخواست بورسی مرغدار +class PoultryRequestExchangeSerializer(serializers.ModelSerializer): + user = UserProfileSerializer(read_only=True) + chicken_age = serializers.SerializerMethodField('age') + + class Meta: + model = PoultryRequestExchange + fields = '__all__' + + +# سریالایزر مربوط به ثبت جوجه ریزی مرغدار +class PoultryHatchingSerializer(serializers.ModelSerializer): + poultry = PoultrySerializer(read_only=True) + chain_company = ChainCompanySerializer(read_only=True) + age = serializers.SerializerMethodField('get_age') + inspection_losses = serializers.SerializerMethodField('get_inspection') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + active_kill = serializers.SerializerMethodField('get_active_kill') + killing_info = serializers.SerializerMethodField('get_killing_info') + free_governmental_info = serializers.SerializerMethodField('get_free_governmental_info') + management_hatching_age_range = serializers.SerializerMethodField('get_management_hatching_age_range') + + class Meta: + model = PoultryHatching + fields = '__all__' + + def get_management_hatching_age_range(self, obj): + + age_range = ManagementHatchingAgeRange.objects.filter(from_age__lte=obj.chicken_age,to_age__gte=obj.chicken_age).first() + if age_range: + return { + 'from_weight': age_range.from_weight, + 'to_weight': age_range.to_weight, + } + else: + return { + 'from_weight': 0, + 'to_weight': 5, + } + + # تابع برای بدست آوردن سن مرع + def get_age(self, instance): + # date = datetime.strptime(str(instance.date), '%Y-%m-%d %H:%M:%S') + # age = (datetime.now() - date).days + 1 + # hatching = PoultryHatching.objects.get(key=instance.key) + # if hatching.archive == False and hatching.allow_hatching == 'pending': + # hatching.chicken_age = age + # hatching.save() + return instance.chicken_age + + def get_inspection(self, instance): + inspection = VetFarmInspection.objects.filter(poultry_hatching=instance) + if inspection.count() > 0: + inspections = 0 + for ins in inspection: + if ins.Losses == 0: + pass + else: + inspections += int(ins.Losses) + return inspections + + def get_vet_farm(self, instance): + vet = { + "vet_farm_full_name": 'ندارد', + "vet_farm_mobile": '', + } + vet_farm = VetFarm.objects.filter(poultry=instance.poultry) + if vet_farm.count() > 0: + vet_farm = vet_farm.last() + vet = { + "vet_farm_full_name": vet_farm.vet.user.fullname, + "vet_farm_mobile": vet_farm.vet.user.mobile, + } + + return vet + + def get_active_kill(self, instance): + + active_kill = False + count_of_request = 0 + + province_kill_request = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=instance, + state='accepted') + if province_kill_request.count() > 0: + count_of_request = province_kill_request.count() + + if ProvinceKillRequest.objects.filter(trash=False, province_request__poultry_request__hatching=instance, + state='pending').exists(): + active_kill = True + info = { + "active_kill": active_kill, + "count_of_request": count_of_request, + } + + return info + + def get_killing_info(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0, + province_request__poultry_request__hatching=obj) + province_kill_requests_quantity = \ + province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight = \ + province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=obj) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + return { + "violation_message": 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' if obj.violation else 'عادی', + "province_kill_requests": len(province_kill_requests), + "province_kill_requests_quantity": province_kill_requests_quantity, + "province_kill_requests_weight": province_kill_requests_weight, + "kill_house_requests": len(kill_house_requests), + "kill_house_requests_first_quantity": first_quantity, + "kill_house_requests_first_weight": first_weight, + "bar_complete_with_kill_house": len(bar_complete_with_kill_house), + "accepted_real_quantity_final": accepted_real_quantity_final, + "accepted_real_wight_final": accepted_real_wight_final, + "ware_house_bars": len(ware_house_bars), + "ware_house_bars_quantity": ware_house_bars_quantity, + "ware_house_bars_weight": ware_house_bars_weight, + 'ware_house_bars_weight_lose': ware_house_bars_weight_lose / len( + ware_house_bars) if ware_house_bars else 0, + } + + def get_free_governmental_info(self, obj): + left_total_free_commitment_quantity = 0 + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=obj) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, final_state='archive', + hatching=obj) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = obj.left_over + + elif obj.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if obj.total_commitment_quantity == 0: + left_total_free_commitment_quantity = obj.left_over + else: + left_total_free_commitment_quantity = obj.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + obj.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + return { + "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + "total_commitment_quantity": obj.total_commitment_quantity, + "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + "total_free_commitment_quantity": obj.total_free_commitment_quantity, + "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + + } + + +class PoultryHatchingForPredictionSerializer(serializers.ModelSerializer): + poultry = PoultryForPredictionSerializer(read_only=True) + general_info = serializers.SerializerMethodField('get_general_info') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + + + class Meta: + model = PoultryHatching + fields = ['poultry', 'general_info', 'chicken_breed', 'date', 'quantity', 'left_over', 'period','chicken_age', + 'losses','violation','vet_farm','licence_number'] + + def get_general_info(self, obj): + now_age = (datetime.now().date() - obj.date.date()).days + 1 + sum_age = 0 + ave_age = 0 + ave_weight = 0 + counter = 0 + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + out_province_request_cancel=False, + hatching=obj) + for poultry_request in poultry_requests: + sum_age += (poultry_request.send_date.date() - obj.date.date()).days + 1 + counter += 1 + ave_age = int(sum_age / counter) if counter > 0 else 0 + + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=obj, + first_car_allocated_quantity=0, + return_to_province=False) + + province_kill_requests_quantity = \ + province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + + province_kill_requests_weight = \ + province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=obj) + + kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + kill_house__requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + + total_quantity = province_kill_requests_quantity + kill_house_requests_quantity + total_weight = province_kill_requests_weight + kill_house__requests_weight + + ave_weight = round(total_weight / total_quantity, 2) if total_quantity > 0 else 0 + + return { + "ave_age": ave_age, + "age": now_age, + "ave_weight": ave_weight, + "province_kill_requests": len(province_kill_requests), + "province_kill_requests_quantity": province_kill_requests_quantity, + "province_kill_requests_weight": province_kill_requests_weight, + "kill_house_requests_quantity": kill_house_requests_quantity, + "kill_house_requests": len(kill_house_requests), + "kill_house__requests_weight": kill_house__requests_weight, + "total_quantity": total_quantity, + "total_weight": total_weight + } + + def get_vet_farm(self, obj): + + vet_farm = VetFarm.objects.filter(poultry=obj.poultry, trash=False).first() + vet_farm_fullname = vet_farm.vet.user.fullname if vet_farm else None + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else None + + return { + "vet_farm_fullname": vet_farm_fullname, + "vet_farm_mobile": vet_farm_mobile, + } + + +class PoultryRequestForAutoAllocationSerializer(serializers.ModelSerializer): + # user = SystemUserProfileSerializer(read_only=True) + poultry = PoultryForAutoAllocationSerializer(read_only=True) + + class Meta: + model = PoultryRequest + fields = ['poultry', 'payer_fullname'] + + +class PoultryRequestForOutRequestTransactionsSerializer(serializers.ModelSerializer): + poultry = PoultryForAutoAllocationSerializer(read_only=True) + + class Meta: + model = PoultryRequest + fields = ['poultry', 'order_code'] + + +class PoultryRequestForMarketSerializer(serializers.ModelSerializer): + + class Meta: + model = PoultryRequest + fields = ['killing_age'] + + +class PoultryHatchingForChainAllocationSerializer(serializers.ModelSerializer): + poultry = PoultryForPoultryRequestLetterSerializer(read_only=True) + + class Meta: + model = PoultryHatching + fields = '__all__' + + +class PoultryHatchingForBarDifferenceRequestSerializer(serializers.ModelSerializer): + poultry = PoultryForBarDifferenceRequestSerializer(read_only=True) + + class Meta: + model = PoultryHatching + fields = ['key', 'poultry', 'quantity', 'left_over', 'chicken_age', 'now_age'] + + +class ChainAllocationForWageSerializer(serializers.ModelSerializer): + poultry_hatching = PoultryHatchingForChainAllocationSerializer(read_only=True) + chain_company = ChainCompanySerializer(read_only=True) + total_wage_amount = serializers.SerializerMethodField('get_total_wage_amount') + + class Meta: + model = ChainAllocation + fields = '__all__' + + def get_total_wage_amount(self, obj): + role = self.context.get('request').GET['role'] + + if role in ['SuperAdmin', 'ChainCompany', 'AdminX', 'Supporter']: + amount = obj.total_wage_amount + elif role == 'ProvinceOperator': + amount = obj.union_share + + elif role == 'Guilds': + amount = obj.guilds_share + elif role == 'Company': + amount = obj.company_share + else: + amount = obj.total_wage_amount + + return amount + + +class KillHouseOperatorForChainAllocationsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializer(read_only=True) + + class Meta: + model = KillHouseOperator + fields = ['user'] + + +class KillHouseForChainAllocationSerializer(serializers.ModelSerializer): + kill_house_operator = KillHouseOperatorForChainAllocationsSerializer(read_only=True) + + class Meta: + model = KillHouse + fields = ['kill_house_operator', 'name', 'killer', 'key'] + + +class ChainAllocationSerializer(serializers.ModelSerializer): + poultry_hatching = PoultryHatchingForChainAllocationSerializer(read_only=True) + chain_company = ChainCompanySerializer(read_only=True) + kill_house = KillHouseForChainAllocationSerializer(read_only=True) + + class Meta: + model = ChainAllocation + fields = '__all__' + + +class ChainCompanyTransactionSerializer(serializers.ModelSerializer): + chain_company = ChainCompanySerializer(read_only=True) + + class Meta: + model = ChainCompanyTransaction + fields = '__all__' + + +class PoultryRequestForKillingInformationSerializer(serializers.ModelSerializer): + poultry = PoultryForBarManagementSerializer(read_only=True) + hatching = serializers.SerializerMethodField('get_hatching') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + city_check_request = serializers.SerializerMethodField('get_city_check_request') + + class Meta: + model = PoultryRequest + fields = ['key', 'id', 'poultry', 'order_code', 'create_date', 'send_date', 'kill_house_list', 'first_quantity', + 'quantity', 'direct_buying', 'union', 'amount', 'financial_operation', + 'remain_quantity', 'Index_weight', 'hatching', 'final_state', 'losses', 'province_state', + 'state_process', 'registrar', 'vet_farm', 'free_sale_in_province', 'freezing', 'export', + 'city_check_request','market','killing_age'] + + def get_hatching(self, obj): + file_state = 'pending' + if obj.province_state == 'pending': + file_state = 'province_state_pending' + + elif obj.price_confirmation and not obj.input_price_confirmation_code: + file_state = 'confirmation_code_pending' + + else: + file_state = 'allocated_pending' + hatching = PoultryHatching.objects.filter(Q(trash=False) | Q(trash=True), key=obj.hatching.key).first() + inspections = VetFarmInspection.objects.filter(poultry_hatching=hatching, trash=False) + losses = 0 + if inspections: + losses = inspections.aggregate(total_quantity=Sum('Losses')).get('total_quantity', 0) + inspection_losses = (losses * 100) / obj.hatching.quantity if losses > 0 else 0 + + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=obj, + state='accepted').exists(): + if obj.remain_quantity == 0: + file_state = 'allocated_completed' + age2 = (obj.send_date - hatching.date).days + 1 + else: + age2 = (datetime.now() - hatching.date).days + 1 + + return { + "age": age2, + "left_over": hatching.left_over, + "file_state": file_state, + "hatching_date": hatching.date, + "allow_hatching": hatching.allow_hatching, + "inspection_losses": losses, + "inspection_losses_percent": inspection_losses, + "total_losses_percent": (hatching.losses * 100) / hatching.quantity, + "poultry_losses_percent": (int(obj.losses) * 100) / hatching.quantity, + "total_weight": obj.Index_weight * obj.quantity + } + + def get_vet_farm(self, obj): + + vet_farm = VetFarm.objects.filter(poultry=obj.poultry, trash=False).first() + vet_farm_fullname = vet_farm.vet.user.fullname if vet_farm else None + vet_farm_mobile = vet_farm.vet.user.mobile if vet_farm else None + + return { + "vet_farm_fullname": vet_farm_fullname, + "vet_farm_mobile": vet_farm_mobile, + } + + def get_city_check_request(self, obj): + try: + city_check = CityOperatorCheckRequest.objects.get(trash=False, poultry_request=obj) + return city_check.key + except: + return None + + +class PoultryRequestForBarMangementSerializer(serializers.ModelSerializer): + poultry = PoultryForBarManagementSerializer(read_only=True) + age = serializers.SerializerMethodField('get_age') + + class Meta: + model = PoultryRequest + fields = ['key', 'poultry', 'send_date', 'age', 'amount', 'financial_operation', 'chicken_breed', 'order_code', + 'freezing', 'export', 'direct_buying', 'free_sale_in_province'] + + def get_age(self, obj): + age = (obj.send_date.date() - obj.hatching.date.date()).days + 1 + return age + + +class PoultryRequestForGeneralCasestatusSerializer(serializers.ModelSerializer): + poultry = PoultryForBarManagementSerializer(read_only=True) + other_informations = serializers.SerializerMethodField('get_other_informations') + + class Meta: + model = PoultryRequest + fields = ['key', 'id', 'poultry', 'send_date', 'amount', 'financial_operation', 'quantity', 'Index_weight', + 'order_code', 'province_state', + 'state_process', + 'other_informations', 'final_state', 'out', 'free_sale_in_province'] + + def get_other_informations(self, obj): + vet_farm_name = None + vet_farm_mobile = None + vet_farm = VetFarm.objects.filter(poultry=obj.poultry, trash=False).select_related( + 'vet__user').only('vet__user__mobile', 'vet__user__fullname').last() + if vet_farm: + vet_farm_name = vet_farm.vet.user.fullname + vet_farm_mobile = vet_farm.vet.user.mobile + + return { + "vet_farm_name": vet_farm_name, + "vet_farm_mobile": vet_farm_mobile, + "province_kill_request_state": ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request=obj).exists(), + "kill_house_state": KillHouseCheckRequest.objects.filter(trash=False, + province_kill_request__province_request__poultry_request=obj).exists(), + "kill_house_request_state": KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request=obj).exists(), + "receive_bar_state": VetCheckRequest.objects.filter(trash=False, + kill_house_request__province_request__poultry_request=obj).exists(), + "bar_state": KillHouseAssignmentInformation.objects.filter(trash=False, + kill_house_request__province_request__poultry_request=obj).exists(), + "province_factor_state": ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__province_request__poultry_request=obj, + trash=False).exists(), + "kill_house_factor_state": KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__province_request__poultry_request=obj, + trash=False, state='accepted').exists(), + "inspector_state": PovinceInspector.objects.filter(poultry_request=obj, + trash=False).exists(), + } + + +# سریالایزر مربوط به درخواست مرغدار +class PoultryRequestSerializer(serializers.ModelSerializer): + # user = SystemUserProfileSerializer(read_only=True) + poultry = PoultrySerializer(read_only=True) + hatching = PoultryHatchingSerializer(read_only=True) + process = serializers.SerializerMethodField('get_process') + + class Meta: + model = PoultryRequest + fields = '__all__' + # fields = ['id', 'poultry', 'hatching'] + + # تایع برای نمایش ریز جزییات مزبوط به پرونده مرغدار برای پنل های استان + def get_process(self, instance): + process = {} + + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=instance, + state='accepted').exists(): + age2 = (instance.send_date - instance.hatching.date).days + 1 + else: + age2 = (datetime.now() - instance.hatching.date).days + 1 + + file_state = 'pending' + if instance.province_state == 'pending': + file_state = 'province_state_pending' + + if ProvinceKillRequest.objects.filter(province_request__poultry_request__id=instance.id).exists(): + if instance.remain_quantity == 0: + file_state = 'allocated_completed' + + + else: + file_state = 'allocated_pending' + + process.update({"file_state": file_state}) + + process.update({"poultry": { + "poultry_unit_name": instance.poultry.unit_name, + "breeding_unique_id": instance.poultry.breeding_unique_id, + "halls": instance.poultry.number_of_halls, + "tenant": instance.poultry.tenant, + "has_tenant": instance.poultry.has_tenant, + "poultry_request_id": instance.id, + "base_order": instance.poultry.user.base_order, + + "awaiting_payment": instance.awaiting_payment, + "poultry_request_key": instance.key, + "general_order_code": instance.general_order_code, + "kill_house_list": instance.kill_house_list, + "poultry_request_final_state": instance.final_state, + "poultry_order_code": instance.order_code, + "poultry_send_date": instance.send_date, + "poultry_name": instance.poultry.user.fullname, + "poultry_mobile": instance.poultry.user.mobile, + "poultry_city": instance.poultry.address.city.name, + "poultry_province": instance.poultry.address.province.name, + "poultry_address": instance.poultry.address.address, + "national_id": instance.poultry.user.national_id, + "poultry_gis_code": instance.poultry.gis_code, + 'age': age2, + 'chicken_date': None, + "poultry_quantity": instance.quantity, + "poultry_remain_quantity": instance.remain_quantity, + "poultry_previous_quantity": instance.previous_quantity, + "poultry_first_quantity": instance.first_quantity, + "poultry_chicken_breed": instance.chicken_breed, + "poultry_request_losses": instance.losses, + "poultry_Index_weight": "{} کیلوگرم".format(instance.Index_weight), + "Index_weight": instance.Index_weight, + "total_weight": instance.Index_weight * instance.quantity, + "poultry_register_date": instance.create_date, + "poultry_auction": instance.auction, + "sell_type": instance.cell_type, + "buyer": instance.buyer, + "quarantine_code": instance.quarantine_code, + + } + }) + poultry_hatching = PoultryHatching.objects.filter(key=instance.hatching.key, trash=False) + if poultry_hatching.count() > 0: + poultry_hatching = poultry_hatching.last() + inspections = VetFarmInspection.objects.filter(poultry_hatching=poultry_hatching) + losses = 0 + if inspections.count() > 0: + for ins in inspections: + if ins.Losses > 0: + losses += ins.Losses + else: + pass + + if losses > 0: + process.update({"inspection_losses": losses + }) + process.update({ + "inspection_losses_percent": (losses * 100) / instance.hatching.quantity + }) + else: + process.update({"inspection_losses": losses + }) + process.update({ + "inspection_losses_percent": losses + }) + + process.update({"poultry_hatching": { + "poultry_key": instance.poultry.key, + "poultry_hatching_key": instance.hatching.key, + "poultry_name": instance.poultry.unit_name, + "quantity": instance.hatching.quantity, + "losses": instance.hatching.losses, + "total_losses_percent": (instance.hatching.losses * 100) / instance.hatching.quantity, + "poultry_losses_percent": (int(instance.losses) * 100) / instance.hatching.quantity, + "left_over": instance.hatching.left_over, + "hall": instance.hatching.hall, + "date": instance.hatching.date, + "allow_hatching": instance.hatching.allow_hatching, + "period": instance.hatching.period, + "state": instance.hatching.state, + } + }) + else: + process.update({"poultry_hatching": None + }) + + vetfarm_inspection = VetFarmInspection.objects.filter(vet_farm__poultry=instance.poultry, trash=False) + if vetfarm_inspection.count() > 0: + vetfarm_inspection = vetfarm_inspection.last() + process.update({"vetfarm_inspection": { + "vet_name": vetfarm_inspection.vet_farm.vet.user.fullname, + "hall": vetfarm_inspection.hall, + "topic": vetfarm_inspection.topic, + "description": vetfarm_inspection.description, + "image": vetfarm_inspection.image, + "losses": vetfarm_inspection.Losses, + "longitude": vetfarm_inspection.longitude, + "latitude": vetfarm_inspection.latitude, + } + }) + else: + process.update({"vetfarm_inspection": None + }) + + auctions = PoultryRequestAuction.objects.filter(poultry_request=instance, state='active', trash=False).order_by( + 'auction_date') + if auctions.count() > 0: + auctions_list = [] + for auction in auctions: + if auction.state == 'active': + index = list(auctions).index(auction) + 1 + pricing = Pricing.objects.get(id=auction.pricing.id, trash=False) + internal_dict_auction = { + "ceiling_price": pricing.ceiling_price, + "floor_price": pricing.floor_price, + "fee": auction.fee, + "hour": auction.hour, + "date": auction.auction_date, + "index": index, + "total_index": auctions.count() + } + auctions_list.append(internal_dict_auction) + process.update({"auctions_list": auctions_list}) + # else: + # break + # process['poultry'].update({"auctions_list":auctions_list}) + process.update({"auctions_list": auctions_list}) + else: + process.update({"auctions_list": None}) + kill_house_auctions = KillHouseRequestAction.objects.filter(poultry_request=instance, state='pending', + trash=False) + if kill_house_auctions.count() > 0: + kill_house_auctions_list = [] + for kill_house_auction in kill_house_auctions: + internal_dict_kill_house_auction = { + "kill_house_name": kill_house_auction.kill_house.name, + "fullname": kill_house_auction.kill_house.kill_house_operator.user.fullname, + "mobile": kill_house_auction.kill_house.kill_house_operator.user.mobile, + "city": kill_house_auction.kill_house.system_address.city.name, + "province": kill_house_auction.kill_house.system_address.province.name, + "fee": kill_house_auction.fee, + } + kill_house_auctions_list.append(internal_dict_kill_house_auction) + process.update({"kill_house_auctions_list": kill_house_auctions_list}) + else: + process.update({"kill_house_auctions_list": None}) + kill_house_auction_winner = KillHouseRequestActionWinner.objects.filter( + kill_house_request_auction__poultry_request=instance, trash=False) + if kill_house_auction_winner.count() > 0: + kill_house_auction_winner = kill_house_auction_winner.last() + process.update({"kill_house_winner": { + "kill_house_winner_key": kill_house_auction_winner.key, + "kill_house_name": kill_house_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_user_name": kill_house_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.fullname, + "kill_house_user_mobile": kill_house_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "kill_house_city": kill_house_auction_winner.kill_house_request_auction.kill_house.system_address.city.name, + "kill_house_province": kill_house_auction_winner.kill_house_request_auction.kill_house.system_address.province.name, + "fee": kill_house_auction_winner.fee, + "quantity": kill_house_auction_winner.quantity + } + }) + else: + process.update({"kill_house_winner": None + }) + + province_request_auctions = ProvinceRequestAction.objects.filter(poultry_request=instance, state='active', + trash=False) + if province_request_auctions.count() > 0: + province_request_auction_list = [] + for province_request_auction in province_request_auctions: + internal_dict_province_request_auction_list = { + "fullname": province_request_auction.province_operator_system.user.fullname, + "mobile": province_request_auction.province_operator_system.user.mobile, + "city": province_request_auction.province_operator_system.user.city.name, + "province": province_request_auction.province_operator_system.user.province.name, + } + province_request_auction_list.append(internal_dict_province_request_auction_list) + process.update({"province_request_auction_list": province_request_auction_list}) + else: + process.update({"province_request_auction_list": None}) + + poultry_assignment = PoultryAssignmentInformation.objects.filter(poultry_request=instance, trash=False) + + if poultry_assignment.count() > 0: + poultry_bar_list = [] + for bar in poultry_assignment: + internal_poultry_bar = { + "poultry_bar_info_key": bar.key, + "car_weight_without_load": bar.car_weight_without_load, + "car_weight_without_load_image": bar.car_weight_without_load_image, + "car_weight_with_load": bar.car_weight_with_load, + "car_weight_with_load_image": bar.car_weight_with_load_image, + "net_weight": bar.net_weight, + } + poultry_bar_list.append(internal_poultry_bar) + + process.update({"poultry_bar_info": poultry_bar_list}) + if not poultry_assignment: + process.update({"poultry_bar_info": None}) + + city = CityOperatorCheckRequest.objects.filter(poultry_request=instance, trash=False) + if city: + process.update({"city": { + "city_operator_name": city[0].city_operator_system.user.fullname, + "city_operator_mobile": city[0].city_operator_system.user.mobile, + "city_operator_province": city[0].city_operator_system.address.province.name, + "city_operator_city": city[0].city_operator_system.address.city.name, + "city_operator_address": city[0].city_operator_system.address.address, + "city_operator_national_id": city[0].city_operator_system.user.national_id, + "city_state": city[0].state, + "province_accept": city[0].province_accept, + "accepted_rejected_date": city[0].create_date, + "city_operator_message": city[0].message, + "unit_name": city[0].city_operator_system.unit_name, + + }}) + if not city: + process.update({"city": None}) + # cit = CityUnit.objects.filter(name=instance.poultry.address.city.name, trash=False) + # if cit.count() > 0: + # city_operator = CityOperator.objects.get(address__city=cit[0].city, trash=False) + city_operator = CityOperator.objects.get(key=instance.city_operator.key, trash=False) + + process.update({"city_operator": { + "city_operator_name": city_operator.user.fullname, + "city_operator_mobile": city_operator.user.mobile, + "city_operator_province": city_operator.address.province.name, + "city_operator_city": city_operator.address.city.name, + "city_operator_address": city_operator.address.address, + "city_operator_national_id": city_operator.user.national_id, + "unit_name": city_operator.unit_name, + + }}) + + province = ProvinceCheckOperatorRequest.objects.filter(poultry_request=instance, + trash=False) + if province: + process.update({"province": { + "province_check_request_key": province[0].key, + "province_operator_name": province[0].province_operator_system.user.fullname, + "province_operator_mobile": province[0].province_operator_system.user.mobile, + "province_operator_provinc": province[0].province_operator_system.address.province.name, + "province_operator_city": province[0].province_operator_system.address.city.name, + "province_operator_address": province[0].province_operator_system.address.address, + "province_operator_national_id": province[0].province_operator_system.user.national_id, + "province_state": province[0].state, + "chicken_price": province[0].fee, + "province_message": province[0].message, + "accepted_rejected_date": province[0].create_date, + }}) + if not province: + process.update({"province": None}) + role = Group.objects.get(name='ProvinceOperator') + province_operator = ProvinceOperator.objects.get(address__province__name=instance.poultry.address.province.name, + user__role=role, trash=False) + process.update({"province_operator": { + "province_operator_name": province_operator.user.fullname, + "province_operator_mobile": province_operator.user.mobile, + "province_operator_provinc": province_operator.address.province.name, + "province_operator_city": province_operator.address.city.name, + "province_operator_address": province_operator.address.address, + "province_operator_national_id": province_operator.user.national_id, + }}) + + if ProvinceFactorToKillHouseForPoultry.objects.filter(province_check_req=province.last()).exists(): + poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_req=province.last()).last() + if poultry_factor.bank != None: + name_of_bank_user_poultry = poultry_factor.bank.name_of_bank_user + bank_name_poultry = poultry_factor.bank.bank_name + card_poultry = poultry_factor.bank.card + shaba_poultry = poultry_factor.bank.shaba + account_poultry = poultry_factor.bank.account + else: + name_of_bank_user_poultry = None + bank_name_poultry = None + card_poultry = None + shaba_poultry = None + account_poultry = None + process.update({"poultry_factor": { + "poultry_factor_key": poultry_factor.key, + "province_factor_fee": poultry_factor.factor_fee, + "province_operator": poultry_factor.province_check_req.province_operator_system.user.fullname, + "province_mobile": poultry_factor.province_check_req.province_operator_system.user.mobile, + "weight": poultry_factor.total_weight, + "cost": poultry_factor.total_price, + "poultry_share_with_profit": poultry_factor.shares, + "total_amount_char": words(poultry_factor.total_price) + " " + "ریال", + "name_of_bank_user": name_of_bank_user_poultry, + "bank_name": bank_name_poultry, + "card": card_poultry, + "shaba": shaba_poultry, + "account": account_poultry, + }}) + else: + process.update({"poultry_factor": None}) + + if ProvinceFactorToKillHouse.objects.filter(province_check_req=province.last()).exists(): + province_factor = ProvinceFactorToKillHouse.objects.filter(province_check_req=province.last()).last() + if province_factor.bank != None: + name_of_bank_user_province_factor = province_factor.bank.name_of_bank_user + bank_name_province_factor = province_factor.bank.bank_name + card_province_factor = province_factor.bank.card + shaba_province_factor = province_factor.bank.shaba + account_province_factor = province_factor.bank.account + else: + name_of_bank_user_province_factor = None + bank_name_province_factor = None + card_province_factor = None + shaba_province_factor = None + account_province_factor = None + + process.update({"province_factor": { + "province_factor_key": province_factor.key, + "province_factor_fee": province_factor.factor_fee, + "province_operator": province_factor.province_check_req.province_operator_system.user.fullname, + "province_mobile": province_factor.province_check_req.province_operator_system.user.mobile, + "weight": province_factor.total_weight, + "cost": province_factor.total_price, + "union_share_with_profit": province_factor.shares, + "total_amount_char": words(province_factor.total_price) + " " + "ریال", + "name_of_bank_user": name_of_bank_user_province_factor, + "bank_name": bank_name_province_factor, + "card": card_province_factor, + "shaba": shaba_province_factor, + "account": account_province_factor, + }}) + else: + process.update({"province_factor": None}) + + if ProvinceImportKillHouseOutFactors.objects.filter(province_check=province.last()).exists(): + payment_out_factors = ProvinceImportKillHouseOutFactors.objects.filter(province_check=province.last()) + interal_factor_list = [] + for payment_out_factor in payment_out_factors: + internal_dict = { + "key": payment_out_factor.key, + "amount": payment_out_factor.amount, + "image": payment_out_factor.image, + } + interal_factor_list.append(internal_dict) + process.update({"out_factors": interal_factor_list}) + else: + process.update({"out_factors": None}) + + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=instance, trash=False) + + if province_kill_reqs.count() > 0: + state_list = [] + for province_kill_req in province_kill_reqs: + state_list.append(province_kill_req.payment_type) + l1 = set(state_list) + if len(l1) > 1: + process.update({"file_payment_type": "cash_credit"}) + else: + process.update({"file_payment_type": state_list[0]}) + + province_kill_reqs_list = [] + for province_kill_req in province_kill_reqs: + internal_province_kill_dict_infos = { + "province_kill_req_key": province_kill_req.key, + "payment_type": province_kill_req.payment_type, + "payment_dead_line": province_kill_req.payment_dead_line, + "kill_req_key": province_kill_req.kill_request.key, + "province_kill_req_state": province_kill_req.state, + "kill_house_name": province_kill_req.kill_request.kill_house.name, + "kill_house_user_name": province_kill_req.kill_request.kill_house.kill_house_operator.user.fullname, + "kill_house_user_city": province_kill_req.kill_request.kill_house.kill_house_operator.user.city.name, + "kill_house_mobile": province_kill_req.kill_request.kill_house.kill_house_operator.user.mobile, + "kill_house_user_province": province_kill_req.kill_request.kill_house.kill_house_operator.user.province.name, + "kill_house_user_national_id": province_kill_req.kill_request.kill_house.kill_house_operator.user.national_id, + "quantity": province_kill_req.quantity, + "time": province_kill_req.kill_request.recive_time, + "date": province_kill_req.kill_request.recive_date, + "automatic_state": province_kill_req.automatic, + "fee": province_kill_req.fee, + "province_kill_req_message": province_kill_req.message + } + + kill_house_requests = KillHouseRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=instance, + province_kill_request=province_kill_req, trash=False) + if kill_house_requests.count() > 0: + reqs = [] + for kill_house_request in kill_house_requests: + province_req = kill_house_request.province_request + internal_dict_infos = { + "kill_house_req_key": kill_house_request.key, + "payment_type": province_kill_req.payment_type, + "payment_dead_line": province_kill_req.payment_dead_line, + "province_fee": province_kill_req.fee, + "kill_house_vet_state": kill_house_request.vet_state, + "kill_req_key": kill_house_request.kill_request.key, + "barcod": kill_house_request.bar_code, + "kill_house_state": kill_house_request.state, + "kill_house_name": kill_house_request.kill_request.kill_house.name, + "kill_house_user_name": kill_house_request.kill_request.kill_house.kill_house_operator.user.fullname, + "kill_house_user_province": kill_house_request.kill_request.kill_house.kill_house_operator.user.province.name, + "kill_house_user_city": kill_house_request.kill_request.kill_house.kill_house_operator.user.city.name, + "kill_house_user_address": kill_house_request.kill_request.kill_house.system_address.address, + "kill_house_mobile": kill_house_request.kill_request.kill_house.kill_house_operator.user.mobile, + "kill_house_national_id": kill_house_request.kill_request.kill_house.kill_house_operator.user.national_id, + "quantity": kill_house_request.quantity, + "fee": kill_house_request.province_kill_request.fee, + "time": kill_house_request.kill_request.recive_time, + "date": kill_house_request.kill_request.recive_date, + "cars": kill_house_request.car, + "driver_name": kill_house_request.add_car.driver.driver_name, + "capocity": kill_house_request.add_car.driver.capocity, + "type_car": kill_house_request.add_car.driver.type_car, + "pelak": kill_house_request.add_car.driver.pelak, + "clearance_code": kill_house_request.clearance_code, + "traffic_code": kill_house_request.traffic_code, + "show_kill_house": kill_house_request.show_kill_house, + "kill_house_message": kill_house_request.kill_house_message + } + + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request, trash=False) + if vet_check: + internal_dict_infos.update({ + "vet_check_info": { + "vet_user": vet_check[0].kill_house_vet.vet.user.fullname, + "vet_user_mobile": vet_check[0].kill_house_vet.vet.user.mobile, + "vet_check_state": vet_check[0].state, + "vet_check_accept_date": vet_check[0].create_date, + } + }) + if not vet_check: + internal_dict_infos.update({ + "vet_check_info": None + }) + kill_house_assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_check__province_kill_request__province_request=province_req, + kill_house_request=kill_house_request, trash=False) + if kill_house_assignment: + internal_dict_infos.update({ + "bar_info": { + "kill_house_assignment_key": kill_house_assignment[0].key, + "real_quantity": kill_house_assignment[0].real_quantity, + "kill_house_weight_without_load": kill_house_assignment[0].car_weight_without_load, + "kill_house_weight_with_load": kill_house_assignment[0].car_weight_with_load, + "kill_house_image_without_load": kill_house_assignment[ + 0].car_weight_without_load_image, + "kill_house_image_with_load": kill_house_assignment[0].car_weight_with_load_image, + "kill_house_net_weight": kill_house_assignment[0].net_weight, + "expire_time": kill_house_assignment[0].protest_time, + "kill_house_assignment_state": kill_house_assignment[0].state, + "kill_house_assignment_message": kill_house_assignment[0].message, + "accept_reject_date": kill_house_assignment[0].modify_date, + "unusual_casualties": kill_house_assignment[0].unusual_casualties, + + } + }) + complaint = KillHouseComplaint.objects.filter(bar=kill_house_assignment[0], trash=False) + percentage_losses = PercentageOfLosses.objects.all() + if percentage_losses.count() > 0: + percentage_losses = percentage_losses.last().percent + else: + percentage_losses = None + + if complaint.count() > 0: + complaint = complaint.last() + check_complaint = CheckUnusualCasualties.objects.filter(complaint=complaint) + if check_complaint.count() > 0: + reviewer = check_complaint.last().role + else: + reviewer = None + internal_dict_infos.update({ + "complaint": { + "complaint_key": complaint.key, + "create_date": complaint.create_date, + "title": complaint.title, + "description": complaint.description, + "percent": complaint.percent, + "image": complaint.image, + "state": complaint.state, + "message": complaint.message, + "registrar": complaint.registrar, + "reviewer": reviewer, + "real_weight": kill_house_assignment[0].net_weight, + "losses_weight": kill_house_assignment[0].weight_withs_losses, + "percentage_losses": percentage_losses, + } + }) + else: + internal_dict_infos.update({ + "complaint": None + }) + if not kill_house_assignment: + internal_dict_infos.update({ + "bar_info": None + }) + internal_dict_infos.update({ + "complaint": None + }) + + poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if poultry_factor.count() > 0: + poultry_factor = poultry_factor.last() + if poultry_factor.bank != None: + name_of_bank_user = poultry_factor.bank.name_of_bank_user + bank_name = poultry_factor.bank.bank_name + card = poultry_factor.bank.card, + shaba = poultry_factor.bank.shaba, + account = poultry_factor.bank.account, + else: + name_of_bank_user = None + bank_name = None + card = None + shaba = None + account = None + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + total = share_allocation.total + else: + total = 0 + internal_dict_infos.update({ + "province_factor_to_kill_house_for_poultry": { + "province_factor_key": poultry_factor.key, + "province_factor_fee": poultry_factor.factor_fee, + "province_operator": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.fullname, + "province_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.mobile, + "weight": poultry_factor.total_weight, + "bar_code": poultry_factor.factor_bar_code, + "kill_house_name": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, + "kill_house_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, + "cost": poultry_factor.total_price, + "poultry_share_with_profit": poultry_factor.shares[ + 'poultryShareWithProfit'], + "total_amount_char": words(poultry_factor.total_price) + " " + "ریال", + "total_share_allocation": poultry_factor.total_weight * total, + "total_share_allocation_char": words( + poultry_factor.total_weight * total) + " " + "ریال", + "name_of_bank_user": name_of_bank_user, + "bank_name": bank_name, + "card": card, + "shaba": shaba, + "account": account, + } + }) + if not poultry_factor: + internal_dict_infos.update({ + "province_factor_to_kill_house_for_poultry": None + }) + province_factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if province_factor: + if province_factor[0].bank != None: + name_of_bank_user = province_factor[0].bank.name_of_bank_user + bank_name = province_factor[0].bank.bank_name + card = province_factor[0].bank.card, + shaba = province_factor[0].bank.shaba, + account = province_factor[0].bank.account, + else: + name_of_bank_user = None + bank_name = None + card = None + shaba = None + account = None + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + total = share_allocation.total + else: + total = 0 + if province_factor[0].poultry_factor == None: + poultry_share_with_profit = province_factor[0].shares['poultryShareWithProfit'] + else: + poultry_share_with_profit = province_factor[0].poultry_factor.total_price + + internal_dict_infos.update({ + "province_factor_to_kill_house": { + "province_factor_key": province_factor[0].key, + "province_factor_fee": province_factor[0].factor_fee, + "province_operator": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.fullname, + "province_mobile": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.mobile, + "weight": province_factor[0].total_weight, + "bar_code": province_factor[0].factor_bar_code, + "kill_house_name": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, + "kill_house_mobile": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, + "cost": province_factor[0].total_price, + "poultry_share_with_profit": poultry_share_with_profit, + "union_share_with_profit": province_factor[0].shares['unionShareWithProfit'], + "total_amount_char": words(province_factor[0].total_price) + " " + "ریال", + "total_share_allocation": province_factor[0].total_weight * total, + "total_share_allocation_char": words( + province_factor[0].total_weight * total) + " " + "ریال", + "name_of_bank_user": name_of_bank_user, + "bank_name": bank_name, + "card": card, + "shaba": shaba, + "account": account, + } + }) + if not province_factor: + internal_dict_infos.update({ + "province_factor_to_kill_house": None + }) + kill_house_factor_poultry = KillHouseFactorToPoultry.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if kill_house_factor_poultry.count(): + kill_house_factor_poultry = kill_house_factor_poultry.last() + internal_dict_infos.update({ + "kill_house_factor_to_poultry": { + "kill_house_name": kill_house_request.killhouse_user.name, + "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, + "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, + "time": kill_house_factor_poultry.create_date, + "payment_code": kill_house_factor_poultry.payment_code, + "factor_image": kill_house_factor_poultry.factor_image, + "factor_key": kill_house_factor_poultry.key, + "factor_state": kill_house_factor_poultry.state, + "total_money": kill_house_factor_poultry.province_factor.total_price, + "factor_message": kill_house_factor_poultry.message + } + }) + if not kill_house_factor_poultry: + internal_dict_infos.update({ + "kill_house_factor_to_poultry": None + }) + kill_house_factor = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if kill_house_factor: + internal_dict_infos.update({ + "kill_house_factor_to_province": { + "kill_house_name": kill_house_request.killhouse_user.name, + "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, + "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, + "time": kill_house_factor[0].create_date, + "payment_code": kill_house_factor[0].payment_code, + "factor_image": kill_house_factor[0].factor_image, + "factor_key": kill_house_factor[0].key, + "factor_state": kill_house_factor[0].state, + "total_money": kill_house_factor[0].province_factor.total_price, + "factor_message": kill_house_factor[0].message + } + }) + if not kill_house_factor: + internal_dict_infos.update({ + "kill_house_factor_to_province": None + }) + + reqs.append(internal_dict_infos) + internal_province_kill_dict_infos.update({"kill_house_requests": reqs + + }) + if not kill_house_requests: + internal_province_kill_dict_infos.update({"kill_house_requests": None + + }) + + province_kill_reqs_list.append(internal_province_kill_dict_infos) + process.update({"province_kill_requests": province_kill_reqs_list}) + + if not province_kill_reqs: + process.update({"province_kill_requests": None + + }) + + kill_house_reqs = KillHouseRequest.objects.filter( + kill_house_request_auction_winner__kill_house_request_auction__poultry_request=instance, trash=False) + if kill_house_reqs.count() > 0: + + reqs = [] + for kill_house_request in kill_house_reqs: + province_req = kill_house_request.province_request + internal_dict_infos = { + "kill_house_req_key": kill_house_request.key, + "kill_house_vet_state": kill_house_request.vet_state, + "order_code": instance.order_code, + "barcod": kill_house_request.bar_code, + "kill_house_state": kill_house_request.state, + "kill_house_name": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_user_name": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.fullname, + "kill_house_user_province": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.province.name, + "kill_house_user_city": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.city.name, + "kill_house_user_address": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.system_address.address, + "kill_house_mobile": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "kill_house_national_id": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.national_id, + "quantity": kill_house_request.quantity, + # "time": kill_house_request.kill_request.recive_time, + # "date": kill_house_request.kill_request.recive_date, + "cars": kill_house_request.car, + "driver_name": kill_house_request.add_car.driver.driver_name, + "type_car": kill_house_request.add_car.driver.type_car, + "pelak": kill_house_request.add_car.driver.pelak, + "clearance_code": kill_house_request.clearance_code, + "traffic_code": kill_house_request.traffic_code, + "show_kill_house": kill_house_request.show_kill_house, + "kill_house_message": kill_house_request.kill_house_message + } + + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request, trash=False) + if vet_check: + internal_dict_infos.update({ + "vet_check_info": { + "vet_user": vet_check[0].kill_house_vet.vet.user.fullname, + "vet_user_mobile": vet_check[0].kill_house_vet.vet.user.mobile, + "vet_check_state": vet_check[0].state, + "vet_check_accept_date": vet_check[0].create_date, + } + }) + if not vet_check: + internal_dict_infos.update({ + "vet_check_info": None + }) + kill_house_assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_request, trash=False) + if kill_house_assignment: + internal_dict_infos.update({ + "bar_info": { + "kill_house_assignment_key": kill_house_assignment[0].key, + "real_quantity": kill_house_assignment[0].real_quantity, + "kill_house_weight_without_load": kill_house_assignment[0].car_weight_without_load, + "kill_house_weight_with_load": kill_house_assignment[0].car_weight_with_load, + "kill_house_image_without_load": kill_house_assignment[ + 0].car_weight_without_load_image, + "kill_house_image_with_load": kill_house_assignment[0].car_weight_with_load_image, + "kill_house_net_weight": kill_house_assignment[0].net_weight, + "expire_time": kill_house_assignment[0].protest_time, + "kill_house_assignment_state": kill_house_assignment[0].state, + "kill_house_assignment_message": kill_house_assignment[0].message, + "accept_reject_date": kill_house_assignment[0].modify_date + + } + }) + complaint = KillHouseComplaint.objects.filter(bar=kill_house_assignment[0], trash=False) + if complaint.count() > 0: + complaint = complaint.last() + internal_dict_infos.update({ + "complaint": { + "complaint_key": complaint.key, + "title": complaint.title, + "description": complaint.description, + "percent": complaint.percent, + "image": complaint.image, + "state": complaint.state, + "message": complaint.message, + } + }) + else: + internal_dict_infos.update({ + "complaint": None + }) + if not kill_house_assignment: + internal_dict_infos.update({ + "bar_info": None + }) + internal_dict_infos.update({ + "complaint": None + }) + poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=instance, + province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) + if poultry_factor.count() > 0: + poultry_factor = poultry_factor.last() + if poultry_factor.bank != None: + name_of_bank_user = poultry_factor.bank.name_of_bank_user + bank_name = poultry_factor.bank.bank_name + card = poultry_factor.bank.card, + shaba = poultry_factor.bank.shaba, + account = poultry_factor.bank.account, + else: + name_of_bank_user = None + bank_name = None + card = None + shaba = None + account = None + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + total = share_allocation.total + else: + total = 0 + internal_dict_infos.update({ + "province_factor_to_kill_house_for_poultry": { + "province_factor_key": poultry_factor.key, + "province_factor_fee": poultry_factor.factor_fee, + "province_operator": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.fullname, + "province_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.mobile, + "weight": poultry_factor.total_weight, + "bar_code": poultry_factor.factor_bar_code, + "kill_house_name": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, + "kill_house_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, + "cost": poultry_factor.total_price, + "poultry_share_with_profit": poultry_factor.shares[ + 'poultryShareWithProfit'], + "total_amount_char": words(poultry_factor.total_price) + " " + "ریال", + "total_share_allocation": poultry_factor.total_weight * total, + "total_share_allocation_char": words( + poultry_factor.total_weight * total) + " " + "ریال", + "name_of_bank_user": name_of_bank_user, + "bank_name": bank_name, + "card": card, + "shaba": shaba, + "account": account, + } + }) + if not poultry_factor: + internal_dict_infos.update({ + "province_factor_to_kill_house_for_poultry": None + }) + province_factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=instance, + province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) + if province_factor: + if province_factor[0].bank != None: + name_of_bank_user = province_factor[0].bank.name_of_bank_user + bank_name = province_factor[0].bank.bank_name + card = province_factor[0].bank.card, + shaba = province_factor[0].bank.shaba, + account = province_factor[0].bank.account, + else: + name_of_bank_user = None + bank_name = None + card = None + shaba = None + account = None + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + total = share_allocation.total + else: + total = 0 + # if poultry_factor == None: + if province_factor[0].poultry_factor == None: + poultry_share_with_profit = province_factor[0].shares['poultryShareWithProfit'] + else: + poultry_share_with_profit = province_factor[0].poultry_factor.total_price + province_operator = province_factor[0].province_check_info.province_operator + internal_dict_infos.update({ + "province_factor_to_kill_house": { + "province_factor_key": province_factor[0].key, + "province_factor_fee": province_factor[0].factor_fee, + "province_operator": province_operator.user.fullname, + "province_mobile": province_operator.user.mobile, + "weight": province_factor[0].total_weight, + "bar_code": province_factor[0].factor_bar_code, + "kill_house_name": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_mobile": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "cost": province_factor[0].total_price, + "poultry_share_with_profit": poultry_share_with_profit, + "union_share_with_profit": province_factor[0].shares['unionShareWithProfit'], + "total_amount_char": words(province_factor[0].total_price) + " " + "ریال", + "total_share_allocation": province_factor[0].total_weight * total, + "total_share_allocation_char": words( + province_factor[0].total_weight * total) + " " + "ریال", + "name_of_bank_user": name_of_bank_user, + "bank_name": bank_name, + "card": card, + "shaba": shaba, + "account": account, + } + }) + if not province_factor: + internal_dict_infos.update({ + "province_factor_to_kill_house": None + }) + + kill_house_factor_poultry = KillHouseFactorToPoultry.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=instance, + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if kill_house_factor_poultry.count(): + kill_house_factor_poultry = kill_house_factor_poultry.last() + internal_dict_infos.update({ + "kill_house_factor_to_poultry": { + "kill_house_name": kill_house_request.killhouse_user.name, + "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, + "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, + "time": kill_house_factor_poultry.create_date, + "payment_code": kill_house_factor_poultry.payment_code, + "factor_image": kill_house_factor_poultry.factor_image, + "factor_key": kill_house_factor_poultry.key, + "factor_state": kill_house_factor_poultry.state, + "total_money": kill_house_factor_poultry.province_factor.total_price, + "factor_message": kill_house_factor_poultry.message + } + }) + if not kill_house_factor_poultry: + internal_dict_infos.update({ + "kill_house_factor_to_poultry": None + }) + kill_house_factor = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=instance, + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if kill_house_factor: + internal_dict_infos.update({ + "kill_house_factor_to_province": { + "kill_house_name": kill_house_request.killhouse_user.name, + "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, + "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, + "time": kill_house_factor[0].create_date, + "payment_code": kill_house_factor[0].payment_code, + "factor_image": kill_house_factor[0].factor_image, + "factor_key": kill_house_factor[0].key, + "factor_state": kill_house_factor[0].state, + "total_money": kill_house_factor[0].province_factor.total_price, + "factor_message": kill_house_factor[0].message + } + }) + if not kill_house_factor: + internal_dict_infos.update({ + "kill_house_factor_to_province": None + }) + + reqs.append(internal_dict_infos) + process.update({"auction": reqs}) + + if not kill_house_reqs: + process.update({"auction": None}) + + allocation = DepositAllocation.objects.filter(poultry=instance, trash=False) + if instance.poultry.user_bank_info != None: + poultry_bank_info = instance.poultry.user_bank_info.name_of_bank_user + poultry_bank_name = instance.poultry.user_bank_info.bank_name + poultry_card_number = instance.poultry.user_bank_info.card + poultry_shaba = instance.poultry.user_bank_info.shaba + else: + poultry_bank_info = None + poultry_bank_name = None + poultry_card_number = None + poultry_shaba = None + + if city_operator.user_bank_info != None: + city_bank_info = city_operator.user_bank_info.name_of_bank_user + city_bank_name = city_operator.user_bank_info.bank_name + city_card_number = city_operator.user_bank_info.card + city_shaba = city_operator.user_bank_info.shaba + else: + city_bank_info = None + city_bank_name = None + city_card_number = None + city_shaba = None + financial_operator = SystemUserProfile.objects.filter(role__name='ProvinceFinancial', + province__name=instance.poultry.address.province.name) + if financial_operator.count() > 0: + operator = ProvinceOperator.objects.get(user=financial_operator.last()) + if operator.user_bank_info != None: + province_bank_info = operator.user_bank_info.name_of_bank_user + province_bank_name = operator.user_bank_info.bank_name + province_card_number = operator.user_bank_info.card + province_shaba = operator.user_bank_info.shaba + else: + province_bank_info = None + province_bank_name = None + province_card_number = None + province_shaba = None + + if allocation.count() > 0: + fee = 0 + process.update({"allocation": {"allocation_key": allocation[0].key, + "fee": fee, + "total_money": allocation[0].poultry_share + allocation[ + 0].city_share + allocation[0].province_share + allocation[ + 0].company_share + allocation[ + 0].central_union_share + allocation[ + 0].fanava_share, + "total_money_char": words( + allocation[0].poultry_share + allocation[ + 0].city_share + allocation[0].province_share + + allocation[ + 0].company_share + allocation[ + 0].central_union_share + allocation[ + 0].fanava_share) + " " + 'ریال', + "poultry_share_digit": allocation[0].poultry_share, + "poultry_share_char": words( + allocation[0].poultry_share) + " " + 'ریال', + "poultry_share_payment": allocation[0].poultry_share_payment, + "poultry_remaining": (allocation[0].poultry_share - allocation[ + 0].poultry_share_payment), + "poultry_payment_documents": allocation[0].poultry_share_payment_info, + "poultry_bank_info": poultry_bank_info, + "poultry_bank_name": poultry_bank_name, + "poultry_card_number": poultry_card_number, + "poultry_shaba": poultry_shaba, + "poultry_image": allocation[0].poultry_image, + "city_share_digit": allocation[0].city_share, + "city_share_char": words( + allocation[0].city_share) + " " + 'ریال', + "city_image": allocation[0].city_image, + "city_bank_info": city_bank_info, + "city_bank_name": city_bank_name, + "city_card_number": city_card_number, + "city_shaba": city_shaba, + "city_share_payment": allocation[0].city_share_payment, + "city_share_remaining": ( + allocation[0].city_share - allocation[0].city_share_payment), + "city_payment_documents": allocation[0].city_share_payment_info, + "province_share_digit": allocation[0].province_share, + "province_share_char": words( + allocation[0].province_share) + " " + 'ریال', + "province_share_payment": allocation[0].province_share_payment, + "province_share_remaining": (allocation[0].province_share - allocation[ + 0].province_share_payment), + "province_payment_documents": allocation[0].province_share_payment_info, + "province_bank_info": province_bank_info, + "province_bank_name": province_bank_name, + "province_card_number": province_card_number, + "province_shaba": province_shaba, + "company_share_digit": allocation[0].company_share, + "company_share_char": words( + allocation[0].company_share) + " " + 'ریال', + "company_share_payment": allocation[0].company_share_payment, + "company_share_remaining": (allocation[0].company_share - allocation[ + 0].company_share_payment), + "company_payment_documents": allocation[0].company_share_payment_info, + "company_bank_info": '************', + "company_bank_name": '************', + "company_card_number": '**************', + "company_shaba": '************', + "central_union_share_digit": allocation[0].central_union_share, + "central_union_share_char": words( + allocation[0].central_union_share) + " " + 'ریال', + "central_union_share_payment": allocation[0].central_union_share_payment, + "central_union_share_remaining": ( + allocation[0].central_union_share - allocation[ + 0].central_union_share_payment), + "central_union_payment_documents": allocation[ + 0].central_union_share_payment_info, + "central_union_bank_info": '************', + "central_union_bank_name": '************', + "central_union_card_number": '**************', + "central_union_shaba": '************', + "fanava_share_digit": allocation[0].fanava_share, + "fanava_share_share_char": words( + allocation[0].fanava_share) + " " + 'ریال', + "fanava_share_payment": allocation[0].fanava_share_payment, + "fanava_share_remaining": ( + allocation[0].fanava_share - allocation[0].fanava_share_payment), + "fanava_payment_documents": allocation[0].fanava_share_payment_info, + "fanava_bank_info": '************', + "fanava_bank_name": '************', + "fanava_card_number": '**************', + "fanava_shaba": '************', + + }}) + + if not allocation: + process.update({"allocation": None}) + + province_incpector = PovinceInspector.objects.filter(poultry_request=instance, trash=False) + if province_incpector: + process.update( + {"province_incpector": {"inspector_name": province_incpector[0].inspector_operator.user.fullname, + "state": province_incpector[0].state, + "message": province_incpector[0].message, + "accept-reject-date": province_incpector[0].create_date, }}) + if not province_incpector: + province_name = instance.poultry.address.province.name + inspector = InspectorOperator.objects.get(address__province__name=province_name, trash=False) + process.update({"province_incpector": {"province_incpector": None, + "state": 'pending', + "inspector_name": inspector.user.fullname, + "inspector_mobile": inspector.user.mobile, + "inspector_address": inspector.address.province.name}}) + + return process + + +# سریالایزر مربوط به درخواست مزایده مرغدار +class PoultryRequestAuctionSerializer(serializers.ModelSerializer): + poultry_request = PoultryRequestSerializer(read_only=True) + + class Meta: + model = PoultryRequestAuction + fields = '__all__' + + +# سریالایزر مربوط به ورود اطلاعات بار برای بارهای اختصاص یافته به درخواست مرغدار + +class PoultryAssignmentInformationSerializer(serializers.ModelSerializer): + class Meta: + model = PoultryAssignmentInformation + fields = '__all__' + + +class LastUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = LastUpdate + fields = '__all__' + + +class PoultryHatchingForLocSerializer(serializers.ModelSerializer): + class Meta: + model = PoultryHatching + fields = ('left_over', 'chicken_age', 'date', + 'licence_number','killed_quantity','total_losses','quantity') + + +class PoultryLocationSerializer(serializers.ModelSerializer): + user = SystemUserProfileForPoultryLocSerializer(read_only=True) + address = SystemAddressForLocSerializer(required=False) + hatching = serializers.SerializerMethodField() + + class Meta: + model = Poultry + fields = [ + 'id', 'unit_name', 'Lat', 'Long', 'user', 'hatching', 'address', 'breeding_unique_id' + ] + + def get_hatching(self, instance): + serilizer = PoultryHatchingForLocSerializer(instance.poultry_hatching_user, many=True).data + return serilizer + + +class SystemUserProfileForAutoAllocationSerializerForGetAllPoultry(serializers.ModelSerializer): + class Meta: + model = SystemUserProfile + fields = ['fullname', 'mobile'] + + +class SystemAddressSerializerForGetAllPoultry(serializers.ModelSerializer): + city = CityForLocSerializer(required=False) + + class Meta: + model = SystemAddress + fields = ['city'] + + +class GetAllPoultrySerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializerForGetAllPoultry(read_only=True) + address = SystemAddressSerializerForGetAllPoultry(required=False) + last_hatching_remain_quantity = serializers.SerializerMethodField() + province_allow_sell_free = serializers.SerializerMethodField() + chain_company = serializers.SerializerMethodField() + + class Meta: + model = Poultry + fields = ['user', 'key', 'unit_name', 'address', 'last_hatching_remain_quantity', 'province_allow_sell_free', + 'chain_company'] + + def get_last_hatching_remain_quantity(self, obj): + poultry_data = self.context.get('poultry_remain_dict', {}).get(obj.id, {}) + return poultry_data.get('last_hatching_remain_quantity', 0) + + def get_province_allow_sell_free(self, obj): + poultry_data = self.context.get('poultry_remain_dict', {}).get(obj.id, {}) + return poultry_data.get('allow_sell_free') + + def get_chain_company(self, obj): + poultry_data = self.context.get('poultry_remain_dict', {}).get(obj.id, {}) + return poultry_data.get('chain_company') + + +class PoultryPredictionSerializer(serializers.ModelSerializer): + poultry = PoultryForPredictionSerializer(required=False) + + class Meta: + model = PoultryPrediction + fields = ['key', 'poultry', 'date', 'killing_ave_age', 'active_left_over', 'killing_ave_count', + 'killing_ave_weight', + 'killing_loss_weight_percent'] + + +class HatchingIncreaseRequestSerializer(serializers.ModelSerializer): + hatching = PoultryHatchingForChainAllocationSerializer(read_only=True) + + class Meta: + model = HatchingIncreaseRequest + fields = "__all__" + + +class EvacuationHatchingDetailSerializer(serializers.ModelSerializer): + hatching = PoultryHatchingSerializer(read_only=True) + + class Meta: + model = EvacuationHatchingDetail + fields = '__all__' + + +class ChickenCommissionPricesSerializer(serializers.ModelSerializer): + price_info = serializers.SerializerMethodField() + + class Meta: + model = ChickenCommissionPrices + fields = "__all__" + + def get_price_info(self, obj): + kill_house_price = round( + ((obj.chicken_average_price + obj.kill_house_price) / 750) * 1000) if obj.chicken_average_price else 0 + return { + "killHousePrice": kill_house_price, + "wholesalePrice": kill_house_price + obj.wholesaler_price if obj.chicken_average_price else 0, + "retailPrice": kill_house_price + obj.retailer_price if obj.chicken_average_price else 0, + } + + +class ChickenCommissionPricesForDashboardSerializer(serializers.ModelSerializer): + price_info = serializers.SerializerMethodField() + + class Meta: + model = ChickenCommissionPrices + fields = ['chicken_average_price', 'price_info', 'date'] + + def get_price_info(self, obj): + kill_house_price = round( + ((obj.chicken_average_price + obj.kill_house_price) / 750) * 1000) if obj.chicken_average_price else 0 + return { + "killHousePrice": kill_house_price, + "wholesalePrice": kill_house_price + obj.wholesaler_price if obj.chicken_average_price else 0, + "retailPrice": kill_house_price + obj.retailer_price if obj.chicken_average_price else 0, + } + + +class PoultryRequestQuarantineCodeSerializer(serializers.ModelSerializer): + class Meta: + model = PoultryRequestQuarantineCode + fields = ['key', 'quarantine_code', 'traffic_code', 'quarantine_quantity', 'registrar', 'register_date', + 'system_quarantine_quantity'] + + +class PoultryForDetailsSerializer(serializers.ModelSerializer): + user = SystemUserProfileForPoultryLocSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + class Meta: + model = Poultry + fields = [ + 'unit_name', 'user', 'address', 'breeding_unique_id' + ] + + +class PoultryHatchingForDetailsSerializer(serializers.ModelSerializer): + killing_info = serializers.SerializerMethodField() + active_kill = serializers.SerializerMethodField() + vet_farm = serializers.SerializerMethodField() + killing_ave_age = serializers.SerializerMethodField() + poultry = PoultryForDetailsSerializer(read_only=True) + + class Meta: + model = PoultryHatching + fields = ('violation', 'licence_number', 'breeding_unique_id', 'CertId', 'poultry', 'InteractTypeName', + 'UnionTypeName', 'hall', 'period', 'create_date', 'date', 'predicate_date', 'chicken_breed', + 'chicken_age', + 'quantity', 'PersonTypeName', 'increase_quantity', 'losses', 'direct_losses', 'total_losses', + 'total_commitment_quantity', 'total_free_commitment_quantity', 'governmental_quantity', + 'free_quantity', 'free_killed_quantity', 'out_province_killed_quantity', 'out_province_killed_weight', + 'killing_info', 'killed_quantity', 'left_over', 'samasat_discharge_percentage', 'total_commitment', + 'total_average_killed_weight', 'total_killed_weight', 'active_kill', 'export_killed_quantity', + 'export_killed_weight', 'vet_farm', 'latest_hatching_change', 'violation', 'killing_ave_age', + 'poultry','bar_difference_request_quantity','bar_difference_request_weight') + + def get_vet_farm(self, instance): + vet = { + "vet_farm_full_name": 'ندارد', + "vet_farm_mobile": '', + } + vet_farm = VetFarm.objects.filter(poultry=instance.poultry) + if vet_farm.count() > 0: + vet_farm = vet_farm.last() + vet = { + "vet_farm_full_name": vet_farm.vet.user.fullname, + "vet_farm_mobile": vet_farm.vet.user.mobile, + } + + return vet + + def get_killing_info(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0, + province_request__poultry_request__hatching=obj) + return_province_kill_requests = ProvinceKillRequest.objects.filter(trash=True, return_trash=True,return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0, + province_request__poultry_request__hatching=obj) + province_kill_requests_quantity = \ + province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight = \ + province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + + return_province_kill_requests_quantity = \ + return_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + return_province_kill_requests_weight = \ + return_province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=obj) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + return_kill_house_requests = KillHouseRequest.objects.filter(trash=True, return_trash=True,province_request__poultry_request__hatching=obj) + + return_kill_house_weight = return_kill_house_requests.aggregate( + total_quantity=Sum('accepted_real_weight')).get('total_quantity') or 0 + + return_kill_house_quantity = return_kill_house_requests.aggregate( + total_quantity=Sum('accepted_real_quantity')).get('total_quantity') or 0 + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + return { + "violation_message": 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' if obj.violation else 'عادی', + "province_kill_requests": len(province_kill_requests), + "province_kill_requests_quantity": province_kill_requests_quantity, + "province_kill_requests_weight": province_kill_requests_weight, + "kill_house_requests": len(kill_house_requests), + "kill_house_requests_first_quantity": first_quantity, + "kill_house_requests_first_weight": first_weight, + "bar_complete_with_kill_house": len(bar_complete_with_kill_house), + "accepted_real_quantity_final": accepted_real_quantity_final, + "accepted_real_wight_final": accepted_real_wight_final, + "ware_house_bars": len(ware_house_bars), + "ware_house_bars_quantity": ware_house_bars_quantity, + "ware_house_bars_weight": ware_house_bars_weight, + 'ware_house_bars_weight_lose': ware_house_bars_weight_lose / len( + ware_house_bars) if ware_house_bars else 0, + 'return_province_kill_requests_count': return_province_kill_requests.count(), + 'return_kill_house_requests_count': return_kill_house_requests.count(), + 'return_kill_house_weight': return_kill_house_weight, + 'return_kill_house_quantity': return_kill_house_quantity, + 'return_province_kill_requests_weight': return_province_kill_requests_weight, + 'return_province_kill_requests_quantity': return_province_kill_requests_quantity, + 'total_return_weight': return_province_kill_requests_weight + return_kill_house_weight, + 'total_return_quantity': return_province_kill_requests_quantity + return_kill_house_quantity, + 'total_sale_in_province_weight': int(province_kill_requests_weight + first_weight), + 'total_sale_in_province_quantity': province_kill_requests_quantity + first_quantity, + } + + def get_killing_ave_age(self, obj): + return obj.poultry.killing_ave_age + + def get_active_kill(self, instance): + + active_kill = False + count_of_request = 0 + + province_kill_request = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=instance, + state='accepted') + if province_kill_request.count() > 0: + count_of_request = province_kill_request.count() + + if ProvinceKillRequest.objects.filter(trash=False, province_request__poultry_request__hatching=instance, + state='pending').exists(): + active_kill = True + info = { + "active_kill": active_kill, + "count_of_request": count_of_request, + } + + return info + + +class PoultryRequestForHatchingDetailSerializer(serializers.ModelSerializer): + weight = serializers.SerializerMethodField() + + class Meta: + model = PoultryRequest + fields = ['order_code', 'send_date', 'buyer_fullname', 'buyer_mobile', 'buyer_province', 'buyer_city', + 'quarantine_code', 'quarantine_quantity', 'quantity', 'weight','killing_age'] + + def get_weight(self, obj): + return int(obj.quantity * obj.Index_weight) + + +class ChainAllocationForHatchingDetailSerializer(serializers.ModelSerializer): + chain_company = ChainCompanySerializer(read_only=True) + kill_house = KillHouseForChainAllocationSerializer(read_only=True) + + class Meta: + model = ChainAllocation + fields = '__all__' + + +class PoultryHatchingForBazrasiSerializer(serializers.ModelSerializer): + # poultry = PoultrySerializer(read_only=True) + chain_company = ChainCompanySerializer(read_only=True) + age = serializers.SerializerMethodField('get_age') + inspection_losses = serializers.SerializerMethodField('get_inspection') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + active_kill = serializers.SerializerMethodField('get_active_kill') + killing_info = serializers.SerializerMethodField('get_killing_info') + free_governmental_info = serializers.SerializerMethodField('get_free_governmental_info') + + class Meta: + model = PoultryHatching + fields = '__all__' + + # تابع برای بدست آوردن سن مرع + def get_age(self, instance): + return instance.chicken_age + + def get_inspection(self, instance): + inspection = VetFarmInspection.objects.filter(poultry_hatching=instance) + if inspection.count() > 0: + inspections = 0 + for ins in inspection: + if ins.Losses == 0: + pass + else: + inspections += int(ins.Losses) + return inspections + + def get_vet_farm(self, instance): + vet = { + "vet_farm_full_name": 'ندارد', + "vet_farm_mobile": '', + } + vet_farm = VetFarm.objects.filter(poultry=instance.poultry).select_related('vet').only( + 'vet__user__fullname', 'vet__user__mobile' + ) + if vet_farm.count() > 0: + vet_farm = vet_farm.last() + vet = { + "vet_farm_full_name": vet_farm.vet.user.fullname, + "vet_farm_mobile": vet_farm.vet.user.mobile, + } + + return vet + + def get_active_kill(self, instance): + active_kill = False + + count_of_request = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=instance, + state='accepted').count() + + if ProvinceKillRequest.objects.filter(trash=False, province_request__poultry_request__hatching=instance, + state='pending').exists(): + active_kill = True + info = { + "active_kill": active_kill, + "count_of_request": count_of_request, + } + + return info + + def get_killing_info(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0, + province_request__poultry_request__hatching=obj).only( + 'total_killed_quantity', + 'total_killed_weight' + ) + province_kill_requests_quantity = \ + province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight = \ + province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=obj) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + return { + "violation_message": 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' if obj.violation else 'عادی', + "province_kill_requests": len(province_kill_requests), + "province_kill_requests_quantity": province_kill_requests_quantity, + "province_kill_requests_weight": province_kill_requests_weight, + "kill_house_requests": len(kill_house_requests), + "kill_house_requests_first_quantity": first_quantity, + "kill_house_requests_first_weight": first_weight, + "bar_complete_with_kill_house": len(bar_complete_with_kill_house), + "accepted_real_quantity_final": accepted_real_quantity_final, + "accepted_real_wight_final": accepted_real_wight_final, + "ware_house_bars": len(ware_house_bars), + "ware_house_bars_quantity": ware_house_bars_quantity, + "ware_house_bars_weight": ware_house_bars_weight, + 'ware_house_bars_weight_lose': ware_house_bars_weight_lose / len( + ware_house_bars) if ware_house_bars else 0, + } + + def get_free_governmental_info(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=obj) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, final_state='archive', + hatching=obj) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = obj.left_over + + elif obj.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if obj.total_commitment_quantity == 0: + left_total_free_commitment_quantity = obj.left_over + else: + left_total_free_commitment_quantity = obj.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + obj.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + return { + "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + "total_commitment_quantity": obj.total_commitment_quantity, + "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + "total_free_commitment_quantity": obj.total_free_commitment_quantity, + "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + + } + + + + +class PoultryRequestForDirectBuyingSerializer(serializers.ModelSerializer): + poultry = PoultryForDirectBuyingSerializer(read_only=True) + age = serializers.SerializerMethodField() + total_allocated = serializers.SerializerMethodField() + + class Meta: + model = PoultryRequest + fields = [ + 'key', + 'poultry', + 'age', + 'total_allocated', + 'Index_weight', + 'quantity', + 'chicken_breed', + 'send_date', + 'remain_quantity', + 'amount' + ] + + def get_age(self, obj): + age = (obj.send_date.date() - obj.hatching.date.date()).days + 1 + hatching_key = obj.hatching.key + return { + 'age':age, + 'hatching_key':hatching_key + } + + def get_total_allocated(self, obj): + return obj.quantity - obj.remain_quantity + + +class ManagementHatchingAgeRangeSerializer(serializers.ModelSerializer): + class Meta: + model = ManagementHatchingAgeRange + fields = '__all__' + + +class GetAllPoultryForPoultryScienceSerializer(serializers.ModelSerializer): + user = SystemUserProfileForAutoAllocationSerializerForGetAllPoultry(read_only=True) + address = SystemAddressSerializerForGetAllPoultry(required=False) + + class Meta: + model = Poultry + fields = ['id', 'user', 'key', 'unit_name', 'address'] + + +class PoultryDetailForPoultryScienceSerializer(serializers.ModelSerializer): + user = SystemUserProfileForPoultryScienceWithoutRoleSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + hatching = serializers.SerializerMethodField('get_hatching') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + hatching_info = serializers.SerializerMethodField('get_hatching_info') + + + class Meta: + model = Poultry + exclude = ( + 'create_date', + 'modify_date', + 'password', + 'created_by', + 'modified_by', + ) + + def get_vet_farm(self, instance): + internal_dictionary = {} + vet_farm = VetFarm.objects.filter(poultry=instance, trash=False) + if vet_farm.count() > 0: + vet_farm = vet_farm.last() + + internal_dictionary = { + "full_name": vet_farm.vet.user.fullname, + "mobile": vet_farm.vet.user.mobile, + "city": vet_farm.vet.user.city.name, + "province": vet_farm.vet.user.province.name, + + } + + return internal_dictionary + + def get_hatching(self, instance): + hatching_list = [] + for hatching in PoultryHatching.objects.filter(poultry=instance, state='pending', + allow_hatching='pending', archive=False, + trash=False): + age = (datetime.now().date() - hatching.date.date()).days + 1 + internal_dictionary = { + "poultry_key": hatching.poultry.key, + "poultry_hatching_key": hatching.key, + "poultry": hatching.poultry.unit_name, + "quantity": hatching.quantity, + "losses": hatching.losses, + "left_over": hatching.left_over, + "out_province_killed_quantity": hatching.out_province_killed_quantity, + "export_killed_quantity": hatching.export_killed_quantity, + "hall": hatching.hall, + "date": hatching.date, + "period": hatching.period, + "state": hatching.state, + "age": age, + "licence_number": hatching.licence_number, + + } + hatching_list.append(internal_dictionary) + + return hatching_list + + def get_hatching_info(self, obj): + hatching = PoultryHatching.objects.filter(poultry__exact=obj, state='pending', archive=False, + trash=False).last() + period = 0 + active_hatching = False + if hatching: + period = hatching.period + if hatching.state == 'pending': + active_hatching = True + return {"period": period, "active_hatching": active_hatching} + + +class PoultryDetailForPoultryAndHatchingForPoultryScienceSerializer(serializers.ModelSerializer): + user = SystemUserProfileForPoultryScienceWithoutRoleSerializer(read_only=True) + address = SystemAddressSerializer(read_only=True) + + + class Meta: + model = Poultry + exclude = ( + 'create_date', + 'modify_date', + 'password', + 'created_by', + 'modified_by', + ) + + +class PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer(serializers.ModelSerializer): + poultry = PoultryDetailForPoultryAndHatchingForPoultryScienceSerializer(read_only=True) + chain_company = ChainCompanySerializer(read_only=True) + age = serializers.SerializerMethodField('get_age') + inspection_losses = serializers.SerializerMethodField('get_inspection') + vet_farm = serializers.SerializerMethodField('get_vet_farm') + active_kill = serializers.SerializerMethodField('get_active_kill') + killing_info = serializers.SerializerMethodField('get_killing_info') + free_governmental_info = serializers.SerializerMethodField('get_free_governmental_info') + report_info = serializers.SerializerMethodField('get_report_info') + + class Meta: + model = PoultryHatching + fields = '__all__' + + def get_report_info(self, instance): + poultry_science = PoultryScienceReport.objects.filter(trash=False, hatching=instance).only('image').first() + image= False + has_poultry_science = False + if poultry_science: + has_poultry_science = True + if poultry_science.image: + image = True + result={ + 'poultry_science': has_poultry_science, + 'image':image, + } + return result + # تابع برای بدست آوردن سن مرع + def get_age(self, instance): + return instance.chicken_age + + def get_inspection(self, instance): + inspection = VetFarmInspection.objects.filter(poultry_hatching=instance) + if inspection.count() > 0: + inspections = 0 + for ins in inspection: + if ins.Losses == 0: + pass + else: + inspections += int(ins.Losses) + return inspections + + def get_vet_farm(self, instance): + vet = { + "vet_farm_full_name": 'ندارد', + "vet_farm_mobile": '', + } + vet_farm = VetFarm.objects.filter(poultry=instance.poultry).select_related('vet').only( + 'vet__user__fullname', 'vet__user__mobile' + ) + if vet_farm.count() > 0: + vet_farm = vet_farm.last() + vet = { + "vet_farm_full_name": vet_farm.vet.user.fullname, + "vet_farm_mobile": vet_farm.vet.user.mobile, + } + + return vet + + def get_active_kill(self, instance): + active_kill = False + + count_of_request = ProvinceKillRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=instance, + state='accepted').count() + + if ProvinceKillRequest.objects.filter(trash=False, province_request__poultry_request__hatching=instance, + state='pending').exists(): + active_kill = True + info = { + "active_kill": active_kill, + "count_of_request": count_of_request, + } + + return info + + def get_killing_info(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + first_car_allocated_quantity=0, + province_request__poultry_request__hatching=obj).only( + 'total_killed_quantity', + 'total_killed_weight' + ) + province_kill_requests_quantity = \ + province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + province_kill_requests_weight = \ + province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching=obj) + first_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity') or 0 + first_weight = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + ware_house_bars = kill_house_requests.filter(ware_house_confirmation=True) + ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + + ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[ + 'total'] or 0 + bar_complete_with_kill_house = kill_house_requests.filter( + assignment_state_archive='True') + + accepted_real_wight_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_weight')).get( + 'total_quantity') or 0 + + accepted_real_quantity_final = bar_complete_with_kill_house.aggregate( + total_quantity=Sum('accepted_real_quantity')).get( + 'total_quantity', 0) or 0 + + return { + "violation_message": 'متخلف' + ' ' + '(مانده در سالن بیش از حد مجاز)' if obj.violation else 'عادی', + "province_kill_requests": len(province_kill_requests), + "province_kill_requests_quantity": province_kill_requests_quantity, + "province_kill_requests_weight": province_kill_requests_weight, + "kill_house_requests": len(kill_house_requests), + "kill_house_requests_first_quantity": first_quantity, + "kill_house_requests_first_weight": first_weight, + "bar_complete_with_kill_house": len(bar_complete_with_kill_house), + "accepted_real_quantity_final": accepted_real_quantity_final, + "accepted_real_wight_final": accepted_real_wight_final, + "ware_house_bars": len(ware_house_bars), + "ware_house_bars_quantity": ware_house_bars_quantity, + "ware_house_bars_weight": ware_house_bars_weight, + 'ware_house_bars_weight_lose': ware_house_bars_weight_lose / len( + ware_house_bars) if ware_house_bars else 0, + } + + def get_free_governmental_info(self, obj): + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False, + state__in=('pending', 'accepted'), + province_request__poultry_request__hatching=obj) + + governmental_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=False) + governmental_province_kill_requests_quantity = \ + governmental_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + free_province_kill_requests = province_kill_requests.filter( + Q(province_request__poultry_request__direct_buying=False) | Q( + province_request__poultry_request__direct_buying=True), + province_request__poultry_request__free_sale_in_province=True) + + free_province_kill_requests_quantity = \ + free_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[ + 'total'] or 0 + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, state_process='accepted', + province_state='accepted', + out_province_request_cancel=False, final_state='archive', + hatching=obj) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + free_sale_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if free_sale_province.allow == False: + left_total_free_commitment_quantity = obj.left_over + + elif obj.total_free_commitment_quantity == 0: + left_total_free_commitment_quantity = 0 + else: + if obj.total_commitment_quantity == 0: + left_total_free_commitment_quantity = obj.left_over + else: + left_total_free_commitment_quantity = obj.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity) if ( + obj.total_free_commitment_quantity - ( + free_province_kill_requests_quantity + out_poultry_requests_quantity)) > 0 else 0 + + return { + "governmental_allocated_quantity": governmental_province_kill_requests_quantity, + "total_commitment_quantity": obj.total_commitment_quantity, + "free_allocated_quantity": free_province_kill_requests_quantity + out_poultry_requests_quantity, + "total_free_commitment_quantity": obj.total_free_commitment_quantity, + "left_total_free_commitment_quantity": left_total_free_commitment_quantity, + + } diff --git a/panel/poultry/views.py b/panel/poultry/views.py new file mode 100644 index 0000000..b1b598c --- /dev/null +++ b/panel/poultry/views.py @@ -0,0 +1,10383 @@ +import math +import threading +from io import BytesIO +from typing import List, Dict + +import openpyxl +import requests +from django.contrib.auth.models import Group +from django.db.models import Q, Prefetch, Min, Max, Avg, Case, When, IntegerField, ExpressionWrapper, FloatField +from rest_framework.generics import GenericAPIView +from rest_framework.views import APIView + +from authentication.sahandsms.sms import kill_house_price +from general_urls import base_url_for_sms_report +from panel.ReportingPanel.views import ( + get_gid_poultry_request, + get_gid_poultry_request_quarantine_code, +) +from panel.admin import PROJECT_API_KEY +from panel.helper import build_query +from panel.helper_excel import percent_of_losses +from panel.poultry.helpers import poultry_prediction_helper, calculate_hatching_increase, \ + create_update_chicken_commission_prices, market_daily_limitation_info +from ticket.bucket import upload_to_liara, delete_file_from_liara + +ARTA_URL_REGISTER = "https://userbackend.rasadyar.com/api/register/" + +ARTA_URL_CHANGE_MOBILE_NUMBER = "https://userbackend.rasadyar.com/change_mobile_number/" +from authentication.models import User, Province +import random +import string +from datetime import datetime, timedelta +from django.http import QueryDict +from django.views.decorators.csrf import csrf_exempt +from django_filters.rest_framework import DjangoFilterBackend +from num2fawords import words +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, +) +from django.utils import timezone +from django.db.models import F +from rest_framework import status +from rest_framework import viewsets +from rest_framework.decorators import permission_classes, api_view +from rest_framework.permissions import AllowAny +from rest_framework.response import Response +from rest_framework.pagination import PageNumberPagination + +from ticket.helper import send_image_to_server +from authentication.models import UserProfile, UserMessage, SystemUserProfile, CityUnit, City +from authentication.serializer.serializer import SystemUserProfileSerializer +from django.db.models import Sum +from authentication.sms_management import operator_hatching_sms, operator_poultry_request_sms, \ + operator_out_poultry_request_sms, sms_chain_company_for_ver_farm, \ + confirm_price_poultry_request_sms, send_sms_for_poultry_market +from panel.KillHouse.serializers import PoultryRequestExchangeAcceptSerializer, ProvinceKillRequestSerializer, \ + KillHouseRequestSerializer, KillHouseRequestForBarManagementSerializer, \ + PoultryRequestLetterTotalSerializer, \ + PoultryRequestoutProvinceSerializer, KillHouseRequestForHatchingDetailSerializer, \ + ReturnProvinceKillRequestSerializer, BarDifferenceRequestSerializer +from panel.convert_date import * +from panel.filterset import PoultryRequestExchangeFilterSet, PoultryFilterSet, PoultryHatchingFilterSet, \ + PoultryRequestFilterSet, ChainAllocationFilterSet, ChainCompanyFilterSet, OutProvincePoultryRequestBuyerFilterSet, \ + DashboardPoultryRequestFilterSet, PoultryManageFilterSet, HatchingIncreaseRequestFilterSet, \ + PoultryRequestDirectBuyingFilterSet, EvacuationHatchingDetailFilterSet +from panel.models import ( + PoultryRequest, + PoultryAssignmentInformation, + KillHouseRequest, + CityOperatorCheckRequest, + ProvinceCheckOperatorRequest, + DepositAllocation, + PovinceInspector, + KillHouseAssignmentInformation, + KillHouseFactorToProvince, + ProvinceFactorToKillHouse, + VetCheckRequest, + PoultryRequestExchange, + PoultryRequestExchangeAccept, + KillHouseRequestExchangeReserve, + KillHouseCheckRequest, + ProvinceKillRequest, + PoultryHatching, + Poultry, + PoultryTenant, CityOperator, PoultryRequestAuction, Pricing, KillHouseRequestAction, KillHouseRequestActionWinner, + ProvinceRequestAction, VetFarmInspection, InspectorOperator, ProvinceOperator, + KillHouseOperator, KillHouse, Vet, KillHouseVet, VetFarm, ShareOfAllocation, ProvinceFactorToKillHouseForPoultry, + KillHouseFactorToPoultry, KillHouseComplaint, KillHouseDriver, KillRequest, CheckUnusualCasualties, + PercentageOfLosses, ProvinceImportKillHouseOutFactors, TotalPoultryRequestQuantity, HourLimit, KillHousePercentage, + SmsLicense, ProvinceAllowPoultryChooseKillHouse, ProvinceAllowPoultrySellFree, LastUpdate, FreeSaleWithinprovince, + OperationLimitation, ChickenAgeRange, TimeRange, ChainCompany, Wallet, ChainAllocation, WageType, + PercentageOfWageType, ChainCompanyTransaction, InternalTransaction, OutProvincePoultryRequestBuyer, + PoultryOutProvinceRequest, PoultryPrediction, PriceConfirmation, HatchingIncreaseRequest, + ChickenCommissionPrices, PoultryRequestQuarantineCode, FinePermission, ShowMarketRequest, + ManagementHatchingAgeRange, IndexWeightCategory, PoultryScience, BarDifferenceRequest, EvacuationHatchingDetail, + MarketDailyLimitation, HatchingArchivePercent +) +from panel.poultry.serializers import ( + PoultryRequestSerializer, + PoultryAssignmentInformationSerializer, + PoultryRequestExchangeSerializer, + PoultryHatchingSerializer, + PoultrySerializer, + PoultryTenantSerializer, TotalPoultryRequestQuantitySerializer, PoultryForPoultryHatchingSerializer, + TotalPoultrySerializer, LastUpdateSerializer, PoultryRequestForKillingInformationSerializer, + PoultryForPoultryHatchingForKillInformationSerializer, ChainCompanySerializer, ChainAllocationSerializer, + ChainCompanyTransactionSerializer, ChainCompanyForTotalWageAllocationWithDAteSerializer, + ChainCompanyForTotalWageAllocationSerializer, ChainAllocationForWageSerializer, + ChainCompanyForTotalWageTransactionSerializer, ChainCompanyForTotalWageTransactionTransactionWithDAteSerializer, + OutProvincePoultryRequestBuyerSerializer, OutProvincePoultryRequestBuyerForBuyerRequestSerializer, + ChainCompanyForCompanyRequestSerializer, PoultryLocationSerializer, GetAllPoultrySerializer, + PoultryHatchingForPredictionSerializer, PoultryPredictionSerializer, HatchingIncreaseRequestSerializer, + ChickenCommissionPricesSerializer, PoultryRequestQuarantineCodeSerializer, PoultryHatchingForDetailsSerializer, + PoultryRequestForHatchingDetailSerializer, ChainAllocationForHatchingDetailSerializer, + PoultryHatchingForBazrasiSerializer, PoultryRequestForDirectBuyingSerializer, ManagementHatchingAgeRangeSerializer, + EvacuationHatchingDetailSerializer, PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer, + PoultryDetailForPoultryAndHatchingForPoultryScienceSerializer +) + +# آدرس پایه برای ذخیره عکس در گالری مرغدار بر روی استوریج آروان +ARVAN_poultry_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' + + +# ARVAN_poultry_URL = 'https://poultry-gallery.s3.ir-thr-at1.arvanstorage.ir/' + + +def update_chain_hatching(poultry_hatching): + chain_allocations = ChainAllocation.objects.filter(trash=False, state='accepted', poultry_hatching=poultry_hatching) + total_killed_quantity = chain_allocations.aggregate(total=Sum('quantity'))['total'] or 0 + total_killed_weight = chain_allocations.aggregate(total=Sum('weight'))['total'] or 0 + + poultry_hatching.chain_killed_quantity = total_killed_quantity + poultry_hatching.chain_killed_weight = total_killed_weight + poultry_hatching.save() + + +class CustomPagination(PageNumberPagination): + page_size = 10 + + +class OutProvincePoultryRequestBuyerViewSet(viewsets.ModelViewSet): + queryset = OutProvincePoultryRequestBuyer.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = OutProvincePoultryRequestBuyerSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = OutProvincePoultryRequestBuyerFilterSet + filterset_fields = [ + 'mobile', + 'kill_house_unique_id', + 'user__national_id', + 'user__base_order', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'unit_name', + + ] + + def create(self, request, *args, **kwargs): + operator_user = SystemUserProfile.objects.get(user=request.user, trash=False) + if SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).exists(): + return Response({"result": "این کاربر قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + + else: + password = "00100" + data = { + "username": request.data['mobile'], + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code in (200, 400): + user = User(username=request.data['mobile'], first_name=request.data['fullname']) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=request.data['mobile'], + first_name=request.data['fullname'], + fullname=request.data['fullname'], + user=user, + base_order=base_id, + password=password, + city=operator_user.city, + province=operator_user.province + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + buyer = serializer.create(validated_data=request.data) + buyer.user = system_profile + buyer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + buyer_list = [] + if 'state' in request.GET: + buyers = OutProvincePoultryRequestBuyer.objects.filter(trash=False).order_by('id') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=buyers + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=buyers) + buyer_list = ps.filter() + buyers = [] if len(buyer_list) == 0 else buyer_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(buyers) + if page is not None: + serializer = OutProvincePoultryRequestBuyerForBuyerRequestSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + else: + buyers = OutProvincePoultryRequestBuyer.objects.filter(active=True, trash=False).order_by('id') + serializer = self.get_serializer(buyers, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + buyer = OutProvincePoultryRequestBuyer.objects.get(key=request.data['buyer_key'], trash=False) + request.data.pop('buyer_key') + system_user_profile = SystemUserProfile.objects.get(key=buyer.user.key, trash=False) + if 'fullname' in request.data.keys(): + system_user_profile.first_name = request.data['fullname'] + system_user_profile.fullname = request.data['fullname'] + system_user_profile.save() + if 'mobile' in request.data.keys(): + first_mobile_number = system_user_profile.mobile + second_mobile_number = request.data['mobile'] + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = second_mobile_number + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + + serializer = self.serializer_class(buyer) + serializer.update(instance=buyer, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + buyer = OutProvincePoultryRequestBuyer.objects.get(key=request.GET["buyer_key"], trash=False) + buyer.trash = True + buyer.save() + return Response({"result": "با موفقیت حذف شد."}, status=status.HTTP_200_OK) + + +class TotalPoultryViewSet(viewsets.ModelViewSet): + queryset = Poultry.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = TotalPoultrySerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryManageFilterSet + filterset_fields = [ + 'breeding_unique_id', + 'user__national_id', + 'user__base_order', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'address__city__name', + 'unit_name', + + ] + + def list(self, request, *args, **kwargs): + poultries = [] + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'search' in request.GET: + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultries = Poultry.objects.filter(city_operator=city_operator.unit_name, trash=False).order_by( + 'id') + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultries = Poultry.objects.filter(address__city=user.city, trash=False).order_by('id') + else: + poultries = Poultry.objects.filter(trash=False).order_by('id') + else: + poultries = Poultry.objects.filter(trash=False).order_by('id') + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + poultries = poultries.filter( + build_query(self.filterset_class, value)) + + else: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultries = Poultry.objects.filter(city_operator=city_operator.unit_name, trash=False).order_by('id') + + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultries = Poultry.objects.filter(address__city=user.city, trash=False).order_by('id') + else: + poultries = Poultry.objects.filter(address__province=user.province, trash=False).order_by('id') + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultries) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(poultries, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به ثبت و نمایش و ... مرغداری +class PoultryViewSet(viewsets.ModelViewSet): + queryset = Poultry.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultrySerializer + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryFilterSet + filterset_fields = [ + 'breeding_unique_id', + 'user__national_id', + 'user__base_order', + 'user__mobile', + + ] + + # تابع مربوط به ویرایش مرغداری + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + poultry = Poultry.objects.get(key=request.data["key"], trash=False) + request.data.pop('key') + serializer = self.serializer_class(poultry) + serializer.update(instance=poultry, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع مربوط به نمایش مرغداری + def list(self, request, *args, **kwargs): + + # refresh(request.user.id) + + # list of self poultry houses + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'type' in request.GET: + if request.GET['type'] == 'filter': + poultry_list = [] + # for poultry in self.queryset.filter(trash=False): + # if PoultryHatching.objects.filter(poultry=poultry, + # allow_hatching='pending', left_over__gt=0, state='pending', + # archive=False, trash=False).exists(): + # poultry_list.append(poultry.key) + poultry_list = self.queryset.filter(address__province=user.province, trash=False) + + for item in self.filterset_fields: + query = QueryDict('{0}={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + # queryset=self.queryset.filter(address__province=user.province, trash=False) + queryset=poultry_list + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=poultry_list) + filtered_poultry = ps.filter() + serializer = self.serializer_class(filtered_poultry, many=True) + return Response(serializer.data) + return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN) + + elif 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + if 'active_hatching' in request.GET: + poultry = [] + poultry_ids = PoultryHatching.objects.filter( + allow_hatching='pending', + left_over__gt=0, + state='pending', + poultry__city_operator=city_operator.unit_name, + archive=False, + trash=False + ).select_related('poultry').only('poultry').values_list('poultry', flat=True).distinct() + poultry = Poultry.objects.filter(id__in=poultry_ids) + serializer = PoultryForPoultryHatchingForKillInformationSerializer(poultry, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + poultry = Poultry.objects.filter(city_operator=city_operator.unit_name) + elif request.GET['role'] == 'Poultry': + poultry = Poultry.objects.filter(user=user, trash=False) + else: + if 'active_hatching' in request.GET: + poultry_ids = PoultryHatching.objects.filter( + poultry__address__province=user.province, + allow_hatching='pending', + left_over__gt=0, + state='pending', + archive=False, + trash=False + ).select_related('poultry').only('poultry').values_list('poultry', flat=True).distinct() + age_range = ChickenAgeRange.objects.filter(trash=False).first() + if 'min_age' in request.GET or 'direct_buying' in request.GET: + if age_range.active: + poultry_ids = poultry_ids.filter(chicken_age__range=(age_range.minimum, age_range.maximum)) + else: + if 'min_age' in request.GET: + min_age = int(request.GET['min_age']) + max_age = int(request.GET.get('max_age', min_age)) # برای اطمینان از وجود 'max_age' + poultry_ids = poultry_ids.filter(chicken_age__range=(min_age, max_age)) + else: + poultry_ids = poultry_ids + poultry = Poultry.objects.filter(id__in=poultry_ids) + serializer = PoultryForPoultryHatchingForKillInformationSerializer(poultry, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + # poultry=PoultryHatching.objects.filter(trash=False,allow_hatching='pending',archive=False).values_list( + # 'poultry',flat=True + # ).distinct() + poultry = Poultry.objects.filter(trash=False, address__province=user.province).select_related( + 'user', 'address' + ).order_by('id') + + serializer = PoultryForPoultryHatchingSerializer(poultry, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + elif 'info' in request.GET: + list1 = [] + # list2 = [] + poultries = Poultry.objects.filter(user=user, trash=False) + if poultries.count() > 0: + for poultry in poultries: + halls = int(poultry.number_of_halls) + inspections_count = 0 + hatching_state = None + hatching_date = None + for hall in range(halls): + hatching = PoultryHatching.objects.filter(poultry=poultry, hall=hall + 1).order_by('date') + if hatching.count() > 0: + hatching = hatching.last() + hatching_date = hatching.date + if hatching.state == 'pending': + hatching_state = 'active' + else: + hatching_state = 'inactive' + + vet_farms = VetFarm.objects.filter(poultry=poultry, hall=hall + 1) + if vet_farms.count() > 0: + for vet_farm in vet_farms: + inspections = VetFarmInspection.objects.filter(vet_farm=vet_farm) + if inspections.count() > 0: + inspections_count += inspections.count() + internal_dict = { + "poultry_name": poultry.unit_name, + "poultry_key": poultry.key, + "hall": hall + 1, + "hatching_state": hatching_state, + "hatching_date": hatching_date, + "inspections": inspections_count + } + list1.append(internal_dict) + inspections_count = 0 + + return Response(list1, status=status.HTTP_200_OK) + + elif 'operator' in request.GET: + if request.GET['operator'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + poultry = Poultry.objects.filter(city_operator=city_operator.unit_name, trash=False) + serializer = PoultrySerializer(poultry, many=True) + # + # elif 'id' in request.GET: + # poultry = Poultry.objects.get(breeding_unique_id=request.GET['id']) + # serializer = PoultrySerializer(poultry) + elif 'all' in request.GET: + poultry_list = [] + poultries = Poultry.objects.filter(address__province=user.province, trash=False) + if poultries.count() > 0: + for poultry in poultries: + allow_state = None + allow_sell_state = None + allow = ProvinceAllowPoultryChooseKillHouse.objects.filter(poultry=poultry, trash=False) + allow_sell = ProvinceAllowPoultrySellFree.objects.filter(poultry=poultry, trash=False) + if allow.count() > 0: + allow_state = allow.last().allow + if allow_sell.count() > 0: + allow_sell_state = allow_sell.last().allow + poultry_dict = { + "name": poultry.unit_name, + "key": poultry.key, + "allow_state": allow_state, + "allow_sell_state": allow_sell_state + } + poultry_list.append(poultry_dict) + return Response(poultry_list, status=status.HTTP_200_OK) + + + else: + poultry = Poultry.objects.filter(user=user, trash=False) + serializer = PoultrySerializer(poultry, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def retrieve(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + + # get self - poultry profile information + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + user_serializer = SystemUserProfileSerializer(user) + poultry = Poultry.objects.filter(user=user, trash=False) + serializer = PoultrySerializer(poultry, many=True) + profile_info = { + 'profile': user_serializer.data, + 'aviculture': serializer.data + } + return Response(profile_info, status=status.HTTP_200_OK) + + # get special poultry information + if 'partial_key' in request.GET: + poultry_object = Poultry.objects.get(key=request.GET['partial_key'], trash=False) + serializer = PoultrySerializer(poultry_object) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, *args, **kwargs): + # refresh(request.user.id) + poultry = self.queryset.get(key=request.data['poultry_key']) + poultry.trash = True + poultry.save() + return Response(status=status.HTTP_200_OK) + + +class ChainCompanyViewSet(viewsets.ModelViewSet): + queryset = ChainCompany.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ChainCompanySerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ChainCompanyFilterSet + filterset_fields = [ + 'user__national_id', + 'user__mobile', + 'user__first_name', + 'user__last_name', + 'user__fullname', + 'name', + + ] + + def retrieve(self, request, pk=None, *args, **kwargs): + if 'profile' in request.GET: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + chain_company = user.chain_company_user.all() + + serializer = self.serializer_class(chain_company[0]) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + group = Group.objects.get(name__exact="ChainCompany") + city = City.objects.get(province_center=True) + province = Province.objects.get(trash=False) + system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last() + if system_profile: + if ChainCompany.objects.filter(user=system_profile, trash=False).exists(): + return Response({"result": "این شرکت قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) + + else: + password = "00100" + data = { + "username": request.data['mobile'], + "password": password, + "api_key": PROJECT_API_KEY + } + req = requests.post( + url=ARTA_URL_REGISTER, + data=data, + verify=False + ) + + if req.status_code == 200: + user = User(username=request.data['mobile'], first_name=request.data['first_name'], + last_name=request.data['last_name']) + user.save() + base_id = SystemUserProfile.objects.all() + if base_id.count() > 0: + base_id = int(base_id.last().base_order) + 1 + else: + base_id = 1000 + system_profile = SystemUserProfile( + mobile=request.data['mobile'], + first_name=request.data['first_name'], + last_name=request.data['last_name'], + fullname=request.data['first_name'] + " " + request.data['last_name'], + user=user, + base_order=base_id, + password=password, + national_id=request.data['national_id'], + city=city, + province=province + ) + system_profile.save() + else: + return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) + + system_profile.role.add(group) + wallet = Wallet() + wallet.save() + request.data.pop('mobile') + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('national_id') + request.data.pop('postal_code') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + chain_company = serializer.create(validated_data=request.data) + chain_company.user = system_profile + chain_company.wallet = wallet + chain_company.save() + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def list(self, request, *args, **kwargs): + + company_list = [] + if 'state' in request.GET: + chain_companies = ChainCompany.objects.filter(trash=False).order_by('id') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=chain_companies + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=chain_companies) + company_list = ps.filter() + chain_companies = [] if len(company_list) == 0 else company_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(chain_companies) + if page is not None: + serializer = ChainCompanyForCompanyRequestSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + else: + chain_companies = ChainCompany.objects.filter(trash=False).order_by('id') + serializer = self.serializer_class(chain_companies, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + company = ChainCompany.objects.get(key=request.data['company_key'], trash=False) + system_user_profile = SystemUserProfile.objects.get(key=company.user.key, trash=False) + system_user_profile.first_name = request.data['first_name'] + system_user_profile.last_name = request.data['last_name'] + system_user_profile.fullname = request.data['first_name'] + " " + request.data['last_name'] + system_user_profile.national_id = request.data['national_id'] + system_user_profile.save() + first_mobile_number = system_user_profile.mobile + second_mobile_number = request.data['mobile'] + request.data.pop('mobile') + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = second_mobile_number + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + + request.data.pop('company_key') + request.data.pop('first_name') + request.data.pop('last_name') + request.data.pop('national_id') + + serializer = self.serializer_class(company) + serializer.update(instance=company, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ChainCompanyForTotalWageAllocationViewSet(viewsets.ModelViewSet): + queryset = ChainCompany.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ChainCompanyForTotalWageAllocationSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ChainCompanyFilterSet + filterset_fields = [ + 'name', + 'user__fullname', + 'user__mobile', + 'address__city__name', + 'address__province__name', + + ] + + def list(self, request, *args, **kwargs): + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'ProvinceOperator': + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + union_share__gt=0, + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Company': + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + company_share__gt=0, + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Company': + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + company_share__gt=0, + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Guilds': + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + guilds_share__gt=0, + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + else: + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + else: + + if request.GET['role'] == 'ProvinceOperator': + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + union_share__gt=0, + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Company': + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + company_share__gt=0, + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Company': + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + company_share__gt=0, + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Guilds': + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + guilds_share__gt=0, + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + else: + chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( + archive_wage=False, + trash=False).values( + 'chain_company'), trash=False) + + if 'search' in request.GET: + chain_companies_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=chain_companies + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=chain_companies) + chain_companies_list = ps.filter() + chain_companies = [] if len(chain_companies_list) == 0 else chain_companies_list + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(chain_companies) + if page is not None: + if 'date1' in request.GET: + serializer = ChainCompanyForTotalWageAllocationWithDAteSerializer(page, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + if 'date1' in request.GET: + serializer = ChainCompanyForTotalWageAllocationWithDAteSerializer(chain_companies, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(chain_companies, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ChainCompanyForTotalWageTransactionViewSet(viewsets.ModelViewSet): + queryset = ChainCompany.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ChainCompanyForTotalWageTransactionSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ChainCompanyFilterSet + filterset_fields = [ + 'name', + 'user__fullname', + 'user__mobile', + 'address__city__name', + 'address__province__name', + + ] + + def list(self, request, *args, **kwargs): + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'ProvinceOperator': + chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='chain_company', + union_share__gt=0, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Company': + chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='chain_company', + company_share__gt=0, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Guilds': + chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='chain_company', + guilds_share__gt=0, + trash=False).values( + 'chain_company'), trash=False) + else: + chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( + date__date__gte=date1, + date__date__lte=date2, + status='completed', + payer_type='chain_company', + trash=False).values( + 'chain_company'), trash=False) + else: + + if request.GET['role'] == 'ProvinceOperator': + chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='chain_company', + union_share__gt=0, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Company': + chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='chain_company', + company_share__gt=0, + trash=False).values( + 'chain_company'), trash=False) + elif request.GET['role'] == 'Guilds': + chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='chain_company', + guilds_share__gt=0, + trash=False).values( + 'chain_company'), trash=False) + else: + chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( + status='completed', + payer_type='chain_company', + trash=False).values( + 'chain_company'), trash=False) + + if 'search' in request.GET: + chain_companies_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=chain_companies + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=chain_companies) + chain_companies_list = ps.filter() + chain_companies = [] if len(chain_companies_list) == 0 else chain_companies_list + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(chain_companies) + if page is not None: + if 'date1' in request.GET: + serializer = ChainCompanyForTotalWageTransactionTransactionWithDAteSerializer(page, many=True, context={ + 'request': request}) + else: + + serializer = self.get_serializer(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + if 'date1' in request.GET: + serializer = ChainCompanyForTotalWageTransactionTransactionWithDAteSerializer(chain_companies, many=True, + context={'request': request}) + else: + + serializer = self.get_serializer(chain_companies, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ChainCompanyTransactionViewSet(viewsets.ModelViewSet): + queryset = ChainCompanyTransaction.objects.all() + serializer_class = ChainCompanyTransactionSerializer + permission_classes = [TokenHasReadWriteScope] + + +class PoultryChooseChainCompanyViewSet(viewsets.ModelViewSet): + queryset = ChainCompany.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ChainCompanySerializer + + def create(self, request, *args, **kwargs): + poultry_hitchings = request.data['poultry_hitchings'] + chain_company = ChainCompany.objects.get(key=request.data['chain_company'], trash=False) + hatchings = PoultryHatching.objects.filter(key__in=poultry_hitchings, trash=False) + for hatching in hatchings: + hatching.chain_company = chain_company + hatching.has_chain_company = True + hatching.save() + + return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) + + def update(self, request, pk=None, *args, **kwargs): + hatching = PoultryHatching.objects.get(key=request.data['hatching_key'], trash=False) + + if 'type' in request.data.keys(): + if request.data['type'] == 'delete': + hatching.chain_company = None + hatching.has_chain_company = False + hatching.save() + else: + company = ChainCompany.objects.get(key=request.data['company_key'], trash=False) + hatching.chain_company = company + hatching.has_chain_company = True + hatching.save() + + return Response({"result": "با موفقیت ثبت شد!"}, status=status.HTTP_200_OK) + + +class ChainAllocationForWageViewSet(viewsets.ModelViewSet): + queryset = ChainAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ChainAllocationForWageSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ChainAllocationFilterSet + filterset_fields = [ + 'poultry_hatching__poultry__breeding_unique_id', + 'poultry_hatching__poultry__user__mobile', + 'poultry_hatching__poultry__user__fullname', + 'poultry_hatching__poultry__user__first_name', + 'poultry_hatching__poultry__user__last_name', + 'poultry_hatching__poultry__unit_name', + 'chain_company__name', + + ] + + def list(self, request, *args, **kwargs): + chain_allocations_list = [] + if request.GET['role'] == 'ChainCompany': + user = SystemUserProfile.objects.get(user=request.user, trash=False) + chain_company = ChainCompany.objects.get(user=user, trash=False) + else: + + chain_company = ChainCompany.objects.get(key=request.GET['chain_company_key'], trash=False) + + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'ProvinceOperator': + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, date__date__gte=date1, + date__date__lte=date2, + union_share__gt=0, + trash=False).order_by('id') + elif request.GET['role'] == 'Company': + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, date__date__gte=date1, + date__date__lte=date2, + company_share__gt=0, + trash=False).order_by('id') + elif request.GET['role'] == 'Guilds': + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, date__date__gte=date1, + date__date__lte=date2, + guilds_share__gt=0, + trash=False).order_by('id') + else: + + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, date__date__gte=date1, + date__date__lte=date2, + trash=False).order_by('id') + else: + + if request.GET['role'] == 'ProvinceOperator': + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, + union_share__gt=0, + trash=False).order_by('id') + elif request.GET['role'] == 'Company': + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, + company_share__gt=0, + trash=False).order_by('id') + elif request.GET['role'] == 'Guilds': + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, + guilds_share__gt=0, + trash=False).order_by('id') + else: + + chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, + trash=False).order_by('id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=chain_allocations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=chain_allocations) + chain_allocations_list = ps.filter() + chain_allocations = [] if len(chain_allocations_list) == 0 else chain_allocations_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(chain_allocations) + if page is not None: + serializer = self.serializer_class(page, many=True, context={'request': request}) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(chain_allocations, many=True, context={'request': request}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ChainAllocationViewSet(viewsets.ModelViewSet): + queryset = ChainAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ChainAllocationSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ChainAllocationFilterSet + filterset_fields = [ + 'poultry_hatching__poultry__breeding_unique_id', + 'poultry_hatching__poultry__user__mobile', + 'poultry_hatching__poultry__user__fullname', + 'poultry_hatching__poultry__user__first_name', + 'poultry_hatching__poultry__user__last_name', + 'poultry_hatching__poultry__unit_name', + 'chain_company__name', + + ] + + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + if base_url_for_sms_report == 'ma': + return Response({ + 'result': "امکان ثبت بار برای زنجیره وجود ندارد جهت فروش زنجیره به قسمت فروش خارج استان مراجعه فرمایید"}, + status=status.HTTP_403_FORBIDDEN) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = None + hatching = PoultryHatching.objects.get(key=request.data['hatching_key'], trash=False) + chain_company = ChainCompany.objects.get(key=hatching.chain_company.key, trash=False) + role = request.data['role'] + request.data.pop('hatching_key') + request.data.pop('role') + now = datetime.datetime.now() + if 'kill_house_key' in request.data.keys(): + kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) + request.data.pop('kill_house_key') + input_date = datetime.datetime.strptime(request.data['date'], '%Y-%m-%d').date() + date = datetime.datetime(year=input_date.year, month=input_date.month, day=input_date.day, hour=now.hour, + minute=now.minute, + second=now.second) + request.data.pop('date') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + chain_allocation = serializer.create(validated_data=request.data) + chain_allocation.poultry_hatching = hatching + chain_allocation.chain_company = chain_company + chain_allocation.date = date + chain_allocation.company_name = chain_company.name + chain_allocation.company_user_fullname = chain_company.user.fullname + chain_allocation.company_user_mobile = chain_company.user.mobile + chain_allocation.company_user_province = chain_company.user.province.name + chain_allocation.company_user_city = chain_company.user.city.name + chain_allocation.registerer = { + "role": role, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.datetime.now()), + } + if kill_house != None: + chain_allocation.kill_house = kill_house + chain_allocation.save() + # update_chain_hatching(hatching) + wage = 0 + wage_type = WageType.objects.filter(en_name='chain', trash=False).first() + if wage_type.status == True: + wage = wage_type.amount + chain_allocation.wage = wage + chain_allocation.total_wage_amount = wage * int(chain_allocation.weight) + chain_allocation.save() + + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) + + if wage_type and wage_type.status == True and percentages_wage_type: + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + chain_allocation.union_share = int( + (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) + chain_allocation.union_share_percent = percentage_wage_type.percent + chain_allocation.save() + elif percentage_wage_type.share_type.en_name == 'company': + chain_allocation.company_share = int( + (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) + chain_allocation.company_share_percent = percentage_wage_type.percent + chain_allocation.save() + + elif percentage_wage_type.share_type.en_name == 'guilds': + chain_allocation.guilds_share = int( + (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) + chain_allocation.guilds_share_percent = percentage_wage_type.percent + chain_allocation.save() + elif percentage_wage_type.share_type.en_name == 'city': + chain_allocation.city_share = int( + (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) + chain_allocation.city_share_percent = percentage_wage_type.percent + chain_allocation.save() + + elif percentage_wage_type.share_type.en_name == 'wallet': + chain_allocation.wallet_share = int( + (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) + chain_allocation.wallet_share_percent = percentage_wage_type.percent + chain_allocation.save() + + else: + chain_allocation.other_share = int( + (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) + chain_allocation.other_share_percent = percentage_wage_type.percent + chain_allocation.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + chain_allocations_list = [] + + if request.GET['role'] == "ChainCompany": + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(chain_company__user=user, date__date__gte=date1, + date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, + temporary_deleted=False).order_by('-id') + else: + chain_allocations = ChainAllocation.objects.filter(chain_company__user=user, date__date__gte=date1, + date__date__lte=date2, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(poultry_hatching__poultry__address__city=user.city, + date__date__gte=date1, date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, + temporary_deleted=False).order_by('-id') + else: + + chain_allocations = ChainAllocation.objects.filter(poultry_hatching__poultry__address__city=user.city, + date__date__gte=date1, date__date__lte=date2, + state='accepted', + trash=False).order_by('-id') + elif request.GET['role'] == "CityOperator": + city_operator = CityOperator.objects.get(user=user, trash=False) + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter( + poultry_hatching__poultry__city_operator=city_operator.unit_name, date__date__gte=date1, + date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, temporary_deleted=False).order_by('-id') + else: + chain_allocations = ChainAllocation.objects.filter( + poultry_hatching__poultry__city_operator=city_operator.unit_name, date__date__gte=date1, + date__date__lte=date2, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + + elif request.GET['role'] == "VetFarm": + vet = Vet.objects.get(user=user, trash=False) + poultry_ids = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry').only( + 'poultry').values_list('poultry', flat=True).distinct() + poultry = Poultry.objects.filter(id__in=poultry_ids) + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + poultry_hatching__poultry__in=poultry, + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, + temporary_deleted=False).order_by('-id') + else: + + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + poultry_hatching__poultry__in=poultry, + state='accepted', + trash=False).order_by('-id') + else: + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True), temporary_trash=False, + temporary_deleted=False).order_by('-id') + else: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=chain_allocations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=chain_allocations) + chain_allocations_list = ps.filter() + chain_allocations = [] if len(chain_allocations_list) == 0 else chain_allocations_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(chain_allocations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(chain_allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + chain_allocation = ChainAllocation.objects.get(key=request.data['chain_allcation_key'], trash=False) + request.data.pop('chain_allcation_key') + if 'check_allocation' in request.data.keys(): + chain_allocation.seconder = { + "role": None, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.datetime.now()), + } + chain_allocation.save() + request.data.pop('check_allocation') + if request.data['state'] == 'accepted': + poultry_name = chain_allocation.poultry_hatching.poultry.unit_name + poultry_mobile = chain_allocation.poultry_hatching.poultry.user.mobile + quantity = chain_allocation.quantity + Index_weight = chain_allocation.index_weight + if chain_allocation.kill_house is not None: + kill_house_name = chain_allocation.kill_house.name + kill_house_mobile = chain_allocation.kill_house.kill_house_operator.user.mobile + + else: + kill_house_name = chain_allocation.buyer_name + kill_house_mobile = chain_allocation.buyer_mobile + city = chain_allocation.poultry_hatching.poultry.user.city.name + province = chain_allocation.poultry_hatching.poultry.user.province.name + date_str = str( + chain_allocation.date) + send_date = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + vet_farm = VetFarm.objects.filter( + poultry=chain_allocation.poultry_hatching.poultry).first() + sms_chain_company_for_ver_farm(poultry_name, poultry_mobile, + quantity, Index_weight, kill_house_name, kill_house_mobile, city, + send_date, + vet_farm.vet.user.mobile, province) + + if 'quarantine_code' in request.data.keys(): + chain_allocation.quarantine_code_registrar = { + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.datetime.now()), + } + chain_allocation.save() + if 'kill_house_key' in request.data.keys() and request.data['kill_house_key'] is not None: + kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) + chain_allocation.kill_house = kill_house + chain_allocation.save() + request.data.pop('kill_house_key') + + serializer = self.serializer_class(chain_allocation) + serializer.update(instance=chain_allocation, validated_data=request.data) + if chain_allocation.state == 'accepted': + update_chain_hatching(chain_allocation.poultry_hatching) + chain_allocation.total_wage_amount = chain_allocation.wage * int(chain_allocation.weight) + chain_allocation.save() + + union_percent = chain_allocation.union_share_percent / 100 if chain_allocation.union_share_percent > 0 else 0 + company_percent = chain_allocation.company_share_percent / 100 if chain_allocation.company_share_percent > 0 else 0 + guilds_percent = chain_allocation.guilds_share_percent / 100 if chain_allocation.guilds_share_percent > 0 else 0 + city_share_percent = chain_allocation.city_share_percent / 100 if chain_allocation.city_share_percent > 0 else 0 + wallet_share_percent = chain_allocation.wallet_share_percent / 100 if chain_allocation.wallet_share_percent > 0 else 0 + other_share_percent = chain_allocation.other_share_percent / 100 if chain_allocation.other_share_percent > 0 else 0 + chain_allocation.union_share = int(union_percent * chain_allocation.total_wage_amount) + chain_allocation.company_share = int(company_percent * chain_allocation.total_wage_amount) + chain_allocation.guilds_share = int(guilds_percent * chain_allocation.total_wage_amount) + chain_allocation.city_share = int(city_share_percent * chain_allocation.total_wage_amount) + chain_allocation.wallet_share = int(wallet_share_percent * chain_allocation.total_wage_amount) + chain_allocation.other_share = int(other_share_percent * chain_allocation.total_wage_amount) + chain_allocation.save() + + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET['role'] + chain_allocation = ChainAllocation.objects.get(key=request.GET['chain_allcation_key'], trash=False) + if chain_allocation.quarantine_code is None == False: + return Response({"result": "به علت ورود کد قرنطینه امکان حذف وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + chain_allocation.trash = True + chain_allocation.state = 'deleted' + chain_allocation.remover = { + "role": role, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.datetime.now()), + } + chain_allocation.save() + update_chain_hatching(chain_allocation.poultry_hatching) + return Response(status=status.HTTP_200_OK) + + +class ParentCompanyChainAllocationViewSet(viewsets.ModelViewSet): + queryset = ChainAllocation.objects.all() + permission_classes = [AllowAny] + serializer_class = ChainAllocationSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ChainAllocationFilterSet + filterset_fields = [ + 'poultry_hatching__poultry__breeding_unique_id', + 'poultry_hatching__poultry__user__mobile', + 'poultry_hatching__poultry__user__fullname', + 'poultry_hatching__poultry__user__first_name', + 'poultry_hatching__poultry__user__last_name', + 'poultry_hatching__poultry__unit_name', + 'chain_company__name', + + ] + + def list(self, request, *args, **kwargs): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + chain_allocations_list = [] + + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True)).order_by('-id') + else: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=chain_allocations + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=chain_allocations) + chain_allocations_list = ps.filter() + chain_allocations = [] if len(chain_allocations_list) == 0 else chain_allocations_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(chain_allocations) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(chain_allocations, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ForecastPoultryHatchingViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + age = int(request.GET['age']) + days_interval = (date2 - date1).days + hatching_list = [] + hatches = PoultryHatching.objects.filter(state='pending', + allow_hatching='pending', archive=False, + trash=False) + + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + hatchings = hatches.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + hatchings = hatches.filter(poultry__address__city=user.city) + else: + hatchings = hatches + else: + hatchings = hatches + + if hatchings: + for i in range(days_interval + 1): + hatching_left_over = 0 + first_date = date1 + timedelta(days=i) + for hatch in hatchings: + if (first_date - hatch.date.date()).days + 1 == age: + hatching_left_over += hatch.left_over + hatching_list.append({"date": first_date, "hatching_left_over": hatching_left_over}) + if days_interval == 0: + break + + return Response(hatching_list, status=status.HTTP_200_OK) + + +class PoultryHatchingForDashBoardViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryHatchingSerializer + filterset_class = PoultryHatchingFilterSet + filterset_fields = [ + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__unit_name', + 'poultry__address__city__name', + 'chicken_age', + 'licence_number', + 'poultry__breeding_unique_id', + 'CertId', + 'PersonTypeName', + 'InteractTypeName', + 'UnionTypeName', + 'poultry__city_operator', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + hatching_filters = { + 'trash': False + } + if request.GET['type'] == 'date-dashboard': + date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultry_hatchings = PoultryHatching.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2, + # allow_hatching='pending', + # state='pending', + # archive=False, + poultry__city_operator=city_operator.unit_name, + ) + elif request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = PoultryHatching.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2, + # allow_hatching='pending', + # state='pending', + # archive=False, + poultry__address__city=user.city, + ) + else: + poultry_hatchings = PoultryHatching.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2, + # allow_hatching='pending', + # state='pending', + # archive=False + ) + if 'search' in request.GET: + value = request.GET.get('value') + if request.GET['search'] == 'filter': + if value != 'undefined' and value.strip(): + poultry_hatchings = poultry_hatchings.filter( + build_query(self.filterset_class, value) + ) + poultries = Poultry.objects.filter(pk__in=poultry_hatchings.values('poultry'), trash=False) + total_hatching_quantity = poultry_hatchings.aggregate(total=Sum('quantity'))['total'] or 0 + total_hatching_left_over_quantity = poultry_hatchings.aggregate(total=Sum('left_over'))['total'] or 0 + total_hatching_killed_quantity = poultry_hatchings.aggregate(total=Sum('killed_quantity'))['total'] or 0 + total_hatching_killed_weight = poultry_hatchings.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + all_vet_losses = poultry_hatchings.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity') or 0 + all_union_losses = poultry_hatchings.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity') or 0 + all_total_losses = poultry_hatchings.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity') or 0 + return Response({ + "poultries": len(poultries), + "total_hatching_quantity": total_hatching_quantity, + "total_hatching_left_over_quantity": total_hatching_left_over_quantity, + "total_hatching_killed_quantity": total_hatching_killed_quantity, + "total_hatching_killed_weight": total_hatching_killed_weight, + "total_hatching_vet_losses": all_vet_losses, + "total_hatching_union_losses": all_union_losses, + "total_hatching_all_losses": all_total_losses, + }) + else: + tab = request.GET.get('tab') + age1 = request.GET.get('age1') + age2 = request.GET.get('age2') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + role = request.GET.get('role') + if tab == 'unknown': + hatching_filters['unknown'] = True + elif tab == 'archive': + hatching_filters['unknown'] = False + elif tab == 'active': + hatching_filters['unknown'] = False + hatching_filters['allow_hatching'] = 'pending' + hatching_filters['state'] = 'pending' + hatching_filters['archive'] = False + else: + hatching_filters['unknown'] = False + + if age1 and age2: + if int(age2) > 0: + hatching_filters['chicken_age__gte'] = int(age1) + hatching_filters['chicken_age__lte'] = int(age2) + + if date1: + hatching_filters['date__date__gte'] = date1 + hatching_filters['date__date__lte'] = date2 + + if role == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + hatching_filters['poultry__city_operator'] = city_operator.unit_name + + + + elif role in ['CityJahad', 'CityPoultry', 'CityVet']: + hatching_filters['poultry__address__city'] = user.city + + poultry_hatchings = PoultryHatching.objects.filter(**hatching_filters).order_by('date') + + if tab == 'archive': + poultry_hatchings = poultry_hatchings.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True)) + + if 'search' in request.GET: + value = request.GET.get('value') + if request.GET['search'] == 'filter': + if value != 'undefined' and value.strip(): + poultry_hatchings = poultry_hatchings.filter( + build_query(self.filterset_class, value) + ) + + total_hatching_quantity = poultry_hatchings.aggregate(total=Sum('quantity'))['total'] or 0 + total_hatching_left_over_quantity = poultry_hatchings.aggregate(total=Sum('left_over'))['total'] or 0 + total_hatching_killed_quantity = poultry_hatchings.aggregate(total=Sum('killed_quantity'))['total'] or 0 + total_hatching_killed_weight = poultry_hatchings.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + all_vet_losses = poultry_hatchings.aggregate(total_quantity=Sum('losses')).get( + 'total_quantity') or 0 + all_union_losses = poultry_hatchings.aggregate(total_quantity=Sum('direct_losses')).get( + 'total_quantity') or 0 + all_total_losses = poultry_hatchings.aggregate(total_quantity=Sum('total_losses')).get( + 'total_quantity') or 0 + now = timezone.now().date() + age_distribution = {"age-20-30": 0, "age-30-40": 0, "age-40-50": 0, "age-50-60": 0, "age-more-than-60": 0} + + for poultry_hatching in poultry_hatchings: + age = (now - poultry_hatching.date.date()).days + 1 + if 20 <= age <= 30: + age_distribution["age-20-30"] += poultry_hatching.left_over + elif age <= 40: + age_distribution["age-30-40"] += poultry_hatching.left_over + elif age <= 50: + age_distribution["age-40-50"] += poultry_hatching.left_over + elif age <= 60: + age_distribution["age-50-60"] += poultry_hatching.left_over + else: + age_distribution["age-more-than-60"] += poultry_hatching.left_over + + return Response({ + "poultries": poultry_hatchings.values('poultry').distinct().count(), + "hatchings": poultry_hatchings.count(), + "total_hatching_quantity": total_hatching_quantity, + "total_hatching_left_over_quantity": total_hatching_left_over_quantity, + **age_distribution, + "total_hatching_killed_quantity": total_hatching_killed_quantity, + "total_hatching_killed_weight": total_hatching_killed_weight, + "total_hatching_vet_losses": all_vet_losses, + "total_hatching_union_losses": all_union_losses, + "total_hatching_all_losses": all_total_losses, + }) + + +# ویوست مربوط به ثبت و نمایش و ... جوجه ریزی مرغدار +class PoultryHatchingViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryHatchingSerializer + pagination_class = CustomPagination + filterset_class = PoultryHatchingFilterSet + filterset_fields = [ + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__unit_name', + 'poultry__address__city__name', + 'chicken_age', + 'licence_number', + 'poultry__breeding_unique_id', + 'CertId', + 'PersonTypeName', + 'InteractTypeName', + 'UnionTypeName', + 'poultry__city_operator', + + ] + + def generate_random_filename(self, extension="jpg", length=15): + """Generates a random filename with the given extension.""" + random_str = ''.join(random.choices(string.ascii_uppercase + string.digits, k=length)) + return f"{random_str}.{extension}" + + def process_violation_images(self, images): + """Uploads images to Arvan Cloud and returns the URLs.""" + violation_images = [] + for image in images: + file_url = upload_to_liara(image, image.name) + violation_images.append(file_url) + return violation_images + + # تابع مربوط به ثبت جوجه ریزی مرغدار + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + if 'role' in request.data.keys(): + role = request.data['role'] + request.data.pop('role') + else: + role = None + poultry = Poultry.objects.get(key=request.data["key"], trash=False) + request.data.pop("key") + if role == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + if city_operator.unit_name != poultry.city_operator: + return Response({"result": "مرغدار زیر مجموعه تعاونی دیگری دیگری است !"}, + status=status.HTTP_403_FORBIDDEN) + hatching = PoultryHatching.objects.filter(poultry=poultry, trash=False) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + if PoultryHatching.objects.filter(poultry=poultry, hall=int(request.data['hall']), + state__in=('pending', 'complete'), allow_hatching='pending', + archive=False, + trash=False).exists(): + return Response({"result": "برای شما دوره فعال جوجه ریزی وجود دارد !"}, + status=status.HTTP_403_FORBIDDEN) + hatch = PoultryHatching.objects.filter(poultry=poultry, hall=int(request.data['hall']), + state__in=('pending', 'complete'), allow_hatching='pending', + archive=False, + trash=False) + if hatch.count() > 0: + hatch = hatch.last() + hatch.quantity += int(request.data['quantity']) + # hatch.left_over += int(request.data['quantity']) + hatch.state = 'pending' + counter = 1 + for chicken_breed in hatch.breed: + if request.data['chicken_breed'] == chicken_breed['breed']: + chicken_breed['main_quantity'] += int(request.data['quantity']) + chicken_breed['remain_quantity'] += int(request.data['quantity']) + break + counter += 1 + if counter == 1: + pass + else: + hatch.breed.append({ + 'breed': request.data['chicken_breed'], + 'main_quantity': int(request.data['quantity']), + 'remain_quantity': int(request.data['quantity']) + }) + + if hatch.chicken_breed == request.data['chicken_breed']: + pass + else: + hatch.chicken_breed = hatch.chicken_breed + " " + "-" + " " + request.data[ + 'chicken_breed'] + + hatch.save() + if SmsLicense.objects.filter(hatching=True).exists(): + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + + poultry_fullname = hatch.poultry.unit_name + quantity = hatch.quantity + chicken_breed = hatch.chicken_breed + date_str = str(hatch.date) + date = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + date = jdatetime.datetime.fromgregorian(year=date.year, month=date.month, + day=date.day).strftime( + '%Y-%m-%d') + date_list = reversed(date.split('-')) + separate = "-" + date = separate.join(date_list) + + province = hatch.poultry.user.province.name + city = hatch.poultry.user.city.name + province_operator_mobile = province_operator.user.mobile + + operator_hatching_sms(province_operator_mobile, poultry_fullname, quantity, date, chicken_breed, + province, city) + free_sale = FreeSaleWithinprovince.objects.filter(trash=False, allow=True).first() + if free_sale: + if free_sale.type == 'weight': + hatch.total_commitment = hatch.quantity * free_sale.weight + else: + hatch.total_commitment_quantity = int(hatch.quantity * (free_sale.percent / 100)) + + hatch.save() + serializer = self.serializer_class(hatch) + return Response(serializer.data, status=status.HTTP_201_CREATED) + if int(request.data['quantity']) == 0: + return Response({"result": "you enter zero"}, status=status.HTTP_403_FORBIDDEN) + breed_list = [] + poultry_hatching = serializer.create(validated_data=request.data) + poultry_hatching.poultry = poultry + if hatching.count() > 0: + poultry_hatching.period = hatching.last().period + 1 + else: + poultry_hatching.period = 1 + if role != None: + poultry_hatching.registrar = { + "role": role, + "fullname": user.fullname, + "date": str(poultry_hatching.create_date) + } + + # poultry_hatching.left_over = poultry_hatching.quantity + breed_list.append({ + 'breed': request.data['chicken_breed'], + 'main_quantity': int(request.data['quantity']), + 'remain_quantity': int(request.data['quantity']) + }) + poultry_hatching.breed = breed_list + poultry_hatching.latest_hatching_change = { + "role": role, + "date": str(datetime.datetime.now().date()), + "full_name": user.fullname + } + poultry_hatching.save() + free_sale = FreeSaleWithinprovince.objects.filter(trash=False, allow=True).first() + if free_sale: + if free_sale.type == 'weight': + poultry_hatching.total_commitment = poultry_hatching.quantity * free_sale.weight + else: + poultry_hatching.total_commitment_quantity = int( + poultry_hatching.quantity * (free_sale.percent / 100)) + + poultry_hatching.save() + + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + + poultry_mobile = poultry_hatching.poultry.user.mobile + poultry_fullname = poultry_hatching.poultry.unit_name + quantity = poultry_hatching.quantity + chicken_breed = poultry_hatching.chicken_breed + date_str = poultry_hatching.date + date = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() + date = jdatetime.datetime.fromgregorian(year=date.year, month=date.month, day=date.day).strftime( + '%Y-%m-%d') + date_list = reversed(date.split('-')) + separate = "-" + date = separate.join(date_list) + if SmsLicense.objects.filter(hatching=True).exists(): + province = poultry_hatching.poultry.user.province.name + city = poultry_hatching.poultry.user.city.name + base_order = poultry_hatching.poultry.user.base_order + province_operator_mobile = province_operator.user.mobile + province_operator_name = province_operator.user.fullname + # hatching_sms(poultry_mobile, poultry_fullname, quantity, chicken_breed, date, province, city, base_order) + operator_hatching_sms(province_operator_mobile, poultry_fullname, quantity, date, chicken_breed, + province, city) + + serializer = self.serializer_class(poultry_hatching) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + hatching = PoultryHatching.objects.get(key=request.data["key"], trash=False) + request.data.pop('key') + if 'violation_check' in request.data.keys(): + if hatching.violation_reporter is not None: + hatching.violation_report_editor = user.fullname + hatching.violation_report_edit_date = datetime.datetime.now() + else: + hatching.violation_reporter = user.fullname + hatching.violation_report_date = datetime.datetime.now() + if request.FILES.get('violation_image_0'): + violation_files = [ + f for i in range(5) + if (f := request.FILES.get(f'violation_image_{i}')) + ] + images = hatching.violation_image + if images: + for image in images: + delete_file_from_liara(image.split('/')[-1]) + violation_images = self.process_violation_images(violation_files) + hatching.violation_image = violation_images + if request.data['archive'] == True: + hatching.allow_hatching = 'True' + hatching.state = 'complete' + hatching.archive_date = datetime.datetime.now() + hatching.archive = True + if hatching.first_date_input_archive is None: + hatching.first_date_input_archive = datetime.datetime.now() + else: + hatching.second_date_input_archive = datetime.datetime.now() + hatching.input_archiver = user.fullname + hatching.save() + request.data.pop('violation_check') + request.data.pop('archive') + if 'unknown' in request.data.keys(): + hatching.poultry.order_limit = False + hatching.poultry.save() + if 'archive_state' in request.data.keys(): + if hatching.left_over > (hatching.quantity * 10): + return Response({'result': 'به دلیل مانده بیش از ده درصد امکان بایگانی کردن این جوجه ریزی را ندارید!'}, + status=status.HTTP_403_FORBIDDEN) + role = request.data['role'] + request.data.pop('role') + request.data.pop('archive_state') + hatching.allow_hatching = True + if hatching.unknown: + hatching.unknown = False + hatching.poultry.order_limit = False + hatching.poultry.save() + hatching.state = 'complete' + hatching.archive_date = datetime.datetime.now() + hatching.archive = True + if hatching.first_date_input_archive is None: + hatching.first_date_input_archive = datetime.datetime.now() + else: + hatching.second_date_input_archive = datetime.datetime.now() + if hatching.left_over > (hatching.quantity * percent_of_losses): + hatching.violation = True + hatching.input_archiver = user.fullname + hatching.last_change = { + "date": str(datetime.datetime.now()), + "full_name": user.fullname, + "role": role, + "type": "manual_archive" + } + hatching.save() + + if 'quantity' in request.data.keys() and request.data['quantity'] != None: + quantity = int(request.data['quantity']) + # poultry_requests_quantity = \ + # PoultryRequest.objects.filter(hatching=hatching, state_process__in=('pending', 'accepted'), + # province_state__in=('pending', 'accepted'), final_state='pending', + # trash=False).aggregate( + # total_quantity=Sum('quantity'))[ + # 'total_quantity'] or 0 + if quantity < hatching.killed_quantity: + # if int(request.data['quantity']) < hatching.left_over: + return Response({"result": "تعداد وارد شده کمتر از تعداد کشتار شده قبلی است."}) + else: + role = request.data['role'] + request.data.pop('role') + # if quantity > hatching.quantity: + # hatching.left_over += quantity - hatching.quantity + # elif quantity < hatching.quantity and hatching.left_over != 0: + # hatching.left_over -= hatching.quantity - quantity + hatching.quantity = quantity + hatching.allow_hatching = 'pending' + hatching.state = 'pending' + # hatching.output_archive_date = datetime.datetime.now() + # hatching.output_archiver = user.fullname + hatching.last_change = { + "date": str(datetime.datetime.now()), + "full_name": user.fullname, + "role": role, + "type": "change_hatching" + } + hatching.save() + free_sale = FreeSaleWithinprovince.objects.filter(trash=False, allow=True).first() + if free_sale: + if free_sale.type == 'weight': + hatching.total_commitment = hatching.quantity * free_sale.weight + else: + hatching.total_commitment_quantity = int(hatching.quantity * (free_sale.percent / 100)) + + hatching.save() + if 'type' in request.data.keys(): + if request.data['type'] == 'return_archive': + if PoultryHatching.objects.filter(poultry=hatching.poultry, hall=hatching.hall, trash=False, + allow_hatching='pending', archive=False + ).exists(): + return Response({"result": "شما در این سالن جوجه ریزی فعال دارید"}, + status=status.HTTP_403_FORBIDDEN) + elif (datetime.datetime.now().date() - hatching.date.date()).days > 85: + return Response({"result": "جوجه ریزی انتخابی بالاتر از 85 روز میباشد،امکان بازگشت وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + else: + hatching.allow_hatching = 'pending' + hatching.state = 'pending' + hatching.archive = False + hatching.chicken_age = (datetime.datetime.now().date() - hatching.date.date()).days + 1 + hatching.output_archive_date = datetime.datetime.now() + hatching.output_archiver = user.fullname + free_sale = FreeSaleWithinprovince.objects.filter(trash=False, allow=True).first() + if free_sale: + if free_sale.type == 'weight': + hatching.total_commitment = hatching.quantity * free_sale.weight + else: + hatching.total_commitment_quantity = int(hatching.quantity * (free_sale.percent / 100)) + + hatching.save() + if 'violation' in request.data.keys(): + if request.data['violation'] == True and hatching.violation == False: + hatching.violation = True + if request.data['violation'] == False and hatching.violation == True: + hatching.violation = False + hatching.save() + request.data.pop('violation') + if 'delete_tenant' in request.data.keys(): + hatching.tenant_fullname = None + hatching.tenant_national_code = None + hatching.tenant_mobile = None + hatching.tenant_city = None + hatching.has_tenant = False + hatching.save() + request.data.pop('delete_tenant') + if 'direct_losses' in request.data.keys(): + if request.data['direct_losses'] > hatching.left_over: + return Response({"result": "تعداد وارد شده از باقی مانده سالن بیشتر است"}, + status=status.HTTP_403_FORBIDDEN) + date = datetime.datetime.now() + if hatching.direct_losses_inputer is None: + hatching.direct_losses_inputer = user.fullname + hatching.direct_losses_date = date + else: + hatching.direct_losses_editor = user.fullname + hatching.direct_losses_last_edit_date = date + hatching.save() + if 'end_period_losses' in request.data.keys(): + if request.data['losses'] > hatching.left_over: + return Response({"result": "تعداد وارد شده از باقی مانده سالن بیشتر است"}, + status=status.HTTP_403_FORBIDDEN) + if request.data['type'] == 'add': + hatching.losses += request.data['losses'] + else: + hatching.losses = request.data['losses'] + + date = datetime.datetime.now() + if hatching.end_period_losses_inputer is None: + hatching.end_period_losses_inputer = user.fullname + hatching.end_period_losses_date = date + else: + hatching.end_period_losses_editor = user.fullname + hatching.end_period_losses_last_edit_date = date + hatching.save() + return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_200_OK) + serializer = self.serializer_class(hatching) + serializer.update(instance=hatching, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع مربوط به نمایش دوره جوجه ریزی مرغدار + def list(self, request, *args, **kwargs): + value = request.GET.get('value') + poultry_hatchings = [] + # refresh(request.user.id) + from datetime import datetime + now = datetime.now().date() + user = SystemUserProfile.objects.get(user=request.user) + + if 'all_active_and_archive' in request.GET: + base_query = PoultryHatching.objects.filter( + trash=False + ).select_related( + 'poultry__user', + 'poultry__address__city', + 'poultry__address__province', + 'chain_company' + ) + + if request.GET.get('role') == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultry_hatchings = base_query.filter( + poultry__city_operator=city_operator.unit_name, + poultry__address__province=user.province + ) + elif request.GET.get('role') in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = base_query.filter( + poultry__address__city=user.city + ) + elif request.GET.get('role') == 'ChainCompany': + poultry_hatchings = base_query.filter( + chain_company__user=user, + poultry__address__province=user.province + ) + else: + poultry_hatchings = base_query.filter( + poultry__address__province=user.province + ) + + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + poultry_hatchings = poultry_hatchings.filter( + date__date__gte=date1, + date__date__lte=date2 + ) + + if 'age1' in request.GET and int(request.GET.get('age2')) > 0: + age1 = int(request.GET['age1']) + age2 = int(request.GET['age2']) + poultry_hatchings = poultry_hatchings.filter( + chicken_age__gte=age1, + chicken_age__lte=age2 + ) + + if 'search' in request.GET and value and value != 'undefined' and value.strip(): + poultry_hatchings = poultry_hatchings.filter( + build_query(self.filterset_class, value) + ) + + poultry_hatchings = poultry_hatchings.order_by('-date') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry_hatchings) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(poultry_hatchings, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + if 'unknown' in request.GET: + base_query = PoultryHatching.objects.filter( + trash=False, unknown=True + ).select_related( + 'poultry__user', + 'poultry__address__city', + 'poultry__address__province', + 'chain_company' + ) + + if request.GET.get('role') == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultry_hatchings = base_query.filter( + poultry__city_operator=city_operator.unit_name, + poultry__address__province=user.province + ) + elif request.GET.get('role') in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = base_query.filter( + poultry__address__city=user.city + ) + elif request.GET.get('role') == 'ChainCompany': + poultry_hatchings = base_query.filter( + chain_company__user=user, + poultry__address__province=user.province + ) + else: + poultry_hatchings = base_query.filter( + poultry__address__province=user.province + ) + + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + poultry_hatchings = poultry_hatchings.filter( + date__date__gte=date1, + date__date__lte=date2 + ) + + if 'age1' in request.GET and int(request.GET.get('age2')) > 0: + age1 = int(request.GET['age1']) + age2 = int(request.GET['age2']) + poultry_hatchings = poultry_hatchings.filter( + chicken_age__gte=age1, + chicken_age__lte=age2 + ) + + if 'search' in request.GET and value and value != 'undefined' and value.strip(): + poultry_hatchings = poultry_hatchings.filter( + build_query(self.filterset_class, value) + ) + + poultry_hatchings = poultry_hatchings.order_by('-date') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry_hatchings) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(poultry_hatchings, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + if 'role' in request.GET: + if 'age1' in request.GET and int(request.GET.get('age2')) > 0: + age1 = int(request.GET.get('age1')) + age2 = int(request.GET.get('age2')) + poultry_hatch = PoultryHatching.objects.filter(trash=False, chicken_age__range=(age1, age2), + unknown=False) + else: + if 'date1' in request.GET: + date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + poultry_hatch = PoultryHatching.objects.filter(trash=False, date__date__gte=date1, + date__date__lte=date2, unknown=False) + else: + poultry_hatch = PoultryHatching.objects.filter(trash=False, unknown=False) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + if 'search' in request.GET: + if 'chain' in request.GET: + if 'archive' in request.GET: + queryset = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, has_chain_company=True, + poultry__city_operator=city_operator.unit_name + ).order_by('-archive_date') + else: + queryset = poultry_hatch.filter(archive=False, allow_hatching='pending', + has_chain_company=True, + poultry__city_operator=city_operator.unit_name) + else: + + if 'archive' in request.GET: + queryset = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, + poultry__city_operator=city_operator.unit_name + ).order_by('-archive_date') + else: + queryset = poultry_hatch.filter(archive=False, allow_hatching='pending', + poultry__city_operator=city_operator.unit_name) + if request.GET['search'] == 'filter': + if value != 'undefined' and value.strip(): + poultry_hatchings = queryset.filter( + build_query(self.filterset_class, value) + ) + else: + poultry_hatchings = queryset + + elif 'archive' in request.GET: + if 'chain' in request.GET: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, has_chain_company=True, + poultry__city_operator=city_operator.unit_name + ).order_by('-archive_date') + else: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, + poultry__city_operator=city_operator.unit_name + ).order_by('-archive_date') + + + else: + if 'chain' in request.GET: + + poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, + has_chain_company=True, + allow_hatching='pending', + poultry__city_operator=city_operator.unit_name).order_by( + 'date') + else: + poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, + allow_hatching='pending', + poultry__city_operator=city_operator.unit_name).order_by( + 'date') + elif request.GET['role'] == 'ChainCompany': + if 'search' in request.GET: + if 'chain' in request.GET: + if 'archive' in request.GET: + queryset = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, has_chain_company=True, + chain_company__user=user + ).order_by('-archive_date') + else: + queryset = poultry_hatch.filter(archive=False, allow_hatching='pending', + has_chain_company=True, + chain_company__user=user) + else: + + if 'archive' in request.GET: + queryset = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, + chain_company__user=user + ).order_by('-archive_date') + else: + queryset = poultry_hatch.filter(archive=False, allow_hatching='pending', + chain_company__user=user) + if request.GET['search'] == 'filter': + if value != 'undefined' and value.strip(): + poultry_hatchings = queryset.filter( + build_query(self.filterset_class, value) + ) + else: + poultry_hatchings = queryset + + elif 'archive' in request.GET: + if 'chain' in request.GET: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, has_chain_company=True, + chain_company__user=user + ).order_by('-archive_date') + else: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, + chain_company__user=user + ).order_by('-date') + + + else: + if 'chain' in request.GET: + + poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, + has_chain_company=True, + allow_hatching='pending', + chain_company__user=user).order_by( + 'date') + else: + poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, + allow_hatching='pending', + chain_company__user=user).order_by( + 'date') + else: + if 'search' in request.GET: + + if 'archive' in request.GET: + if 'chain' in request.GET: + if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__city=user.city, has_chain_company=True, + + ).order_by('-archive_date') + else: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, has_chain_company=True, + + ).order_by('-archive_date') + else: + + if request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__city=user.city, trash=False + + ).order_by('-archive_date') + else: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, trash=False + ).order_by('-archive_date') + else: + if 'chain' in request.GET: + if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = poultry_hatch.filter(archive=False, allow_hatching='pending', + poultry__address__city=user.city, + has_chain_company=True, trash=False + ) + else: + + poultry_hatchings = poultry_hatch.filter(archive=False, allow_hatching='pending', + poultry__address__province=user.province, + has_chain_company=True, trash=False + ) + else: + + if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = poultry_hatch.filter(archive=False, allow_hatching='pending', + poultry__address__city=user.city, + ).order_by('date') + else: + + poultry_hatchings = poultry_hatch.filter(archive=False, allow_hatching='pending', + + ).order_by('date') + + if request.GET['search'] == 'filter': + poultry_hatchings_list = [] + if value != 'undefined' and value.strip(): + poultry_hatchings = poultry_hatchings.filter( + build_query(self.filterset_class, value) + ) + else: + poultry_hatchings = poultry_hatchings + + elif 'archive' in request.GET: + if 'chain' in request.GET: + if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__city=user.city, has_chain_company=True, + + ).order_by('-archive_date') + else: + + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, has_chain_company=True, + ).order_by('-archive_date') + else: + + if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__city=user.city, + ).order_by('-date') + else: + + poultry_hatchings = poultry_hatch.filter( + Q(allow_hatching='True', state='complete') | Q(archive=True), + poultry__address__province=user.province, + ).order_by('-date') + + else: + if 'chain' in request.GET: + if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = poultry_hatch.filter(poultry__address__city=user.city, + archive=False, has_chain_company=True, + allow_hatching='pending').order_by( + 'date') + else: + + poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, + archive=False, has_chain_company=True, + allow_hatching='pending').order_by( + 'date') + else: + + if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = poultry_hatch.filter(poultry__address__city=user.city, + archive=False, + allow_hatching='pending').order_by( + 'date') + else: + poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, + archive=False, + allow_hatching='pending').order_by( + 'date') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry_hatchings) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(poultry_hatchings, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + elif 'illegal' in request.GET: + poultry_hatching = PoultryHatching.objects.filter(poultry__address__province=user.province, + archive=True).order_by('date') + serializer = PoultryHatchingSerializer(poultry_hatching, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'forecast' in request.GET: + hatch_quantity = 0 + hatch_losses = 0 + from datetime import datetime + date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() + date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() + hatchs = PoultryHatching.objects.filter(state='pending', + poultry__address__province=user.province) + if hatchs.count() > 0: + for hatch in hatchs: + if date1.year <= hatch.date.year and date1.month <= hatch.date.month and date1.day <= hatch.date.day and hatch.date.year >= date2.year and hatch.date.month >= date2.month and hatch.date.day >= date2.day: + hatch_quantity += hatch.quantity - (hatch.quantity * 0.1) + hatch_losses += hatch.losses + return Response({"hatch_quantity": hatch_quantity, "hatch_losses": hatch_losses}) + + elif 'filter' in request.GET: + now = datetime.now().date() + quantity_1_5 = 0 + quantity_5_10 = 0 + quantity_10_15 = 0 + quantity_15_20 = 0 + quantity_20_25 = 0 + quantity_25_30 = 0 + quantity_30_35 = 0 + quantity_35_40 = 0 + quantity_40_45 = 0 + quantity_45_50 = 0 + quantity_50_55 = 0 + quantity_55_60 = 0 + hatching = PoultryHatching.objects.filter(state='pending') + if hatching.count() > 0: + for hatch in hatching: + age = (now - hatch.date.date()).days + 1 + if age >= 1 and age <= 5: + quantity_1_5 += hatch.quantity + elif age >= 5 and age <= 10: + quantity_5_10 += hatch.quantity + elif age >= 10 and age <= 15: + quantity_10_15 += hatch.quantity + elif age >= 15 and age <= 20: + quantity_15_20 += hatch.quantity + elif age >= 20 and age <= 25: + quantity_20_25 += hatch.quantity + elif age >= 25 and age <= 30: + quantity_25_30 += hatch.quantity + elif age >= 30 and age <= 35: + quantity_30_35 += hatch.quantity + elif age >= 35 and age <= 40: + quantity_35_40 += hatch.quantity + elif age >= 40 and age <= 45: + quantity_40_45 += hatch.quantity + elif age >= 45 and age <= 50: + quantity_45_50 += hatch.quantity + elif age >= 50 and age <= 55: + quantity_50_55 += hatch.quantity + elif age >= 55 and age <= 60: + quantity_55_60 += hatch.quantity + out_put = { + 'quantity_1_5': quantity_1_5, + 'quantity_5_10': quantity_5_10, + 'quantity_10_15': quantity_10_15, + 'quantity_15_20': quantity_15_20, + 'quantity_20_25': quantity_20_25, + 'quantity_25_30': quantity_25_30, + 'quantity_30_35': quantity_30_35, + 'quantity_35_40': quantity_35_40, + 'quantity_40_45': quantity_40_45, + 'quantity_45_50': quantity_45_50, + 'quantity_50_55': quantity_50_55, + 'quantity_55_60': quantity_55_60, + + } + return Response(out_put, status=status.HTTP_200_OK) + elif 'age' in request.GET: + poultry = [] + poultry_hatching = PoultryHatching.objects.filter(state='pending') + now = datetime.now().date() + if poultry_hatching.count() > 0: + for hatch in poultry_hatching: + age = (now - hatch.date.date()).days + 1 + if age >= int(request.GET['age1']) and age <= int(request.GET['age2']): + if hatch.poultry in poultry: + pass + else: + poultry.append(hatch.poultry) + serializer = PoultrySerializer(poultry, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'amar' in request.GET: + now = datetime.now().date() + total_list = [] + l1 = [] + chickenbreed_list = ['وارداتی', 'آرین', 'راس', 'آربراکرز(آپلاس)', 'کاب', 'هوبارد', 'ترکیبی'] + for city in City.objects.all(): + for breed in chickenbreed_list: + quantity_1_5 = 0 + quantity_1_5_losses = 0 + quantity_5_10 = 0 + quantity_5_10_losses = 0 + quantity_10_15 = 0 + quantity_10_15_losses = 0 + quantity_15_20 = 0 + quantity_15_20_losses = 0 + quantity_20_25 = 0 + quantity_20_25_losses = 0 + quantity_25_30 = 0 + quantity_25_30_losses = 0 + quantity_30_35 = 0 + quantity_30_35_losses = 0 + quantity_35_40 = 0 + quantity_35_40_losses = 0 + quantity_40_45 = 0 + quantity_40_45_losses = 0 + quantity_45_50 = 0 + quantity_45_50_losses = 0 + quantity_50_55 = 0 + quantity_50_55_losses = 0 + quantity_55_60 = 0 + quantity_55_60_losses = 0 + hatchs = PoultryHatching.objects.filter(state='pending', poultry__address__city=city, + chicken_breed=breed) + if hatchs.count() > 0: + for hatch in hatchs: + age = (now - hatch.date.date()).days + 1 + if age >= 1 and age <= 5: + quantity_1_5 += hatch.quantity + quantity_1_5_losses += hatch.losses + elif age >= 5 and age <= 10: + quantity_5_10 += hatch.quantity + quantity_5_10_losses += hatch.losses + elif age >= 10 and age <= 15: + quantity_10_15 += hatch.quantity + quantity_10_15_losses += hatch.losses + elif age >= 15 and age <= 20: + quantity_15_20 += hatch.quantity + quantity_15_20_losses += hatch.losses + elif age >= 20 and age <= 25: + quantity_20_25 += hatch.quantity + quantity_20_25_losses += hatch.losses + elif age >= 25 and age <= 30: + quantity_25_30 += hatch.quantity + quantity_25_30_losses += hatch.quantity + elif age >= 30 and age <= 35: + quantity_30_35 += hatch.quantity + quantity_30_35_losses += hatch.losses + elif age >= 35 and age <= 40: + quantity_35_40 += hatch.quantity + quantity_35_40_losses += hatch.losses + elif age >= 40 and age <= 45: + quantity_40_45 += hatch.quantity + quantity_40_45_losses += hatch.losses + elif age >= 45 and age <= 50: + quantity_45_50 += hatch.quantity + quantity_45_50_losses += hatch.losses + elif age >= 50 and age <= 55: + quantity_50_55 += hatch.quantity + quantity_50_55_losses += hatch.losses + elif age >= 55 and age <= 60: + quantity_55_60 += hatch.quantity + quantity_55_60_losses += hatch.losses + internal_dict = { + 'quantity_1_5': quantity_1_5, + 'quantity_1_5_losses': quantity_1_5_losses, + 'quantity_5_10': quantity_5_10, + 'quantity_5_10_losses': quantity_5_10_losses, + 'quantity_10_15': quantity_10_15, + 'quantity_10_15_losses': quantity_10_15_losses, + 'quantity_15_20': quantity_15_20, + 'quantity_15_20_losses': quantity_15_20_losses, + 'quantity_20_25': quantity_20_25, + 'quantity_20_25_losses': quantity_20_25_losses, + 'quantity_25_30': quantity_25_30, + 'quantity_25_30_losses': quantity_25_30_losses, + 'quantity_30_35': quantity_30_35, + 'quantity_30_35_losses': quantity_30_35_losses, + 'quantity_35_40': quantity_35_40, + 'quantity_35_40_losses': quantity_35_40_losses, + 'quantity_40_45': quantity_40_45, + 'quantity_40_45_losses': quantity_40_45_losses, + 'quantity_45_50': quantity_45_50, + 'quantity_45_50_losses': quantity_45_50_losses, + 'quantity_50_55': quantity_50_55, + 'quantity_50_55_losses': quantity_50_55_losses, + 'quantity_55_60': quantity_55_60, + 'quantity_55_60_losses': quantity_55_60_losses, + + } + l1.append({breed: internal_dict}) + + total_list.append({city.name: l1}) + l1 = [] + + return Response(total_list, status=status.HTTP_200_OK) + + # list of self poultry houses + elif 'key' in request.GET: + poultry = Poultry.objects.get(key=request.GET['key'], trash=False) + if 'hall' in request.GET: + poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, hall=int(request.GET['hall']), + state='pending', trash=False).order_by('date') + elif 'increase' in request.GET: + poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, state='pending', + trash=False).order_by('date') + else: + poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, state='pending', left_over__gt=0, + trash=False).order_by('date') + + elif 'role' in request.GET: + if 'age1' in request.GET and int(request.GET.get('age2')) > 0: + age1 = int(request.GET.get('age1')) + age2 = int(request.GET.get('age2')) + poultry_hatch = self.queryset.filter(trash=False, chicken_age__range=(age1, age2)) + else: + poultry_hatch = self.queryset.filter(trash=False) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=SystemUserProfile.objects.get(user=request.user)) + city = city_operator.address.city + city_unit_list = [] + city_units = CityUnit.objects.filter(city=city) + for city in city_units: + city_unit_list.append(city.name) + poultry_hatching = poultry_hatch.filter(poultry__address__city__name__in=city_unit_list, + state__in=('pending', 'complete'), + trash=False).order_by( + '-create_date') + else: + poultry_hatching = poultry_hatch.filter(poultry__address__province=user.province, + # state__in=('pending', 'complete'), + trash=False).order_by( + '-create_date') + else: + user = SystemUserProfile.objects.get(user=request.user, trash=False) + poultry = Poultry.objects.filter(user=user, trash=False) + + if poultry.count() > 1: + list1 = [] + for p in poultry: + list1.append(p.id) + poultry_hatching = PoultryHatching.objects.filter(poultry_id__in=list1, trash=False).order_by( + 'date') + + else: + + poultry_hatching = PoultryHatching.objects.filter(poultry=poultry.last(), trash=False).order_by( + 'date') + serializer = PoultryHatchingSerializer(poultry_hatching, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + queryset = PoultryHatching.objects.get(key__exact=request.GET["key"], trash=False) + vet_farm_inspection = VetFarmInspection.objects.filter(poultry_hatching=queryset, trash=False) + poultry_request = PoultryRequest.objects.filter(hatching=queryset, trash=False) + if vet_farm_inspection.count() > 0: + return Response({"result": "object has inspection"}, status=status.HTTP_400_BAD_REQUEST) + elif poultry_request.count() > 0: + return Response({"result": "object has poultry_request"}, status=status.HTTP_403_FORBIDDEN) + queryset.trash = True + queryset.save() + # queryset.delete() + return Response({"result": "object deleted"}, status=status.HTTP_200_OK) + + +class PoultryHatchingForPredictionViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryHatchingForPredictionSerializer + pagination_class = CustomPagination + filterset_class = PoultryHatchingFilterSet + filterset_fields = [ + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__user__mobile', + 'poultry__unit_name', + 'poultry__address__city__name', + 'chicken_age', + 'poultry__breeding_unique_id', + 'poultry__city_operator', + + ] + + def list(self, request, *args, **kwargs): + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'hatching_list' in request.GET: + poultry_hatchings = PoultryHatching.objects.filter( + id__in=(request.GET['hatching_list']).split(',')).order_by('date') + else: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', + state='pending', + poultry__city_operator=city_operator.unit_name, + trash=False).order_by('date') + + elif request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', + state='pending', + poultry__address__city=user.city, + trash=False).order_by('date') + + else: + poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', + state='pending', + trash=False).order_by('date') + + if 'search' in request.GET: + hatching_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=poultry_hatchings + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=poultry_hatchings) + hatching_list = ps.filter() + poultry_hatchings = [] if len(hatching_list) == 0 else hatching_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry_hatchings) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(poultry_hatchings, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryHatchingForPredictionDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryHatchingForPredictionSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', + poultry__city_operator=city_operator.unit_name, + trash=False).order_by('date') + + elif request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: + poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', + poultry__address__city=user.city, + trash=False).order_by('date') + + else: + poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', + trash=False).order_by('date') + + now_ages = poultry_hatchings.aggregate(total=Sum('now_age'))['total'] or 0 + total_hatching_quantity = poultry_hatchings.aggregate(total=Sum('quantity'))['total'] or 0 + total_hatching_left_over = poultry_hatchings.aggregate(total=Sum('left_over'))['total'] or 0 + ave_now_age = now_ages / len(poultry_hatchings) if len(poultry_hatchings) > 0 else 0 + sum_age = 0 + ave_age = 0 + ave_weight = 0 + counter = 0 + poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + out_province_request_cancel=False, + hatching__in=poultry_hatchings) + for poultry_request in poultry_requests: + sum_age += (poultry_request.send_date.date() - poultry_request.hatching.date.date()).days + 1 + counter += 1 + ave_age = int(sum_age / counter) if counter > 0 else 0 + + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), + province_request__poultry_request__hatching__in=poultry_hatchings, + first_car_allocated_quantity=0, + return_to_province=False) + + province_kill_requests_quantity = \ + province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 + + province_kill_requests_weight = \ + province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__hatching__in=poultry_hatchings) + + kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + kill_house__requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + + total_quantity = province_kill_requests_quantity + kill_house_requests_quantity + total_weight = province_kill_requests_weight + kill_house__requests_weight + + ave_weight = round(total_weight / total_quantity, 2) if total_quantity > 0 else 0 + + result = { + "hatchings": len(poultry_hatchings), + "total_hatching_quantity": total_hatching_quantity, + "total_hatching_left_over": total_hatching_left_over, + "ave_age": ave_age, "ave_now_age": ave_now_age, + "ave_weight": ave_weight, + "province_kill_requests": len(province_kill_requests), + "province_kill_requests_quantity": province_kill_requests_quantity, + "province_kill_requests_weight": province_kill_requests_weight, + "kill_house_requests": len(kill_house_requests), + "kill_house_requests_quantity": kill_house_requests_quantity, + "kill_house__requests_weight": kill_house__requests_weight, + "total_quantity": total_quantity, + "total_weight": total_weight + } + + return Response(result, status=status.HTTP_200_OK) + + +class PoultryHatchingForPredictionChartViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryHatchingForPredictionSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + consumption_limit_type = request.GET.get('consumption_limit_type') + consumption_limit = request.GET.get('consumption_limit') + killing_age_external_type = request.GET.get('killing_age_external_type') + killing_age_internal_type = request.GET.get('killing_age_internal_type') + killing_age = request.GET.get('killing_age') + time_frame_type = request.GET.get('time_frame_type') + date1 = request.GET.get('date1') + date2 = request.GET.get('date2') + date_list = [] + final_list = [] + + poultries = Poultry.objects.filter(killing_ave_age__gt=1, trash=False) + if killing_age_external_type == 'poultry_ave_killing_age': + if killing_age_internal_type == 'poultry': + if time_frame_type == 'all': + hatchings = PoultryHatching.objects.filter(trash=False, state='pending', + archive=False, temporary_trash=False, + temporary_deleted=False, predicate_date__isnull=False) + date_list = hatchings.values_list('predicate_date', flat=True).distinct() + for date in date_list: + n_hatchings = hatchings.filter(predicate_date=date) + poultries = Poultry.objects.filter(pk__in=n_hatchings.values_list('poultry', flat=True)) + ages = poultries.values_list('killing_ave_age', flat=True).distinct() + + index_weight = poultries.aggregate(total=Sum('real_killing_ave_weight'))[ + 'total'] or 0 + quantity = n_hatchings.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + + result = { + "date": date, + "quantity": quantity, + "poultry": len(poultries), + "age": ages, + "hatchings": n_hatchings.values_list('id', flat=True), + "weight": int(quantity * index_weight) if consumption_limit_type in ( + 'quantity', 'live_weight') else int((quantity * index_weight) * 0.75), + } + final_list.append(result) + + else: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + hatchings = PoultryHatching.objects.filter(trash=False, state='pending', + archive=False, temporary_trash=False, + temporary_deleted=False, predicate_date__date__gte=date1, + predicate_date__date__lte=date2) + # poultries = poultries.filter(date__gte=date1,date__lte=date2).order_by('date') + date_list = poultries.values_list('date', flat=True).distinct() + + for date in date_list: + n_hatchings = hatchings.filter(predicate_date__date=date) + poultries = Poultry.objects.filter(pk__in=n_hatchings.values_list('poultry', flat=True)) + ages = poultries.values_list('killing_ave_age', flat=True).distinct() + + index_weight = poultries.aggregate(total=Sum('real_killing_ave_weight'))[ + 'total'] or 0 + quantity = n_hatchings.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + result = { + "date": date, + "quantity": quantity, + "poultry": len(poultries.filter(date=date)), + "age": ages, + "hatchings": n_hatchings.values_list('id', flat=True), + "weight": int(quantity * index_weight) if consumption_limit_type in ( + 'quantity', 'live_weight') else int((quantity * index_weight) * 0.75), + } + final_list.append(result) + + else: + sum_of_ages = poultries.aggregate(total=Sum('killing_ave_age'))[ + 'total'] or 0 + ave_killing_age = int(sum_of_ages / len(poultries)) + if time_frame_type == 'all': + final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type) + + + else: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type, date1, date2) + + else: + if killing_age_internal_type == 'poultry': + if time_frame_type == 'all': + final_list = poultry_prediction_helper(int(killing_age), consumption_limit_type) + # poultries = poultries.filter(killing_ave_age=int(killing_age)) + # date_list = poultries.values_list('date', flat=True).distinct() + # for date in date_list: + # index_weight = poultries.filter(date=date).aggregate(total=Sum('killing_ave_weight'))[ + # 'total'] or 0 + # quantity = poultries.filter(date=date).aggregate(total=Sum('active_left_over'))[ + # 'total'] or 0 + # + # result = { + # "date": date, + # "quantity": quantity, + # "poultry": len(poultries.filter(date=date)), + # "age": int(killing_age), + # "wight": quantity * index_weight, + # } + # final_list.append(result) + + else: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + final_list = poultry_prediction_helper(int(killing_age), consumption_limit_type, date1, date2) + + # poultries = poultries.filter(killing_ave_age=int(killing_age),date__gte=date1,date__lte=date2) + # date_list = poultries.values_list('date', flat=True) + # for date in date_list: + # index_weight = poultries.filter(date=date).aggregate(total=Sum('killing_ave_weight'))[ + # 'total'] or 0 + # quantity = poultries.filter(date=date).aggregate(total=Sum('active_left_over'))[ + # 'total'] or 0 + # + # result = { + # "date": date, + # "quantity": quantity, + # "poultry": len(poultries.filter(date=date)), + # "age": int(killing_age), + # "wight": quantity * index_weight, + # } + # final_list.append(result) + + else: + + ave_killing_age = int(killing_age) + + if time_frame_type == 'all': + final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type) + + + + else: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type, date1, date2) + + return Response(final_list) + + +class PoultryTenantViewSet(viewsets.ModelViewSet): + queryset = PoultryTenant.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryTenantSerializer + + +# ویوست مربوط به ثبت و نمایش و ... درخواست بورسی مرغدار +class PoultryRequestExchangeViewSet(viewsets.ModelViewSet): + queryset = PoultryRequestExchange.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryRequestExchangeSerializer + + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryRequestExchangeFilterSet + filterset_fields = [ + 'quantity', + 'send_date', + 'chicken_breed', + 'Index_weight', + 'fee', + 'age', + ] + + # تابع مربوط به ثبت درخواست بورسی مرغدار + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + user = UserProfile.objects.get(user=request.user, trash=False) + send_date = request.data['send_date'] + hatching_date = request.data['hatching_date'] + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + poultry_request_exchange = serializer.create(validated_data=request.data) + send_date = datetime.strptime(send_date, '%Y-%m-%d %H:%M:%S').date() + hatching_date = datetime.strptime(hatching_date, '%Y-%m-%d %H:%M:%S').date() + poultry_request_exchange.age = (send_date - hatching_date).days + poultry_request_exchange.user = user + poultry_request_exchange.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع مربوط به نمایش درخواست بورسی مرغدار + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + queryset = [] + list1 = [] + values_item = [] + query_list = [] + query_dictionary = {} + query_list_obj = [] + filter_list = [] + obj_list = [] + q2 = [] + + if 'operator' in request.GET: + if request.GET['operator'] == 'kill_house': + chicken_breed = request.GET['chicken_breed'].split(",") + send_date1 = request.GET['send_date1'].strip() + send_date2 = request.GET['send_date2'].strip() + send_date1 = datetime.strptime(send_date1, '%Y-%m-%d').date() + send_date2 = datetime.strptime(send_date2, '%Y-%m-%d').date() + q = PoultryRequestExchange.objects.filter(chicken_breed__in=chicken_breed, trash=False).order_by( + 'fee') + for x in q: + if x.send_date.date() >= send_date1 and x.send_date.date() <= send_date2: + q2.append(x) + serializer = self.serializer_class(q2, many=True) + return Response(serializer.data) + + if 'type' in request.GET: + if request.GET['type'] == 'filter': + if request.GET['value'] != "": + d1 = request.GET['value'].split(",") + for item in self.filterset_fields: + for x in d1: + query = QueryDict('{0}__contains={1}'.format(item, x)) + if (self.filterset_class(data=query, queryset=self.queryset.all())).filter(): + query_list.append(query) + + for i in query_list: + for key, value in i.items(): + query_dictionary[key] = value + if len(d1) != len(query_dictionary): + pass + else: + for i in PoultryRequestExchange.objects.filter(**query_dictionary): + query_list_obj.append(i) + + if 'age_period' in request.GET: + if request.GET['age_period'] != "": + age_split = request.GET['age_period'].split(',') + for item in self.queryset: + if int(age_split[0]) <= item.age <= int(age_split[1]): + obj_list.append(item) + for i in obj_list: + for j in query_list_obj: + if i == j: + filter_list.append(i) + query_list_obj.clear() + for i in filter_list: + query_list_obj.append(i) + + serializer = self.serializer_class(query_list_obj, many=True) + return Response(serializer.data) + return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN) + + queryset = PoultryRequestExchange.objects.all() + serializer = self.serializer_class(queryset, many=True) + return Response(serializer.data) + + +# ویوست مربوط به تایید یا رد درخواست بورسی رزرو شده توسط کشتارگاه برای درخواست بورسی مرغدار +class PoultryRequestExchangeAcceptViewSet(viewsets.ModelViewSet): + queryset = PoultryRequestExchangeAccept.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryRequestExchangeAcceptSerializer + + # تابع مربوط به تایید یا رد درخواست بورسی رزرو شده توسط کشتارگاه برای درخواست بورسی مرغدار + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + poultry_exchange = PoultryRequestExchange.objects.get(key=request.data['poultry_request_key'], trash=False) + kill_house_exchange_reserve = KillHouseRequestExchangeReserve.objects.get( + key=request.data['kill_house_request_key'], trash=False) + request.data.pop('poultry_request_key') + request.data.pop('kill_house_request_key') + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + poultry_request_exchange_accept = serializer.create(validated_data=request.data) + poultry_request_exchange_accept.poultry_request_exchange = poultry_exchange + poultry_request_exchange_accept.kill_house_request_exchange_reserve = kill_house_exchange_reserve + poultry_request_exchange_accept.save() + if poultry_request_exchange_accept.state == 'accepted': + poultry_exchange.quantity -= kill_house_exchange_reserve.quantity + poultry_exchange.state = 'pending' + poultry_exchange.save() + kill_house_exchange_reserve.state = 'accepted' + else: + kill_house_exchange_reserve.state = 'rejected' + + kill_house_exchange_reserve.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + +# ویوست مربوط به ثبت و نمایش و ... درخواست مرغدار + +class PoultryRequestForLetterViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + date = datetime.datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() + poultry_requests = PoultryRequest.objects.filter(send_date__date=date, + quantity__gt=F('remain_quantity'), + trash=False) + serializer = PoultryRequestLetterTotalSerializer(poultry_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class CancelOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.filter(out=True, trash=False) + serializer_class = PoultryRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def update(self, request, pk=None, *args, **kwargs): + date = datetime.datetime.now() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.data['role'] + poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) + if poultry_request.quarantine_code != None: + return Response({"result": "به علت ورود کد قرنطینه امکان لغو وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + if poultry_request.wage_pay == True: + return Response({"result": "به علت پرداخت امکان لغو وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + poultry_request.out_province_request_cancel = True + poultry_request.out_province_request_canceller = { + "role": role, + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(date), + } + poultry_request.save() + if poultry_request.province_state == 'accepted': + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + hatching.out_province_killed_weight -= int(poultry_request.quantity * poultry_request.Index_weight) + hatching.out_province_killed_quantity -= poultry_request.quantity + hatching.save() + return Response({"result": "با موفقیت ثیت شد"}, status=status.HTTP_200_OK) + + +class OutProvincePoultryRequestViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.filter(out=True, trash=False) + serializer_class = PoultryRequestoutProvinceSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryRequestFilterSet + filterset_fields = [ + 'order_code', + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__address__city__name', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() + state = request.GET['state'] + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False).order_by('-send_date') + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + if state == 'pending': + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + + + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: + if request.GET['state'] == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='rejected', + province_state='rejected', + has_wage=True, wage_pay=False, + out_province_request_cancel=True, archive=True) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=True, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='accepted', province_state='accepted', final_state='archive', + has_wage=True, wage_pay=False, out_province_request_cancel=True), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + trash=False).order_by('-send_date') + + if 'search' in request.GET: + poultry_request_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=poultry_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=poultry_requests) + poultry_request_list = ps.filter() + poultry_requests = [] if len(poultry_request_list) == 0 else poultry_request_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry_requests) + if page is not None: + serializer = PoultryRequestoutProvinceSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = PoultryRequestoutProvinceSerializer(poultry_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) + poultry_request.out_province_driver_info['driverhealthCode'] = request.data['driver_health_code'] + poultry_request.save() + return Response({"result": "با موفقیت ثیت شد"}, status=status.HTTP_200_OK) + + +class OutProvincePoultryRequestDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.filter(out=True, trash=False) + serializer_class = PoultryRequestoutProvinceSerializer + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryRequestFilterSet + filterset_fields = [ + 'order_code', + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__address__city__name', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + poultry_requests = PoultryRequest.objects.filter( + poultry__in=poultries, + out=True, + temporary_trash=False, + temporary_deleted=False, + trash=False).order_by('-send_date') + + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + poultry_requests = PoultryRequest.objects.filter( + poultry__city_operator=city_operator.unit_name, + temporary_trash=False, + temporary_deleted=False, + out=True, + trash=False).order_by('-send_date') + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultry_requests = PoultryRequest.objects.filter( + poultry__address__city=user.city, + temporary_trash=False, + temporary_deleted=False, + out=True, + trash=False).order_by('-send_date') + + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: + poultry_requests = PoultryRequest.objects.filter( + out=True, + temporary_trash=False, + temporary_deleted=False, + trash=False).order_by('-send_date') + if 'date1' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + poultry_requests = poultry_requests.filter(send_date__date__gte=date1, send_date__date__lte=date2) + + if 'search' in request.GET: + poultry_request_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=poultry_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=poultry_requests) + poultry_request_list = ps.filter() + poultry_requests = [] if len(poultry_request_list) == 0 else poultry_request_list + + poultry = Poultry.objects.filter(trash=False, pk__in=poultry_requests.values_list('poultry', flat=True)) + total_out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_out_province_poultry_request_weight = \ + poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + accepted_poultry_requests_with_out_wage = poultry_requests.filter( + state_process='accepted', province_state='accepted', final_state='archive', + out_province_request_cancel=False, has_wage=False, wage_pay=False, + ) + + total_accepted_poultry_request_quantity_with_out_wage = \ + accepted_poultry_requests_with_out_wage.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + + total_accepted_poultry_request_weight_with_out_wage = \ + accepted_poultry_requests_with_out_wage.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + paid_poultry_requests = poultry_requests.filter( + state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True, out_province_request_cancel=False + ) + + total_paid_poultry_request_quantity = paid_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + + total_paid_poultry_request_weight = \ + paid_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + result = { + "poultries": len(poultry), + "total_number_of_poultry_request": len(poultry_requests), + "total_poultry_request_quantity": total_out_province_poultry_request_quantity, + "total_poultry_request_weight": total_out_province_poultry_request_weight, + "total_number_of_accepted_poultry_request_with_out_wage": len(accepted_poultry_requests_with_out_wage), + "total_accepted_poultry_request_quantity_with_out_wage": total_accepted_poultry_request_quantity_with_out_wage, + "total_accepted_poultry_request_weight_with_out_wage": total_accepted_poultry_request_weight_with_out_wage, + "total_number_of_accepted_poultry_request_with_wage": len(paid_poultry_requests), + "total_accepted_poultry_request_quantity_with_wage": total_paid_poultry_request_quantity, + "total_accepted_poultry_request_weight_with_wage": total_paid_poultry_request_weight, + "total_number_of_accepted_poultry_request": len(accepted_poultry_requests_with_out_wage) + len( + paid_poultry_requests), + "total_accepted_poultry_request_quantity": total_paid_poultry_request_quantity + total_accepted_poultry_request_quantity_with_out_wage, + "total_accepted_poultry_request_weight": total_paid_poultry_request_weight + total_accepted_poultry_request_weight_with_out_wage, + + } + + return Response(result, status=status.HTTP_200_OK) + + +class ParentCompanyOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.filter(out=True, trash=False) + serializer_class = PoultryRequestoutProvinceSerializer + permission_classes = [AllowAny] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryRequestFilterSet + filterset_fields = [ + 'order_code', + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__address__city__name', + + ] + + def list(self, request, *args, **kwargs): + state = request.GET['state'] + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if request.GET['state'] == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='rejected', + province_state='rejected', + has_wage=True, wage_pay=False, + out_province_request_cancel=True, archive=True) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=True, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='accepted', province_state='accepted', final_state='archive', + has_wage=True, wage_pay=False, out_province_request_cancel=True), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + trash=False).order_by('-send_date') + + if 'search' in request.GET: + poultry_request_list = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "" and request.GET['value'] != 'undefined': + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (self.filterset_class( + data=query, + queryset=poultry_requests + ) + ).filter(): + ps = self.filterset_class(data=query, queryset=poultry_requests) + poultry_request_list = ps.filter() + poultry_requests = [] if len(poultry_request_list) == 0 else poultry_request_list + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(poultry_requests) + if page is not None: + serializer = PoultryRequestoutProvinceSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = PoultryRequestoutProvinceSerializer(poultry_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class TemporaryOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.filter(out=True, trash=False) + serializer_class = PoultryRequestoutProvinceSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + + + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + serializer = PoultryRequestoutProvinceSerializer(poultry_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def update(self, request, pk=None, *args, **kwargs): + poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) + poultry_request.out_province_driver_info['driverhealthCode'] = request.data['driver_health_code'] + poultry_request.save() + return Response({"result": "با موفقیت ثیت شد"}, status=status.HTTP_200_OK) + + +class PoultryRequestViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestSerializer + pagination_class = CustomPagination + permission_classes = [TokenHasReadWriteScope] + filter_backends = [DjangoFilterBackend] + # filterset_class = PoultryRequestFilterSet + filterset_fields = [ + 'order_code', + 'poultry__user__mobile', + 'poultry__user__fullname', + 'poultry__user__first_name', + 'poultry__user__last_name', + 'poultry__address__city__name', + + ] + + # تابع مربوط به ثبت درخواست مرغدار + def create(self, request, *args, **kwargs): + request_buyer = None + traffic_codes = None + vet = None + if 'kill_req_key' in request.data.keys(): + if request.data['kill_req_key'] is not None: + kill_request = KillRequest.objects.get(key=request.data['kill_req_key']) + if request.data['quantity'] > (kill_request.kill_capacity - kill_request.remain_quantity_for_poultry): + return Response({"result": "تعداد وارد شده از باقی مانده ظرفیت کشتارگاه انتخابی بیشتر است!"}, + status=status.HTTP_403_FORBIDDEN) + kill_request.remain_quantity_for_poultry += request.data['quantity'] + kill_request.save() + request.data.pop('kill_req_key') + wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() + time_range = TimeRange.objects.filter(trash=False).first() + if time_range: + time = next( + (t for t in time_range.time_range if t.get("name") == "poultry_request" and t.get("active", False)), + None) + if time: + + start_hour = datetime.datetime.strptime(time.get("start", 0), "%H:%M:%S").time() + end_hour = datetime.datetime.strptime(time.get("end", 0), "%H:%M:%S").time() + current_hour = datetime.datetime.now().time().replace(second=0, microsecond=0) + if not (start_hour < current_hour < end_hour): + return Response( + {"result": "لطفا در ساعات مجاز برای ثبت درخواست اقدام نمایید!"}, + status=status.HTTP_403_FORBIDDEN) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + last_poultry_request = PoultryRequest.objects.all() + if last_poultry_request.count() > 0: + general_order_code = last_poultry_request.last().general_order_code + 1 + else: + general_order_code = 1 + + now_request_date = datetime.datetime.now().date() + now = datetime.datetime.now().time() + now_hour = HourLimit.objects.all() + if now_hour.count() > 0: + now_hour = now_hour.last() + if now_hour.active == True: + request_date = datetime.datetime.strptime(request.data['send_date'], '%Y-%m-%d').date() + if request_date.year >= now_request_date.year and request_date.month >= now_request_date.month and request_date.day > now_request_date.day: + pass + + else: + if now.hour >= now_hour.hour: + text = 'زمان ثبت درخواست کشتار درامروز تا ساعت {0} بوده است. شما میتوانید برای تاریخ های آینده درخواست ثبت نمایید ! '.format( + now_hour.hour) + if 'role' not in request.data.keys(): + return Response({'result': text}, status=status.HTTP_403_FORBIDDEN) + poultry_hatching = PoultryHatching.objects.get(key=request.data['poultry_hatching_key'], trash=False) + vet = VetFarm.objects.filter(poultry=poultry_hatching.poultry, trash=False).last() + free_sale_with_province = FreeSaleWithinprovince.objects.filter(trash=False).first() + if poultry_hatching.poultry.order_limit: + return Response( + {"result": "امکان ثبت کشتار برای مرغدار وجود ندارد جهت اطلاعات بیشتر بااتحادیه استان خود هماهنگ کنید!"}, + status=status.HTTP_403_FORBIDDEN) + # if RequestLimitation.objects.filter(trash=False).first().limitation: + # if ('out' in request.data.keys() and request.data['out'] == True) or ( + # 'free_sale_in_province' in request.data.keys() and request.data['free_sale_in_province'] == True): + # free_sale_state = FreeSaleWithinprovince.objects.filter(trash=False).first() + # if free_sale_state and free_sale_state.allow: + # percent = (free_sale_state.percent - 10)/100 + # govermental_quantity = percent * poultry_hatching.quantity + # govermental_poultry_requests = PoultryRequest.objects.filter(state_process__in=('pending','accepted'),province_state__in=('pending','accepted'),out=False,free_sale_in_province=False, trash=False, hatching=poultry_hatching) + # govermental_poultry_requests_sum = \ + # govermental_poultry_requests.aggregate(total=Sum('quantity'))[ + # 'total'] or 0 + # if govermental_poultry_requests_sum < govermental_quantity: + # return Response({"result": "امکان فروش آزاد تا تکمیل تعهد دولتی وجود ندارد!"}, + # status=status.HTTP_403_FORBIDDEN) + + # Q(direct_buying=True) | Q(out=True, wage_pay=True) | Q(free_sale_in_province=True), + # state_process='accepted', province_state='accepted', trash=False, hatching=poultry_hatching) + + if free_sale_with_province.allow == True: + if ('out' in request.data.keys() and request.data['out'] == True) or ( + 'free_sale_in_province' in request.data.keys() and request.data['free_sale_in_province'] == True): + poultry_requests_for_free_sale = PoultryRequest.objects.filter( + Q(direct_buying=True) | Q(out=True, wage_pay=True) | Q(free_sale_in_province=True), + state_process='accepted', province_state='accepted', trash=False, hatching=poultry_hatching) + poultry_requests_for_free_sale_sum = poultry_requests_for_free_sale.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + if poultry_requests_for_free_sale_sum + request.data[ + 'quantity'] > poultry_hatching.total_free_commitment_quantity: + return Response({"result": "مجموع حجم کشتار آزاد از حجم کل تعهد آزاد بیشتر است "}, + status=status.HTTP_403_FORBIDDEN) + if 'role' in request.data.keys() and request.data['role'] not in ('AdminX', 'SuperAdmin'): + + age_range = ChickenAgeRange.objects.filter(trash=False).first() + if age_range.active == True: + chicken_age = (datetime.datetime.strptime(request.data['send_date'], + '%Y-%m-%d').date() - poultry_hatching.date.date()).days + 1 + if chicken_age < age_range.minimum or chicken_age > age_range.maximum: + return Response( + {"result": "به علت استاندارد نبودن سن مرغ برای کشتار امکان ثبت درخواست وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + if 'role' in request.data.keys(): + role = request.data['role'] + poultry_object = Poultry.objects.get(key=request.data['poultry_key']) + request.data.pop('role') + request.data.pop('poultry_key') + if role == 'CityOperator': + city_operator = CityOperator.objects.get(user=user, trash=False) + if city_operator.unit_name != poultry_object.city_operator: + poultry_city = poultry_object.city_operator + return Response({"result": "مرغدار زیر مجموعه {0} است !".format(poultry_city)}, + status=status.HTTP_403_FORBIDDEN) + + else: + role = None + poultry_object = None + if 'operator_key' in request.data.keys(): + if request.data['operator_key'] == None or request.data['operator_key'] == "": + c_operator = None + + else: + c_operator = CityOperator.objects.get(key=request.data['operator_key']) + request.data.pop('operator_key') + else: + c_operator = None + auction_list = request.data['auction_list'] + request.data.pop('poultry_hatching_key') + request.data.pop('auction_list') + if auction_list != None: + for auction in auction_list: + pricing = Pricing.objects.get(key=auction['pricing_key'], trash=False) + if pricing.ceiling_price < int(auction['fee']): + return Response({"result": "fee is more than celling price"}, status=status.HTTP_403_FORBIDDEN) + if role != None: + poultry = poultry_object + user = SystemUserProfile.objects.get(key=poultry_object.user.key, trash=False) + else: + poultry = Poultry.objects.get(id=poultry_hatching.poultry.id, trash=False) + user = SystemUserProfile.objects.get(user=request.user, trash=False) + poultry_requests = PoultryRequest.objects.filter(poultry__user=poultry.user, trash=False).order_by( + 'create_date') + if poultry_hatching.left_over < int(request.data['quantity']) or poultry_hatching.left_over < int( + request.data['quantity']) + int(request.data['losses']): + return Response({"result": "تعداد درخواست از باقی مانده سالن بیشتر است!"}, status=status.HTTP_403_FORBIDDEN) + + cash = request.data['cash'] + credit = request.data['credit'] + request.data.pop('cash') + request.data.pop('credit') + dict1 = {} + new_date = datetime.datetime.strptime(request.data['send_date'], '%Y-%m-%d').date() + change_date = datetime.datetime(year=new_date.year, month=new_date.month, day=new_date.day, hour=now.hour, + minute=now.minute, + second=now.second) + request.data.pop('send_date') + if 'out_province_poultry_request_buyer_key' in request.data.keys(): + if request.data['out_province_poultry_request_buyer_key'] != None: + request_buyer = OutProvincePoultryRequestBuyer.objects.get( + key=request.data['out_province_poultry_request_buyer_key']) + out_province_request_limitation = PoultryOutProvinceRequest.objects.filter(trash=False).first() + if role and role not in ('AdminX', 'SuperAdmin'): + if out_province_request_limitation: + if out_province_request_limitation.allow: + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, + hatching=poultry_hatching, + out_province_request_cancel=False, + state_process__in=( + 'pending', 'accepted'), + province_state__in=( + 'pending', 'accepted')) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + if poultry_hatching.quantity * ( + out_province_request_limitation.limitation / 100) < out_poultry_requests_quantity + \ + request.data['quantity']: + return Response( + {"result": " تعداد وارد شده بیشتر از ظرفیت فروش به خارج استان برای مرغدار است ! "}, + status=status.HTTP_403_FORBIDDEN) + # request.data.pop('out_province_poultry_request_buyer_key') + if wage_type and wage_type.status == False: + request.data.pop('payer_type') + request.data.pop('poultry_mobile') + request.data.pop('buyer_mobile') + + else: + if 'poultry_mobile' in request.data.keys() and request.data['poultry_mobile'] is not None: + if poultry_hatching.poultry.user.mobile != request.data['poultry_mobile']: + first_mobile_number = poultry_hatching.poultry.user.mobile + second_mobile_number = request.data['poultry_mobile'] + system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) + poultry_user = User.objects.get(id=system_user_profile.user.id) + + if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + poultry_user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + elif 'buyer_mobile' in request.data.keys() and request.data['buyer_mobile'] is not None: + if request_buyer.user.mobile != request.data['buyer_mobile']: + first_mobile_number = request_buyer.user.mobile + second_mobile_number = request.data['buyer_mobile'] + system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) + buyer_user = User.objects.get(id=system_user_profile.user.id) + + if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + buyer_user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + request_buyer.mobile = second_mobile_number + request_buyer.save() + request.data.pop('poultry_mobile') + request.data.pop('buyer_mobile') + + request.data.pop('out_province_poultry_request_buyer_key') + + if 'confirm_poultry_mobile' in request.data.keys(): + if request.data.get('confirm_poultry_mobile') != "": + first_mobile_number = poultry.user.mobile + second_mobile_number = request.data['confirm_poultry_mobile'] + if first_mobile_number != second_mobile_number: + system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) + system_person = SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False) + if system_person: + return Response({"result": f'این شماره در سامانه به نام {system_person.first().fullname} است'}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + system_user_profile.user.username = second_mobile_number + system_user_profile.user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + request.data.pop('confirm_poultry_mobile') + if 'traffic_codes' in request.data: + traffic_codes = request.data.get('traffic_codes', []) + request.data.pop('traffic_codes') + if 'market' in request.data and request.data['market']: + if MarketDailyLimitation.objects.filter(active=True).exists(): + market_result = market_daily_limitation_info() + if request.data['quantity'] > market_result['remain_quantity']: + return Response({"result": "تعداد وارد شده از باقی مانده سقف کشتار معاملات بیشتر است!"}, + status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + poultry_request = serializer.create(validated_data=request.data) + price_confirmation = PriceConfirmation.objects.filter(trash=False).first() + price_confirmation = price_confirmation.poultry_status if price_confirmation else False + + poultry_request.general_order_code = general_order_code + poultry_request.send_date = change_date + poultry_request.killing_age = (poultry_request.send_date.date() - poultry_hatching.date.date()).days + 1 + if request_buyer != None: + poultry_request.out_province_poultry_request_buyer = request_buyer + poultry_request.buyer_mobile = request_buyer.mobile + poultry_request.buyer_fullname = request_buyer.fullname + poultry_request.buyer_city = request_buyer.city + poultry_request.buyer_province = request_buyer.province + if int(poultry_request.losses) > 0: + poultry_hatching.losses += int(poultry_request.losses) + poultry_hatching.save() + poultry_request.poultry = poultry + poultry_request.hatching = poultry_hatching + if vet: + poultry_request.vet_farm = vet.vet + city = poultry.address.city.name + city_unit = CityUnit.objects.filter(name=city, trash=False) + if c_operator != None: + main_operator = c_operator.user.first_name + " " + c_operator.user.last_name + city_operator_user = c_operator + + else: + if city_unit.count() > 0: + city_operator_user = CityOperator.objects.filter(address__city__name=city_unit[0].city.name, + trash=False) + if city_operator_user.count() > 0: + city_operator_user = city_operator_user.last() + else: + city_operator_user = CityOperator.objects.filter(address__city__province_center=True, + trash=False) + city_operator_user = city_operator_user.last() + + else: + city_operator_user = CityOperator.objects.filter(address__city__name=city, trash=False) + if city_operator_user.count() > 0: + city_operator_user = city_operator_user.last() + else: + city_operator_user = CityOperator.objects.filter(address__city__province_center=True, + trash=False) + city_operator_user = city_operator_user.last() + + main_operator = city_operator_user.user.first_name + " " + city_operator_user.user.last_name + poultry_request.state = { + "city_operator": main_operator, + "city_state": poultry_request.state_process, + "city_operator_mobile": city_operator_user.user.mobile, + "province_operator": "", + "province_state": "" + } + + if poultry_requests.count() > 0: + poultry_request.order_code = poultry_requests.last().order_code + 1 + else: + poultry_request.order_code = int(str(user.base_order) + '0001') + + poultry_request.save() + if len(auction_list) > 0: + for auction in auction_list: + poultry_request_auction = PoultryRequestAuction( + poultry_request=poultry_request, + pricing=Pricing.objects.all().last(), + fee=auction['fee'], + hour=auction['hour'] + ) + poultry_request_auction.save() + dict1.update({ + 'cash': cash, + 'credit': credit + }) + poultry_request.cell_type = dict1 + poultry_request.city_operator = city_operator_user + if role != None: + system_user = SystemUserProfile.objects.get(user=request.user, trash=False) + poultry_request.registrar = { + "role": role, + "fullname": system_user.fullname, + "date": str(poultry_request.create_date) + } + if poultry_request.out_province_poultry_request_buyer != None: + poultry_request.out = True + # if role != None and role == 'ProvinceOperator': + # poultry_request.state_process = 'accepted' + # poultry_request.province_state = 'accepted' + # poultry_request.final_state = 'archive' + poultry_request.previous_quantity = int(request.data['quantity']) + poultry_request.remain_quantity = int(request.data['quantity']) + poultry_request.first_quantity = int(request.data['quantity']) + poultry_request.save() + + message = UserMessage(message="درخواست شما با کد سفارش {0} در انتطار تایید کارشناس شهرستان/{1}".format( + poultry_request.order_code, main_operator)) + message.save() + message.users.add(user) + vet_farm = VetFarm.objects.filter(poultry=poultry_hatching.poultry, hall=poultry_hatching.hall, + state='pending') + if vet_farm.count() > 0: + vet_farm = vet_farm.last() + inspections = VetFarmInspection.objects.filter(vet_farm=vet_farm, hall=vet_farm.hall, + state='pending') + for inspection in inspections: + inspection.state = 'complete' + inspection.save() + vet_farm.save() + if SmsLicense.objects.filter(poultry_request=True).exists(): + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + poultry_fullname = poultry_request.poultry.unit_name + poultry_mobile = poultry_request.poultry.user.mobile + quantity = poultry_request.quantity + chicken_breed = poultry_request.chicken_breed + order_code = poultry_request.order_code + request_kill_house = poultry_request.kill_house_list[0] if poultry_request.kill_house_list else "-" + date_str = poultry_request.send_date + send_date = datetime.datetime.strptime(str(date_str), '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + province_operator_mobile = province_operator.user.mobile + + sms_operator_poultry_request_sms = threading.Thread(target=operator_poultry_request_sms, + args=( + province_operator_mobile, poultry_fullname, + quantity, chicken_breed, + order_code, send_date, + poultry_request.free_sale_in_province, + poultry_request.amount, request_kill_house, + poultry_mobile)) + sms_operator_poultry_request_sms.start() + + if poultry_request.out_province_poultry_request_buyer != None: + vet = VetFarm.objects.filter(trash=False, poultry=poultry_request.poultry).first() + vet_number = vet.vet.user.mobile if vet else None + if wage_type and wage_type.status == False: + sms_operator_out_poultry_request_sms = threading.Thread(target=operator_out_poultry_request_sms, + args=( + province_operator_mobile, + poultry_fullname, + quantity, chicken_breed, + order_code, send_date, + poultry_request.free_sale_in_province, + poultry_request.amount, + vet_number + )) + sms_operator_out_poultry_request_sms.start() + + if role != None and role == 'ProvinceOperator' and poultry_request.out == False: + + city_operator_check_request = CityOperatorCheckRequest( + city_operator_system=poultry_request.city_operator, + poultry_request=poultry_request, + state='accept', + province_accept=True, + province_state='accept', + allow_hatching=True + + ) + city_operator_check_request.save() + province_operator = ProvinceOperator.objects.filter( + user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) + + if province_operator.count() > 0: + province_operator = province_operator.last() + check = ProvinceCheckOperatorRequest( + province_operator_system=province_operator, + poultry_request=poultry_request, + city_request_Poultry=city_operator_check_request, + quantity=poultry_request.quantity, + + state='accept', + ) + check.save() + poultry_request.state_process = 'accepted' + poultry_request.province_state = 'accepted' + if poultry_request.city_operator.address.city.name == 'فاقد شهرستان': + poultry_request.archive = True + poultry_request.save() + + elif role != None and role == 'CityOperator' and poultry_request.out == False: + + city_operator_check_request = CityOperatorCheckRequest( + city_operator_system=poultry_request.city_operator, + poultry_request=poultry_request, + state='accept', + province_accept=False, + province_state='pending', + allow_hatching=True + + ) + city_operator_check_request.save() + poultry_request.state_process = 'accepted' + if poultry_request.city_operator.address.city.name == 'فاقد شهرستان': + poultry_request.archive = True + poultry_request.save() + else: + if poultry_request.city_operator.address.city.name == 'فاقد شهرستان': + city_operator_check_request = CityOperatorCheckRequest( + city_operator_system=poultry_request.city_operator, + poultry_request=poultry_request, + state='accept', + province_accept=False, + province_state='pending', + allow_hatching=True + + ) + city_operator_check_request.save() + if poultry_request.city_operator.address.city.name == 'فاقد شهرستان': + poultry_request.archive = True + poultry_request.state_process = 'accepted' + poultry_request.save() + if poultry_request.out == True: + if wage_type and wage_type.status == True: + poultry_request.has_wage = True + if poultry_request.payer_type == 'buyer': + poultry_request.payer_fullname = poultry_request.out_province_poultry_request_buyer.fullname + else: + poultry_request.payer_fullname = poultry_request.poultry.user.fullname + poultry_request.save() + wage = wage_type.amount + poultry_request.wage = wage + percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, + trash=False) + + if percentages_wage_type: + poultry_request.total_wage_amount = int( + (poultry_request.Index_weight * poultry_request.quantity) * wage) + # fine = FinePermission.objects.filter(trash=False).first() + # time_for_fine = datetime.datetime.now() + # time_for_fine = time_for_fine.replace(second=0, microsecond=0).time() + # if fine.out_poultry_request: + # if fine.out_poultry_request_start_time < time_for_fine < fine.out_poultry_request_end_time: + # poultry_request.fine = True + # poultry_request.fine_amount = fine.out_poultry_request_fine_coefficient * poultry_request.total_wage_amount + # poultry_request.fine_coefficient = fine.out_poultry_request_fine_coefficient + + for percentage_wage_type in percentages_wage_type: + if percentage_wage_type.share_type.en_name == 'union': + poultry_request.union_share = int( + (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) + poultry_request.union_share_percent = percentage_wage_type.percent + poultry_request.save() + elif percentage_wage_type.share_type.en_name == 'company': + poultry_request.company_share = int( + (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) + poultry_request.company_share_percent = percentage_wage_type.percent + poultry_request.save() + + elif percentage_wage_type.share_type.en_name == 'guilds': + poultry_request.guilds_share = int( + (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) + poultry_request.guilds_share_percent = percentage_wage_type.percent + poultry_request.save() + elif percentage_wage_type.share_type.en_name == 'city': + poultry_request.city_share = int( + (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) + poultry_request.city_share_percent = percentage_wage_type.percent + poultry_request.save() + + elif percentage_wage_type.share_type.en_name == 'wallet': + poultry_request.wallet_share = int( + (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) + poultry_request.wallet_share_percent = percentage_wage_type.percent + poultry_request.save() + + else: + poultry_request.other_share = int( + (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) + poultry_request.other_share_percent = percentage_wage_type.percent + poultry_request.save() + # poultry_prediction(poultry_hatching.poultry) + + if price_confirmation and not poultry_request.out: + poultry_fullname = poultry_request.poultry.unit_name + poultry_mobile = poultry_request.poultry.user.mobile + quantity = poultry_request.quantity + chicken_breed = poultry_request.chicken_breed + order_code = poultry_request.order_code + request_kill_house = poultry_request.kill_house_list[0] if poultry_request.kill_house_list else "-" + date_str = poultry_request.send_date + send_date = datetime.datetime.strptime(str(date_str), '%Y-%m-%d %H:%M:%S').date() + send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + day=send_date.day).strftime('%Y-%m-%d') + date_list = reversed(send_date.split('-')) + separate = "-" + send_date = separate.join(date_list) + + # poultry_fullname = poultry_request.poultry.unit_name + # poultry_mobile = poultry_request.poultry.user.mobile + # quantity = poultry_request.quantity + # chicken_breed = poultry_request.chicken_breed + # date_str = poultry_request.send_date + # send_date = datetime.datetime.strptime(str(date_str), '%Y-%m-%d %H:%M:%S').date() + # send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, + # day=send_date.day).strftime('%Y-%m-%d') + # date_list = reversed(send_date.split('-')) + # separate = "-" + # send_date = separate.join(date_list) + # confirm_code = ''.join(random.choices(string.ascii_lowercase + string.digits, k=5)) + confirm_code = str(random.randint(10000, 99000)) + confirm_price_poultry_request = threading.Thread(target=confirm_price_poultry_request_sms, + args=( + poultry_mobile, poultry_fullname, + quantity, chicken_breed, + order_code, send_date, + poultry_request.free_sale_in_province, + poultry_request.amount, request_kill_house, + confirm_code)) + confirm_price_poultry_request.start() + poultry_request.price_confirmation_code = confirm_code + poultry_request.price_confirmation = True + poultry_request.save() + if poultry_request.market == True: + send_sms_for_poultry_market(poultry_request) + create_update_chicken_commission_prices() + + if traffic_codes and isinstance(traffic_codes, list): + codes_to_create = [] + now = datetime.datetime.now() + for traffic_code in traffic_codes: + if traffic_code and str(traffic_code).strip(): + codes_to_create.append( + PoultryRequestQuarantineCode( + poultry_request=poultry_request, + traffic_code=str(traffic_code).strip(), + registrar=user.fullname, + register_date=now + ) + ) + + if codes_to_create: + PoultryRequestQuarantineCode.objects.bulk_create(codes_to_create) + + serializer_request = self.serializer_class(poultry_request) + return Response(serializer_request.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + # تابع مربوط به ویرایش درخواست ثبت شده مرغدار + def update(self, request, pk=None, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + + if 'confirmation_code' in request.data.keys(): + poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) + if poultry_request.price_confirmation_code != request.data['confirmation_code']: + return Response({"result": "کد وارد شده صحیح نمی باشد!"}, + status=status.HTTP_403_FORBIDDEN) + poultry_request.input_price_confirmation_code = request.data['confirmation_code'] + poultry_request.save() + return Response({"result": "با موفقیت انجام شد!"}, + status=status.HTTP_200_OK) + + if 'quarantine_code' in request.data.keys(): + poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) + + date_time_of_now = datetime.datetime.now().date() + if OperationLimitation.objects.all().first().vet_farm_out_province_limitation == True: + if date_time_of_now > poultry_request.send_date.date() + timedelta(days=1): + return Response( + {"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"}, + status=status.HTTP_403_FORBIDDEN) + if PoultryRequest.objects.filter(quarantine_code=request.data['quarantine_code'], trash=False).exists(): + return Response({"result": "کد وارد شده تکراری میباشد!"}, status=status.HTTP_403_FORBIDDEN) + + poultry_request.quarantine_code = request.data['quarantine_code'] + poultry_request.quarantine_code_registrar = { + "role": request.data['role'], + "fullname": user.fullname, + "mobile": user.mobile, + "date": str(datetime.datetime.now().date()), + } + poultry_request.save() + get_gid_poultry_request(poultry_request.id) + return Response({"result": "با موفقیت ثیت شد"}, status=status.HTTP_200_OK) + if 'edit' in request.data.keys(): + poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) + request.data.pop('poultry_request_key') + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) + if 'out_province_poultry_request_buyer_key' in request.data.keys(): + request_buyer = OutProvincePoultryRequestBuyer.objects.get( + key=request.data['out_province_poultry_request_buyer_key']) + poultry_request.out_province_poultry_request_buyer = request_buyer + poultry_request.buyer_mobile = request_buyer.mobile + poultry_request.buyer_fullname = request_buyer.fullname + poultry_request.buyer_city = request_buyer.city + poultry_request.buyer_province = request_buyer.province + request.data.pop('out_province_poultry_request_buyer_key') + + if 'quantity' in request.data.keys(): + if poultry_request.market: + if MarketDailyLimitation.objects.filter(active=True).exists(): + market_result = market_daily_limitation_info() + if int(request.data['quantity']) > poultry_request.quantity: + diff_quantity = int(request.data['quantity']) - poultry_request.quantity + + if diff_quantity > market_result['remain_quantity']: + return Response({"result": "تعداد وارد شده از باقی مانده سقف کشتار معاملات بیشتر است!"}, + status=status.HTTP_403_FORBIDDEN) + + if poultry_request.out: + out_province_request_limitation = PoultryOutProvinceRequest.objects.filter(trash=False).first() + if out_province_request_limitation: + if out_province_request_limitation.limitation_status: + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, + hatching=poultry_request.hatching, + out_province_request_cancel=False, + state_process__in=( + 'pending', 'accepted'), + province_state__in=( + 'pending', 'accepted')).exclude( + id=poultry_request.id) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + if poultry_request.hatching.quantity * ( + out_province_request_limitation.limitation / 100) < out_poultry_requests_quantity + \ + int(request.data['quantity']): + return Response( + {"result": " تعداد وارد شده بیشتر از ظرفیت فروش به خارج استان برای مرغدار است ! "}, + status=status.HTTP_403_FORBIDDEN) + if int(request.data['quantity']) > poultry_request.quantity: + diffrent_quantity = int(request.data['quantity']) - poultry_request.quantity + if hatching.left_over < diffrent_quantity: + return Response({"result": "تعداد وارد شده از باقی مانده جوجه ریزی بیشتر است !"}, + status=status.HTTP_403_FORBIDDEN) + if poultry_request.out == True and poultry_request.province_state == 'accepted': + hatching.out_province_killed_quantity += diffrent_quantity + hatching.out_province_killed_weight += int(diffrent_quantity * poultry_request.Index_weight) + hatching.save() + elif int(request.data['quantity']) < poultry_request.quantity: + if poultry_request.out == True and poultry_request.province_state == 'accepted': + diffrent_quantity = poultry_request.quantity - int(request.data['quantity']) + + hatching.out_province_killed_quantity -= diffrent_quantity + hatching.out_province_killed_weight -= int(diffrent_quantity * poultry_request.Index_weight) + hatching.save() + + poultry_request.remain_quantity = int(request.data['quantity']) + poultry_request.save() + + if 'poultry_mobile' in request.data.keys() and request.data['poultry_mobile'] is not None: + if poultry_request.poultry.user.mobile != request.data['poultry_mobile']: + first_mobile_number = poultry_request.poultry.user.mobile + second_mobile_number = request.data['poultry_mobile'] + system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) + poultry_user = User.objects.get(id=system_user_profile.user.id) + + if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + poultry_user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + elif 'buyer_mobile' in request.data.keys() and request.data['buyer_mobile'] is not None: + if poultry_request.out_province_poultry_request_buyer.user.mobile != request.data['buyer_mobile']: + first_mobile_number = poultry_request.out_province_poultry_request_buyer.user.mobile + second_mobile_number = request.data['buyer_mobile'] + system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) + buyer_user = User.objects.get(id=system_user_profile.user.id) + + if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + buyer_user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + system_user_profile.save() + request_buyer = OutProvincePoultryRequestBuyer.objects.get( + key=poultry_request.out_province_poultry_request_buyer.key) + request_buyer.mobile = second_mobile_number + request_buyer.save() + request.data.pop('poultry_mobile') + request.data.pop('buyer_mobile') + serializer = self.serializer_class(poultry_request) + serializer.update(instance=poultry_request, validated_data=request.data) + poultry_request.total_wage_amount = int( + (poultry_request.Index_weight * poultry_request.quantity) * poultry_request.wage) + poultry_request.save() + union_percent = poultry_request.union_share_percent / 100 if poultry_request.union_share_percent > 0 else 0 + company_percent = poultry_request.company_share_percent / 100 if poultry_request.company_share_percent > 0 else 0 + guilds_percent = poultry_request.guilds_share_percent / 100 if poultry_request.guilds_share_percent > 0 else 0 + city_share_percent = poultry_request.city_share_percent / 100 if poultry_request.city_share_percent > 0 else 0 + wallet_share_percent = poultry_request.wallet_share_percent / 100 if poultry_request.wallet_share_percent > 0 else 0 + other_share_percent = poultry_request.other_share_percent / 100 if poultry_request.other_share_percent > 0 else 0 + poultry_request.union_share = int(union_percent * poultry_request.total_wage_amount) + poultry_request.company_share = int(company_percent * poultry_request.total_wage_amount) + poultry_request.guilds_share = int(guilds_percent * poultry_request.total_wage_amount) + poultry_request.city_share = int(city_share_percent * poultry_request.total_wage_amount) + poultry_request.wallet_share = int(wallet_share_percent * poultry_request.total_wage_amount) + poultry_request.other_share = int(other_share_percent * poultry_request.total_wage_amount) + poultry_request.save() + return Response({"result": "با موفقیت وبرایش شد"}, status=status.HTTP_200_OK) + quantity = 0 + last_check_quantity = 0 + province_kill_request_quantity = 0 + if 'state' in request.data.keys(): + state = request.data['state'] + request.data.pop('state') + else: + state = None + poultry_request = PoultryRequest.objects.get(key=request.data["key"], trash=False) + request.data.pop('key') + province_check = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request) + if 'quantity' in request.data.keys() or 'allocated_number' in request.data.keys(): + if 'quantity' in request.data.keys(): + if poultry_request.out: + out_province_request_limitation = PoultryOutProvinceRequest.objects.filter(trash=False).first() + if out_province_request_limitation: + if out_province_request_limitation.limitation_status: + out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, + hatching=poultry_request.hatching, + out_province_request_cancel=False, + state_process__in=( + 'pending', 'accepted'), + province_state__in=( + 'pending', 'accepted')).exclude( + id=poultry_request.id) + out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + if poultry_request.hatching.quantity * ( + out_province_request_limitation.limitation / 100) < out_poultry_requests_quantity + \ + int(request.data['quantity']): + return Response( + {"result": " تعداد وارد شده بیشتر از ظرفیت فروش به خارج استان برای مرغدار است ! "}, + status=status.HTTP_403_FORBIDDEN) + quantity = int(request.data['quantity']) + province_kill_requests = ProvinceKillRequest.objects.filter( + province_request__poultry_request=poultry_request, trash=False) + if province_kill_requests.count() > 0: + for province_kill_request in province_kill_requests: + province_kill_request_quantity += province_kill_request.main_quantity + if quantity < province_kill_request_quantity: + return Response({"result": "درخواست کشتار شما کمتر از مجموع کل تخصیصات داده شده است!"}, + status=status.HTTP_403_FORBIDDEN) + + if (quantity - poultry_request.quantity) > poultry_request.hatching.left_over: + # if quantity > poultry_request.hatching.left_over + poultry_request.remain_quantity: + return Response({"result": "درخواست کشتار شما بزرگتر از کل مانده جوجه ریزی است!"}, + status=status.HTTP_403_FORBIDDEN) + if poultry_request.kill_house_list != None and len(poultry_request.kill_house_list) > 0: + for item in poultry_request.kill_house_list: + parts = item.split("(") + name = parts[0].strip() + + kill_request = KillRequest.objects.filter(kill_house__name=name, + recive_date__date=poultry_request.send_date.date(), + trash=False, poultry__isnull=True, + province_state='accepted').first() + if kill_request: + if quantity > poultry_request.quantity: + if kill_request.remain_quantity_for_poultry + ( + quantity - poultry_request.quantity) > kill_request.kill_capacity: + return Response( + {"result": "مقدار وارد شده از باقی مانده اعلام نیاز کشتارگاه بیشتر است!"}, + status=status.HTTP_403_FORBIDDEN) + kill_request.remain_quantity_for_poultry += quantity - poultry_request.quantity + else: + kill_request.remain_quantity_for_poultry -= poultry_request.quantity - quantity + + kill_request.save() + + + else: + quantity = request.data['allocated_number'] + request.data.pop('allocated_number') + if quantity == 0: + quantity = poultry_request.quantity + poultry_request.final_state = request.data['final_state'] + else: + request.data.pop('final_state') + if province_check.count() > 0: + province_check = province_check.last() + last_check_quantity += province_check.quantity + province_check.quantity = 0 + province_check.save() + + poultry_request.previous_quantity = poultry_request.quantity + if poultry_request.quantity > quantity: + a = -1 * (poultry_request.quantity - quantity) + else: + a = quantity - poultry_request.quantity + + poultry_request.remain_quantity += a + poultry_request.save() + + hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) + if poultry_request.quantity - quantity == 0: + if state != None: + pass + else: + province_check = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request) + if province_check.count() > 0: + province_check = province_check.last().quantity + if province_check == 0 and last_check_quantity > 0: + if poultry_request.quantity == last_check_quantity: + poultry_request.final_state = 'archive' + poultry_request.archive = True + if poultry_request.kill_house_list != None and len(poultry_request.kill_house_list) > 0: + for item in poultry_request.kill_house_list: + parts = item.split("(") + name = parts[0].strip() + kill_request = KillRequest.objects.filter(kill_house__name=name, + recive_date__date=poultry_request.send_date.date(), + trash=False, poultry__isnull=True, + province_state='accepted').first() + if kill_request: + kill_request.remain_quantity_for_poultry -= poultry_request.quantity + kill_request.save() + # hatching.left_over += last_check_quantity + hatching.save() + + else: + pass + else: + + poultry_request.final_state = 'archive' + poultry_request.archive = True + if poultry_request.kill_house_list != None and len(poultry_request.kill_house_list) > 0: + for item in poultry_request.kill_house_list: + parts = item.split("(") + name = parts[0].strip() + kill_request = KillRequest.objects.filter(kill_house__name=name, + recive_date__date=poultry_request.send_date.date(), + trash=False, poultry__isnull=True, + province_state='accepted').first() + if kill_request: + kill_request.remain_quantity_for_poultry -= poultry_request.quantity + kill_request.save() + # hatching.left_over += quantity + + else: + if quantity > poultry_request.quantity: + # hatching.left_over -= quantity - poultry_request.quantity + # hatching.save() + if poultry_request.final_state != 'archive': + province_check = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request) + if province_check.count() > 0: + province_check = province_check.last() + province_check.quantity += quantity - poultry_request.quantity + province_check.save() + + + else: + # hatching.left_over += poultry_request.quantity - quantity + if poultry_request.final_state != 'archive': + province_check = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request) + if province_check.count() > 0: + province_check = province_check.last() + if 'quantity' in request.data.keys(): + # province_check.quantity = (poultry_request.quantity - quantity) - last_check_quantity + # last_province_quantity = province_check.quantity + if quantity < poultry_request.quantity: + if province_check.quantity > 0: + province_check.quantity -= poultry_request.quantity - quantity + + + + else: + province_check.quantity = (poultry_request.quantity - quantity) - last_check_quantity + province_check.save() + if hatching.left_over > 0: + hatching.state = 'pending' + hatching.allow_hatching = 'pending' + hatching.save() + poultry_request.quantity = quantity + poultry_request.save() + serializer = self.serializer_class(poultry_request) + serializer.update(instance=poultry_request, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع مربوط به نمایش درخواست ثبت شده مرغدار + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + breed_list = [] + city_list = [] + quantity_list = [] + total_list = [] + + user = SystemUserProfile.objects.get(user=request.user, trash=False) + if 'role' in request.GET: + if request.GET['role'] == 'Poultry': + if 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__user=user, awaiting_payment=True, + trash=False, out=False).order_by('-send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__user=user, inspector='pending', + trash=False, out=False).order_by('-send_date') + else: + now = datetime.datetime.now().date() + + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + + queryset_lists = PoultryRequest.objects.filter(poultry__user=user, + final_state__in=('pending', 'archive'), + trash=False, out=False).order_by('-send_date') + queryset = [ + queryset_list for queryset_list in queryset_lists + if date1 <= queryset_list.send_date.date() <= date2 + ] + elif request.GET['role'] == 'VetSupervisor': + + if 'check' in request.GET: + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + elif request.GET['role'] == 'VetFarm': + vet = Vet.objects.filter(user=user, trash=False) + poultries = [] + if vet.count() > 0: + vet = vet.last() + vet_farms = VetFarm.objects.filter(vet=vet, trash=False) + if vet_farms.count() > 0: + for vet_farm in vet_farms: + if vet_farm.poultry in poultries: + pass + else: + poultries.append(vet_farm.poultry) + if 'check' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultries, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__in=poultries, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + + elif 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__in=poultries, + poultry__address__province=user.province, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__in=poultries, + poultry__address__province=user.province, + inspector='pending', + trash=False, out=False).order_by('send_date') + else: + queryset = PoultryRequest.objects.filter(poultry__in=poultries, + poultry__address__province=user.province, + final_state__in=('pending', 'archive'), + trash=False, out=False).order_by('send_date') + else: + queryset = [] + + elif request.GET['role'] == 'ProvinceInspector': + if 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + inspector='pending', + trash=False, out=False).order_by('send_date') + # elif 'out' in request.GET: + + else: + + if 'date' in request.GET: + date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.datetime.now() + + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, + send_date__year=date.year, send_date__month=date.month, + send_date__day=date.day + ).order_by('-send_date') + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + + if 'check' in request.GET: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__city_operator=city_operator.unit_name, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + + + # list1 = [] + # for c in CityUnit.objects.filter(city__name=user.city.name, trash=False): + # list1.append(c.name) + elif 'waiting' in request.GET: + # queryset = PoultryRequest.objects.filter(poultry__address__city__name__in=list1, + # awaiting_payment=True, + # trash=False).order_by('send_date') + + queryset = PoultryRequest.objects.filter(city_operator=city_operator, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + # queryset = PoultryRequest.objects.filter(poultry__address__city__name__in=list1, + # inspector='pending', + # trash=False).order_by('send_date') + queryset = PoultryRequest.objects.filter(city_operator=city_operator, + inspector='pending', + trash=False, out=False).order_by('send_date') + else: + # queryset = PoultryRequest.objects.filter(poultry__address__city__name__in=list1, + # trash=False).order_by( + # 'send_date') + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if 'state' in request.GET: + if request.GET['state'] == 'pending': + queryset = PoultryRequest.objects.filter(poultry__city_operator=city_operator.unit_name, + trash=False, out=False, state_process='pending', + final_state='pending', + send_date__date__gte=date1, + send_date__date__lte=date2 + ).order_by('send_date') + elif request.GET['state'] == 'accepted': + queryset = PoultryRequest.objects.filter(poultry__city_operator=city_operator.unit_name, + trash=False, out=False, state_process='accepted', + final_state='pending', + send_date__date__gte=date1, + send_date__date__lte=date2 + ).order_by('send_date') + else: + queryset = PoultryRequest.objects.filter(poultry__city_operator=city_operator.unit_name, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, final_state='pending', + send_date__date__gte=date1, send_date__date__lte=date2 + ).order_by('send_date') + + if 'search' in request.GET: + poultry_requests = [] + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (PoultryRequestFilterSet( + data=query, + queryset=queryset + ) + ).filter(): + ps = PoultryRequestFilterSet(data=query, queryset=queryset) + poultry_requests = ps.filter() + queryset = [] if len(poultry_requests) == 0 else poultry_requests + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = PoultryRequestForKillingInformationSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + # queryset = [ + # poultry_req for poultry_req in queryset_list + # if date1 <= poultry_req.send_date.date() <= date2 + # ] + elif request.GET['role'] == 'PoultryScience': + poultry_science = PoultryScience.objects.filter(trash=False, user=user).values_list('poultry__id', + flat=True).distinct() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + queryset = PoultryRequest.objects.filter(poultry__id__in=poultry_science, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, final_state='pending', + send_date__date__gte=date1, send_date__date__lte=date2 + ).order_by('send_date') + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (PoultryRequestFilterSet( + data=query, + queryset=queryset + ) + ).filter(): + ps = PoultryRequestFilterSet(data=query, queryset=queryset) + poultry_requests = ps.filter() + queryset = [] if len(poultry_requests) == 0 else poultry_requests + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = PoultryRequestForKillingInformationSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif request.GET['role'] in ['CityCommerce', 'CityVet', 'CityPoultry', 'CityJahad']: + + if 'check' in request.GET: + + if 'date1' in request.GET and 'date2' in request.GET: + + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + + kill_request__recive_date__date__gte=date1, + + kill_request__recive_date__date__lte=date2, + + province_request__poultry_request__poultry__address__city=user.city, + + trash=True, + + message__isnull=False, temporary_trash=False, temporary_deleted=False + + ).select_related('kill_request') + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + + return Response(serializer.data, status=status.HTTP_200_OK) + + else: + + kill_house_requests = KillHouseRequest.objects.filter( + + kill_request__recive_date__date__gte=date1, + + kill_request__recive_date__date__lte=date2, + + province_request__poultry_request__poultry__address__city=user.city, + + trash=False + + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'date1' in request.GET and 'date2' in request.GET: + + now = datetime.datetime.now().date() + + date1 = datetime.datetime.strptime(str(request.GET['date1']), + + '%Y-%m-%d').date() if 'date1' in request.GET else now + + date2 = datetime.datetime.strptime(str(request.GET['date2']), + + '%Y-%m-%d').date() if 'date2' in request.GET else now + + if 'state_process' in request.GET: + + queryset = PoultryRequest.objects.filter(poultry__address__city=user.city, + + trash=False, state_process='pending', out=False, + + send_date__date__gte=date1, send_date__date__lte=date2 + + ).order_by('-send_date') + + else: + + poultry_requests = [] + + queryset = PoultryRequest.objects.filter(poultry__address__city=user.city, + + state_process__in=('pending', 'accepted'), + + province_state__in=('pending', 'accepted'), + + final_state='pending', + + trash=False, out=False, send_date__date__gte=date1, + + send_date__date__lte=date2 + + ).order_by('-send_date') + + if 'search' in request.GET: + + if request.GET['search'] == 'filter': + + if request.GET['value'] != "": + + for item in self.filterset_fields: + + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + + if (PoultryRequestFilterSet( + + data=query, + + queryset=queryset + + ) + + ).filter(): + ps = PoultryRequestFilterSet(data=query, queryset=queryset) + + poultry_requests = ps.filter() + + queryset = [] if len(poultry_requests) == 0 else poultry_requests + + page_size = request.query_params.get('page_size', None) + + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(queryset) + + if page is not None: + serializer = PoultryRequestForKillingInformationSerializer(page, many=True) + + return self.get_paginated_response(serializer.data) + + serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True) + + return Response(serializer.data, status=status.HTTP_200_OK) + + elif request.GET['role'] == 'ProvinceFinancial': + if 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + inspector='pending', + trash=False, out=False).order_by('send_date') + elif 'all' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + assignment=True, + final_state='pending', + trash=False, out=False).order_by('send_date') + else: + if 'date' in request.GET: + date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.datetime.now() + + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, + send_date__year=date.year, send_date__month=date.month, + send_date__day=date.day + ).order_by('-send_date') + elif request.GET['role'] in ['ProvinceOperator', 'Commerce', 'SuperAdmin', 'AdminX', 'Supporter']: + if 'waiting' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + awaiting_payment=True, + trash=False, out=False).order_by('send_date') + elif 'inspector' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + inspector='pending', + trash=False, out=False).order_by('send_date') + elif 'out' in request.GET: + # if 'date' in request.GET: + # date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # else: + # date = datetime.datetime.now() + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False, out=True).order_by('-send_date') + elif 'check' in request.GET: + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + # serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + # return Response(serializer.data, status=status.HTTP_200_OK) + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif 'date1' in request.GET and 'date2' in request.GET: + + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else now + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date2' in request.GET else now + if 'state_process' in request.GET: + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + trash=False, state_process='pending', out=False, + send_date__date__gte=date1, send_date__date__lte=date2 + ).order_by('-send_date') + else: + poultry_requests = [] + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + final_state='pending', + trash=False, out=False, send_date__date__gte=date1, + send_date__date__lte=date2 + ).order_by('-send_date') + + if 'search' in request.GET: + if request.GET['search'] == 'filter': + if request.GET['value'] != "": + for item in self.filterset_fields: + query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) + if (PoultryRequestFilterSet( + data=query, + queryset=queryset + ) + ).filter(): + ps = PoultryRequestFilterSet(data=query, queryset=queryset) + poultry_requests = ps.filter() + queryset = [] if len(poultry_requests) == 0 else poultry_requests + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = PoultryRequestForKillingInformationSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + # queryset = [ + # queryset_list for queryset_list in queryset_lists + # if date1 <= queryset_list.send_date.date() <= date2 + # ] + + # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + # queryset_list = PoultryRequest.objects.filter(poultry__address__province=user.province, + # trash=False, out=False, + # ).order_by('-send_date') + # + # queryset = [] + # queryset = [ + # poultry_req for poultry_req in queryset_list + # if date1 <= poultry_req.send_date.date() <= date2 + # ] + else: + if 'date' in request.GET: + date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.datetime.now() - timedelta(days=2) + + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, + send_date__year__gte=date.year, + send_date__month__gte=date.month, + send_date__day__gte=date.day + ).order_by('-send_date') + + elif request.GET['role'] == 'KillHouse': + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) + if 'check' in request.GET: + if 'date1' in request.GET and 'date2' in request.GET: + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'deleted_requests' in request.GET: + + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=True, + message__isnull=False, temporary_trash=False, temporary_deleted=False + ).select_related('kill_request') + # serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + # return Response(serializer.data, status=status.HTTP_200_OK) + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + kill_house_requests = KillHouseRequest.objects.filter( + (Q(killhouse_user__in=kill_house) | Q( + kill_request__slaughter_house__in=kill_house)), + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + province_request__poultry_request__poultry__address__province=user.province, + trash=False + ).select_related('kill_request') + + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(kill_house_requests) + if page is not None: + serializer = KillHouseRequestForBarManagementSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + # if 'check' in request.GET: + # kill_house_req_dict = {} + # kill_house_req_list = [] + # bar_remover = None + # + # now = datetime.datetime.now().date() + # date1 = datetime.datetime.strptime(str(request.GET['date1']), + # '%Y-%m-%d').date() if 'date1' in request.GET else now + # date2 = datetime.datetime.strptime(str(request.GET['date2']), + # '%Y-%m-%d').date() if 'date2' in request.GET else now + # queryset_list = PoultryRequest.objects.filter( + # poultry__address__province=user.province, + # final_state__in=('pending', 'archive'), + # trash=False, out=False, + # ).order_by('-send_date') + # + # queryset = [] + # queryset = [ + # poultry_req for poultry_req in queryset_list + # if date1 <= poultry_req.send_date.date() <= date2 + # ] + # if len(queryset) > 0: + # for poultry_req in queryset: + # vet_farm = VetFarm.objects.filter(poultry=poultry_req.poultry) + # if vet_farm.count() > 0: + # vet_farm = vet_farm.last() + # vet_name = vet_farm.vet.user.fullname + # vet_mobile = vet_farm.vet.user.mobile + # else: + # vet_name = None + # vet_mobile = None + # if 'deleted_requests' in request.GET: + # kill_house_requests = KillHouseRequest.objects.filter( + # province_kill_request__province_request__poultry_request=poultry_req, + # killhouse_user__in=kill_house, trash=True, + # message__isnull=False) + # else: + # kill_house_requests = KillHouseRequest.objects.filter( + # province_kill_request__province_request__poultry_request=poultry_req, + # killhouse_user__in=kill_house, trash=False) + # if kill_house_requests.count() > 0: + # for kill_house_request in kill_house_requests: + # kill_house_name = kill_house_request.kill_request.kill_house.name + # if kill_house_request.kill_request.slaughter_house: + # kill_place = kill_house_request.kill_request.slaughter_house.name + # else: + # kill_place = kill_house_name + # + # if kill_house_request.bar_remover != None: + # bar_remover = kill_house_request.bar_remover + # vet_check = VetCheckRequest.objects.filter( + # kill_house_request=kill_house_request) + # if vet_check.count() > 0: + # vet_check_state = vet_check.last().state + # else: + # vet_check_state = 'pending' + # + # kill_house_req_dict.update({ + # "poultry_req_key": poultry_req.key, + # "poultry_req_order_code": poultry_req.order_code, + # "poultry_name": poultry_req.poultry.unit_name, + # "poultry_mobile": poultry_req.poultry.user.mobile, + # "poultry_city": poultry_req.poultry.address.city.name, + # "chicken_breed": poultry_req.chicken_breed, + # "date": poultry_req.send_date, + # "poultry_request_first_quantity": kill_house_request.quantity, + # "poultry_request_final_quantity": kill_house_request.quantity, + # "clearance_code": kill_house_request.clearance_code, + # "traffic_code": kill_house_request.traffic_code, + # "kill_house_name": kill_house_name, + # "buyer_mobile": kill_house_request.kill_request.kill_house.kill_house_operator.user.mobile, + # "driver_mobile": kill_house_request.add_car.driver.driver_mobile, + # "kill_house_request_key": kill_house_request.key, + # "registerar": kill_house_request.registrar_clearance_code, + # "bar_code": kill_house_request.bar_code, + # "health_code": kill_house_request.add_car.driver.health_code, + # "message": kill_house_request.message, + # "date_of_reject": kill_house_request.modify_date, + # "vet_name": vet_name, + # "vet_mobile": vet_mobile, + # "driver_name": kill_house_request.add_car.driver.driver_name, + # "pelak": kill_house_request.add_car.driver.pelak, + # "type_car": kill_house_request.add_car.driver.type_car, + # "quantity": kill_house_request.add_car.driver.type_car, + # "vet_check_state": vet_check_state, + # "bar_remover": bar_remover, + # "kill_place": kill_place, + # + # }) + # kill_house_req_list.append(kill_house_req_dict) + # kill_house_req_dict = {} + # + # return Response(kill_house_req_list, status=status.HTTP_200_OK) + + else: + if 'date' in request.GET: + date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') + else: + date = datetime.datetime.now() + + queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, + send_date__year=date.year, send_date__month=date.month, + send_date__day=date.day + ).order_by('-send_date') + + else: + + if 'type' in request.GET: + if request.GET['type'] == 'auction': + queryset = [] + poultry_req_auctions = PoultryRequestAuction.objects.filter(state='active', + trash=False).order_by( + 'fee').order_by( + 'create_date') + for poultry_req_auction in poultry_req_auctions: + queryset.append( + PoultryRequest.objects.get(id=poultry_req_auction.poultry_request.id, auction=True)) + + serializer = PoultryRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + queryset = PoultryRequest.objects.get(id=pk, trash=False) + if queryset.province_state == 'accepted': + role = Group.objects.get(name='ProvinceOperator') + if role not in user.role.all(): + return Response({"result": " بدلیل تایید درخواست از طرف استان امکان حذف وجود ندارد!"}, + status=status.HTTP_400_BAD_REQUEST) + if ProvinceKillRequest.objects.filter(province_request__poultry_request=queryset, trash=False, + ).exists(): + return Response({"result": " بدلیل وجود تخصیص به کشتارگاه امکان حذف وجود ندارد!"}, + status=status.HTTP_400_BAD_REQUEST) + + # if queryset.state_process == 'pending' and queryset.province_state == 'pending': + # + # + # # if 'role' in request.GET: + # # if request.GET['role'] == 'ProvinceOperator': + # + # hatching = queryset.hatching + # hatching.left_over += queryset.quantity + queryset.losses + # hatching.losses -= queryset.losses + # hatching.state = 'pending' + # hatching.save() + # try: + # city = CityOperatorCheckRequest.objects.get(poultry_request=queryset, trash=False) + # city.trash = True + # city.save() + # except: + # pass + # queryset.trash = True + # queryset.save() + # if queryset.kill_house_list != None and len(queryset.kill_house_list) > 0: + # for item in queryset.kill_house_list: + # parts = item.split("(") + # name = parts[0].strip() + # kill_request = KillRequest.objects.filter(kill_house__name=name, + # recive_date__date=queryset.send_date.date(), + # trash=False, poultry__isnull=True, + # province_state='accepted').first() + # if kill_request: + # kill_request.remain_quantity_for_poultry -= queryset.quantity + # kill_request.save() + # return Response(queryset.trash, status=status.HTTP_200_OK) + # else: + + # if ProvinceOperator.objects.filter(user=user).exists(): + # hatching = queryset.hatching + # hatching.left_over += queryset.quantity + queryset.losses + # hatching.losses -= queryset.losses + # hatching.state = 'pending' + # hatching.save() + try: + city = CityOperatorCheckRequest.objects.get(poultry_request=queryset, trash=False) + city.trash = True + city.save() + except: + pass + queryset.trash = True + queryset.save() + if queryset.kill_house_list != None and len(queryset.kill_house_list) > 0: + for item in queryset.kill_house_list: + parts = item.split("(") + name = parts[0].strip() + kill_request = KillRequest.objects.filter(kill_house__name=name, + recive_date__date=queryset.send_date.date(), + trash=False, poultry__isnull=True, + province_state='accepted').first() + if kill_request: + kill_request.remain_quantity_for_poultry -= queryset.quantity + kill_request.save() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + +# ویوست مربوط به ریزجزییات پرونده مرغدار برای پنل مرغدار و شهرستان و کشتارگاه +class ProcessViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به نمایش ریزجزییات پرونده مرغدار برای پنل مرغدار و شهرستان و کشتارگاه + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + process = {} + process1 = {} + user = SystemUserProfile.objects.get(user=request.user, trash=False) + poultry_request = PoultryRequest.objects.get(id=int(request.GET['id']), trash=False) + # date = str(poultry_request.poultry.incubation_date) + # new_date = date[:19] + # chicken_date = datetime.datetime.strptime(new_date, '%Y-%m-%d %H:%M:%S') + kill_date = datetime.datetime.strptime(str(poultry_request.send_date), '%Y-%m-%d %H:%M:%S') + # age = (kill_date - chicken_date).days + if ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, state='accepted').exists(): + age2 = (poultry_request.send_date - poultry_request.hatching.date).days + 1 + else: + age2 = (datetime.datetime.now() - poultry_request.hatching.date).days + 1 + + file_state = 'pending' + if poultry_request.province_state == 'pending': + file_state = 'province_state_pending' + + if ProvinceKillRequest.objects.filter(province_request__poultry_request__id=poultry_request.id).exists(): + if poultry_request.remain_quantity == 0: + file_state = 'allocated_completed' + + + else: + file_state = 'allocated_pending' + + process.update({"file_state": file_state}) + process.update({"poultry": { + "poultry_unit_name": poultry_request.poultry.unit_name, + "breeding_unique_id": poultry_request.poultry.breeding_unique_id, + "general_order_code": poultry_request.general_order_code, + "halls": poultry_request.poultry.number_of_halls, + "tenant": poultry_request.poultry.tenant, + "has_tenant": poultry_request.poultry.has_tenant, + "poultry_request_id": poultry_request.id, + "base_order": poultry_request.poultry.user.base_order, + "awaiting_payment": poultry_request.awaiting_payment, + "poultry_request_final_state": poultry_request.final_state, + "poultry_request_key": poultry_request.key, + "kill_house_list": poultry_request.kill_house_list, + "poultry_order_code": poultry_request.order_code, + "poultry_send_date": poultry_request.send_date, + "poultry_name": poultry_request.poultry.user.fullname, + "poultry_mobile": poultry_request.poultry.user.mobile, + "poultry_city": poultry_request.poultry.address.city.name, + "poultry_province": poultry_request.poultry.address.province.name, + "poultry_gis_code": poultry_request.poultry.gis_code, + 'age': age2, + 'chicken_date': None, + "poultry_quantity": poultry_request.quantity, + "poultry_first_quantity": poultry_request.first_quantity, + "poultry_previous_quantity": poultry_request.previous_quantity, + "poultry_remain_quantity": poultry_request.remain_quantity, + "poultry_chicken_breed": poultry_request.chicken_breed, + "poultry_request_losses": poultry_request.losses, + "poultry_Index_weight": "{} کیلوگرم".format(poultry_request.Index_weight), + "Index_weight": poultry_request.Index_weight, + "poultry_register_date": poultry_request.create_date, + "poultry_auction": poultry_request.auction, + "sell_type": poultry_request.cell_type, + "buyer": poultry_request.buyer, + "clearance_code": poultry_request.clearance_code, + + } + }) + poultry_hatching = PoultryHatching.objects.filter(key=poultry_request.hatching.key, trash=False) + if poultry_hatching.count() > 0: + poultry_hatching = poultry_hatching.last() + inspections = VetFarmInspection.objects.filter(poultry_hatching=poultry_hatching) + losses = 0 + if inspections.count() > 0: + for ins in inspections: + if ins.Losses > 0: + losses += ins.Losses + else: + pass + + if losses > 0: + process.update({"inspection_losses": losses + }) + process.update({ + "inspection_losses_percent": (losses * 100) / poultry_request.hatching.quantity + }) + + else: + process.update({"inspection_losses": losses + }) + process.update({ + "inspection_losses_percent": losses + }) + + process.update({"poultry_hatching": { + "poultry_key": poultry_request.hatching.poultry.key, + "poultry_hatching_key": poultry_request.hatching.key, + "poultry_name": poultry_request.hatching.poultry.unit_name, + "quantity": poultry_request.hatching.quantity, + "losses": poultry_request.hatching.losses, + "total_losses_percent": (poultry_request.hatching.losses * 100) / poultry_request.hatching.quantity, + "poultry_losses_percent": (poultry_request.losses * 100) / poultry_request.hatching.quantity, + "left_over": poultry_request.hatching.left_over, + "hall": poultry_request.hatching.hall, + "date": poultry_request.hatching.date, + "allow_hatching": poultry_request.hatching.allow_hatching, + "period": poultry_request.hatching.period, + "state": poultry_request.hatching.state, + } + }) + else: + process.update({"poultry_hatching": None + }) + + vetfarm_inspection = VetFarmInspection.objects.filter(vet_farm__poultry=poultry_request.poultry, + trash=False) + if vetfarm_inspection.count() > 0: + vetfarm_inspection = vetfarm_inspection.last() + process.update({"vetfarm_inspection": { + "vet_name": vetfarm_inspection.vet_farm.vet.user.fullname, + "hall": vetfarm_inspection.hall, + "topic": vetfarm_inspection.topic, + "description": vetfarm_inspection.description, + "image": vetfarm_inspection.image, + "losses": vetfarm_inspection.Losses, + "longitude": vetfarm_inspection.longitude, + "latitude": vetfarm_inspection.latitude, + } + }) + else: + process.update({"vetfarm_inspection": None + }) + auctions = PoultryRequestAuction.objects.filter(poultry_request=poultry_request, + state__in=('active', 'inactive'), trash=False).order_by( + 'auction_date') + if auctions.count() > 0: + auctions_list = [] + for auction in auctions: + if auction.state == 'active': + index = list(auctions).index(auction) + 1 + pricing = Pricing.objects.get(id=auction.pricing.id) + internal_dict_auction = { + "ceiling_price": pricing.ceiling_price, + "floor_price": pricing.floor_price, + "fee": auction.fee, + "hour": auction.hour, + "date": auction.auction_date, + "index": index, + "total_index": auctions.count() + } + auctions_list.append(internal_dict_auction) + process.update({"auctions_list": auctions_list}) + # else: + # break + + + else: + process.update({"auctions_list": None}) + kill_house_auctions = KillHouseRequestAction.objects.filter(poultry_request=poultry_request, + state='pending', + trash=False) + if kill_house_auctions.count() > 0: + kill_house_auctions_list = [] + for kill_house_auction in kill_house_auctions: + internal_dict_kill_house_auction = { + "kill_house_name": kill_house_auction.kill_house.name, + "fullname": kill_house_auction.kill_house.kill_house_operator.user.fullname, + "mobile": kill_house_auction.kill_house.kill_house_operator.user.mobile, + "city": kill_house_auction.kill_house.system_address.city.name, + "province": kill_house_auction.kill_house.system_address.province.name, + "fee": kill_house_auction.fee, + } + kill_house_auctions_list.append(internal_dict_kill_house_auction) + process.update({"kill_house_auctions_list": kill_house_auctions_list}) + else: + process.update({"kill_house_auctions_list": None}) + + kill_house_auction_winner = KillHouseRequestActionWinner.objects.filter( + kill_house_request_auction__poultry_request=poultry_request, trash=False) + if kill_house_auction_winner.count() > 0: + kill_house_auction_winner = kill_house_auction_winner.last() + process.update({"kill_house_winner": { + "kill_house_winner_key": kill_house_auction_winner.key, + "kill_house_name": kill_house_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_user_name": kill_house_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.fullname, + "kill_house_user_mobile": kill_house_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "kill_house_city": kill_house_auction_winner.kill_house_request_auction.kill_house.system_address.city.name, + "kill_house_province": kill_house_auction_winner.kill_house_request_auction.kill_house.system_address.province.name, + "fee": kill_house_auction_winner.fee, + "quantity": kill_house_auction_winner.quantity + } + }) + else: + process.update({"kill_house_winner": None + }) + + province_request_auctions = ProvinceRequestAction.objects.filter(poultry_request=poultry_request, + state='active', trash=False) + if province_request_auctions.count() > 0: + province_request_auction_list = [] + for province_request_auction in province_request_auctions: + internal_dict_province_request_auction_list = { + "fullname": province_request_auction.province_operator_system.user.fullname, + "mobile": province_request_auction.province_operator_system.user.mobile, + "city": province_request_auction.province_operator_system.user.city.name, + "province": province_request_auction.province_operator_system.user.province.name, + } + province_request_auction_list.append(internal_dict_province_request_auction_list) + process.update({"province_request_auction_list": province_request_auction_list}) + else: + process.update({"province_request_auction_list": None}) + poultry_assignment = PoultryAssignmentInformation.objects.filter(poultry_request=poultry_request, + trash=False) + + if poultry_assignment: + poultry_bar_list = [] + for bar in poultry_assignment: + internal_poultry_bar = { + "poultry_bar_info_key": bar.key, + "car_weight_without_load": bar.car_weight_without_load, + "car_weight_without_load_image": bar.car_weight_without_load_image, + "car_weight_with_load": bar.car_weight_with_load, + "car_weight_with_load_image": bar.car_weight_with_load_image, + "net_weight": bar.net_weight, + } + poultry_bar_list.append(internal_poultry_bar) + + process.update({"poultry_bar_info": poultry_bar_list}) + if not poultry_assignment: + process.update({"poultry_bar_info": None}) + + city = CityOperatorCheckRequest.objects.filter(poultry_request=poultry_request, trash=False) + if city: + process.update({"city": { + "city_operator_name": city[0].city_operator_system.user.fullname, + "city_operator_mobile": city[0].city_operator_system.user.mobile, + "city_operator_province": city[0].city_operator_system.address.province.name, + "city_operator_city": city[0].city_operator_system.address.city.name, + "city_operator_address": city[0].city_operator_system.address.address, + "city_operator_national_id": city[0].city_operator_system.user.national_id, + "city_state": city[0].state, + "province_accept": city[0].province_accept, + "accepted_rejected_date": city[0].create_date, + "city_operator_message": city[0].message, + "unit_name": city[0].city_operator_system.unit_name, + }}) + if not city: + process.update({"city": None}) + # cit = CityUnit.objects.filter(name=poultry_request.poultry.address.city.name, trash=False) + # if cit.count() > 0: + # city_operator = CityOperator.objects.get(address__city=cit[0].city, trash=False) + city_operator = CityOperator.objects.get(key=poultry_request.city_operator.key, trash=False) + process.update({"city_operator": { + "city_operator_name": city_operator.user.fullname, + "city_operator_mobile": city_operator.user.mobile, + "city_operator_province": city_operator.address.province.name, + "city_operator_city": city_operator.address.city.name, + "city_operator_address": city_operator.address.address, + "city_operator_national_id": city_operator.user.national_id, + "unit_name": city_operator.unit_name, + }}) + + province = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request, + trash=False) + + if province.count() > 0: + if 'role' in request.GET: + if request.GET['role'] == 'Poultry': + process.update({"province": { + "province_check_request_key": province[0].key, + "province_operator_name": province[0].province_operator_system.user.fullname, + "province_operator_mobile": province[0].province_operator_system.user.mobile, + "province_operator_provinc": province[0].province_operator_system.address.province.name, + "province_operator_city": province[0].province_operator_system.address.city.name, + "province_operator_address": province[0].province_operator_system.address.address, + "province_operator_national_id": province[0].province_operator_system.user.national_id, + "province_state": province[0].state, + "province_message": province[0].message, + "chicken_price": province[0].fee, + "accepted_rejected_date": province[0].create_date, + }}) + else: + + process.update({"province": { + "province_check_request_key": province[0].key, + "province_operator_name": province[0].province_operator_system.user.fullname, + "province_operator_mobile": province[0].province_operator_system.user.mobile, + "province_operator_provinc": province[0].province_operator_system.address.province.name, + "province_operator_city": province[0].province_operator_system.address.city.name, + "province_operator_address": province[0].province_operator_system.address.address, + "province_operator_national_id": province[0].province_operator_system.user.national_id, + "province_state": province[0].state, + "province_message": province[0].message, + "chicken_price": province[0].fee, + "accepted_rejected_date": province[0].create_date, + }}) + + if not province: + process.update({"province": None}) + + role = Group.objects.get(name='ProvinceOperator') + province_operator = ProvinceOperator.objects.get( + address__province__name=poultry_request.poultry.address.province.name, + user__role=role, trash=False) + process.update({"province_operator": { + "province_operator_name": province_operator.user.fullname, + "province_operator_mobile": province_operator.user.mobile, + "province_operator_provinc": province_operator.address.province.name, + "province_operator_city": province_operator.address.city.name, + "province_operator_address": province_operator.address.address, + "province_operator_national_id": province_operator.user.national_id, + }}) + if ProvinceFactorToKillHouseForPoultry.objects.filter(province_check_req=province.last()).exists(): + poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_req=province.last()).last() + if poultry_factor.bank != None: + name_of_bank_user_poultry = poultry_factor.bank.name_of_bank_user + bank_name_poultry = poultry_factor.bank.bank_name + card_poultry = poultry_factor.bank.card + shaba_poultry = poultry_factor.bank.shaba + account_poultry = poultry_factor.bank.account + else: + name_of_bank_user_poultry = None + bank_name_poultry = None + card_poultry = None + shaba_poultry = None + account_poultry = None + process.update({"poultry_factor": { + "poultry_factor_key": poultry_factor.key, + "province_factor_fee": poultry_factor.factor_fee, + "province_operator": poultry_factor.province_check_req.province_operator_system.user.fullname, + "province_mobile": poultry_factor.province_check_req.province_operator_system.user.mobile, + "weight": poultry_factor.total_weight, + "cost": poultry_factor.total_price, + "poultry_share_with_profit": poultry_factor.shares, + "total_amount_char": words(poultry_factor.total_price) + " " + "ریال", + "name_of_bank_user": name_of_bank_user_poultry, + "bank_name": bank_name_poultry, + "card": card_poultry, + "shaba": shaba_poultry, + "account": account_poultry, + }}) + else: + process.update({"poultry_factor": None}) + + if ProvinceFactorToKillHouse.objects.filter(province_check_req=province.last()).exists(): + province_factor = ProvinceFactorToKillHouse.objects.filter(province_check_req=province.last()).last() + + if province_factor.bank != None: + name_of_bank_user_province_factor = province_factor.bank.name_of_bank_user + bank_name_province_factor = province_factor.bank.bank_name + card_province_factor = province_factor.bank.card + shaba_province_factor = province_factor.bank.shaba + account_province_factor = province_factor.bank.account + else: + name_of_bank_user_province_factor = None + bank_name_province_factor = None + card_province_factor = None + shaba_province_factor = None + account_province_factor = None + + process.update({"province_factor": { + "province_factor_key": province_factor.key, + "province_factor_fee": province_factor.factor_fee, + "province_operator": province_factor.province_check_req.province_operator_system.user.fullname, + "province_mobile": province_factor.province_check_req.province_operator_system.user.mobile, + "weight": province_factor.total_weight, + "cost": province_factor.total_price, + "union_share_with_profit": province_factor.shares, + "total_amount_char": words(province_factor.total_price) + " " + "ریال", + "name_of_bank_user": name_of_bank_user_province_factor, + "bank_name": bank_name_province_factor, + "card": card_province_factor, + "shaba": shaba_province_factor, + "account": account_province_factor, + }}) + else: + process.update({"province_factor": None}) + + if ProvinceImportKillHouseOutFactors.objects.filter(province_check=province.last()).exists(): + payment_out_factors = ProvinceImportKillHouseOutFactors.objects.filter(province_check=province.last()) + interal_factor_list = [] + for payment_out_factor in payment_out_factors: + internal_dict = { + "key": payment_out_factor.key, + "amount": payment_out_factor.amount, + "image": payment_out_factor.image, + } + interal_factor_list.append(internal_dict) + process.update({"out_factors": interal_factor_list}) + else: + process.update({"out_factors": None}) + + if 'role' in request.GET: + if request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.filter(user=user, trash=False) + if kill_house_operator.count() > 0: + kill_house_operator = kill_house_operator.last() + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, + killhouse_user__in=kill_house, trash=False) + elif request.GET['role'] == 'KillHouseVet': + vet = Vet.objects.filter(user=user, trash=False) + if vet.count() > 0: + vet = vet.last() + kill_house_vet = KillHouseVet.objects.filter(vet=vet) + kill_house_vet = kill_house_vet.last() + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, + killhouse_user=kill_house_vet.kill_house, trash=False) + else: + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, trash=False) + + if province_kill_reqs.count() > 0: + state_list = [] + for province_kill_req in province_kill_reqs: + state_list.append(province_kill_req.payment_type) + l1 = set(state_list) + if len(l1) > 1: + process.update({"file_payment_type": "cash_credit"}) + else: + process.update({"file_payment_type": state_list[0]}) + province_kill_reqs_list = [] + for province_kill_req in province_kill_reqs: + check = KillHouseCheckRequest.objects.filter(province_kill_request=province_kill_req, + trash=False) + internal_province_kill_dict_infos = { + "province_kill_req_key": province_kill_req.key, + "payment_type": province_kill_req.payment_type, + "payment_dead_line": province_kill_req.payment_dead_line, + "kill_req_key": province_kill_req.kill_request.key, + "province_kill_req_state": province_kill_req.state, + "kill_house_name": province_kill_req.kill_request.kill_house.name, + "kill_house_user_name": province_kill_req.kill_request.kill_house.kill_house_operator.user.fullname, + "kill_house_user_city": province_kill_req.kill_request.kill_house.kill_house_operator.user.city.name, + "kill_house_user_province": province_kill_req.kill_request.kill_house.kill_house_operator.user.province.name, + "kill_house_user_national_id": province_kill_req.kill_request.kill_house.kill_house_operator.user.national_id, + "kill_house_mobile": province_kill_req.kill_request.kill_house.kill_house_operator.user.mobile, + "quantity": province_kill_req.quantity, + "time": province_kill_req.kill_request.recive_time, + "date": province_kill_req.kill_request.recive_date, + "automatic_state": province_kill_req.automatic, + "fee": province_kill_req.fee, + "province_kill_req_message": province_kill_req.message + } + + kill_house_requests = KillHouseRequest.objects.filter( + province_request__city_request_Poultry__poultry_request=poultry_request, + province_kill_request=province_kill_req, trash=False) + if kill_house_requests.count() > 0: + reqs = [] + for kill_house_request in kill_house_requests: + province_req = kill_house_request.province_request + internal_dict_infos = { + "kill_house_req_key": kill_house_request.key, + "payment_type": province_kill_req.payment_type, + "province_fee": province_kill_req.fee, + "payment_dead_line": province_kill_req.payment_dead_line, + "kill_house_vet_state": kill_house_request.vet_state, + "kill_req_key": kill_house_request.kill_request.key, + "kill_house_check_key": check[0].key, + "barcod": kill_house_request.bar_code, + "kill_house_state": kill_house_request.state, + "kill_house_name": kill_house_request.kill_request.kill_house.name, + "kill_house_user_name": kill_house_request.kill_request.kill_house.kill_house_operator.user.fullname, + "kill_house_user_province": kill_house_request.kill_request.kill_house.kill_house_operator.user.province.name, + "kill_house_user_city": kill_house_request.kill_request.kill_house.kill_house_operator.user.city.name, + "kill_house_user_address": kill_house_request.kill_request.kill_house.system_address.address, + "kill_house_mobile": kill_house_request.kill_request.kill_house.kill_house_operator.user.mobile, + "kill_house_national_id": kill_house_request.kill_request.kill_house.kill_house_operator.user.national_id, + "quantity": kill_house_request.quantity, + "fee": kill_house_request.province_kill_request.fee, + "time": kill_house_request.kill_request.recive_time, + "date": kill_house_request.kill_request.recive_date, + "cars": kill_house_request.car, + "driver_name": kill_house_request.add_car.driver.driver_name, + "type_car": kill_house_request.add_car.driver.type_car, + "pelak": kill_house_request.add_car.driver.pelak, + "clearance_code": kill_house_request.clearance_code, + "traffic_code": kill_house_request.traffic_code, + "show_kill_house": kill_house_request.show_kill_house, + "kill_house_message": kill_house_request.kill_house_message + } + + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request, + trash=False) + if vet_check: + internal_dict_infos.update({ + "vet_check_info": { + "vet_user": vet_check[0].kill_house_vet.vet.user.fullname, + "vet_user_mobile": vet_check[0].kill_house_vet.vet.user.mobile, + "vet_check_state": vet_check[0].state, + "vet_check_accept_date": vet_check[0].create_date, + } + }) + if not vet_check: + internal_dict_infos.update({ + "vet_check_info": None + }) + kill_house_assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_check__province_kill_request__province_request=province_req, + kill_house_request=kill_house_request, trash=False) + if kill_house_assignment: + internal_dict_infos.update({ + "bar_info": { + "kill_house_assignment_key": kill_house_assignment[0].key, + "real_quantity": kill_house_assignment[0].real_quantity, + "kill_house_weight_without_load": kill_house_assignment[ + 0].car_weight_without_load, + "kill_house_weight_with_load": kill_house_assignment[ + 0].car_weight_with_load, + "kill_house_image_without_load": kill_house_assignment[ + 0].car_weight_without_load_image, + "kill_house_image_with_load": kill_house_assignment[ + 0].car_weight_with_load_image, + "kill_house_net_weight": kill_house_assignment[0].net_weight, + "kill_house_assignment_state": kill_house_assignment[0].state, + "expire_time": kill_house_assignment[0].protest_time, + "kill_house_assignment_message": kill_house_assignment[0].message, + "accept_reject_date": kill_house_assignment[0].modify_date, + "unusual_casualties": kill_house_assignment[0].unusual_casualties, + + } + }) + + complaint = KillHouseComplaint.objects.filter(bar=kill_house_assignment[0], + trash=False) + percentage_losses = PercentageOfLosses.objects.all() + if percentage_losses.count() > 0: + percentage_losses = percentage_losses.last().percent + else: + percentage_losses = None + if complaint.count() > 0: + complaint = complaint.last() + check_complaint = CheckUnusualCasualties.objects.filter(complaint=complaint) + if check_complaint.count() > 0: + reviewer = check_complaint.last().role + else: + reviewer = None + internal_dict_infos.update({ + "complaint": { + "complaint_key": complaint.key, + "create_date": complaint.create_date, + "title": complaint.title, + "description": complaint.description, + "percent": complaint.percent, + "image": complaint.image, + "state": complaint.state, + "message": complaint.message, + "registrar": complaint.registrar, + "reviewer": reviewer, + "real_weight": kill_house_assignment[0].net_weight, + "losses_weight": kill_house_assignment[0].weight_withs_losses, + "percentage_losses": percentage_losses, + } + }) + else: + internal_dict_infos.update({ + "complaint": None + }) + + if not kill_house_assignment: + internal_dict_infos.update({ + "bar_info": None + }) + internal_dict_infos.update({ + "complaint": None + }) + + poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if poultry_factor.count() > 0: + poultry_factor = poultry_factor.last() + if poultry_factor.bank != None: + name_of_bank_user = poultry_factor.bank.name_of_bank_user + bank_name = poultry_factor.bank.bank_name + card = poultry_factor.bank.card, + shaba = poultry_factor.bank.shaba, + account = poultry_factor.bank.account, + else: + name_of_bank_user = None + bank_name = None + card = None + shaba = None + account = None + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + total = share_allocation.total + else: + total = 0 + internal_dict_infos.update({ + "province_factor_to_kill_house_for_poultry": { + "province_factor_key": poultry_factor.key, + "province_factor_fee": poultry_factor.factor_fee, + "province_operator": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.fullname, + "province_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.mobile, + "weight": poultry_factor.total_weight, + "bar_code": poultry_factor.factor_bar_code, + "kill_house_name": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, + "kill_house_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, + "cost": poultry_factor.total_price, + "poultry_share_with_profit": poultry_factor.shares[ + 'poultryShareWithProfit'], + "total_amount_char": words(poultry_factor.total_price) + " " + "ریال", + "total_share_allocation": poultry_factor.total_weight * total, + "total_share_allocation_char": words( + poultry_factor.total_weight * total) + " " + "ریال", + "name_of_bank_user": name_of_bank_user, + "bank_name": bank_name, + "card": card, + "shaba": shaba, + "account": account, + } + }) + if not poultry_factor: + internal_dict_infos.update({ + "province_factor_to_kill_house_for_poultry": None + }) + + province_factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if province_factor: + if province_factor[0].bank != None: + name_of_bank_user = province_factor[0].bank.name_of_bank_user + bank_name = province_factor[0].bank.bank_name + card = province_factor[0].bank.card, + shaba = province_factor[0].bank.shaba, + account = province_factor[0].bank.account, + else: + name_of_bank_user = None + bank_name = None + card = None + shaba = None + account = None + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + total = share_allocation.total + else: + total = 0 + + if province_factor[0].poultry_factor == None: + poultry_share_with_profit = province_factor[0].shares['poultryShareWithProfit'] + else: + poultry_share_with_profit = province_factor[0].poultry_factor.total_price + + internal_dict_infos.update({ + "province_factor_to_kill_house": { + "province_factor_key": province_factor[0].key, + "province_factor_fee": province_factor[0].factor_fee, + "province_operator": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.fullname, + "province_mobile": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.mobile, + "weight": province_factor[0].total_weight, + "bar_code": province_factor[0].factor_bar_code, + "kill_house_name": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, + "kill_house_mobile": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, + "cost": province_factor[0].total_price, + "poultry_share_with_profit": poultry_share_with_profit, + "union_share_with_profit": province_factor[0].shares[ + 'unionShareWithProfit'], + "total_amount_char": words(province_factor[0].total_price) + " " + "ریال", + "total_share_allocation": province_factor[0].total_weight * total, + "total_share_allocation_char": words( + province_factor[0].total_weight * total) + " " + "ریال", + "name_of_bank_user": name_of_bank_user, + "bank_name": bank_name, + "card": card, + "shaba": shaba, + "account": account, + } + }) + if not province_factor: + internal_dict_infos.update({ + "province_factor_to_kill_house": None + }) + + kill_house_factor_poultry = KillHouseFactorToPoultry.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if kill_house_factor_poultry.count(): + kill_house_factor_poultry = kill_house_factor_poultry.last() + internal_dict_infos.update({ + "kill_house_factor_to_poultry": { + "kill_house_name": kill_house_request.killhouse_user.name, + "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, + "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, + "time": kill_house_factor_poultry.create_date, + "payment_code": kill_house_factor_poultry.payment_code, + "factor_image": kill_house_factor_poultry.factor_image, + "factor_key": kill_house_factor_poultry.key, + "factor_state": kill_house_factor_poultry.state, + "total_money": kill_house_factor_poultry.province_factor.total_price, + "factor_message": kill_house_factor_poultry.message + } + }) + if not kill_house_factor_poultry: + internal_dict_infos.update({ + "kill_house_factor_to_poultry": None + }) + kill_house_factor = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if kill_house_factor: + internal_dict_infos.update({ + "kill_house_factor_to_province": { + "kill_house_name": kill_house_request.killhouse_user.name, + "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, + "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, + "time": kill_house_factor[0].create_date, + "payment_code": kill_house_factor[0].payment_code, + "factor_image": kill_house_factor[0].factor_image, + "factor_key": kill_house_factor[0].key, + "factor_state": kill_house_factor[0].state, + "total_money": kill_house_factor[0].province_factor.total_price, + "factor_message": kill_house_factor[0].message + } + }) + if not kill_house_factor: + internal_dict_infos.update({ + "kill_house_factor_to_province": None + }) + + reqs.append(internal_dict_infos) + internal_province_kill_dict_infos.update({"kill_house_requests": reqs + + }) + if not kill_house_requests: + internal_province_kill_dict_infos.update({"kill_house_requests": None + + }) + + province_kill_reqs_list.append(internal_province_kill_dict_infos) + process.update({"province_kill_requests": province_kill_reqs_list}) + + elif province_kill_reqs.count() == 0: + process.update({"province_kill_requests": None + + }) + if 'role' in request.GET: + if request.GET['role'] == 'KillHouse': + kill_house_operator = KillHouseOperator.objects.filter(user=user, trash=False) + if kill_house_operator.count() > 0: + kill_house_operator = kill_house_operator.last() + kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) + kill_house_reqs = KillHouseRequest.objects.filter( + kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + killhouse_user__in=kill_house, trash=False) + elif request.GET['role'] == 'KillHouseVet': + vet = Vet.objects.filter(user=user, trash=False) + if vet.count() > 0: + vet = vet.last() + kill_house_vet = KillHouseVet.objects.filter(vet=vet) + kill_house_vet = kill_house_vet.last() + kill_house_reqs = KillHouseRequest.objects.filter( + kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + killhouse_user=kill_house_vet.kill_house, trash=False) + else: + kill_house_reqs = KillHouseRequest.objects.filter( + kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + trash=False) + + if kill_house_reqs.count() > 0: + + reqs = [] + for kill_house_request in kill_house_reqs: + # province_req = kill_house_request.province_request + internal_dict_infos = { + "kill_house_req_key": kill_house_request.key, + "kill_house_vet_state": kill_house_request.vet_state, + "order_code": poultry_request.order_code, + "barcod": kill_house_request.bar_code, + "kill_house_state": kill_house_request.state, + "kill_house_name": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_user_name": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.fullname, + "kill_house_user_province": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.province.name, + "kill_house_user_city": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.city.name, + "kill_house_user_address": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.system_address.address, + "kill_house_mobile": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "kill_house_national_id": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.national_id, + "quantity": kill_house_request.quantity, + # "time": kill_house_request.kill_request.recive_time, + # "date": kill_house_request.kill_request.recive_date, + "cars": kill_house_request.car, + "driver_name": kill_house_request.add_car.driver.driver_name, + "type_car": kill_house_request.add_car.driver.type_car, + "pelak": kill_house_request.add_car.driver.pelak, + "clearance_code": kill_house_request.clearance_code, + "traffic_code": kill_house_request.traffic_code, + "show_kill_house": kill_house_request.show_kill_house, + "kill_house_message": kill_house_request.kill_house_message + } + + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request, trash=False) + if vet_check: + internal_dict_infos.update({ + "vet_check_info": { + "vet_user": vet_check[0].kill_house_vet.vet.user.fullname, + "vet_user_mobile": vet_check[0].kill_house_vet.vet.user.mobile, + "vet_check_state": vet_check[0].state, + "vet_check_accept_date": vet_check[0].create_date, + } + }) + if not vet_check: + internal_dict_infos.update({ + "vet_check_info": None + }) + kill_house_assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_request, trash=False) + if kill_house_assignment: + internal_dict_infos.update({ + "bar_info": { + "kill_house_assignment_key": kill_house_assignment[0].key, + "real_quantity": kill_house_assignment[0].real_quantity, + "kill_house_weight_without_load": kill_house_assignment[0].car_weight_without_load, + "kill_house_weight_with_load": kill_house_assignment[0].car_weight_with_load, + "kill_house_image_without_load": kill_house_assignment[ + 0].car_weight_without_load_image, + "kill_house_image_with_load": kill_house_assignment[0].car_weight_with_load_image, + "kill_house_net_weight": kill_house_assignment[0].net_weight, + "expire_time": kill_house_assignment[0].protest_time, + "kill_house_assignment_state": kill_house_assignment[0].state, + "kill_house_assignment_message": kill_house_assignment[0].message, + "accept_reject_date": kill_house_assignment[0].modify_date + + } + }) + complaint = KillHouseComplaint.objects.filter(bar=kill_house_assignment[0], trash=False) + if complaint.count() > 0: + complaint = complaint.last() + internal_dict_infos.update({ + "complaint": { + "complaint_key": complaint.key, + "title": complaint.title, + "description": complaint.description, + "percent": complaint.percent, + "image": complaint.image, + "state": complaint.state, + "message": complaint.message, + } + }) + else: + internal_dict_infos.update({ + "complaint": None + }) + + if not kill_house_assignment: + internal_dict_infos.update({ + "bar_info": None + }) + internal_dict_infos.update({ + "complaint": None + }) + poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if poultry_factor.count() > 0: + poultry_factor = poultry_factor.last() + if poultry_factor.bank != None: + name_of_bank_user = poultry_factor.bank.name_of_bank_user + bank_name = poultry_factor.bank.bank_name + card = poultry_factor.bank.card, + shaba = poultry_factor.bank.shaba, + account = poultry_factor.bank.account, + else: + name_of_bank_user = None + bank_name = None + card = None + shaba = None + account = None + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + total = share_allocation.total + else: + total = 0 + internal_dict_infos.update({ + "province_factor_to_kill_house_for_poultry": { + "province_factor_key": poultry_factor.key, + "province_factor_fee": poultry_factor.factor_fee, + "province_operator": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.fullname, + "province_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.mobile, + "weight": poultry_factor.total_weight, + "bar_code": poultry_factor.factor_bar_code, + "kill_house_name": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, + "kill_house_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, + "cost": poultry_factor.total_price, + "poultry_share_with_profit": poultry_factor.shares[ + 'poultryShareWithProfit'], + "total_amount_char": words(poultry_factor.total_price) + " " + "ریال", + "total_share_allocation": poultry_factor.total_weight * total, + "total_share_allocation_char": words( + poultry_factor.total_weight * total) + " " + "ریال", + "name_of_bank_user": name_of_bank_user, + "bank_name": bank_name, + "card": card, + "shaba": shaba, + "account": account, + } + }) + if not poultry_factor: + internal_dict_infos.update({ + "province_factor_to_kill_house_for_poultry": None + }) + province_factor = ProvinceFactorToKillHouse.objects.filter( + province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if province_factor: + if province_factor[0].bank != None: + name_of_bank_user = province_factor[0].bank.name_of_bank_user + bank_name = province_factor[0].bank.bank_name + card = province_factor[0].bank.card, + shaba = province_factor[0].bank.shaba, + account = province_factor[0].bank.account, + else: + name_of_bank_user = None + bank_name = None + card = None + shaba = None + account = None + share_allocation = ShareOfAllocation.objects.all() + if share_allocation.count() > 0: + share_allocation = share_allocation.last() + total = share_allocation.total + else: + total = 0 + if province_factor[0].poultry_factor == None: + poultry_share_with_profit = province_factor[0].shares['poultryShareWithProfit'] + else: + poultry_share_with_profit = province_factor[0].poultry_factor.total_price + province_operator = province_factor[0].province_check_info.province_operator + internal_dict_infos.update({ + "province_factor_to_kill_house": { + "province_factor_key": province_factor[0].key, + "province_factor_fee": province_factor[0].factor_fee, + "province_operator": province_operator.user.fullname, + "province_mobile": province_operator.user.mobile, + "weight": province_factor[0].total_weight, + "bar_code": province_factor[0].factor_bar_code, + "kill_house_name": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, + "kill_house_mobile": province_factor[ + 0].province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, + "cost": province_factor[0].total_price, + "poultry_share_with_profit": poultry_share_with_profit, + "union_share_with_profit": province_factor[0].shares['unionShareWithProfit'], + "total_amount_char": words(province_factor[0].total_price) + " " + "ریال", + "total_share_allocation": province_factor[0].total_weight * total, + "total_share_allocation_char": words( + province_factor[0].total_weight * total) + " " + "ریال", + "name_of_bank_user": name_of_bank_user, + "bank_name": bank_name, + "card": card, + "shaba": shaba, + "account": account, + + } + }) + if not province_factor: + internal_dict_infos.update({ + "province_factor_to_kill_house": None + }) + + kill_house_factor_poultry = KillHouseFactorToPoultry.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if kill_house_factor_poultry.count(): + kill_house_factor_poultry = kill_house_factor_poultry.last() + internal_dict_infos.update({ + "kill_house_factor_to_poultry": { + "kill_house_name": kill_house_request.killhouse_user.name, + "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, + "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, + "time": kill_house_factor_poultry.create_date, + "payment_code": kill_house_factor_poultry.payment_code, + "factor_image": kill_house_factor_poultry.factor_image, + "factor_key": kill_house_factor_poultry.key, + "factor_state": kill_house_factor_poultry.state, + "total_money": kill_house_factor_poultry.province_factor.total_price, + "factor_message": kill_house_factor_poultry.message + } + }) + if not kill_house_factor_poultry: + internal_dict_infos.update({ + "kill_house_factor_to_poultry": None + }) + kill_house_factor = KillHouseFactorToProvince.objects.filter( + province_factor__province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, + province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, + trash=False) + if kill_house_factor: + internal_dict_infos.update({ + "kill_house_factor_to_province": { + "kill_house_name": kill_house_request.killhouse_user.name, + "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, + "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, + "time": kill_house_factor[0].create_date, + "payment_code": kill_house_factor[0].payment_code, + "factor_image": kill_house_factor[0].factor_image, + "factor_key": kill_house_factor[0].key, + "total_money": kill_house_factor[0].province_factor.total_price, + "factor_state": kill_house_factor[0].state, + "factor_message": kill_house_factor[0].message + } + }) + if not kill_house_factor: + internal_dict_infos.update({ + "kill_house_factor_to_province": None + }) + + reqs.append(internal_dict_infos) + process.update({"auction": reqs}) + + elif kill_house_reqs.count() > 0: + process.update({"auction": None}) + + allocation = DepositAllocation.objects.filter(poultry=poultry_request, trash=False) + if allocation.count() > 0: + if request.GET['role'] == 'Poultry': + if poultry_request.poultry.user_bank_info != None: + poultry_bank_info = poultry_request.poultry.user_bank_info.name_of_bank_user + poultry_bank_name = poultry_request.poultry.user_bank_info.bank_name + poultry_card_number = poultry_request.poultry.user_bank_info.card + poultry_shaba = poultry_request.poultry.user_bank_info.shaba + + else: + poultry_bank_info = None + poultry_bank_name = None + poultry_card_number = None + poultry_shaba = None + + process.update({"allocation": {"allocation_key": allocation[0].key, + "poultry_share_digit": allocation[0].poultry_share, + "poultry_share_char": words( + allocation[0].poultry_share) + " " + 'ریال', + "poultry_share_payment": allocation[0].poultry_share_payment, + "poultry_remaining": (allocation[0].poultry_share - allocation[ + 0].poultry_share_payment), + "poultry_payment_documents": allocation[ + 0].poultry_share_payment_info, + "poultry_bank_info": poultry_bank_info, + "poultry_bank_name": poultry_bank_name, + "poultry_card_number": poultry_card_number, + "poultry_shaba": poultry_shaba, + "poultry_image": allocation[0].poultry_image, + + }}) + elif request.GET['role'] == 'CityOperator': + if city_operator.user_bank_info != None: + city_bank_info = city_operator.user_bank_info.name_of_bank_user + city_bank_name = city_operator.user_bank_info.bank_name + city_card_number = city_operator.user_bank_info.card + city_shaba = city_operator.user_bank_info.shaba + else: + city_bank_info = None + city_bank_name = None + city_card_number = None + city_shaba = None + process.update({"allocation": {"allocation_key": allocation[0].key, + "city_share_digit": allocation[0].city_share, + "city_share_char": words( + allocation[0].city_share) + " " + 'ریال', + "city_share_payment": allocation[0].city_share_payment, + "city_share_remaining": ( + allocation[0].city_share - allocation[0].city_share_payment), + "city_payment_documents": allocation[0].city_share_payment_info, + "city_image": allocation[0].city_image, + "city_bank_info": city_bank_info, + "city_bank_name": city_bank_name, + "city_card_number": city_card_number, + "city_shaba": city_shaba, + }}) + else: + process.update({"allocation": None}) + + if not allocation: + process.update({"allocation": None}) + + province_incpector = PovinceInspector.objects.filter(poultry_request=poultry_request, trash=False) + if province_incpector: + process.update( + {"province_incpector": {"inspector_name": province_incpector[0].inspector_operator.user.fullname, + "state": province_incpector[0].state, + "message": province_incpector[0].message, + "accept-reject-date": province_incpector[0].create_date, }}) + if not province_incpector: + province_name = poultry_request.poultry.address.province.name + inspector = InspectorOperator.objects.get(address__province__name=province_name, trash=False) + process.update({"province_incpector": {"province_incpector": None, + "state": 'pending', + "inspector_name": inspector.user.fullname, + "inspector_mobile": inspector.user.mobile, + "inspector_address": inspector.address.province.name}}) + process1.update({"process": process}) + + return Response(process1, status=status.HTTP_200_OK) + + +# ویوست مربوط به ثبت و نمایش و ... مستاجر مرغداری +class PoultryRequestAuctionViewSet(viewsets.ModelViewSet): + queryset = PoultryRequestAuction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryRequestAuction + + +# ویوست مربوط به وارد کردن اطلاعات بار توسط مرغدار +class PoultryAssignmentInformationViewSet(viewsets.ModelViewSet): + queryset = PoultryAssignmentInformation.objects.all() + serializer_class = PoultryAssignmentInformationSerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به وارد کردن اطلاعات بار توسط مرغدار + def create(self, request, *args, **kwargs): + # refresh(request.user.id) + poultry = PoultryRequest.objects.get(key=request.data['key'], trash=False) + car_without_load_image = request.data['car_without_load_image'] + car_with_load_image = request.data['car_with_load_image'] + request.data.pop('key') + request.data.pop('car_without_load_image') + request.data.pop('car_with_load_image') + pic = [] + pic.append(car_without_load_image) + pic.append(car_with_load_image) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + poultry_assignment_info = serializer.create(validated_data=request.data) + poultry_assignment_info.poultry_request = poultry + for p in pic: + if p == car_without_load_image: + poultry_assignment_info.car_weight_without_load_image = send_image_to_server(p) + else: + poultry_assignment_info.car_weight_with_load_image = send_image_to_server(p) + poultry_assignment_info.save() + assignment_info_serializer = self.serializer_class(poultry_assignment_info) + return Response(assignment_info_serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + + # تابع مربوط به ویرایش اطلاعات بار وارد شده توسط مرغدار + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + poultry_assignment = PoultryAssignmentInformation.objects.get(key__exact=request.data["key"], trash=False) + request.data.pop('key') + try: + if request.data['car_without_load_image'] == "": + car_without_load_image = None + + else: + car_without_load_image = request.data['car_without_load_image'] + request.data.pop('car_without_load_image') + + except: + car_without_load_image = None + + try: + if request.data['car_with_load_image'] == "": + car_with_load_image = None + + else: + car_with_load_image = request.data['car_with_load_image'] + request.data.pop('car_with_load_image') + + except: + car_with_load_image = None + + if car_without_load_image: + poultry_assignment.car_weight_without_load_image = send_image_to_server(car_without_load_image) + + if car_with_load_image: + poultry_assignment.car_weight_with_load_image = send_image_to_server(car_with_load_image) + + poultry_assignment.save() + serializer = self.serializer_class(poultry_assignment) + serializer.update(instance=poultry_assignment, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + +# ویوست مربوط به سرچ درخواست مرغدار +class PoultryRequestSearchViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + if 'type' in request.GET: + if request.GET['type'] == 'fullname': + queryset = PoultryRequest.objects.filter(user__fullname=request.GET['value'], trash=False) + serializer = PoultryRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif request.GET['type'] == 'mobile': + queryset = PoultryRequest.objects.filter(user__mobile=request.GET['value'], trash=False) + serializer = PoultryRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif request.GET['type'] == 'gis_code': + queryset = PoultryRequest.objects.filter(user__gis_code=request.GET['value'], trash=False) + serializer = PoultryRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif request.GET['type'] == 'order_code': + queryset = PoultryRequest.objects.get(order_code=int(request.GET['value']), trash=False) + serializer = PoultryRequestSerializer(queryset) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif request.GET['type'] == 'bar_code': + poultry = KillHouseRequest.objects.get( + bar_code=int(request.GET['value'])).province_request.city_request_Poultry.poultry_request + queryset = PoultryRequest.objects.get(key=poultry.key, trash=False) + serializer = PoultryRequestSerializer(queryset) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif request.GET['type'] == 'city': + queryset = PoultryRequest.objects.filter(user__address__city=request.GET['value'], trash=False) + serializer = PoultryRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + elif request.GET['type'] == 'province': + queryset = PoultryRequest.objects.filter(user__address__province=request.GET['value'], trash=False) + serializer = PoultryRequestSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN) + + +# تابع برای کنسل کردن اتوماتیک درخواست بورسی مرغدار طبق شرایط خاص +@api_view(["POST"]) +@csrf_exempt +@permission_classes([AllowAny]) +def Cancel_Poultry_Exchange_request(request): + for req in PoultryRequestExchange.objects.all(): + if (req.send_date - req.hatching_date).days > 65: + req.trash = True + req.save() + return Response("ok") + + +def Check_Poultry_Auction_request(): + reqs = PoultryRequest.objects.filter(auction=True, final_state='pending', trash=False).order_by('send_date') + for req in reqs: + now = datetime.datetime.now() + kill_house_auction = KillHouseRequestAction.objects.filter(poultry_request=req, trash=False).order_by('fee') + auction = PoultryRequestAuction.objects.filter(poultry_request=req, state='active', trash=False) + if auction.count() > 0: + auction = auction.last() + if now.year >= auction.auction_date.year and now.month >= auction.auction_date.month and now.day >= auction.auction_date.day and now.hour >= auction.auction_date.hour and now.minute >= auction.auction_date.minute: + if kill_house_auction.count() > 0: + kill_house_auction = kill_house_auction.last() + kill_house_auction_win = KillHouseRequestActionWinner( + kill_house_request_auction=kill_house_auction, + fee=kill_house_auction.fee, + quantity=req.quantity + ) + kill_house_auction_win.save() + req.auction = False + req.save() + auction.state = 'complete' + auction.save() + kill_house_auction.state = 'accepted' + kill_house_auction.save() + kill_house_aucs = KillHouseRequestAction.objects.filter(poultry_request=req, state='pending', + trash=False) + for kill_house_auc in kill_house_aucs: + kill_house_auc.state = 'unaccepted' + kill_house_auc.save() + auctions = PoultryRequestAuction.objects.filter(poultry_request=req, state='inactive', + trash=False) + for auc in auctions: + auc.state = 'complete' + auc.save() + + else: + + auction.state = 'complete' + auction.save() + auctions = PoultryRequestAuction.objects.filter(poultry_request=req, state='inactive', + trash=False).order_by( + 'auction_date') + if auctions.count() > 0: + for auction in auctions: + auction.state = 'active' + auction.save() + break + else: + if req.union == True: + req.auction = False + req.save() + city_operator_check_request = CityOperatorCheckRequest.objects.get(poultry_request=req, + trash=False) + city_operator_check_request.show_province = True + city_operator_check_request.save() + + return Response({"result": "system checked"}, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@csrf_exempt +@permission_classes([AllowAny]) +def Check_Poultry_Auction_request_front(request): + reqs = PoultryRequest.objects.filter(auction=True, final_state='pending', trash=False).order_by('send_date') + for req in reqs: + now = datetime.datetime.now() + kill_house_auction = KillHouseRequestAction.objects.filter(poultry_request=req, trash=False).order_by('fee') + auction = PoultryRequestAuction.objects.filter(poultry_request=req, state='active', trash=False) + if auction.count() > 0: + auction = auction.last() + if now.year >= auction.auction_date.year and now.month >= auction.auction_date.month and now.day >= auction.auction_date.day and now.hour >= auction.auction_date.hour and now.minute >= auction.auction_date.minute: + if kill_house_auction.count() > 0: + kill_house_auction = kill_house_auction.last() + kill_house_auction_win = KillHouseRequestActionWinner( + kill_house_request_auction=kill_house_auction, + fee=kill_house_auction.fee, + quantity=req.quantity + ) + kill_house_auction_win.save() + req.auction = False + req.save() + auction.state = 'complete' + auction.save() + kill_house_auction.state = 'accepted' + kill_house_auction.save() + kill_house_aucs = KillHouseRequestAction.objects.filter(poultry_request=req, state='pending', + trash=False) + for kill_house_auc in kill_house_aucs: + kill_house_auc.state = 'unaccepted' + kill_house_auc.save() + auctions = PoultryRequestAuction.objects.filter(poultry_request=req, state='inactive', + trash=False) + for auc in auctions: + auc.state = 'complete' + auc.save() + else: + + auction.state = 'complete' + auction.save() + auctions = PoultryRequestAuction.objects.filter(poultry_request=req, state='inactive', + trash=False).order_by( + 'auction_date') + if auctions.count() > 0: + for auction in auctions: + auction.state = 'active' + auction.save() + break + else: + if req.union == True: + req.auction = False + req.save() + city_operator_check_request = CityOperatorCheckRequest.objects.get(poultry_request=req, + trash=False) + city_operator_check_request.show_province = True + city_operator_check_request.save() + + return Response({"result": "system checked"}, status=status.HTTP_200_OK) + + +class Chicken_informationViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + serializer_class = PoultryHatchingSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + + poultry_list = [] + quantity_list = [] + + now = datetime.datetime.now().date() + + poultryhatchings = PoultryHatching.objects.filter(state='pending', trash=False) + if poultryhatchings.count() > 0: + if 'age1' in request.GET: + if 'age2' in request.GET: + for poultryhatching in poultryhatchings: + if int(request.GET['age1']) <= (now - poultryhatching.date.date()).days + 1 and ( + now - poultryhatching.date.date()).days + 1 <= int(request.GET['age2']): + quantity_list.append(poultryhatching.quantity) + + internal_dict = { + "full_name": poultryhatching.poultry.user.fullname, + "mobile": poultryhatching.poultry.user.mobile, + "city": poultryhatching.poultry.user.city.name, + "province": poultryhatching.poultry.user.province.name, + "unit_name": poultryhatching.poultry.unit_name, + "breeding_unique_id": poultryhatching.poultry.breeding_unique_id, + "quantity": quantity_list, + } + poultry_list.append(internal_dict) + else: + for poultryhatching in poultryhatchings: + if (now - poultryhatching.date.date()).days + 1 == int(request.GET['age1']): + internal_dict = { + "full_name": poultryhatching.poultry.user.fullname, + "mobile": poultryhatching.poultry.user.mobile, + "city": poultryhatching.poultry.user.city.name, + "province": poultryhatching.poultry.user.province.name, + "unit_name": poultryhatching.poultry.unit_name, + "breeding_unique_id": poultryhatching.poultry.breeding_unique_id, + "quantity": poultryhatching.quantity, + } + poultry_list.append(internal_dict) + + return Response(poultry_list, status=status.HTTP_200_OK) + + +class SingleAgeHatchingStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + + now = timezone.now().date() + ages_list = [] + hatching_list = [] + hatches = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False + , trash=False).order_by( + '-date') + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + hatchs = hatches.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + hatchs = hatches.filter(poultry__address__city=user.city) + else: + hatchs = hatches + else: + hatchs = hatches + for hatch in hatchs: + if (now - hatch.date.date()).days + 1 not in ages_list: + ages_list.append((now - hatch.date.date()).days + 1) + + # age_difference = ExpressionWrapper(now - F('date'), output_field=DurationField()) + # hatchs = hatchs.annotate(age_difference=age_difference) + for age_list in ages_list: + quantity = 0 + losses = 0 + for hatch in hatchs: + age = (now - hatch.date.date()).days + 1 + if age == age_list: + quantity += hatch.left_over + losses += hatch.losses + hatching_list.append({ + "type": age_list, + "quantity": quantity, + "losses": losses, + }) + return Response(hatching_list, status=status.HTTP_200_OK) + + +class DoughnutHatchingStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + + year = datetime.datetime.now().year + total = 0 + city_list = [] + hatching_list = [] + hatchings_list = [] + hatchingss_lists = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', + archive=False).order_by( + '-date') + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + hatchingss_list = hatchingss_lists.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + hatchingss_list = hatchingss_lists.filter(poultry__address__city=user.city) + else: + hatchingss_list = hatchingss_lists + else: + hatchingss_list = hatchingss_lists + for hatchingss in hatchingss_list: + if (jdatetime.datetime.fromgregorian(year=hatchingss.date.year, month=hatchingss.date.month, + day=hatchingss.date.day)).month == int(request.GET['month']): + hatchings_list.append(hatchingss) + total += hatchingss.quantity + if hatchingss.poultry.address.city not in city_list: + city_list.append(hatchingss.poultry.address.city) + + for city in city_list: + quantity = 0 + for hatch in hatchings_list: + if hatch.poultry.address.city == city: + quantity += hatch.quantity + hatching_list.append({ + "city": city.name, + "percent": round((quantity / total) * 100, 2), + "quantity": quantity, + }) + + return Response(hatching_list, status=status.HTTP_200_OK) + + +class DoughnutHatchingLeftOverStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + + year = datetime.datetime.now().year + total = 0 + city_list = [] + hatching_list = [] + hatchings_list = [] + hatchingss_lists = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', + archive=False).order_by( + '-date') + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + hatchingss_list = hatchingss_lists.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + hatchingss_list = hatchingss_lists.filter(poultry__address__city=user.city) + else: + hatchingss_list = hatchingss_lists + else: + hatchingss_list = hatchingss_lists + for hatchingss in hatchingss_list: + if (jdatetime.datetime.fromgregorian(year=hatchingss.date.year, month=hatchingss.date.month, + day=hatchingss.date.day)).month == int(request.GET['month']): + hatchings_list.append(hatchingss) + total += hatchingss.left_over + if hatchingss.poultry.address.city not in city_list: + city_list.append(hatchingss.poultry.address.city) + + for city in city_list: + quantity = 0 + for hatch in hatchings_list: + if hatch.poultry.address.city == city: + quantity += hatch.left_over + hatching_list.append({ + "city": city.name, + "percent": round((quantity / total) * 100, 2), + "quantity": quantity, + }) + + return Response(hatching_list, status=status.HTTP_200_OK) + + +class HatchingStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + # user = SystemUserProfile.objects.get(user=request.user) + now = timezone.now().date() + age_ranges = [ + (1, 5), (6, 10), (11, 15), (16, 20), (21, 25), (26, 30), + (31, 35), (36, 40), (41, 45), (46, 50), (51, 55), (56, 60), (61, 65), (66, 70), (71, 75), (76, 80), + (81, 85), (86, 90), (91, 95), (96, 100) + ] + + age_ranges_dict = {f"{start}_{end}": {"quantity": 0, "losses": 0} for start, end in age_ranges} + + hatches = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False, + trash=False).order_by( + 'date') + + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + hatchs = hatches.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + hatchs = hatches.filter(poultry__address__city=user.city) + else: + hatchs = hatches + else: + hatchs = hatches + for hatch in hatchs: + age = (now - hatch.date.date()).days + 1 + for age_range, range_data in age_ranges_dict.items(): + start_age, end_age = map(int, age_range.split('_')) + if start_age <= age <= end_age: + range_data["quantity"] += hatch.left_over + range_data["losses"] += hatch.losses + + information_list = [{"type": age_range, **data} for age_range, data in age_ranges_dict.items()] + + return Response(information_list) + + +class PoultryRequestProcessDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + + poultry_request_quantity = 0 + poultry_request_index_weight = 0 + poultry_quantity = 0 + poultry_list = [] + now = datetime.datetime.now().date() + poultry_reqs = PoultryRequest.objects.filter(state_process='accepted', province_state='accepted', + archive=False, send_date__year=now.year, + send_date__month=now.month, send_date__day=now.day, + trash=False).select_related( + 'poultry').only('poultry', 'quantity', 'Index_weight') + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + poultry_requests = poultry_reqs.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + poultry_requests = poultry_reqs.filter(poultry__address__city=user.city) + else: + poultry_requests = poultry_reqs + else: + poultry_requests = poultry_reqs + for poultry_request in poultry_requests: + if poultry_request.poultry not in poultry_list: + poultry_list.append(poultry_request.poultry) + + poultry_request_quantity += poultry_request.quantity + poultry_request_index_weight += round(poultry_request.quantity * poultry_request.Index_weight) + poultry_quantity = len(poultry_list) + + # province_kill_requests_list = ProvinceKillRequest.objects.filter(state='accepted', trash=False).select_related( + # 'province_request__poultry_request', 'kill_request__kill_house').only( + # 'province_request__poultry_request__Index_weight', 'quantity', 'kill_request__kill_house') + # + # province_kill_requests = [ + # province_kill_request_list for province_kill_request_list in province_kill_requests_list + # if date1 <= province_kill_request_list.kill_request.recive_date.date() <= date2 + # ] + # for province_kill_request in province_kill_requests: + # if province_kill_request.kill_request.kill_house not in kill_house_list: + # kill_house_list.append(province_kill_request.kill_request.kill_house) + # province_kill_request_index_weight += province_kill_request.quantity * province_kill_request.province_request.poultry_request.Index_weight + # province_kill_request_quantity += province_kill_request.quantity + # kill_house_quantity = len(kill_house_list) + # + # kill_house_requests_list = KillHouseRequest.objects.filter(trash=False).select_related( + # 'province_kill_request__province_request__poultry_request', 'kill_request').only( + # 'province_kill_request__province_request__poultry_request__Index_weight', 'kill_request', 'quantity', + # 'vet_state') + # + # kill_house_requests = [ + # kill_house_request_list for kill_house_request_list in kill_house_requests_list + # if date1 <= kill_house_request_list.kill_request.recive_date.date() <= date2 + # ] + # for kill_house_request in kill_house_requests: + # kill_house_assignment_information = KillHouseAssignmentInformation.objects.filter( + # kill_house_request=kill_house_request, trash=False).only('net_weight').last() + # if kill_house_assignment_information: + # kill_house_request_weight += kill_house_assignment_information.net_weight + # else: + # + # kill_house_request_weight += kill_house_request.quantity * kill_house_request.province_kill_request.province_request.poultry_request.Index_weight + # if kill_house_request.clearance_code != None: + # clearance_code_counter += 1 + # if kill_house_request.vet_state == 'accepted': + # vet_state_counter += 1 + # kill_house_request_quantity += kill_house_request.quantity + return Response({ + "poultry_quantity": poultry_quantity, + "poultry_request_quantity": poultry_request_quantity, + "poultry_request_index_weight": poultry_request_index_weight, + # "province_kill_request_quantity": province_kill_request_quantity, + # "province_kill_request_index_weight": province_kill_request_index_weight, + # "kill_house_quantity": kill_house_quantity, + # "clearance_code_counter": clearance_code_counter, + # "kill_house_request_quantity": kill_house_request_quantity, + # "kill_house_request_weight": kill_house_request_weight, + # "vet_state_counter": vet_state_counter, + }) + + +class ProvinceKillRequestProcessDashboardViewSet(viewsets.ModelViewSet): + queryset = ProvinceKillRequest.objects.all() + permission_classes = [AllowAny] + serializer_class = ProvinceKillRequestSerializer + + def list(self, request, *args, **kwargs): + + province_kill_request_quantity = 0 + province_kill_request_index_weight = 0 + kill_house_quantity = 0 + kill_house_list = [] + now = datetime.datetime.now().date() + + province_kill_reqs = ProvinceKillRequest.objects.filter(state__in=('accepted', 'pending'), + kill_request__recive_date__year=now.year, + kill_request__recive_date__month=now.month, + kill_request__recive_date__day=now.day, + trash=False).select_related( + 'province_request__poultry_request', 'kill_request__kill_house').only( + 'province_request__poultry_request__Index_weight', 'quantity', 'kill_request__kill_house') + + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + province_kill_requests = province_kill_reqs.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + province_kill_requests = province_kill_reqs.filter( + province_request__poultry_request__poultry__address__city=user.city) + else: + province_kill_requests = province_kill_reqs + else: + province_kill_requests = province_kill_reqs + + for province_kill_request in province_kill_requests: + if province_kill_request.kill_request.kill_house not in kill_house_list: + kill_house_list.append(province_kill_request.kill_request.kill_house) + province_kill_request_index_weight += province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight + province_kill_request_quantity += province_kill_request.main_quantity + kill_house_quantity = len(kill_house_list) + return Response({ + "province_kill_request_quantity": province_kill_request_quantity, + "province_kill_request_index_weight": province_kill_request_index_weight, + "kill_house_quantity": kill_house_quantity, + }) + + +class KillHouseRequestVetFarmProcessDashboardViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + permission_classes = [AllowAny] + serializer_class = KillHouseRequestSerializer + + def list(self, request, *args, **kwargs): + + kill_house_request_quantity = 0 + kill_house_request_weight = 0 + clearance_code_counter = 0 + now = datetime.datetime.now().date() + + kill_house_reqs = KillHouseRequest.objects.filter(kill_request__recive_date__year=now.year, + kill_request__recive_date__month=now.month, + kill_request__recive_date__day=now.day, + trash=False).select_related( + 'province_kill_request__province_request__poultry_request', 'kill_request').only( + 'province_kill_request__province_request__poultry_request__Index_weight', 'kill_request', 'quantity', + 'vet_state', 'clearance_code') + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + kill_house_requests = kill_house_reqs.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + kill_house_requests = kill_house_reqs.filter( + province_request__poultry_request__poultry__address__city=user.city) + else: + kill_house_requests = kill_house_reqs + else: + kill_house_requests = kill_house_reqs + + for kill_house_request in kill_house_requests: + kill_house_assignment_information = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_request, trash=False).only('net_weight').last() + if kill_house_assignment_information: + kill_house_request_weight += kill_house_assignment_information.net_weight + else: + + kill_house_request_weight += kill_house_request.quantity * kill_house_request.province_kill_request.province_request.poultry_request.Index_weight + if kill_house_request.clearance_code != None: + clearance_code_counter += 1 + kill_house_request_quantity += kill_house_request.quantity + return Response({ + "kill_house_quantity": kill_house_request_quantity, + "clearance_code_counter": clearance_code_counter, + "kill_house_request_weight": kill_house_request_weight, + }) + + +class KillHouseRequestVetProcessDashboardViewSet(viewsets.ModelViewSet): + queryset = KillHouseRequest.objects.all() + permission_classes = [AllowAny] + serializer_class = KillHouseRequestSerializer + + def list(self, request, *args, **kwargs): + + kill_house_request_quantity = 0 + kill_house_request_weight = 0 + vet_check_counter = 0 + now = datetime.datetime.now().date() + + kill_house_reqs = KillHouseRequest.objects.filter(kill_request__recive_date__year=now.year, + kill_request__recive_date__month=now.month, + kill_request__recive_date__day=now.day, + trash=False, vet_state='accepted').select_related( + 'province_kill_request__province_request__poultry_request', 'kill_request').only( + 'province_kill_request__province_request__poultry_request__Index_weight', 'kill_request', 'quantity', + 'vet_state') + + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + user = SystemUserProfile.objects.get(user=request.user) + city_operator = CityOperator.objects.get(trash=False, user=user) + kill_house_requests = kill_house_reqs.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + user = SystemUserProfile.objects.get(user=request.user) + kill_house_requests = kill_house_reqs.filter( + province_request__poultry_request__poultry__address__city=user.city) + else: + kill_house_requests = kill_house_reqs + else: + kill_house_requests = kill_house_reqs + + for kill_house_request in kill_house_requests: + kill_house_assignment_information = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_request, trash=False).only('net_weight').last() + if kill_house_assignment_information: + kill_house_request_weight += kill_house_assignment_information.net_weight + else: + + kill_house_request_weight += kill_house_request.quantity * kill_house_request.province_kill_request.province_request.poultry_request.Index_weight + if kill_house_request.vet_state == 'accepted': + vet_check_counter += 1 + kill_house_request_quantity += kill_house_request.quantity + return Response({ + "kill_house_quantity": kill_house_request_quantity, + "vet_check_counter": vet_check_counter, + "kill_house_request_weight": kill_house_request_weight, + }) + + +class TotalPoultryRequestStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryRequestSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + accepted_poultry_request_quantity = 0 + accepted_kill_house_request_quantity = 0 + poultry_reqs = PoultryRequest.objects.filter(state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False).only( + 'quantity', 'province_state', + 'state_process') + kill_house_reqs = KillHouseRequest.objects.filter(trash=False).only('quantity', 'vet_state') + + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + poultry_requests = poultry_reqs.filter(poultry__city_operator=city_operator.unit_name) + kill_house_requests = kill_house_reqs.filter( + province_request__poultry_request__poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultry_requests = poultry_reqs.filter(poultry__address__city=user.city) + kill_house_requests = kill_house_reqs.filter( + province_request__poultry_request__poultry__address__city=user.city) + + else: + poultry_requests = poultry_reqs + kill_house_requests = kill_house_reqs + else: + poultry_requests = poultry_reqs + kill_house_requests = kill_house_reqs + total_poultry_request_quantity = poultry_requests.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + for poultry_request in poultry_requests: + if poultry_request.state_process == 'accepted' and poultry_request.province_state == 'accepted' and poultry_request.archive == False: + accepted_poultry_request_quantity += poultry_request.quantity + total_kill_house_request_quantity = kill_house_requests.aggregate(total_quantity=Sum('quantity')).get( + 'total_quantity', 0) + for kill_house_request in kill_house_requests: + if kill_house_request.vet_state == 'accepted': + accepted_kill_house_request_quantity += kill_house_request.quantity + return Response({ + "total_poultry_request_quantity": total_poultry_request_quantity, + "accepted_poultry_request_quantity": accepted_poultry_request_quantity, + "total_kill_house_request_quantity": total_kill_house_request_quantity, + "accepted_kill_house_request_quantity": accepted_kill_house_request_quantity, + }) + + +class TotalFilePoultryRequestStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + permission_classes = [AllowAny] + serializer_class = PoultryRequestSerializer + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + accepted_poultry_request_quantity = 0 + rejected_poultry_request_quantity = 0 + archive_poultry_request_quantity = 0 + poultry_reqs = PoultryRequest.objects.filter(trash=False).only('quantity', 'province_state', + 'state_process', 'archive', + 'final_state') + if 'role' in request.GET: + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + poultry_requests = poultry_reqs.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultry_requests = poultry_reqs.filter(poultry__address__city=user.city) + else: + poultry_requests = poultry_reqs + else: + poultry_requests = poultry_reqs + for poultry_request in poultry_requests: + if poultry_request.state_process == 'accepted' and poultry_request.province_state == 'accepted' and poultry_request.archive == False: + accepted_poultry_request_quantity += 1 + if poultry_request.province_state == 'rejected' or poultry_request.state_process == 'rejected': + rejected_poultry_request_quantity += 1 + if poultry_request.archive == True: + archive_poultry_request_quantity += 1 + + return Response({ + "total_poultry_request_quantity": poultry_requests.count(), + "accepted_poultry_request_quantity": accepted_poultry_request_quantity, + "rejected_poultry_request_quantity": rejected_poultry_request_quantity, + "archive_poultry_request_quantity": archive_poultry_request_quantity, + }) + + +class TotalPoultryHatchingStatisticsDashboardViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryHatchingSerializer + filterset_class = PoultryManageFilterSet + + def list(self, request, *args, **kwargs): + value = request.GET.get('value') + search = request.GET.get('search') + poultreis = Poultry.objects.filter(trash=False).select_related('user', 'address__province', 'address__city') + if 'role' in request.GET: + user = SystemUserProfile.objects.get(user=request.user) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + poultrys = poultreis.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultrys = poultreis.filter(poultry__user__city=user.city) + else: + poultrys = poultreis + else: + poultrys = poultreis + if value and search == 'filter': + if value != 'undefined' and value.strip(): + poultrys = poultreis.filter( + build_query(self.filterset_class, value) + ) + all_period = 0 + all_total_quantity = 0 + all_hatching_pending = 0 + all_total_quantity_poultry_hatching_pending = 0 + all_total_left_over_poultry_hatching_pending = 0 + all_kill_request = 0 + all_kill_request_quantity = 0 + all_all_weight_loss = 0 + len_werhouse_enter = 0 + for poultry in poultrys: + poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, trash=False).only('quantity', 'left_over' + ) + if poultry_hatching: + + poultry_hatching_pending = poultry_hatching.filter(state='pending', allow_hatching='pending', + archive=False).last() + if poultry_hatching_pending: + all_hatching_pending += 1 + if poultry_hatching_pending: + period = poultry_hatching_pending.period + else: + period = poultry_hatching.last().period + all_period += period + poultry_hatching_pending1 = poultry_hatching.filter(state='pending', allow_hatching='pending', + archive=False) + total_quantity = \ + poultry_hatching.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_quantity_poultry_hatching_pending = \ + poultry_hatching_pending1.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_left_over_poultry_hatching_pending = \ + poultry_hatching_pending1.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + all_total_quantity += total_quantity + all_total_quantity_poultry_hatching_pending += total_quantity_poultry_hatching_pending + all_total_left_over_poultry_hatching_pending += total_left_over_poultry_hatching_pending + poultry_request = PoultryRequest.objects.filter(trash=False, poultry=poultry, + state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending')).only( + 'quantity', 'Index_weight') + kill_request = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__in=poultry_request).only( + 'accepted_real_quantity', 'accepted_real_weight') + + all_kill_request += len(kill_request) + kill_request_quantity = kill_request.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + all_kill_request_quantity += kill_request_quantity + + werhouse_enter = kill_request.filter(ware_house_confirmation=True).only( + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss') + + all_weight_loss = werhouse_enter.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_all_weight_loss += all_weight_loss + len_werhouse_enter += len(werhouse_enter) + + return Response({ + "poultryCounts": len(poultrys), + "allPeriod": all_period, + "allTotalQuantity": all_total_quantity, + "hatchingPending": all_hatching_pending, + "totalQuantityPoultryHatchingPending": all_total_quantity_poultry_hatching_pending, + "totalLeftOverPoultryHatchingPending": all_total_left_over_poultry_hatching_pending, + "allKillRequest": all_kill_request, + "allKillRequestQuantity": all_kill_request_quantity, + "percentLoss": round(int(all_all_weight_loss) / len_werhouse_enter, 2) if len_werhouse_enter > 0 else 0, + }) + + +# test +class Chart_DashbourdViewSet(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryHatchingSerializer + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + poultry_hatching = {} + price_dict = {} + price_list = [] + poultry_requests = {} + kill_house_requests = {} + operators = {} + prices = {} + file = {} + box = {} + total_users = 0 + number_of_users = 0 + number_of_operators = 0 + chicken_price = 0 + celling_chicken_price = 0 + floor_chicken_price = 0 + total_users = 0 + total_hatching = 0 + total_lossess = 0 + real_hatching = 0 + total_list = [] + killcapacity = 0 + poultryquentity = 0 + + now = datetime.datetime.now().date() + quantity_1_5 = 0 + quantity_1_5_losses = 0 + quantity_5_10 = 0 + quantity_5_10_losses = 0 + quantity_10_15 = 0 + quantity_10_15_losses = 0 + quantity_15_20 = 0 + quantity_15_20_losses = 0 + + quantity_20_25 = 0 + quantity_20_25_losses = 0 + quantity_25_30 = 0 + quantity_25_30_losses = 0 + quantity_30_35 = 0 + quantity_30_35_losses = 0 + quantity_35_40 = 0 + quantity_35_40_losses = 0 + quantity_40_45 = 0 + quantity_40_45_losses = 0 + quantity_45_50 = 0 + quantity_45_50_losses = 0 + quantity_50_55 = 0 + quantity_50_55_losses = 0 + quantity_55_60 = 0 + quantity_55_60_losses = 0 + + killreques_10 = 0 + killreques_20 = 0 + killreques_30 = 0 + killreques_40 = 0 + killreques_50 = 0 + killreques_60 = 0 + + if 'city' in request.GET: + hatchs = PoultryHatching.objects.filter(state='pending', + poultry__address__city__name=request.GET['city'], + poultry__address__province=user.province) + + elif 'breed' in request.GET: + hatchs = PoultryHatching.objects.filter(state='pending', chicken_breed=request.GET['breed'], + poultry__address__province=user.province) + else: + hatchs = PoultryHatching.objects.filter(state='pending', poultry__address__province=user.province) + + if hatchs.count() > 0: + + for hatch in hatchs: + age = (now - hatch.date.date()).days + 1 + if age >= 1 and age <= 5: + quantity_1_5 += hatch.quantity + quantity_1_5_losses += hatch.losses + + elif age >= 5 and age <= 10: + quantity_5_10 += hatch.quantity + quantity_5_10_losses += hatch.losses + + elif age >= 10 and age <= 15: + quantity_10_15 += hatch.quantity + quantity_10_15_losses += hatch.losses + + elif age >= 15 and age <= 20: + quantity_15_20 += hatch.quantity + quantity_15_20_losses += hatch.losses + + elif age >= 20 and age <= 25: + quantity_20_25 += hatch.quantity + quantity_20_25_losses += hatch.losses + + + elif age >= 25 and age <= 30: + quantity_25_30 += hatch.quantity + quantity_25_30_losses += hatch.losses + + elif age >= 30 and age <= 35: + quantity_30_35 += hatch.quantity + quantity_30_35_losses += hatch.losses + + elif age >= 35 and age <= 40: + quantity_35_40 += hatch.quantity + quantity_35_40_losses += hatch.losses + + elif age >= 40 and age <= 45: + quantity_40_45 += hatch.quantity + quantity_40_45_losses += hatch.losses + + elif age >= 45 and age <= 50: + quantity_45_50 += hatch.quantity + quantity_45_50_losses += hatch.losses + + elif age >= 50 and age <= 55: + quantity_50_55 += hatch.quantity + quantity_50_55_losses += hatch.losses + + elif age >= 55 and age <= 60: + quantity_55_60 += hatch.quantity + quantity_55_60_losses += hatch.losses + information_list = [ + {"type": "1_5", "quantity": quantity_1_5, "losses": quantity_1_5_losses}, + {"type": "5_10", "quantity": quantity_5_10, "losses": quantity_5_10_losses}, + {"type": "10_15", "quantity": quantity_10_15, "losses": quantity_10_15_losses}, + {"type": "15_20", "quantity": quantity_15_20, "losses": quantity_15_20_losses}, + {"type": "20_25", "quantity": quantity_20_25, "losses": quantity_20_25_losses}, + {"type": "25_30", "quantity": quantity_25_30, "losses": quantity_25_30_losses}, + {"type": "30_35", "quantity": quantity_30_35, "losses": quantity_30_35_losses}, + {"type": "35_40", "quantity": quantity_35_40, "losses": quantity_35_40_losses}, + {"type": "40_45", "quantity": quantity_40_45, "losses": quantity_40_45_losses}, + {"type": "45_50", "quantity": quantity_45_50, "losses": quantity_45_50_losses}, + {"type": "50_55", "quantity": quantity_50_55, "losses": quantity_5_10_losses}, + {"type": "55_60", "quantity": quantity_55_60, "losses": quantity_55_60_losses}, + + ] + else: + information_list = [] + + poultry_hatching.update({"poultry_hatching": information_list}) + + total_list.append(poultry_hatching) + + pricing = Pricing.objects.all() + price_internal_dict = {} + for price in pricing: + inter_dict = { + "price": price.live_chicken_price, + "date": price.date + } + price_list.append(inter_dict) + inter_dict = {} + price_internal_dict.update({"price_list": price_list}) + total_list.append(price_internal_dict) + + poultry = Poultry.objects.filter(user__province=user.province) + city_operator = CityOperator.objects.filter(user__province=user.province) + province_operator = ProvinceOperator.objects.filter(user__province=user.province, + user__role__name='ProvinceOperator') + financial_operator = Poultry.objects.filter(user__province=user.province, + user__role__name='ProvinceFinancial') + inspector_operator = InspectorOperator.objects.filter(user__province=user.province) + killhouse_operator = KillHouseOperator.objects.filter(user__province=user.province) + driver = KillHouseDriver.objects.filter(user__province=user.province) + vet = Vet.objects.filter(user__province=user.province) + killhouse_vet = KillHouseVet.objects.filter(vet__user__province=user.province) + total_users = poultry.count() + city_operator.count() + province_operator.count() + financial_operator.count() + inspector_operator.count() + killhouse_operator.count() + vet.count() + driver.count() + number_of_users = poultry.count() + killhouse_operator.count() + vet.count() + driver.count() + number_of_operators = city_operator.count() + province_operator.count() + financial_operator.count() + inspector_operator.count() + + poultry_reqs = PoultryRequest.objects.filter(poultry__address__province=user.province) + files_count = [] + active = 0 + archive = 0 + rejected = 0 + if poultry_reqs.count() > 0: + + for poultry_req in poultry_reqs: + if poultry_req.final_state == 'pending': + active += 1 + if poultry_req.final_state == 'archive': + archive += 1 + if poultry_req.state_process == 'rejected' or poultry_req.province_state == 'rejected': + rejected += 1 + poultyry_hachting = PoultryHatching.objects.filter(state='pending', + poultry__address__province=user.province) + if poultyry_hachting.count() > 0: + for hatching in poultyry_hachting: + total_hatching += hatching.quantity + total_lossess += hatching.losses + real_hatching = total_hatching - total_lossess + + pricies = Pricing.objects.all() + + if pricies.count() > 0: + price = pricies.last() + chicken_price = price.live_chicken_price + celling_chicken_price = price.ceiling_price + floor_chicken_price = price.floor_price + + poultryrequests = PoultryRequest.objects.filter(state_process='accepted') + + if poultryrequests.count() > 0: + for poultryrequest in poultryrequests: + poultryquentity += poultryrequest.quantity + + box.update({"box": {"total_users": total_users, "number_of_users": number_of_users, + "number_of_operators": number_of_operators, "number_of_active_files": active, + "number_of_archive_files": archive, "number_of_rejected_files": rejected, + "total_hatching": total_hatching, "total_lossess": total_lossess, + "real_hatching": real_hatching, "price": chicken_price, + "floor_price": floor_chicken_price, "celling_price": celling_chicken_price, + "killcapacity": killcapacity, "poultryquentity": poultryquentity}}) + total_list.append(box) + + return Response(total_list, status=status.HTTP_200_OK) + + +class PoultryRequestInformation(viewsets.ModelViewSet): + queryset = PoultryHatching.objects.all() + serializer_class = PoultryHatchingSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # refresh(request.user.id) + poultry_hatchings = PoultryHatching.objects.filter(state='pending', trash=False) + l = [] + + for hatch in poultry_hatchings: + if PoultryRequest.objects.filter(hatching_id=hatch.id).exists(): + inter_dict = { + "period": hatch.period, + "breed": hatch.chicken_breed, + "hatching_date": hatch.create_date, + "losses": hatch.losses + } + l.append(inter_dict) + return Response(l, status=status.HTTP_200_OK) + + +class TotalPoultryRequestQuantityForCitryViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + city_operator = CityOperator.objects.get(user=SystemUserProfile.objects.get(user=request.user)) + poultry_list = [] + total_quantity = 0 + first_quantity = 0 + accepted_quantity = 0 + city_accepted_quantity = 0 + allocated_quantity = 0 + kill_request_quantity = 0 + rejected_quantity = 0 + waiting_quantity = 0 + assignableQuantity = 0 + quantity_of_45 = 0 + now = datetime.datetime.strptime(request.GET['date'], + '%Y-%m-%d').date() if 'date' in request.GET else datetime.datetime.now().date() + + hatchings = PoultryHatching.objects.filter(trash=False, allow_hatching='pending', archive=False) + if hatchings.count() > 0: + + for hatcing in hatchings: + if (now - hatcing.date.date()).days + 1 <= 65 and (now - hatcing.date.date()).days + 1 >= 45: + quantity_of_45 += hatcing.left_over + + poultry_requests = PoultryRequest.objects.filter(final_state='pending', city_operator=city_operator, + trash=False, + out=False, send_date__year=now.year, + send_date__month=now.month, send_date__day=now.day + ) + + for poultry_request in poultry_requests: + if poultry_request.province_state == 'accepted' or poultry_request.province_state == 'pending': + total_quantity += poultry_request.quantity + first_quantity += poultry_request.first_quantity + if poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(poultry_request.poultry) + if poultry_request.state_process == 'accepted': + city_accepted_quantity += poultry_request.quantity + if poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(poultry_request.poultry) + + if poultry_request.province_state == 'accepted': + accepted_quantity += poultry_request.quantity + assignableQuantity += poultry_request.remain_quantity + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__poultry_request=poultry_request, + trash=False, state__in=('pending', 'accepted')) + if province_kill_reqs.count() > 0: + for province_kill_req in province_kill_reqs: + allocated_quantity += province_kill_req.main_quantity + if poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(poultry_request.poultry) + + if poultry_request.province_state == 'rejected' or poultry_request.state_process == 'rejected': + rejected_quantity += poultry_request.quantity + if poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(poultry_request.poultry) + + if poultry_request.province_state == 'pending': + if poultry_request.state_process == 'rejected': + continue + else: + waiting_quantity += poultry_request.quantity + if poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(poultry_request.poultry) + + dict1 = { + "total_quantity": total_quantity, + "first_quantity": first_quantity, + "accepted_quantity": accepted_quantity, + "city_accepted_quantity": city_accepted_quantity, + "allocated_quantity": allocated_quantity, + "kill_request_quantity": kill_request_quantity, + "rejected_quantity": rejected_quantity, + "waiting_quantity": waiting_quantity, + "assignableQuantity": assignableQuantity, + "quantity_of_45": quantity_of_45 + + } + return Response(dict1, status=status.HTTP_200_OK) + + +class TotalPoultryRequestQuantityViewSet(viewsets.ModelViewSet): + queryset = TotalPoultryRequestQuantity.objects.all() + serializer_class = TotalPoultryRequestQuantitySerializer + permission_classes = [TokenHasReadWriteScope] + + # تابع مربوط به ویرایش مرغداری + def update(self, request, pk=None, *args, **kwargs): + # refresh(request.user.id) + user = SystemUserProfile.objects.get(user=request.user) + now = datetime.datetime.now().date() + total_poultry_request_quantity = TotalPoultryRequestQuantity.objects.get(key=request.data["key"], + trash=False) + request.data.pop('key') + for kill_house in KillHouse.objects.filter(system_address__province=user.province): + percentage = KillHousePercentage.objects.get(kill_house=kill_house) + percentage.quantity = percentage.percent / 100 * int(request.data['input_quantity']) + percentage.save() + kill_req = KillRequest.objects.filter(recive_date__year=now.year, recive_date__month=now.month, + recive_date__day=now.day, kill_house=kill_house) + if kill_req.count() > 0: + kill_req = kill_req.last() + kill_req.kill_capacity = percentage.quantity + kill_req.remain_quantity += percentage.quantity - kill_req.remain_quantity + kill_req.save() + serializer = self.serializer_class(total_poultry_request_quantity) + serializer.update(instance=total_poultry_request_quantity, validated_data=request.data) + return Response(serializer.data, status=status.HTTP_200_OK) + + # تابع مربوط به نمایش مرغداری + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + poultry_list = [] + total_quantity = 0 + first_quantity = 0 + accepted_quantity = 0 + city_accepted_quantity = 0 + allocated_quantity = 0 + returned_quantity = 0 + direct_buying_quantity = 0 + kill_request_quantity = 0 + rejected_quantity = 0 + waiting_quantity = 0 + assignableQuantity = 0 + quantity_of_45 = 0 + if 'date' in request.GET: + now = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d').date() + else: + now = datetime.datetime.now().date() + + hatchings = PoultryHatching.objects.filter(trash=False, allow_hatching='pending', + archive=False) + + if hatchings: + for hatcing in hatchings: + if (now - hatcing.date.date()).days + 1 <= 80: + if (now - hatcing.date.date()).days + 1 >= 45: + quantity_of_45 += hatcing.left_over + + poultry_requests = PoultryRequest.objects.filter( + # final_state='pending', + # province_state__in=('accepted', 'pending'), + poultry__address__province=user.province, trash=False, + out=False, + # direct_buying=False, + send_date__year=now.year, send_date__month=now.month, + send_date__day=now.day) + for poultry_request in poultry_requests: + total_quantity += poultry_request.quantity + first_quantity += poultry_request.first_quantity + if poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(poultry_request.poultry) + city_accepted_poultry_requests = PoultryRequest.objects.filter(final_state='pending', + state_process='accepted', + poultry__address__province=user.province, + trash=False, + out=False, + direct_buying=False, + send_date__year=now.year, + send_date__month=now.month, + send_date__day=now.day) + + if city_accepted_poultry_requests.count() > 0: + for city_accepted_poultry_request in city_accepted_poultry_requests: + city_accepted_quantity += city_accepted_poultry_request.quantity + if city_accepted_poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(city_accepted_poultry_request.poultry) + + accepted_poultry_requests = PoultryRequest.objects.filter(final_state='pending', + province_state='accepted', + poultry__address__province=user.province, + trash=False, + out=False, + direct_buying=False, + send_date__year=now.year, + send_date__month=now.month, + send_date__day=now.day) + + if accepted_poultry_requests.count() > 0: + for accepted_poultry_request in accepted_poultry_requests: + accepted_quantity += accepted_poultry_request.quantity + assignableQuantity += accepted_poultry_request.remain_quantity + if accepted_poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(accepted_poultry_request.poultry) + + rejected_requests = PoultryRequest.objects.filter( + Q(province_state='rejected') | Q(state_process='rejected'), + final_state='pending', + poultry__address__province=user.province, + trash=False, + out=False, + direct_buying=False, + send_date__year=now.year, + send_date__month=now.month, + send_date__day=now.day) + + if rejected_requests.count() > 0: + for rejected_request in rejected_requests: + rejected_quantity += rejected_request.quantity + if rejected_request.poultry in poultry_list: + pass + else: + poultry_list.append(rejected_request.poultry) + waiting_requests = PoultryRequest.objects.filter(final_state='pending', + province_state='pending', + poultry__address__province=user.province, + trash=False, + out=False, + direct_buying=False, + send_date__year=now.year, + send_date__month=now.month, + send_date__day=now.day) + + if waiting_requests.count() > 0: + for waiting_request in waiting_requests: + if waiting_request.state_process == 'rejected': + continue + else: + waiting_quantity += waiting_request.quantity + if waiting_request.poultry in poultry_list: + pass + else: + poultry_list.append(waiting_request.poultry) + + allocated_poultry_requests = PoultryRequest.objects.filter(final_state='pending', + province_state='accepted', + poultry__address__province=user.province, + trash=False, + out=False, + direct_buying=False, + send_date__year=now.year, + send_date__month=now.month, + send_date__day=now.day) + if allocated_poultry_requests.count() > 0: + for allocated_poultry_request in allocated_poultry_requests: + if allocated_poultry_request.poultry in poultry_list: + pass + else: + poultry_list.append(allocated_poultry_request.poultry) + province_kill_reqs = ProvinceKillRequest.objects.filter( + province_request__poultry_request=allocated_poultry_request, + trash=False, state__in=('pending', 'accepted')) + if province_kill_reqs.count() > 0: + for province_kill_req in province_kill_reqs: + if province_kill_req.return_to_province == False: + allocated_quantity += province_kill_req.main_quantity + else: + returned_quantity += province_kill_req.main_quantity + + direct_buying_poultry_requests = PoultryRequest.objects.filter( + + poultry__address__province=user.province, + trash=False, + out=False, + direct_buying=True, + send_date__year=now.year, + send_date__month=now.month, + send_date__day=now.day) + if direct_buying_poultry_requests.count() > 0: + for direct in direct_buying_poultry_requests: + direct_buying_quantity += direct.quantity + + total_poultry_request_quantity = TotalPoultryRequestQuantity.objects.filter(create_date__year=now.year, + create_date__month=now.month, + create_date__day=now.day) + if total_poultry_request_quantity.count() > 0: + total_poultry_request_quantity = total_poultry_request_quantity.last() + total_poultry_request_quantity.quantity = total_quantity + total_poultry_request_quantity.accepted_quantity = accepted_quantity + total_poultry_request_quantity.allocated_quantity = allocated_quantity + total_poultry_request_quantity.returned_quantity = returned_quantity + total_poultry_request_quantity.city_accepted_quantity = city_accepted_quantity + total_poultry_request_quantity.first_quantity = first_quantity + total_poultry_request_quantity.rejected_quantity = rejected_quantity + total_poultry_request_quantity.waiting_quantity = waiting_quantity + total_poultry_request_quantity.direct_buying_quantity = direct_buying_quantity + total_poultry_request_quantity.age_up_45 = quantity_of_45 + total_poultry_request_quantity.save() + else: + total_poultry_request_quantity = TotalPoultryRequestQuantity( + quantity=total_quantity, + accepted_quantity=accepted_quantity, + allocated_quantity=allocated_quantity, + returned_quantity=returned_quantity, + city_accepted_quantity=city_accepted_quantity, + first_quantity=first_quantity, + rejected_quantity=rejected_quantity, + waiting_quantity=waiting_quantity, + direct_buying_quantity=direct_buying_quantity, + age_up_45=quantity_of_45, + ) + total_poultry_request_quantity.save() + percentage = KillHousePercentage.objects.filter(percent__gt=0) + kill_reqs = KillRequest.objects.filter(recive_date__year=now.year, recive_date__month=now.month, + recive_date__day=now.day, trash=False) + if kill_reqs.count() > 0: + for kill_req in kill_reqs: + kill_request_quantity += kill_req.kill_capacity + + total_poultry_request_quantity.kill_requests_quantity = kill_request_quantity + total_poultry_request_quantity.number_of_kill_house = percentage.count() + total_poultry_request_quantity.number_of_poultry = len(poultry_list) + total_poultry_request_quantity.assignableQuantity = assignableQuantity + total_poultry_request_quantity.save() + serializer = self.serializer_class(total_poultry_request_quantity) + return Response(serializer.data) + + +class PoultryRequestWeightViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # user = SystemUserProfile.objects.get(user=request.user) + # # refresh(request.user.id) + # weight_list = [] + # average = 0 + # now = datetime.datetime.now().date() + # poultry_requests = PoultryRequest.objects.filter(final_state='pending', + # province_state__in=('accepted', 'pending'), + # poultry__address__province=user.province) + # # poultry_requests = PoultryRequest.objects.filter(final_state='pending', + # # province_state__in=('accepted', 'pending'), + # # send_date__year=now.year, send_date__month=now.month, + # # send_date__day=now.day, + # # poultry__address__province=user.province) + # if poultry_requests.count() > 0: + # + # for poultry_request in poultry_requests: + # total_quantity = poultry_request.quantity + # + # province_kill_reqs = ProvinceKillRequest.objects.filter( + # province_request__poultry_request=poultry_request) + # if province_kill_reqs.count() > 0: + # for province_kill_req in province_kill_reqs: + # total_quantity -= province_kill_req.main_quantity + # if total_quantity > 0: + # weight_list.append(poultry_request.Index_weight) + # for weight in weight_list: + # average += weight + # average = average / 1 + weight_list = [3.2, 3.2, 2.5, 2.9, 3.1] + return Response({'list': weight_list, 'ave': 3613.2}) + # return Response({'list': weight_list, 'ave': round(average, 2)}) + + +class BarsForKillHouseViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.all() + serializer_class = PoultryRequestSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( + 'system_address__province').first() + if kill_house.killer == True: + percentage = KillHousePercentage.objects.get(kill_house=kill_house, trash=False) + kill_house_vet = KillHouseVet.objects.filter(kill_house=percentage.kill_house_for_killer, + trash=False).select_related( + 'vet__user').last() + else: + kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_house, trash=False).select_related( + 'vet__user').last() + kill_house_req_dict = {} + kill_house_req_list = [] + + now = datetime.datetime.now().date() + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + # date = date - timedelta(days=1) + # if 'freezing' in request.GET: + # freezing = True + # # freezing = False if user.province.name == 'مركزی' else True + # + # queryset = PoultryRequest.objects.filter( + # poultry__address__province=kill_house.system_address.province, + # final_state__in=('pending', 'archive'), + # trash=False, out=False, + # send_date__date=date, + # freezing=freezing + # + # ).select_related('poultry', 'poultry__user', 'poultry__address__city').order_by('-send_date') + # else: + queryset = PoultryRequest.objects.filter( + poultry__address__province=kill_house.system_address.province, + final_state__in=('pending', 'archive'), + trash=False, out=False, + send_date__date__gte=date1, send_date__date__lte=date2, + + ).select_related('poultry', 'poultry__user', 'poultry__address__city').order_by('-send_date') + + if len(queryset) > 0: + for poultry_req in queryset: + vet_farm = VetFarm.objects.filter(poultry=poultry_req.poultry).select_related('vet__user').last() + if vet_farm: + vet_name = vet_farm.vet.user.fullname + vet_mobile = vet_farm.vet.user.mobile + else: + vet_name = None + vet_mobile = None + if request.GET['type'] == 'entered': + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + province_kill_request__province_request__poultry_request=poultry_req, + ware_house_confirmation=True, trash=False).select_related( + 'kill_request__kill_house__kill_house_operator__user', 'add_car__driver', + 'kill_request__kill_house') + else: + + kill_house_requests = KillHouseRequest.objects.filter( + Q(killhouse_user=kill_house) | Q(killer=kill_house), + province_kill_request__province_request__poultry_request=poultry_req, + ware_house_confirmation=False).select_related( + 'kill_request__kill_house__kill_house_operator__user', 'add_car__driver', + 'kill_request__kill_house') + if kill_house_requests: + for kill_house_request in kill_house_requests: + weight_loss = kill_house_request.accepted_real_weight - kill_house_request.ware_house_accepted_real_weight if kill_house_request.ware_house_accepted_real_weight > 0 else 0 + if weight_loss < 0: + weight_loss = weight_loss * -1 + total_weight_loss = ( + weight_loss / kill_house_request.accepted_real_weight) * 100 if weight_loss != 0 else 0 + # kill_house_request.weight_loss = total_weight_loss + # kill_house_request.save() + vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request) + if vet_check.count() > 0: + vet_check_state = vet_check.last().state + else: + vet_check_state = 'pending' + assignment = KillHouseAssignmentInformation.objects.filter( + kill_house_request=kill_house_request).last() + if assignment: + assignment_state = 'accepted' + assignment_real_quantity = kill_house_request.accepted_real_quantity + assignment_net_weight = kill_house_request.accepted_real_weight + + else: + if kill_house_request.vet_state == 'pending': + assignment_state = 'pending' + else: + assignment_state = 'no_state' + assignment_real_quantity = kill_house_request.accepted_real_quantity + assignment_net_weight = kill_house_request.accepted_real_weight + exclusive_killer = None + if kill_house_request.killer != None: + exclusive_killer = { + "killer_name": kill_house_request.killer.name, + "killer_mobile": kill_house_request.killer.kill_house_operator.user.mobile, + "killer_fullname": kill_house_request.killer.kill_house_operator.user.fullname, + } + + kill_house_req_dict.update({ + "poultry_req_order_code": poultry_req.order_code, + "poultry_name": poultry_req.poultry.unit_name, + "poultry_user_name": poultry_req.poultry.user.fullname, + "poultry_mobile": poultry_req.poultry.user.mobile, + "poultry_city": poultry_req.poultry.address.city.name, + "chicken_breed": poultry_req.chicken_breed, + "date": poultry_req.send_date, + "freezing": poultry_req.freezing, + "clearance_code": kill_house_request.clearance_code, + "traffic_code": kill_house_request.traffic_code, + "kill_house_request_key": kill_house_request.key, + "ware_house_accepted_real_quantity": kill_house_request.ware_house_accepted_real_quantity, + "ware_house_accepted_real_weight": kill_house_request.ware_house_accepted_real_weight, + "bar_code": kill_house_request.bar_code, + "health_code": kill_house_request.add_car.driver.health_code, + "vet_name": vet_name, + "vet_mobile": vet_mobile, + "kill_house_vet_name": kill_house_vet.vet.user.fullname, + "kill_house_vet_mobile": kill_house_vet.vet.user.mobile, + "driver_name": kill_house_request.add_car.driver.driver_name, + "driver_mobile": kill_house_request.add_car.driver.driver_mobile, + "kill_house_name": kill_house_request.killhouse_user.name, + "type_car": kill_house_request.add_car.driver.type_car, + "killer": exclusive_killer, + "vet_check_state": vet_check_state, + "assignment_state": assignment_state, + "kill_house_request_quantity": kill_house_request.quantity, + "assignment_real_quantity": assignment_real_quantity, + "assignment_net_weight": assignment_net_weight, + "weight_loss": round(total_weight_loss, 1), + "input_loss": kill_house_request.weight_loss, + + }) + kill_house_req_list.append(kill_house_req_dict) + kill_house_req_dict = {} + + return Response(kill_house_req_list, status=status.HTTP_200_OK) + + +@api_view(["POST"]) +@permission_classes([AllowAny]) +@csrf_exempt +def city_operator_for_poultry(request): + file = request.FILES['file'].read() + wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) + sheet = wb_obj.active + list1 = [] + + for i, row in enumerate(sheet.iter_rows(values_only=True)): + if i == 0: + continue + try: + poultry = Poultry.objects.get(breeding_unique_id=row[3], trash=False) + poultry.city_operator = row[5] + poultry.save() + except: + dict1 = { + "name": row[4], + "breeding": row[3] + } + list1.append(dict1) + continue + return Response(list1) + + +@api_view(["POST"]) +@permission_classes([TokenHasReadWriteScope]) +@csrf_exempt +def archive_hatching(request): + user = SystemUserProfile.objects.get(user=request.user) + if request.data['role'] == 'ProvinceOperator': + return Response({'result': 'شما دسترسی لازم را ندارید!'}, + status=status.HTTP_403_FORBIDDEN) + now = datetime.datetime.now().date() + date = (datetime.datetime(year=now.year, month=now.month, day=now.day, hour=23, minute=59, + second=59) - timedelta( + days=int(request.data['age']))) + poultry_hatching = PoultryHatching.objects.filter(date__lte=date, trash=False, allow_hatching='pending', + archive=False) + for hatching in poultry_hatching: + if hatching.left_over > (hatching.quantity * percent_of_losses): + hatching.violation = True + hatching.allow_hatching = 'True' + hatching.state = 'complete' + hatching.archive = True + hatching.archive_date = datetime.datetime.now() + if hatching.first_date_input_archive is None: + hatching.first_date_input_archive = datetime.datetime.now() + else: + hatching.second_date_input_archive = datetime.datetime.now() + hatching.input_archiver = user.fullname + hatching.last_change = { + "date": str(datetime.datetime.now()), + "full_name": user.fullname, + "role": request.data['role'], + "type": "automatic-archive" + } + hatching.save() + return Response({"msg": f"تعداد {poultry_hatching.count()} جوجه ریزی بایگانی شد."}, status=status.HTTP_200_OK) + + +class LastUpdateViewSet(viewsets.ModelViewSet): + queryset = LastUpdate.objects.first() + serializer_class = LastUpdateSerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + if 'type' in request.GET: + if request.GET['type'] == 'poultry_hatching': + update = LastUpdate.objects.first().update_date + # ser_deta=self.serializer_class(update).data + return Response(update) + + return Response({"result": "you havnt type in url params"}, status=status.HTTP_403_FORBIDDEN) + + +class UpdatePoultryTenantViewSet(viewsets.ModelViewSet): + queryset = Poultry.objects.all() + serializer_class = PoultrySerializer + permission_classes = [AllowAny] + + def update(self, request, *args, **kwargs): + poultry_tenant = self.queryset.get(trash=False, key=request.data['tenant_key']) + system_user_profile = SystemUserProfile.objects.get(trash=False, key=poultry_tenant.user.key) + first_mobile_number = system_user_profile.mobile + second_mobile_number = request.data['mobile'] + poultry_tenant.breeding_unique_id = request.data['breeding_unique_id'] + system_user_profile.last_name = request.data['last_name'] + system_user_profile.first_name = request.data['first_name'] + system_user_profile.fullname = request.data['first_name'] + ' ' + request.data['last_name'] + system_user_profile.national_id = request.data['national_id'] + if first_mobile_number != second_mobile_number: + if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): + return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, + status=status.HTTP_403_FORBIDDEN) + data = { + "first_mobile_number": first_mobile_number, + "second_mobile_number": second_mobile_number, + } + req = requests.post( + url=ARTA_URL_CHANGE_MOBILE_NUMBER, + data=data, + verify=False + ) + if req.status_code == 200: + second_mobile_number = second_mobile_number + user = User.objects.get(id=system_user_profile.user.id) + user.username = second_mobile_number + user.save() + system_user_profile.mobile = second_mobile_number + poultry_tenant.save() + system_user_profile.save() + return Response('poultry tenant successfully update!', status=status.HTTP_201_CREATED) + + +class GeneralStatisticsdashboardForCasesViewSet(viewsets.ViewSet): + permission_classes = [TokenHasReadWriteScope] + + def list(self, request): + date1 = datetime.datetime.strptime(request.GET['date1'], + '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(request.GET['date2'], + '%Y-%m-%d').date() + user = SystemUserProfile.objects.get(user=request.user, trash=False) + poultry_requests = PoultryRequest.objects.filter(trash=False, + send_date__date__gte=date1, + send_date__date__lte=date2).order_by('send_date') + + if request.GET['role'] in ['CityCommerce', 'CityVet', 'CityPoultry', 'CityJahad']: + poultry_requests = poultry_requests.filter(poultry__address__city=user.city) + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + poultry_requests = poultry_requests.filter(poultry__city_operator=city_operator.unit_name) + else: + poultry_requests = poultry_requests + poultry = poultry_requests.values('poultry').distinct().count() + poultry_requests_quantity = poultry_requests.aggregate(total=Sum('quantity'))['total'] or 0 + poultry_requests_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))['total'] or 0 + out_poultry_request = poultry_requests.filter(out=True) + out_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))['total'] or 0 + out_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), + return_to_province=False, + province_request__poultry_request__in=poultry_requests) + province_kill_requests_quantity = province_kill_requests.aggregate(total=Sum('main_quantity'))['total'] or 0 + province_kill_requests_weight = province_kill_requests.aggregate( + total=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight')))['total'] or 0 + province_kill_requests_buyers = province_kill_requests.values('killhouse_user').distinct().count() + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_kill_request__in=province_kill_requests) + kill_house_request_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + kill_house_request_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + kill_house_requests_with_quarantine_code = kill_house_requests.filter(clearance_code__isnull=False) + kill_house_requests_with_quarantine_code_quantity = \ + kill_house_requests_with_quarantine_code.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + kill_house_requests_with_quarantine_code_weight = \ + kill_house_requests_with_quarantine_code.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + kill_house_requests_without_quarantine_code = kill_house_requests.filter(clearance_code__isnull=True) + kill_house_requests_without_quarantine_code_quantity = \ + kill_house_requests_without_quarantine_code.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + kill_house_requests_without_quarantine_code_weight = \ + kill_house_requests_without_quarantine_code.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + kill_house_requests_with_kill_house_vet_accepted = kill_house_requests.filter(vet_state='accepted') + kill_house_requests_with_kill_house_vet_accepted_quantity = \ + kill_house_requests_with_kill_house_vet_accepted.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_house_requests_with_kill_house_vet_accepted_weight = \ + kill_house_requests_with_kill_house_vet_accepted.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + kill_house_requests_without_kill_house_vet_accepted = kill_house_requests.filter(vet_state='pending') + kill_house_requests_without_kill_house_vet_accepted_quantity = \ + kill_house_requests_without_kill_house_vet_accepted.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_house_requests_without_kill_house_vet_accepted_weight = \ + kill_house_requests_without_kill_house_vet_accepted.aggregate(total=Sum('accepted_real_weight'))[ + 'total'] or 0 + kill_house_requests_with_kill_house_assignment = kill_house_requests.filter( + assignment_state_archive='True') + kill_house_requests_with_kill_house_assignment_quantity = \ + kill_house_requests_with_kill_house_assignment.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 + kill_house_requests_with_kill_house_assignment_weight = \ + kill_house_requests_with_kill_house_assignment.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + kill_house_requests_without_kill_house_assignment = kill_house_requests.filter( + assignment_state_archive='True') + kill_house_requests_without_kill_house_assignment_quantity = \ + kill_house_requests_without_kill_house_assignment.aggregate(total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + kill_house_requests_without_kill_house_assignment_weight = \ + kill_house_requests_without_kill_house_assignment.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 + + return Response( + { + "poultry_requests": len(poultry_requests), + "poultry": poultry, + "poultry_requests_quantity": poultry_requests_quantity, + "poultry_requests_weight": poultry_requests_weight, + "out_poultry_request": len(out_poultry_request), + "out_poultry_request_quantity": out_poultry_request_quantity, + "out_poultry_request_weight": out_poultry_request_weight, + "province_kill_requests": len(province_kill_requests), + "province_kill_requests_quantity": province_kill_requests_quantity, + "province_kill_requests_weight": province_kill_requests_weight, + "province_kill_requests_buyers": province_kill_requests_buyers, + "kill_house_requests": len(kill_house_requests), + "kill_house_request_quantity": kill_house_request_quantity, + "kill_house_request_weight": kill_house_request_weight, + "kill_house_requests_with_quarantine_code": len(kill_house_requests_with_quarantine_code), + "kill_house_requests_with_quarantine_code_quantity": kill_house_requests_with_quarantine_code_quantity, + "kill_house_requests_with_quarantine_code_weight": kill_house_requests_with_quarantine_code_weight, + "kill_house_requests_without_quarantine_code": len(kill_house_requests_without_quarantine_code), + "kill_house_requests_without_quarantine_code_quantity": kill_house_requests_without_quarantine_code_quantity, + "kill_house_requests_without_quarantine_code_weight": kill_house_requests_without_quarantine_code_weight, + "kill_house_requests_with_kill_house_vet_accepted": len( + kill_house_requests_with_kill_house_vet_accepted), + "kill_house_requests_with_kill_house_vet_accepted_quantity": kill_house_requests_with_kill_house_vet_accepted_quantity, + "kill_house_requests_with_kill_house_vet_accepted_weight": kill_house_requests_with_kill_house_vet_accepted_weight, + "kill_house_requests_without_kill_house_vet_accepted": len( + kill_house_requests_without_kill_house_vet_accepted), + "kill_house_requests_without_kill_house_vet_accepted_quantity": kill_house_requests_without_kill_house_vet_accepted_quantity, + "kill_house_requests_without_kill_house_vet_accepted_weight": kill_house_requests_without_kill_house_vet_accepted_weight, + "kill_house_requests_with_kill_house_assignment": len(kill_house_requests_with_kill_house_assignment), + "kill_house_requests_with_kill_house_assignment_quantity": kill_house_requests_with_kill_house_assignment_quantity, + "kill_house_requests_with_kill_house_assignment_weight": kill_house_requests_with_kill_house_assignment_weight, + "kill_house_requests_without_kill_house_assignment": len( + kill_house_requests_without_kill_house_assignment), + "kill_house_requests_without_kill_house_assignment_quantity": kill_house_requests_without_kill_house_assignment_quantity, + "kill_house_requests_without_kill_house_assignment_weight": kill_house_requests_without_kill_house_assignment_weight, + }) + + +def archive_poultry_hatching_with_cron_job(): + hatching = PoultryHatching.objects.filter(Q(left_over=0) | Q(chicken_age__gt=80), trash=False, + allow_hatching='pending', + state='pending', archive=False).only('allow_hatching', + 'left_over', 'quantity', 'state', + 'archive') + now_date = datetime.datetime.now() + for hatch in hatching: + if hatch.left_over > (hatch.quantity * percent_of_losses): + hatch.violation = True + hatch.allow_hatching = 'True' + hatch.state = 'complete' + hatch.archive = True + hatch.archive_date = datetime.datetime.now() + if hatch.first_date_input_archive is None: + hatch.first_date_input_archive = now_date + else: + hatch.second_date_input_archive = now_date + hatch.input_archiver = 'automatic-archive' + hatch.last_change = { + "date": str(now_date), + "full_name": 'automatic-archive', + "role": 'automatic-archive1', + "type": "automatic-archive" + } + hatch.save() + + +def archive_poultry_hatching_with_archive_percent_cron_job(): + now_date = datetime.datetime.now() + archive_percent = HatchingArchivePercent.objects.filter(trash=False, active=True).first() + if archive_percent: + hatchings = PoultryHatching.objects.filter( + state='pending', + archive=False, + allow_hatching='pending', + trash=False, + ).annotate( + allowed_left_over=ExpressionWrapper( + F('quantity') * (archive_percent.percent / 100), + output_field=FloatField() + ) + ).filter( + left_over__lte=F('allowed_left_over') + ) + + Poultry.objects.filter( + id__in=hatchings.values_list('poultry__id', flat=True), order_limit=True + ).update(order_limit=False) + for hatching in hatchings: + if hatching.left_over > (hatching.quantity * percent_of_losses): + hatching.violation = True + hatching.allow_hatching = 'True' + hatching.state = 'complete' + hatching.archive = True + hatching.unknown = False + hatching.archive_date = datetime.datetime.now() + if hatching.first_date_input_archive is None: + hatching.first_date_input_archive = now_date + else: + hatching.second_date_input_archive = now_date + hatching.input_archiver = 'automatic-archive' + hatching.last_change = { + "date": str(now_date), + "full_name": 'automatic-archive', + "role": 'automatic-archive1', + "type": "automatic-archive" + } + hatching.save() + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def archive_poultry_hatching_with_archive_percent(request): + now_date = datetime.datetime.now() + archive_percent = HatchingArchivePercent.objects.filter(trash=False, active=True).first() + if archive_percent: + hatchings = PoultryHatching.objects.filter( + state='pending', + archive=False, + allow_hatching='pending', + trash=False, + ).annotate( + allowed_left_over=ExpressionWrapper( + F('quantity') * (archive_percent.percent / 100), + output_field=FloatField() + ) + ).filter( + left_over__lte=F('allowed_left_over') + ) + + Poultry.objects.filter( + id__in=hatchings.values_list('poultry__id', flat=True), order_limit=True + ).update(order_limit=False) + for hatching in hatchings: + hatching.allow_hatching = 'True' + hatching.state = 'complete' + hatching.archive = True + hatching.unknown = False + hatching.archive_date = datetime.datetime.now() + if hatching.first_date_input_archive is None: + hatching.first_date_input_archive = now_date + else: + hatching.second_date_input_archive = now_date + hatching.input_archiver = 'automatic-archive' + hatching.last_change = { + "date": str(now_date), + "full_name": 'automatic-archive', + "role": 'automatic-archive1', + "type": "automatic-archive" + } + hatching.save() + + +class PoultryLocationViewSet(viewsets.ModelViewSet): + queryset = Poultry.objects.filter( + trash=False, + Long__isnull=False + ).select_related( + 'user', 'address', 'address__city' + ).only( + 'id', 'unit_name', 'Lat', 'Long', + 'user__fullname', 'user__mobile', + 'address__address', 'address__city__name', 'breeding_unique_id' + ).prefetch_related( + Prefetch('poultry_hatching_user', + queryset=PoultryHatching.objects.filter( + state__in=('pending', 'complete'), + archive=False, + allow_hatching='pending', + trash=False + ).only( + 'left_over', 'chicken_age', 'date', + 'licence_number', + 'poultry_id', 'killed_quantity', 'total_losses' + ) + ) + ) + serializer_class = PoultryLocationSerializer + permission_classes = [AllowAny] + filter_backends = [DjangoFilterBackend] + filterset_class = PoultryManageFilterSet + + @staticmethod + def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float: + radius = 6378137.0 + + dlat = math.radians(lat2 - lat1) + dlon = math.radians(lon2 - lon1) + lat1_rad = math.radians(lat1) + lat2_rad = math.radians(lat2) + + a = math.sin(dlat / 2) ** 2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon / 2) ** 2 + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + return radius * c + + def filter_nearby_poultries(self, poultries: List[Dict], center_lat: float, center_lon: float, radius: float) -> \ + List[Dict]: + nearby_poultries = [ + poultry for poultry in poultries + if self.haversine_distance(center_lat, center_lon, poultry['Lat'], poultry['Long']) <= radius + ] + return nearby_poultries + + def list(self, request, *args, **kwargs): + queryset = self.filter_queryset(self.get_queryset()) + value = request.GET.get('value') + if value: + if value != 'undefined' and value.strip(): + queryset = queryset.filter( + build_query(self.filterset_class, value) + ) + serializer = self.get_serializer(queryset, many=True) + data = serializer.data + + center_lat = request.query_params.get('center_lat') + center_lon = request.query_params.get('center_lon') + radius = request.query_params.get('radius') + + if center_lat and center_lon and radius: + try: + center_lat = float(center_lat) + center_lon = float(center_lon) + radius = float(radius) + + if radius > 100: + radius_meters = radius + else: + radius_meters = radius * 1000 + + data = self.filter_nearby_poultries(data, center_lat, center_lon, radius_meters) + except (ValueError, TypeError): + pass + + return Response(data) + + +class DashboardOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.filter(out=True, trash=False) + serializer_class = PoultryRequestoutProvinceSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = DashboardPoultryRequestFilterSet + + def list(self, request, *args, **kwargs): + value = request.GET.get('value') + search = request.GET.get('search') + user = SystemUserProfile.objects.get(user=request.user, trash=False) + state = request.GET.get('state') + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + if request.GET['role'] == 'VetFarm': + vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) + poultries = Poultry.objects.filter( + pk__in=vet_farms.values('poultry') + ) + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__in=poultries, send_date__date__gte=date1, + send_date__date__lte=date2, + trash=False).order_by('-send_date') + + elif request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + if state == 'pending': + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__city_operator=city_operator.unit_name, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + if state == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True), + poultry__address__city=user.city, + send_date__date__gte=date1, + send_date__date__lte=date2, + out=True, + trash=False).order_by('-send_date') + + else: + if request.GET['state'] == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=True, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='accepted', province_state='accepted', final_state='archive', + has_wage=True, wage_pay=False, out_province_request_cancel=True), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + trash=False).order_by('-send_date') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + poultry_requests = poultry_requests.filter( + build_query(self.filterset_class, value) + ) + + index_weight = poultry_requests.aggregate(total=Sum('Index_weight'))[ + 'total'] or 0 + quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + has_code = len(poultry_requests.filter(quarantine_code__isnull=False)) + hasnt_code = len(poultry_requests.filter(quarantine_code__isnull=True)) + hatching = poultry_requests.values_list('hatching__id', flat=True).distinct() + hatchings = PoultryHatching.objects.filter(trash=False, id__in=hatching) + left_over = hatchings.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + quantity_hatching = hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + poultry_request_aggregates = poultry_requests.aggregate( + total_weight=Sum(F('quantity') * F('Index_weight')), + ) + dict1 = { + 'lenBar': len(poultry_requests), + 'indexWeight': round(index_weight / len(poultry_requests) if len(poultry_requests) > 0 else 0), + 'quantity': quantity, + # 'weight': int(quantity * index_weight), + 'weight': poultry_request_aggregates['total_weight'] or 0, + 'hasCode': has_code, + 'hasntCode': hasnt_code, + 'leftOver': left_over, + 'hatchingQuantity': quantity_hatching, + + } + return Response(dict1, status=status.HTTP_200_OK) + + +class ParentCompanyDashboardOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): + queryset = PoultryRequest.objects.filter(out=True, trash=False) + serializer_class = PoultryRequestoutProvinceSerializer + permission_classes = [AllowAny] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = DashboardPoultryRequestFilterSet + + def list(self, request, *args, **kwargs): + value = request.GET.get('value') + search = request.GET.get('search') + state = request.GET.get('state') + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if request.GET['state'] == 'pending': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', + wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + + elif state == 'accepted': + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, + wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + out_province_request_cancel=False, + trash=False).order_by('-send_date') + else: + poultry_requests = PoultryRequest.objects.filter( + Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, + wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', + province_state='rejected', + final_state='archive', + has_wage=False, wage_pay=False, + out_province_request_cancel=False) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='pending', province_state='pending', final_state='pending', + has_wage=True, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='accepted', province_state='accepted', final_state='archive', + has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( + state_process='accepted', province_state='accepted', final_state='archive', + has_wage=True, wage_pay=False, out_province_request_cancel=True), + send_date__date__gte=date1, + send_date__date__lte=date2, out=True, + trash=False).order_by('-send_date') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + poultry_requests = poultry_requests.filter( + build_query(self.filterset_class, value) + ) + + index_weight = poultry_requests.aggregate(total=Sum('Index_weight'))[ + 'total'] or 0 + quantity = poultry_requests.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + has_code = len(poultry_requests.filter(quarantine_code__isnull=False)) + hasnt_code = len(poultry_requests.filter(quarantine_code__isnull=True)) + hatching = poultry_requests.values_list('hatching__id', flat=True).distinct() + hatchings = PoultryHatching.objects.filter(trash=False, id__in=hatching) + left_over = hatchings.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + quantity_hatching = hatchings.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + dict1 = { + 'lenBar': len(poultry_requests), + 'indexWeight': round(index_weight / len(poultry_requests) if len(poultry_requests) > 0 else 0), + 'quantity': quantity, + 'weight': int(quantity * index_weight), + 'hasCode': has_code, + 'hasntCode': hasnt_code, + 'leftOver': left_over, + 'hatchingQuantity': quantity_hatching, + + } + return Response(dict1, status=status.HTTP_200_OK) + + +class DashboardChainAllocationViewSet(viewsets.ModelViewSet): + queryset = ChainAllocation.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = ChainAllocationSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ChainAllocationFilterSet + filterset_fields = [ + 'poultry_hatching__poultry__breeding_unique_id', + 'poultry_hatching__poultry__user__mobile', + 'poultry_hatching__poultry__user__fullname', + 'poultry_hatching__poultry__user__first_name', + 'poultry_hatching__poultry__user__last_name', + 'poultry_hatching__poultry__unit_name', + 'chain_company__name', + + ] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if request.GET['role'] == "ChainCompany": + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(chain_company__user=user, date__date__gte=date1, + date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True)).order_by('-id') + else: + chain_allocations = ChainAllocation.objects.filter(chain_company__user=user, date__date__gte=date1, + date__date__lte=date2, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(poultry_hatching__poultry__address__city=user.city, + date__date__gte=date1, date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True)).order_by('-id') + else: + + chain_allocations = ChainAllocation.objects.filter(poultry_hatching__poultry__address__city=user.city, + date__date__gte=date1, date__date__lte=date2, + state='accepted', + trash=False).order_by('-id') + elif request.GET['role'] == "CityOperator": + city_operator = CityOperator.objects.get(user=user, trash=False) + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter( + poultry_hatching__poultry__city_operator=city_operator.unit_name, date__date__gte=date1, + date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True)).order_by('-id') + else: + chain_allocations = ChainAllocation.objects.filter( + poultry_hatching__poultry__city_operator=city_operator.unit_name, date__date__gte=date1, + date__date__lte=date2, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + + elif request.GET['role'] == "VetFarm": + vet = Vet.objects.get(user=user, trash=False) + poultry_ids = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry').only( + 'poultry').values_list('poultry', flat=True).distinct() + poultry = Poultry.objects.filter(id__in=poultry_ids) + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + poultry_hatching__poultry__in=poultry, + state__in=('rejected', 'deleted'), + trash__in=(False, True)).order_by('-id') + else: + + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + poultry_hatching__poultry__in=poultry, + state='accepted', + trash=False).order_by('-id') + else: + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True)).order_by('-id') + else: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + + index_weight = chain_allocations.aggregate(total=Sum('index_weight'))[ + 'total'] or 0 + weight = chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + quantity = chain_allocations.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + has_code = len(chain_allocations.filter(quarantine_code__isnull=False)) + hasnt_code = len(chain_allocations.filter(quarantine_code__isnull=True)) + + dict1 = { + 'lenBar': len(chain_allocations), + 'indexWeight': round(index_weight / len(chain_allocations) if len(chain_allocations) > 0 else 0), + 'quantity': quantity, + 'weight': int(weight), + 'hasCode': has_code, + 'hasntCode': hasnt_code, + + } + return Response(dict1, status=status.HTTP_200_OK) + + +class ParentCompanyDashboardChainAllocationViewSet(viewsets.ModelViewSet): + queryset = ChainAllocation.objects.all() + permission_classes = [AllowAny] + serializer_class = ChainAllocationSerializer + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = ChainAllocationFilterSet + filterset_fields = [ + 'poultry_hatching__poultry__breeding_unique_id', + 'poultry_hatching__poultry__user__mobile', + 'poultry_hatching__poultry__user__fullname', + 'poultry_hatching__poultry__user__first_name', + 'poultry_hatching__poultry__user__last_name', + 'poultry_hatching__poultry__unit_name', + 'chain_company__name', + + ] + + def list(self, request, *args, **kwargs): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + + if 'state' in request.GET: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + state__in=('rejected', 'deleted'), + trash__in=(False, True)).order_by('-id') + else: + chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, + state__in=('accepted', 'pending'), + trash=False).order_by('-id') + + index_weight = chain_allocations.aggregate(total=Sum('index_weight'))[ + 'total'] or 0 + weight = chain_allocations.aggregate(total=Sum('weight'))[ + 'total'] or 0 + quantity = chain_allocations.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + has_code = len(chain_allocations.filter(quarantine_code__isnull=False)) + hasnt_code = len(chain_allocations.filter(quarantine_code__isnull=True)) + + dict1 = { + 'lenBar': len(chain_allocations), + 'indexWeight': round(index_weight / len(chain_allocations) if len(chain_allocations) > 0 else 0), + 'quantity': quantity, + 'weight': int(weight), + 'hasCode': has_code, + 'hasntCode': hasnt_code, + + } + return Response(dict1, status=status.HTTP_200_OK) + + +class DashboardTotalPoultryViewSet(viewsets.ModelViewSet): + queryset = Poultry.objects.all() + serializer_class = PoultrySerializer + permission_classes = [AllowAny] + + def list(self, request, *args, **kwargs): + poultreis = Poultry.objects.filter(trash=False).select_related('user', 'address__province', 'address__city') + if 'role' in request.GET: + user = SystemUserProfile.objects.get(key=request.GET['key']) + if request.GET['role'] == 'CityOperator': + city_operator = CityOperator.objects.get(trash=False, user=user) + poultrys = poultreis.filter(poultry__city_operator=city_operator.unit_name) + elif request.GET['role'] in ['CityJahad', 'CityPoultry']: + poultrys = poultreis.filter(poultry__user__city=user.city) + else: + poultrys = poultreis + else: + poultrys = poultreis + all_hatching_pending = 0 + all_total_quantity = 0 + all_poultry_request = 0 + all_kill_request = 0 + all_kill_request_quantity = 0 + all_kill_request_weight = 0 + all_kill_request_has_assigment = 0 + all_kill_request_quantity_assigment = 0 + all_kill_request_weight_assigment = 0 + all_total_quantity_poultry_hatching_pending = 0 + all_total_left_over_poultry_hatching_pending = 0 + all_total_quantity_poultry_request = 0 + all_len_out_poultry_request = 0 + all_total_out_quantity_poultry_request = 0 + all_total_out_weight_poultry_request = 0 + all_period = 0 + len_werhouse_enter = 0 + all_werhouse_enter_quantity = 0 + all_werhouse_enter_weight = 0 + all_all_weight_loss = 0 + for poultry in poultrys: + user_mobile = poultry.user.mobile if poultry.user else '-' + user_name = poultry.user.fullname if poultry.user else '-' + city_operator = poultry.city_operator if poultry.city_operator else '-' + health_certificate_number = poultry.health_certificate_number if poultry.health_certificate_number else '-' + epidemiological_code = poultry.epidemiological_code if poultry.epidemiological_code else '-' + vet_farm = VetFarm.objects.filter(poultry=poultry, trash=False).select_related('vet__user').last() + vet_name = '-' + mobile_vet = '-' + if vet_farm: + vet_name = vet_farm.vet.user.fullname + mobile_vet = vet_farm.vet.user.mobile + poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, trash=False).only('quantity', 'left_over' + ) + + if poultry_hatching: + + poultry_hatching_pending = poultry_hatching.filter(state='pending', allow_hatching='pending', + archive=False).last() + if poultry_hatching_pending: + all_hatching_pending += 1 + hatching = 'ندارد' if not poultry_hatching_pending else f'دارد' + + if poultry_hatching_pending: + period = poultry_hatching_pending.period + else: + period = poultry_hatching.last().period + all_period += period + poultry_hatching_pending1 = poultry_hatching.filter(state='pending', allow_hatching='pending', + archive=False) + total_quantity = \ + poultry_hatching.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_quantity_poultry_hatching_pending = \ + poultry_hatching_pending1.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_left_over_poultry_hatching_pending = \ + poultry_hatching_pending1.aggregate(total=Sum('left_over'))[ + 'total'] or 0 + all_total_quantity += total_quantity + all_total_quantity_poultry_hatching_pending += total_quantity_poultry_hatching_pending + all_total_left_over_poultry_hatching_pending += total_left_over_poultry_hatching_pending + poultry_request = PoultryRequest.objects.filter(trash=False, poultry=poultry, + state_process__in=('accepted', 'pending'), + province_state__in=('accepted', 'pending')).only( + 'quantity', 'Index_weight') + kill_request = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__in=poultry_request).only( + 'accepted_real_quantity', 'accepted_real_weight') + + out_poultry_request = poultry_request.filter(out=True, out_province_request_cancel=False).only( + 'quantity', 'Index_weight' + ) + total_out_quantity_poultry_request = \ + out_poultry_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + total_out_weight_poultry_request = \ + out_poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ + 'total'] or 0 + + all_total_out_quantity_poultry_request += total_out_quantity_poultry_request + all_total_out_weight_poultry_request += total_out_weight_poultry_request + all_len_out_poultry_request += len(out_poultry_request) + total_quantity_poultry_request = \ + poultry_request.aggregate(total=Sum('quantity'))[ + 'total'] or 0 + all_total_quantity_poultry_request += total_quantity_poultry_request + all_poultry_request += len(poultry_request) + all_kill_request += len(kill_request) + kill_request_quantity = kill_request.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + all_kill_request_quantity += kill_request_quantity + kill_request_weight = kill_request.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + all_kill_request_weight += int(kill_request_weight) + kill_request_has_assigment = kill_request.filter(assignment_state_archive='True').only( + 'accepted_real_quantity', 'accepted_real_weight') + + all_kill_request_has_assigment += len(kill_request_has_assigment) + + kill_request_quantity_assigment = kill_request_has_assigment.aggregate( + total=Sum('accepted_real_quantity'))[ + 'total'] or 0 + all_kill_request_quantity_assigment += kill_request_quantity_assigment + kill_request_weight_assigment = kill_request_has_assigment.aggregate( + total=Sum('accepted_real_weight'))[ + 'total'] or 0 + all_kill_request_weight_assigment += int(kill_request_weight_assigment) + + werhouse_enter = kill_request.filter(ware_house_confirmation=True).only( + 'ware_house_accepted_real_quantity', + 'ware_house_accepted_real_weight', + 'weight_loss') + werhouse_enter_quantity = werhouse_enter.aggregate( + total=Sum('ware_house_accepted_real_quantity'))[ + 'total'] or 0 + werhouse_enter_weight = werhouse_enter.aggregate( + total=Sum('ware_house_accepted_real_weight'))[ + 'total'] or 0 + all_weight_loss = werhouse_enter.aggregate( + total_quantity=Sum('weight_loss')).get( + 'total_quantity', 0) or 0 + all_all_weight_loss += all_weight_loss + + all_weight_loss = round(int(all_weight_loss) / len(werhouse_enter), 2) if len(werhouse_enter) > 0 else 0 + + len_werhouse_enter += len(werhouse_enter) + all_werhouse_enter_quantity += werhouse_enter_quantity + all_werhouse_enter_weight += int(werhouse_enter_weight) + list1 = [ + poultry.unit_name, + user_name, + user_mobile, + poultry.breeding_unique_id, + epidemiological_code, + health_certificate_number, + poultry.number_of_halls, + poultry.total_capacity, + poultry.user.province.name + '/' + poultry.user.city.name if poultry.user.city and poultry.user.province is not None else '-', + city_operator, + vet_name + '/' + mobile_vet, + hatching, + period, + total_quantity, + round(total_quantity / period) if period > 0 else 0, + len(poultry_request), + total_quantity_poultry_request, + len(kill_request), + kill_request_quantity, + int(kill_request_weight), + round(kill_request_weight / kill_request_quantity, 1) if kill_request_weight > 0 else 0, + len(kill_request_has_assigment), + kill_request_quantity_assigment, + int(kill_request_weight_assigment), + round(kill_request_weight_assigment / kill_request_quantity_assigment, + 1) if kill_request_weight_assigment > 0 else 0, + len(out_poultry_request), + total_out_quantity_poultry_request, + int(total_out_weight_poultry_request), + str(round(total_out_weight_poultry_request / total_out_quantity_poultry_request, + 1)) if total_out_quantity_poultry_request > 0 else 0, + + len(werhouse_enter), + werhouse_enter_quantity, + int(werhouse_enter_weight), + f'%{all_weight_loss}', + + ] + + value_header_list = [ + all_period, + all_total_quantity, + all_hatching_pending, + all_total_quantity_poultry_hatching_pending, + all_total_left_over_poultry_hatching_pending, + all_poultry_request, + all_total_quantity_poultry_request, + all_kill_request, + all_kill_request_quantity, + all_kill_request_weight, + (round(all_kill_request_weight / all_kill_request_quantity, 1)) if all_kill_request_quantity > 0 else 0, + + all_kill_request_has_assigment, + all_kill_request_quantity_assigment, + all_kill_request_weight_assigment, + str(round(all_kill_request_weight_assigment / all_kill_request_quantity_assigment, + 1)) if all_kill_request_quantity_assigment > 0 else 0, + + all_len_out_poultry_request, + all_total_out_quantity_poultry_request, + int(all_total_out_weight_poultry_request), + str(round(all_total_out_weight_poultry_request / all_total_out_quantity_poultry_request, + 1)) if all_total_out_quantity_poultry_request > 0 else 0, + len_werhouse_enter, + all_werhouse_enter_quantity, + all_werhouse_enter_weight, + f'%{round(int(all_all_weight_loss) / len_werhouse_enter, 2) if len_werhouse_enter > 0 else 0}', + + ] + + +class GetAllPoultryViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET.get('role') + min_age = int(request.GET.get('min_age', 0)) + max_age = int(request.GET.get('max_age', min_age)) + + filters = { + 'allow_hatching': 'pending', + 'left_over__gt': 0, + 'state': 'pending', + 'archive': False, + 'trash': False + } + + if role == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + filters['poultry__city_operator'] = city_operator.unit_name + elif role == 'Poultry': + filters['poultry__user'] = user + elif role == 'PoultryScience': + poultry_science = PoultryScience.objects.filter(user=user).values_list('poultry__id', flat=True).distinct() + filters['poultry__id__in'] = poultry_science + + if 'chain' in request.GET: + if request.GET['chain'] == 'true' or request.GET['chain']: + filters['InteractTypeName'] = 'در مشارکت با زنجیره' + poultry_hatchings = PoultryHatching.objects.filter(**filters).values( + 'poultry', 'has_chain_company', 'key' + ).annotate( + last_hatching_remain_quantity=Max('left_over') + ) + + age_range = ChickenAgeRange.objects.filter(trash=False).first() + if 'min_age' in request.GET or 'direct_buying' in request.GET: + if age_range and age_range.active: + poultry_hatchings = poultry_hatchings.filter(chicken_age__range=(age_range.minimum, age_range.maximum)) + elif min_age: + poultry_hatchings = poultry_hatchings.filter(chicken_age__range=(min_age, max_age)) + + poultry_remain_dict = { + poultry_hatching['poultry']: { + 'last_hatching_remain_quantity': poultry_hatching['last_hatching_remain_quantity'], + 'chain_company': { + "chain_company": poultry_hatching['has_chain_company'], + "hatching_key": poultry_hatching['key'], + }, + 'allow_sell_free': ProvinceAllowPoultrySellFree.objects.filter( + poultry_id=poultry_hatching['poultry'] + ).values_list('allow', flat=True).first() or False + } + for poultry_hatching in poultry_hatchings + } + + poultry = Poultry.objects.filter(id__in=poultry_remain_dict.keys()).select_related('user', 'address').order_by( + 'id') + serializer = GetAllPoultrySerializer(poultry, many=True, context={'poultry_remain_dict': poultry_remain_dict}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryPredictionViewSet(viewsets.ModelViewSet): + queryset = PoultryPrediction.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryPredictionSerializer + + +class HatchingIncreaseRequestViewSet(viewsets.ModelViewSet): + queryset = HatchingIncreaseRequest.objects.all() + serializer_class = HatchingIncreaseRequestSerializer + permission_classes = [TokenHasReadWriteScope] + filterset_class = HatchingIncreaseRequestFilterSet + pagination_class = CustomPagination + + def list(self, request, *args, **kwargs): + value = request.GET.get('value') + search = request.GET.get('search') + query = HatchingIncreaseRequest.objects.filter(trash=False).order_by('-date') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + query = query.filter( + build_query(self.filterset_class, value) + ) + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(query) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + ser_data = self.serializer_class(query, many=True) + return Response(ser_data.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(trash=False, user=request.user) + hatching_key = request.data["hatching_key"] + hatching = PoultryHatching.objects.get(trash=False, key=hatching_key) + request.data.pop('hatching_key') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + hatching_increase = serializer.create(validated_data=request.data) + hatching_increase.hatching = hatching + hatching_increase.registerer_name = user.fullname + hatching_increase.registerer_mobile = user.mobile + hatching_increase.hatching_left_over = hatching.left_over + hatching_increase.hatching_quantity = hatching.quantity + hatching_increase.hatching_losses = hatching.total_losses + hatching_increase.hatching_kill_quantity = hatching.killed_quantity + hatching_increase.save() + calculate_hatching_increase(hatching) + + return Response(serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status.HTTP_403_FORBIDDEN) + + def update(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(trash=False, user=request.user) + + data = request.data + query = HatchingIncreaseRequest.objects.get(trash=False, key=data['key']) + query.quantity = data['quantity'] + query.message = data['message'] + query.registerer_name = user.fullname + query.registerer_mobile = user.mobile + query.registerer_role = data['role'] + query.date = datetime.datetime.now() + query.save() + calculate_hatching_increase(query.hatching) + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + def destroy(self, request, *args, **kwargs): + query = HatchingIncreaseRequest.objects.get(trash=False, key=request.GET['key']) + hatching = query.hatching + if hatching.left_over < query.quantity: + return Response({'result': 'به علت کم بودن حجم مانده در سالن اجازه حذف ندارید!'}, + status=status.HTTP_403_FORBIDDEN) + query.trash = True + query.save() + calculate_hatching_increase(hatching) + return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + +class ChickenCommissionPricesViewSet(viewsets.ModelViewSet): + queryset = ChickenCommissionPrices.objects.all() + serializer_class = ChickenCommissionPricesSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + + def list(self, request, *args, **kwargs): + ChickenCommissionPrices.objects.get_or_create(date__date=datetime.date.today(), + defaults={'date': datetime.datetime.now(), + 'kill_house_price': kill_house_price}) + create_update_chicken_commission_prices() + query = ChickenCommissionPrices.objects.filter(trash=False).order_by('-date') + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(query) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + ser_data = self.serializer_class(query, many=True) + return Response(ser_data.data, status=status.HTTP_200_OK) + + +class GetAllPoultryFoIncreaseHatchingViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + user = SystemUserProfile.objects.get(user=request.user, trash=False) + role = request.GET.get('role') + min_age = int(request.GET.get('min_age', 0)) + max_age = int(request.GET.get('max_age', min_age)) + + filters = { + 'allow_hatching': 'pending', + 'state': 'pending', + 'archive': False, + 'trash': False + } + + if role == 'CityOperator': + city_operator = CityOperator.objects.get(user=user) + filters['poultry__city_operator'] = city_operator.unit_name + elif role == 'Poultry': + filters['poultry__user'] = user + if 'chain' in request.GET: + if request.GET['chain'] == 'true' or request.GET['chain']: + filters['InteractTypeName'] = 'در مشارکت با زنجیره' + poultry_hatchings = PoultryHatching.objects.filter(**filters).values( + 'poultry', 'has_chain_company', 'key' + ).annotate( + last_hatching_remain_quantity=Max('left_over') + ) + + age_range = ChickenAgeRange.objects.filter(trash=False).first() + if 'min_age' in request.GET or 'direct_buying' in request.GET: + if age_range and age_range.active: + poultry_hatchings = poultry_hatchings.filter(chicken_age__range=(age_range.minimum, age_range.maximum)) + elif min_age: + poultry_hatchings = poultry_hatchings.filter(chicken_age__range=(min_age, max_age)) + + poultry_remain_dict = { + poultry_hatching['poultry']: { + 'last_hatching_remain_quantity': poultry_hatching['last_hatching_remain_quantity'], + 'chain_company': { + "chain_company": poultry_hatching['has_chain_company'], + "hatching_key": poultry_hatching['key'], + }, + 'allow_sell_free': ProvinceAllowPoultrySellFree.objects.filter( + poultry_id=poultry_hatching['poultry'] + ).values_list('allow', flat=True).first() or False + } + for poultry_hatching in poultry_hatchings + } + + poultry = Poultry.objects.filter(id__in=poultry_remain_dict.keys()).select_related('user', 'address').order_by( + 'id') + serializer = GetAllPoultrySerializer(poultry, many=True, context={'poultry_remain_dict': poultry_remain_dict}) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryRequestQuarantineCodeViewSet(viewsets.ModelViewSet): + queryset = PoultryRequestQuarantineCode.objects.all() + serializer_class = PoultryRequestQuarantineCodeSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + poultry_request_key = request.GET.get('poultry_request_key') + codes = PoultryRequestQuarantineCode.objects.filter(poultry_request__key=poultry_request_key, + trash=False).order_by('id') + serializer = self.serializer_class(codes, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) + request.data.pop('poultry_request_key') + + if PoultryRequestQuarantineCode.objects.filter(quarantine_code=request.data['quarantine_code'], + trash=False).exists(): + return Response({"result": "این کد قبلا وارد شده است!"}, status=status.HTTP_403_FORBIDDEN) + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + code = serializer.create(validated_data=request.data) + code.registrar = user.fullname + code.register_date = datetime.datetime.now() + code.poultry_request = poultry_request + code.save() + get_gid_poultry_request_quarantine_code(code.id) + + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors) + + def update(self, request, pk=None, *args, **kwargs): + code_key = request.data.pop('request_code_key') + + code = PoultryRequestQuarantineCode.objects.get(key=code_key) + + if 'quarantine_code' in request.data.keys(): + if code.quarantine_code != request.data['quarantine_code']: + if PoultryRequestQuarantineCode.objects.filter( + quarantine_code=request.data['quarantine_code'], trash=False).exists(): + return Response({"result": "این کد قبلا وارد شده است!"}, status=status.HTTP_403_FORBIDDEN) + + serializer = self.serializer_class(code) + serializer.update(instance=code, validated_data=request.data) + get_gid_poultry_request_quarantine_code(code.id) + + return Response(serializer.data, status=status.HTTP_200_OK) + + def destroy(self, request, *args, **kwargs): + code_key = request.GET.get('request_code_key') + code = PoultryRequestQuarantineCode.objects.get(key=code_key) + code.trash = True + code.save() + return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) + + +class EvacuationHatchingDetailViewSet(viewsets.ModelViewSet): + queryset = EvacuationHatchingDetail.objects.filter(trash=False) + serializer_class = EvacuationHatchingDetailSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filter_backends = [DjangoFilterBackend] + filterset_class = EvacuationHatchingDetailFilterSet + filterset_fields = [ + 'hatching__key', + 'hatching__poultry__breeding_unique_id', + 'PartIdCode', + 'RequestId', + 'MoReportId', + 'ReportType', + 'ReportStatus', + 'GoodCount', + 'IsDeleted', + 'IsPersisted', + 'AllowInsert', + 'AllowUpdate', + 'ExternalId', + 'StringId', + ] + + +class HatchingDetailView(APIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + hatching = PoultryHatching.objects.filter( + trash=False, + key=request.GET['key'] + ).select_related('poultry').first() + ser_data = PoultryHatchingForDetailsSerializer(hatching).data + kill_requests = KillHouseRequest.objects.filter( + trash=False, + province_request__poultry_request__hatching=hatching, + ware_house_confirmation=True + ).select_related( + 'killhouse_user', + 'killer', + 'province_request', + 'province_request__poultry_request', + 'kill_request' + ).order_by('-create_date') + ser_data_kill_request = KillHouseRequestForHatchingDetailSerializer(kill_requests, many=True).data + + poultry_requests = PoultryRequest.objects.filter(hatching=hatching, trash=False, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, + temporary_trash=False, + temporary_deleted=False) + + ser_data_poultry_request = PoultryRequestForHatchingDetailSerializer(poultry_requests, many=True).data + + chain_allocation = ChainAllocation.objects.filter(trash=False, state='accepted', poultry_hatching=hatching) + ser_data_chain_allocation = ChainAllocationForHatchingDetailSerializer(chain_allocation, many=True).data + + bar_diffrent_requests = BarDifferenceRequest.objects.filter(trash=False, hatching=hatching, + state='accepted').order_by('-id') + bar_diffrent_requests_serializer_data = BarDifferenceRequestSerializer(bar_diffrent_requests, many=True).data + + evacuation_reports = [] + if hatching: + details_qs = hatching.evacuation_details.filter(trash=False).order_by('-ReportDate', '-create_date') + evacuation_reports = EvacuationHatchingDetailSerializer(details_qs, many=True).data + + date1 = datetime.datetime.strptime(str(request.GET['date1']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + date2 = datetime.datetime.strptime(str(request.GET['date2']), + '%Y-%m-%d').date() if 'date1' in request.GET else None + + poultry_hatching_licence_number = hatching.licence_number + response = requests.post( + f'https://rsibackend.rasadyar.com/app/send_different_bar_with_licence_number/?' + f'licence_number={poultry_hatching_licence_number}' + f'&date1={date1}&date2={date2}', + headers={'Content-Type': 'application/json'} + ) + + kill_requests_non_receipt = KillHouseRequest.objects.filter( + trash=False, + province_request__poultry_request__hatching=hatching, + non_receipt=True, main_non_receipt=True + ).select_related( + 'killhouse_user', + 'killer', + 'province_request', + 'province_request__poultry_request', + 'kill_request' + ).order_by('-create_date') + ser_data_non_receipt_kill_request = KillHouseRequestForHatchingDetailSerializer(kill_requests_non_receipt, + many=True).data + filters = { + 'archive_wage': False, + 'state__in': ('pending', 'accepted'), + 'first_car_allocated_quantity': 0, + 'return_to_province': False + } + return_province_kill_requests = ProvinceKillRequest.objects.filter( + trash=True, return_trash=True, **filters, + province_request__poultry_request__hatching=hatching).order_by('id') + return_province_kill_requests_serializer = ReturnProvinceKillRequestSerializer(return_province_kill_requests, + many=True).data + + kill_house_requests_return = KillHouseRequest.objects.filter( + trash=True, return_trash=True, + province_request__poultry_request__hatching=hatching) + kill_house_requests_return_serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests_return, + many=True).data + + bar_requests = BarDifferenceRequest.objects.filter(trash=False, + state='accepted').order_by('id') + bar_request_serilizer = BarDifferenceRequestSerializer(bar_requests, many=True).data + + hatching_increase = HatchingIncreaseRequest.objects.filter(trash=False).order_by('-date') + hatching_increase_serilizer = HatchingIncreaseRequestSerializer(hatching_increase, many=True).data + result = { + **ser_data, + "bars": ser_data_kill_request, + 'outBars': ser_data_poultry_request, + 'chainAllocation': ser_data_chain_allocation, + "differentBars": response.json(), + "nonReceipt": ser_data_non_receipt_kill_request, + "returnProvinceRequest": return_province_kill_requests_serializer, + "returnKillHouseRequest": kill_house_requests_return_serializer, + "killingDifference": bar_request_serilizer, + "hatchingIncrease": hatching_increase_serilizer, + "bar_diffrent_requets": bar_diffrent_requests_serializer_data, + "evacuation_reports": evacuation_reports, + } + return Response(result) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def bulk_test_data(request): + count = int(request.query_params.get('count', 1000000)) # پیش‌فرض 1 میلیون + + result = [] + for i in range(count): + data = { + "id": i + 1, + "unit_name": 'nn', + "Lat": 34.88681445023634 + random.uniform(-0.1, 0.1), + "Long": 48.32817003380081 + random.uniform(-0.1, 0.1), + "user": { + "fullname": 'sdfsd', + "mobile": 'sdfsd' + }, + "hatching": [ + { + "quantity": random.randint(10000, 50000), + "left_over": random.randint(10000, 50000), + "period": random.randint(1, 30), + "chicken_age": random.randint(1, 100), + "date": (datetime.datetime.now() - timedelta(days=random.randint(1, 365))).isoformat(), + "violation": random.choice([True, False]), + "archive": False, + "licence_number": str(random.randint(1000000000, 9999999999)), + "samasat_discharge_percentage": random.randint(0, 100), + "chicken_breed": random.choice(["آربراکرز (آپلاس)", "راس", "کاب", "هوبارد"]), + "total_killed_weight": round(random.uniform(0, 1000), 2), + "killed_quantity": random.randint(0, 1000), + "PersonTypeName": random.choice(["حقیقی", "حقوقی"]), + "InteractTypeName": random.choice(["مالک", "مستأجر"]), + "UnionTypeName": random.choice(["تعاونی", "خصوصی", "دولتی"]), + "CertId": str(random.randint(100000000000, 999999999999)) + } + ], + "address": { + "city": { + "name": 'همدان' + }, + "address": 'sdasdasdasd' + }, + "breeding_unique_id": str(random.randint(100000000000, 999999999999)) + } + result.append(data) + + return Response(result) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_hatching_for_bazrasi(request): + active = request.GET['active'] + poultry = Poultry.objects.filter(trash=False, breeding_unique_id=request.GET['code']).first() + if poultry: + poultry_hatching = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id') + if active == 'true': + poultry_hatching = poultry_hatching.filter(state='pending', allow_hatching='pending', archive=False) + else: + poultry_hatching = poultry_hatching.filter(archive=True).last() + poultry_hatching = [poultry_hatching] if poultry_hatching else [] + ser_data = PoultryHatchingForBazrasiSerializer(poultry_hatching, many=True).data + return Response(ser_data, status.HTTP_200_OK) + return Response({'result': "مرغدار وجود ندارد!"}, status.HTTP_403_FORBIDDEN) + + +@api_view(["GET"]) +@permission_classes([AllowAny]) +@csrf_exempt +def get_poultry_for_bazrasi(request): + breeding_unique_id = request.GET.get('code') or request.GET.get('breeding_unique_id') + + if not breeding_unique_id: + return Response({'result': "شناسه یکتا مرغدار ارسال نشده است!"}, status=status.HTTP_400_BAD_REQUEST) + + poultry = Poultry.objects.filter( + trash=False, + breeding_unique_id=breeding_unique_id + ).select_related( + 'user', 'address', 'address__city', 'address__province' + ).first() + + if not poultry: + return Response({'result': "مرغدار وجود ندارد!"}, status=status.HTTP_404_NOT_FOUND) + + active_hatchings = PoultryHatching.objects.filter( + trash=False, + poultry=poultry, + state='pending', + allow_hatching='pending', + archive=False + ).select_related( + 'chain_company', 'poultry' + ).order_by('id') + + poultry_serializer = PoultryDetailForPoultryAndHatchingForPoultryScienceSerializer(poultry) + hatchings_serializer = PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer(active_hatchings, many=True) + + result = { + 'poultry': poultry_serializer.data, + 'active_hatchings': hatchings_serializer.data + } + + return Response(result, status=status.HTTP_200_OK) + + +class PoultryRequestForDirectBuyingViewSet(GenericAPIView): + permission_classes = [TokenHasReadWriteScope] + serializer_class = PoultryRequestForDirectBuyingSerializer + filterset_class = PoultryRequestDirectBuyingFilterSet + pagination_class = CustomPagination + + def get_queryset(self): + user = SystemUserProfile.objects.select_related("user").get(user=self.request.user, trash=False) + role = self.request.GET.get('role') + date1, date2 = self.request.GET.get('date1'), self.request.GET.get('date2') + now = datetime.datetime.now() + + categories = {c.name: c for c in IndexWeightCategory.objects.filter(trash=False).only('name')} + light, average, heavy = categories.get("سبک"), categories.get("متوسط"), categories.get("سنگین") + + show_market = ShowMarketRequest.objects.filter(trash=False, allow=True).first() + now_time = now.time().replace(second=0, microsecond=0) + + filters = Q( + state_process='accepted', + province_state='accepted', + temporary_trash=False, + trash=False, + out=False, + final_state='pending', + market=True + ) + + if date1 and date2: + filters &= Q(send_date__date__gte=date1, send_date__date__lte=date2) + else: + filters &= Q(send_date__date=now.date()) + + queryset = PoultryRequest.objects.select_related( + "poultry__user__city", + "hatching" + ).filter(filters) + + if role == "KillHouse" and show_market: + kill_house = KillHouse.objects.filter(trash=False, kill_house_operator__user=user).first() + if not ( + kill_house and kill_house.market_buying and show_market.start_time < now_time < show_market.end_time): + return PoultryRequest.objects.none() + + breed = self.request.GET.get('breed') + city = self.request.GET.get('city') + remain = self.request.GET.get('remain') + min_amount = self.request.GET.get('min_amount') + max_amount = self.request.GET.get('max_amount') + weight = self.request.GET.get('weight') + min_age = self.request.GET.get('min_age') + max_age = self.request.GET.get('max_age') + value = self.request.GET.get('value') + search = self.request.GET.get('search') + + if breed: + queryset = queryset.filter(chicken_breed__in=breed.split(',')) + if city: + queryset = queryset.filter(poultry__user__city__name__in=city.split(',')) + if remain == 'true': + queryset = queryset.filter(remain_quantity__gt=0) + if min_amount: + queryset = queryset.filter(amount__gte=min_amount) + if max_amount: + queryset = queryset.filter(amount__lte=max_amount) + + if weight and (light and average and heavy): + if weight == 'سبک': + queryset = queryset.filter(Index_weight__gte=light.min_value, Index_weight__lt=light.max_value) + elif weight == 'متوسط': + queryset = queryset.filter(Index_weight__gte=average.min_value, Index_weight__lt=average.max_value) + elif weight == 'سنگین': + queryset = queryset.filter(Index_weight__gte=heavy.min_value, Index_weight__lte=heavy.max_value) + + if min_age: + queryset = queryset.filter(hatching__chicken_age__gte=min_age) + if max_age: + queryset = queryset.filter(hatching__chicken_age__lte=max_age) + + if value and search == 'filter' and value.strip() and value != 'undefined': + queryset = queryset.filter(build_query(self.filterset_class, value)) + + return queryset + + def get(self, request): + queryset = self.get_queryset() + + page_size = request.query_params.get('page_size') + if page_size: + self.pagination_class.page_size = int(page_size) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.serializer_class(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class PoultryHatchingForDirectBuyingViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + result = None + hatching = PoultryHatching.objects.get(key=request.GET['hatching_key']) + poultry_requests = PoultryRequest.objects.filter(hatching=hatching, state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), trash=False, + temporary_trash=False, + out=False).order_by('send_date') + poultry_requests_info = poultry_requests.aggregate( + avg_weight=Avg('Index_weight'), + min_age=Min('killing_age'), + max_age=Max('killing_age') + ) + + kill_house_requests = KillHouseRequest.objects.filter(trash=False, + province_request__poultry_request__in=poultry_requests) + kill_house_requests_info = kill_house_requests.aggregate( + avg_weight_losse=Avg('weight_loss') + ) + completed_bars = kill_house_requests.filter(assignment_state_archive='True') + receive_bars_percent = ( + completed_bars.count() / kill_house_requests.count()) * 100 if kill_house_requests else 0 + + if poultry_requests: + result = { + 'min_age': poultry_requests_info['min_age'] or 1, + 'max_age': poultry_requests_info['max_age'] or 1, + 'now_age': hatching.chicken_age, + 'avg_weight': round(poultry_requests_info['avg_weight'] or 0, 2) or 0, + 'avg_weight_losse': round(kill_house_requests_info['avg_weight_losse'] or 0, 2) or 0, + 'receive_bars_percent': round(receive_bars_percent, 2), + } + + return Response(result, status=status.HTTP_200_OK) + + +class PoultryHatchingChartForDirectBuyingViewSet(APIView): + permission_classes = [TokenHasReadWriteScope] + + def get(self, request): + user = SystemUserProfile.objects.get(user=self.request.user, trash=False) + today = datetime.date.today() + now = datetime.datetime.now() + role = request.GET.get('role') + show_market = ShowMarketRequest.objects.filter(trash=False, allow=True).first() + now_time = now.time().replace(second=0, microsecond=0) + index_weight_category = IndexWeightCategory.objects.filter(trash=False).order_by('id') + light = index_weight_category.filter(name='سبک').first() + average = index_weight_category.filter(name='متوسط').first() + heavy = index_weight_category.filter(name='سنگین').first() + light_min_value = light.min_value + light_max_value = light.max_value + average_min_value = average.min_value + average_max_value = average.max_value + heavy_min_value = heavy.min_value + heavy_max_value = heavy.max_value + if show_market and role == 'KillHouse': + kill_house = KillHouse.objects.filter(trash=False, kill_house_operator__user=user).first() + + if show_market.start_time < \ + now_time < show_market.end_time: + if kill_house.market_buying: + + queryset = ( + PoultryRequest.objects.filter( + send_date__date=today, + state_process='accepted', + province_state='accepted', + temporary_trash=False, + trash=False, + out=False, + final_state='pending', + market=True, + ) + .values("poultry__user__city__name") + .annotate( + total_quantity=Sum('quantity'), + light_quantity=Sum( + Case( + When(Q(Index_weight__gte=light_min_value, Index_weight__lt=light_max_value), + then="quantity"), + output_field=IntegerField(), + ) + ), + average_quantity=Sum( + Case( + When(Q(Index_weight__gte=average_min_value, Index_weight__lt=average_max_value), + then="quantity"), + output_field=IntegerField(), + ) + ), + heavy_quantity=Sum( + Case( + When(Q(Index_weight__gte=heavy_min_value, Index_weight__lt=heavy_max_value), + then="quantity"), + output_field=IntegerField(), + ) + ), + ) + ) + + result = [ + { + "city": row["poultry__user__city__name"], + "total_quantity": row["total_quantity"] or 0, + "category": [ + { + "name": light.name, + "min_value": light.min_value, + "max_value": light.max_value, + "quantity": row['light_quantity'] or 0, + }, + { + "name": average.name, + "min_value": average.min_value, + "max_value": average.max_value, + "quantity": row['average_quantity'] or 0, + }, + { + "name": heavy.name, + "min_value": heavy.min_value, + "max_value": heavy.max_value, + "quantity": row['heavy_quantity'] or 0, + } + ] + } + for row in queryset + ] + + else: + result = [] + + else: + result = [] + else: + queryset = ( + PoultryRequest.objects.filter( + send_date__date=today, + state_process='accepted', + province_state='accepted', + temporary_trash=False, + trash=False, + out=False, + final_state='pending', + market=True, + ) + .values("poultry__user__city__name") + .annotate( + total_quantity=Sum('quantity'), + light_quantity=Sum( + Case( + When(Q(Index_weight__gte=light_min_value, Index_weight__lt=light_max_value), + then="quantity"), + output_field=IntegerField(), + ) + ), + average_quantity=Sum( + Case( + When(Q(Index_weight__gte=average_min_value, Index_weight__lt=average_max_value), + then="quantity"), + output_field=IntegerField(), + ) + ), + heavy_quantity=Sum( + Case( + When(Q(Index_weight__gte=heavy_min_value, Index_weight__lt=heavy_max_value), + then="quantity"), + output_field=IntegerField(), + ) + ), + ) + ) + + result = [ + { + "city": row["poultry__user__city__name"], + "total_quantity": row["total_quantity"] or 0, + "category": [ + { + "name": light.name, + "min_value": light.min_value, + "max_value": light.max_value, + "quantity": row['light_quantity'] or 0, + }, + { + "name": average.name, + "min_value": average.min_value, + "max_value": average.max_value, + "quantity": row['average_quantity'] or 0, + }, + { + "name": heavy.name, + "min_value": heavy.min_value, + "max_value": heavy.max_value, + "quantity": row['heavy_quantity'] or 0, + } + ] + } + for row in queryset + ] + + return Response(result, status=status.HTTP_200_OK) + + +class ManagementHatchingAgeRangeViewSet(viewsets.ModelViewSet): + queryset = ManagementHatchingAgeRange.objects.all().order_by('from_age') + serializer_class = ManagementHatchingAgeRangeSerializer + permission_classes = [TokenHasReadWriteScope] diff --git a/panel/scripts/__init__.py b/panel/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/scripts/database_merge.py b/panel/scripts/database_merge.py new file mode 100644 index 0000000..c5837e4 --- /dev/null +++ b/panel/scripts/database_merge.py @@ -0,0 +1,6 @@ +def update_database(): + from panel.models import Poultry + poultries = Poultry.objects.all() + for poultry in poultries: + poultry.city = poultry.address.city.id + poultry.save() diff --git a/panel/temp_keys.py b/panel/temp_keys.py new file mode 100644 index 0000000..20ffa64 --- /dev/null +++ b/panel/temp_keys.py @@ -0,0 +1,430 @@ +from authentication.models import Province, City, CityUnit, SystemAddress, SystemUserProfile, BankCard +from panel.models import Poultry, PoultryHatching, CityOperator, PoultryRequest, KillHouseOperator, \ + KillHouseAllowVet, KillHousePercentage, KillHouseDriver, CityOperatorCheckRequest, KillHouseADDCAR, \ + ProvinceOperator, ProvinceCheckOperatorOutRequest, ProvinceCheckOperatorRequest, ShareOfAllocation, KillRequest, \ + KillRequestFactor, KillRequestFactorPayment, ProvinceKillRequest, KillHouseRequest, KillHouseCheckRequest, \ + KillHouseAssignmentInformation, ProvinceCheckInformation, ProvinceFactorToKillHouse, KillHouseFactorToProvince, \ + ProvinceCheckKillHouseFactor, DepositAllocation, InspectorOperator, PovinceInspector, Vet, KillHouseVet, \ + VetCheckRequest, VetFarm, VetFarmInspection, Admin, Jahad, CityJahad, ProvincialGovernment, VetSupervisor, \ + ProvinceAllowKillHouseRegisterCar, ProvinceAllowPoultryChooseKillHouse, ProvinceAllowPoultrySellFree, \ + KillHouseDailyQuota, ProvinceAutoAllocation, Pricing, PoultryAllowCityProvince, TotalPoultryRequestQuantity, \ + VetCheckAllocations, Wallet + + +def make_temp_keys(): + from panel.models import KillHouse + wallets = Wallet.objects.all() + provinces = Province.objects.all() + cities = City.objects.all() + cityunits = CityUnit.objects.all() + system_addresses = SystemAddress.objects.all() + bank_cards = BankCard.objects.all() + system_userprofiles = SystemUserProfile.objects.all() + pricings = Pricing.objects.all() + poultries = Poultry.objects.all() + poultry_allow_citys_provinces = PoultryAllowCityProvince.objects.all() + hatchings = PoultryHatching.objects.all() + city_operators = CityOperator.objects.all() + poultry_requests = PoultryRequest.objects.all() + totals_poultry_request_quantity = TotalPoultryRequestQuantity.objects.all() + kill_house_operators = KillHouseOperator.objects.all() + KillHouses = KillHouse.objects.all() + killhouseallowvets = KillHouseAllowVet.objects.all() + killhousepercentages = KillHousePercentage.objects.all() + drivers = KillHouseDriver.objects.all() + add_cars = KillHouseADDCAR.objects.all() + city_check_requests = CityOperatorCheckRequest.objects.all() + province_operators = ProvinceOperator.objects.all() + province_check_out_requests = ProvinceCheckOperatorOutRequest.objects.all() + province_check_requests = ProvinceCheckOperatorRequest.objects.all() + share_of_allocations = ShareOfAllocation.objects.all() + kill_requests = KillRequest.objects.all() + kill_request_factors = KillRequestFactor.objects.all() + kill_request_payment_factors = KillRequestFactorPayment.objects.all() + province_kill_requests = ProvinceKillRequest.objects.all() + kill_house_requests = KillHouseRequest.objects.all() + kill_house_check_requests = KillHouseCheckRequest.objects.all() + assignment_informations = KillHouseAssignmentInformation.objects.all() + province_check_informations = ProvinceCheckInformation.objects.all() + province_factors = ProvinceFactorToKillHouse.objects.all() + kill_house_factors = KillHouseFactorToProvince.objects.all() + province_check_kill_house_factors = ProvinceCheckKillHouseFactor.objects.all() + deposit_allocations = DepositAllocation.objects.all() + inspectors = InspectorOperator.objects.all() + inspector_checks = PovinceInspector.objects.all() + vets = Vet.objects.all() + kill_house_vets = KillHouseVet.objects.all() + vet_check_requests = VetCheckRequest.objects.all() + vet_farms = VetFarm.objects.all() + vet_farm_inspections = VetFarmInspection.objects.all() + admins = Admin.objects.all() + jahads = Jahad.objects.all() + city_jahads = CityJahad.objects.all() + goverments = ProvincialGovernment.objects.all() + vet_supervisers = VetSupervisor.objects.all() + vet_check_allocations = VetCheckAllocations.objects.all() + province_allow_kill_house_registers = ProvinceAllowKillHouseRegisterCar.objects.all() + province_allow_poultry_choose_kill_houses = ProvinceAllowPoultryChooseKillHouse.objects.all() + province_allow_poultry_auto_sell = ProvinceAllowPoultrySellFree.objects.all() + kill_house_daily_quotas = KillHouseDailyQuota.objects.all() + province_auto_allocations = ProvinceAutoAllocation.objects.all() + + for wallet in wallets: + wallet.province_name = 'لرستان' + wallet.save() + + for bank_card in bank_cards: + bank_card.user_bank_id_key = bank_card.id + bank_card.province_name = 'لرستان' + bank_card.save() + + + # for province in provinces: + # province.province_id_key = province.id + # province.save() + # + # for city in cities: + # city.province_id_foreign_key = city.province.id + # city.city_id_key = city.id + # city.save() + # + # for cityunit in cityunits: + # cityunit.city_id_foreign_key = cityunit.city.id + # cityunit.city_unit_id_key = cityunit.id + # cityunit.save() + # + # for system_addresse in system_addresses: + # system_addresse.province_id_foreign_key = system_addresse.province.id + # system_addresse.city_id_foreign_key = system_addresse.city.id + # system_addresse.address_id_key = system_addresse.id + # system_addresse.save() + # + # + # for system_userprofile in system_userprofiles: + # system_userprofile.city_id_foreign_key = system_userprofile.city.id + # system_userprofile.province_id_foreign_key = system_userprofile.province.id + # system_userprofile.user_django_id_foreign_key = system_userprofile.user.id + # system_userprofile.system_user_profile_id_key = system_userprofile.id + # system_userprofile.save() + # + # for pricing in pricings: + # if pricing.operator != None: + # pricing.operator_id_foreign_key = pricing.operator.id + # pricing.pricing_id_key = pricing.id + # pricing.save() + # + # for poultry in poultries: + # if poultry.owner != None: + # poultry.owner_id_foreign_key = poultry.owner.id + # poultry.user_id_foreign_key = poultry.user.id + # poultry.address_id_foreign_key = poultry.address.id + # if poultry.user_bank_info != None: + # poultry.user_bank_id_foreign_key = poultry.user_bank_info.id + # poultry.wallet_id_foreign_key = poultry.wallet.id + # poultry.poultry_id_key = poultry.id + # poultry.save() + # + # for poultry_allow_city_province in poultry_allow_citys_provinces: + # poultry_allow_city_province.poultry_id_foreign_key = poultry_allow_city_province.poultry.id + # poultry_allow_city_province.poultry_allow_city_province_id_key = poultry_allow_city_province.id + # poultry_allow_city_province.save() + # + # for hatching in hatchings: + # hatching.poultry_id_foreign_key = hatching.poultry.id + # hatching.poultry_hatching_id_key = hatching.id + # hatching.save() + # + # for city_operator in city_operators: + # city_operator.user_id_foreign_key = city_operator.user.id + # city_operator.address_id_foreign_key = city_operator.address.id + # if city_operator.user_bank_info != None: + # city_operator.user_bank_id_foreign_key = city_operator.user_bank_info.id + # city_operator.wallet_id_foreign_key = city_operator.wallet.id + # city_operator.city_operator_id_key = city_operator.id + # city_operator.save() + # + # for poultry_request in poultry_requests: + # poultry_request.city_operator_id_foreign_key = poultry_request.city_operator.id + # poultry_request.poultry_id_foreign_key = poultry_request.poultry.id + # poultry_request.poultry_hatching_id_foreign_key = poultry_request.hatching.id + # poultry_request.poultry_request_id_key = poultry_request.id + # poultry_request.save() + # + # for total_poultry_request_quantity in totals_poultry_request_quantity: + # total_poultry_request_quantity.total_poultry_request_quantity_id_key = total_poultry_request_quantity.id + # total_poultry_request_quantity.save() + # + # for kill_house_operator in kill_house_operators: + # kill_house_operator.user_id_foreign_key = kill_house_operator.user.id + # kill_house_operator.address_id_foreign_key = kill_house_operator.address.id + # if kill_house_operator.user_bank_info != None: + # kill_house_operator.user_bank_id_foreign_key = kill_house_operator.user_bank_info.id + # kill_house_operator.wallet_id_foreign_key = kill_house_operator.wallet.id + # kill_house_operator.kill_house_operator_id_key = kill_house_operator.id + # kill_house_operator.save() + # + # for KillHouse in KillHouses: + # KillHouse.kill_house_operator_id_foreign_key = KillHouse.kill_house_operator.id + # KillHouse.system_address_id_foreign_key = KillHouse.system_address.id + # KillHouse.kill_house_id_key = KillHouse.id + # KillHouse.save() + # + # for killhouseallowvet in killhouseallowvets: + # killhouseallowvet.kill_house_id_foreign_key = killhouseallowvet.kill_house.id + # killhouseallowvet.kill_house_allow_vet_id_key = killhouseallowvet.id + # killhouseallowvet.save() + # + # for killhousepercentage in killhousepercentages: + # killhousepercentage.kill_house_id_foreign_key = killhousepercentage.kill_house.id + # if killhousepercentage.kill_house_for_killer != None: + # killhousepercentage.kill_house_for_killer_id_foreign_key = killhousepercentage.kill_house_for_killer.id + # killhousepercentage.kill_house_percentage_id_key = killhousepercentage.id + # killhousepercentage.save() + # + # for driver in drivers: + # driver.user_id_foreign_key = driver.user.id + # if driver.user_bank_info != None: + # driver.user_bank_id_foreign_key = driver.user_bank_info.id + # driver.wallet_id_foreign_key = driver.wallet.id + # driver.kill_house_driver_id_key = driver.id + # driver.save() + # + # for add_car in add_cars: + # add_car.kill_house_id_foreign_key = add_car.kill_house.id + # add_car.driver_id_foreign_key = add_car.driver.id + # add_car.kill_house_add_car_id_key = add_car.id + # add_car.save() + # + # for city_check_request in city_check_requests: + # city_check_request.city_operator_system_id_foreign_key = city_check_request.city_operator_system.id + # city_check_request.poultry_request_id_foreign_key = city_check_request.poultry_request.id + # city_check_request.city_operator_check_request_id_key = city_check_request.id + # city_check_request.save() + # + # for province_operator in province_operators: + # province_operator.user_id_foreign_key = province_operator.user.id + # province_operator.address_id_foreign_key = province_operator.address.id + # if province_operator.user_bank_info != None: + # province_operator.user_bank_id_foreign_key = province_operator.user_bank_info.id + # province_operator.wallet_id_foreign_key = province_operator.wallet.id + # province_operator.province_operator_id_key = province_operator.id + # province_operator.save() + # + # for province_check_out_request in province_check_out_requests: + # province_check_out_request.province_operator_system_id_foreign_key = province_check_out_request.province_operator_system.id + # province_check_out_request.poultry_request_id_foreign_key = province_check_out_request.poultry_request.id + # province_check_out_request.province_operator_check_out_request_id_key = province_check_out_request.id + # province_check_out_request.save() + # + # for province_check_request in province_check_requests: + # province_check_request.province_operator_system_id_foreign_key = province_check_request.province_operator_system.id + # province_check_request.poultry_request_id_foreign_key = province_check_request.poultry_request.id + # province_check_request.city_request_poultry_id_foreign_key = province_check_request.city_request_Poultry.id + # province_check_request.province_operator_check_request_id_key = province_check_request.id + # province_check_request.save() + # + # for share_of_allocation in share_of_allocations: + # share_of_allocation.province_id_foreign_key = share_of_allocation.province.id + # share_of_allocation.share_of_allocation_id_key = share_of_allocation.id + # share_of_allocation.save() + # + # for kill_request in kill_requests: + # kill_request.kill_house_id_foreign_key = kill_request.kill_house.id + # if kill_request.slaughter_house != None: + # kill_request.slaughter_house_id_foreign_key = kill_request.slaughter_house.id + # kill_request.kill_request_id_key = kill_request.id + # kill_request.save() + # + # for kill_request_factor in kill_request_factors: + # kill_request_factor.kill_request_id_foreign_key = kill_request_factor.kill_request.id + # kill_request_factor.kill_request_factor_id_key = kill_request_factor.id + # kill_request_factor.save() + # + # for kill_request_payment_factor in kill_request_payment_factors: + # kill_request_payment_factor.kill_request_factor_id_foreign_key = kill_request_payment_factor.kill_request_factor.id + # kill_request_payment_factor.kill_request_factor_payment_id_key = kill_request_payment_factor.id + # kill_request_payment_factor.save() + # + # for province_kill_request in province_kill_requests: + # province_kill_request.killhouse_user_id_foreign_key = province_kill_request.killhouse_user.id + # province_kill_request.kill_request_id_foreign_key = province_kill_request.kill_request.id + # province_kill_request.province_request_id_foreign_key = province_kill_request.province_request.id + # province_kill_request.province_kill_request_id_key = province_kill_request.id + # province_kill_request.save() + # + # for kill_house_request in kill_house_requests: + # kill_house_request.killhouse_user_id_foreign_key = kill_house_request.killhouse_user.id + # kill_house_request.kill_request_id_foreign_key = kill_house_request.kill_request.id + # kill_house_request.province_request_id_foreign_key = kill_house_request.province_request.id + # kill_house_request.province_kill_request_id_foreign_key = kill_house_request.province_kill_request.id + # kill_house_request.add_car_id_foreign_key = kill_house_request.add_car.id + # kill_house_request.kill_house_request_id_key = kill_house_request.id + # kill_house_request.save() + # + # for kill_house_check_request in kill_house_check_requests: + # kill_house_check_request.province_kill_request_id_foreign_key = kill_house_check_request.province_kill_request.id + # kill_house_check_request.kill_house_check_request_id_key = kill_house_check_request.id + # kill_house_check_request.save() + # + # for assignment_information in assignment_informations: + # assignment_information.kill_house_check_id_foreign_key = assignment_information.kill_house_check.id + # assignment_information.kill_house_request_id_foreign_key = assignment_information.kill_house_request.id + # assignment_information.kill_house_kill_house_assingment_information_id_key = assignment_information.id + # assignment_information.save() + # + # for province_check_information in province_check_informations: + # province_check_information.kill_house_assignment_id_foreign_key = province_check_information.kill_house_assignment.id + # if province_check_information.province_operator != None: + # province_check_information.province_operator_id_foreign_key = province_check_information.province_operator.id + # province_check_information.province_check_information_id_key = province_check_information.id + # province_check_information.save() + # + # for province_factor in province_factors: + # province_factor.province_check_info_id_foreign_key = province_factor.province_check_info.id + # province_factor.province_check_req_id_foreign_key = province_factor.province_check_req.id + # province_factor.user_bank_id_foreign_key = province_factor.bank.id + # province_factor.province_factor_to_kill_house_id_key = province_factor.id + # province_factor.save() + # + # for kill_house_factor in kill_house_factors: + # kill_house_factor.province_factor_id_foreign_key = kill_house_factor.province_factor.id + # kill_house_factor.kill_house_factor_to_province_id_key = kill_house_factor.id + # kill_house_factor.save() + # + # for province_check_kill_house_factor in province_check_kill_house_factors: + # province_check_kill_house_factor.kill_house_factor_id_foreign_key = province_check_kill_house_factor.kill_house_factor.id + # province_check_kill_house_factor.province_check_kill_house_factor_id_key = province_check_kill_house_factor.id + # province_check_kill_house_factor.save() + # + # for deposit_allocation in deposit_allocations: + # deposit_allocation.poultry_request_id_foreign_key = deposit_allocation.poultry.id + # deposit_allocation.deposit_allocation_id_key = deposit_allocation.id + # deposit_allocation.save() + # + # for inspector in inspectors: + # inspector.user_id_foreign_key = inspector.user.id + # inspector.address_id_foreign_key = inspector.address.id + # if inspector.user_bank_info != None: + # inspector.user_bank_id_foreign_key = inspector.user_bank_info.id + # inspector.wallet_id_foreign_key = inspector.wallet.id + # inspector.inspector_operator_id_key = inspector.id + # inspector.save() + # + # for inspector_check in inspector_checks: + # inspector_check.inspector_operator_id_foreign_key = inspector_check.inspector_operator.id + # inspector_check.poultry_request_id_foreign_key = inspector_check.poultry_request.id + # inspector_check.province_inspector_id_key = inspector_check.id + # inspector_check.save() + # + # for vet in vets: + # vet.user_id_foreign_key = vet.user.id + # vet.address_id_foreign_key = vet.address.id + # if vet.user_bank_info != None: + # vet.user_bank_id_foreign_key = vet.user_bank_info.id + # vet.wallet_id_foreign_key = vet.wallet.id + # vet.vet_id_key = vet.id + # vet.save() + # + # for kill_house_vet in kill_house_vets: + # kill_house_vet.vet_id_foreign_key = kill_house_vet.vet.id + # kill_house_vet.kill_house_id_foreign_key = kill_house_vet.kill_house.id + # kill_house_vet.kill_house_vet_id_key = kill_house_vet.id + # kill_house_vet.save() + # + # for vet_check_request in vet_check_requests: + # vet_check_request.kill_house_vet_id_foreign_key = vet_check_request.kill_house_vet.id + # vet_check_request.kill_house_request_id_foreign_key = vet_check_request.kill_house_request.id + # vet_check_request.vet_check_request_id_key = vet_check_request.id + # vet_check_request.save() + # + # for vet_farm in vet_farms: + # vet_farm.vet_id_foreign_key = vet_farm.vet.id + # vet_farm.poultry_id_foreign_key = vet_farm.poultry.id + # vet_farm.vet_farm_id_key = vet_farm.id + # vet_farm.save() + # + # for vet_farm_inspection in vet_farm_inspections: + # vet_farm_inspection.vet_farm_id_foreign_key = vet_farm_inspection.vet_farm.id + # vet_farm_inspection.poultry_hatching_id_foreign_key = vet_farm_inspection.poultry_hatching.id + # vet_farm_inspection.vet_farm_inspection_id_key = vet_farm_inspection.id + # vet_farm_inspection.save() + # + # for admin in admins: + # admin.user_id_foreign_key = admin.user.id + # admin.address_id_foreign_key = admin.address.id + # admin.admin_id_key = admin.id + # admin.save() + # + # for jahad in jahads: + # jahad.user_id_foreign_key = jahad.user.id + # if jahad.user_bank_info != None: + # jahad.user_bank_id_foreign_key = jahad.user_bank_info.id + # jahad.address_id_foreign_key = jahad.address.id + # jahad.wallet_id_foreign_key = jahad.wallet.id + # jahad.jahad_id_key = jahad.id + # jahad.save() + # + # for city_jahad in city_jahads: + # city_jahad.user_id_foreign_key = city_jahad.user.id + # city_jahad.address_id_foreign_key = city_jahad.address.id + # if city_jahad.user_bank_info != None: + # city_jahad.user_bank_id_foreign_key = city_jahad.user_bank_info.id + # city_jahad.wallet_id_foreign_key = city_jahad.wallet.id + # city_jahad.city_jahad_id_key = city_jahad.id + # city_jahad.save() + # + # for goverment in goverments: + # goverment.user_id_foreign_key = goverment.user.id + # goverment.address_id_foreign_key = goverment.address.id + # if goverment.user_bank_info != None: + # goverment.user_bank_id_foreign_key = goverment.user_bank_info.id + # goverment.wallet_id_foreign_key = goverment.wallet.id + # goverment.provincial_government_id_key = goverment.id + # goverment.save() + # + # for vet_superviser in vet_supervisers: + # vet_superviser.user_id_foreign_key = vet_superviser.user.id + # vet_superviser.address_id_foreign_key = vet_superviser.address.id + # if vet_superviser.user_bank_info != None: + # vet_superviser.user_bank_id_foreign_key = vet_superviser.user_bank_info.id + # vet_superviser.wallet_id_foreign_key = vet_superviser.wallet.id + # if vet_superviser.vet != None: + # vet_superviser.vet_id_foreign_key = vet_superviser.vet.id + # vet_superviser.vet_superviser_id_key = vet_superviser.id + # vet_superviser.save() + # + # for vet_check_allocation in vet_check_allocations: + # vet_check_allocation.vet_id_foreign_key = vet_check_allocation.vet.id + # vet_check_allocation.kill_house_request_id_foreign_key = vet_check_allocation.kill_house_request.id + # vet_check_allocation.vet_chick_allocations_id_key = vet_check_allocation.id + # vet_check_allocation.save() + # + # for province_allow_kill_house_register in province_allow_kill_house_registers: + # province_allow_kill_house_register.kill_house_id_foreign_key = province_allow_kill_house_register.kill_house.id + # province_allow_kill_house_register.province_allow_kill_house_register_car_id_key = province_allow_kill_house_register.id + # province_allow_kill_house_register.save() + # + # for province_allow_poultry_choose_kill_house in province_allow_poultry_choose_kill_houses: + # province_allow_poultry_choose_kill_house.poultry_id_foreign_key = province_allow_poultry_choose_kill_house.poultry.id + # province_allow_poultry_choose_kill_house.province_allow_poultry_choose_kill_house_id_key = province_allow_poultry_choose_kill_house.id + # province_allow_poultry_choose_kill_house.save() + # + # for province_allow_poultry_auto in province_allow_poultry_auto_sell: + # province_allow_poultry_auto.poultry_id_foreign_key = province_allow_poultry_auto.poultry.id + # province_allow_poultry_auto.province_allow_poultry_sell_free_id_key = province_allow_poultry_auto.id + # province_allow_poultry_auto.save() + # + # for kill_house_daily_quota in kill_house_daily_quotas: + # kill_house_daily_quota.kill_house_id_foreign_key = kill_house_daily_quota.kill_house.id + # if kill_house_daily_quota.killer_kill_house != None: + # kill_house_daily_quota.killer_kill_house_id_foreign_key = kill_house_daily_quota.killer_kill_house.id + # kill_house_daily_quota.kill_request_id_foreign_key = kill_house_daily_quota.kill_request.id + # kill_house_daily_quota.kill_house_daily_quota_id_key = kill_house_daily_quota.id + # kill_house_daily_quota.save() + # + # for province_auto_allocation in province_auto_allocations: + # province_auto_allocation.daily_quota_id_foreign_key = province_auto_allocation.daily_quota.id + # province_auto_allocation.poultry_request_id_foreign_key = province_auto_allocation.poultry_request.id + # province_auto_allocation.province_kill_request_id_foreign_key = province_auto_allocation.province_kill_request.id + # province_auto_allocation.province_auto_allocation_id_key = province_auto_allocation.id + # province_auto_allocation.save() diff --git a/panel/templatetags/__init__.py b/panel/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/panel/templatetags/jalali_filters.py b/panel/templatetags/jalali_filters.py new file mode 100644 index 0000000..5098a0c --- /dev/null +++ b/panel/templatetags/jalali_filters.py @@ -0,0 +1,47 @@ +from django import template +from datetime import datetime + +from panel.helper_excel import shamsi_date, to_locale_str + +register = template.Library() + + +@register.filter(name='jalali') +def jalali(value): + if not value: + return "" + + try: + if isinstance(value, str): + try: + value = datetime.fromisoformat(value) + except: + return '-' + + if hasattr(value, 'date'): + value = value.date() + + return shamsi_date(value,in_value=True) + except: + return '-' + + +@register.filter(name='isNone') +def is_none(value): + if value is None: + return "-" + return value + + +@register.filter(name='toLocaleStr') +def to_locale_string(value): + if value is None: + return "-" + return to_locale_str(value) + + +@register.filter(name='int') +def to_int(value): + if value is None: + return "-" + return int(value) diff --git a/panel/tests.py b/panel/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/panel/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/panel/urls.py b/panel/urls.py new file mode 100644 index 0000000..fbfddba --- /dev/null +++ b/panel/urls.py @@ -0,0 +1,1393 @@ +from authentication.register import add_zero_for_user_mobile +from authentication.sms_management import send_daily_slaughter_statistics_sms_manual, \ + send_daily_distribution_report_sms_manual +from pdf.views import kill_request_pdf, management_all_poultry_and_warehouse_pdf, summary_report_pdf, \ + hatching_detail_pdf, poultry_science_report_pdf +from .KillHouse.excel_processing import direct_purchase_archive_excel, kill_house_user_excel, \ + bar_excel, bar_excel_trash_true, kill_house_total_wage_excel, export_kill_house_excel, monitor_loads_excel, \ + kill_house_free_bar_excel, comprehensive_report_of_the_slaughterhouse_excel, \ + out_province_carcasses_buyer_kill_house_excel, kill_house_free_sale_bar_information_excel, \ + kill_house_free_sale_bar_information_for_excel_excel, notentered_bars_for_kill_house_excel, \ + entered_bars_for_kill_house_excel, kill_house_free_bar_entered_for_warehouse_excel, \ + steward_allocation_for_warehouse_excel, kill_house_free_bar_carcasses_for_warehouse_excel, \ + kill_house_inventory_data, all_kill_house_inventory_data, cold_house_excel, management_cold_house_excel, \ + direct_purchase_excel, non_receipt_request_excel, return_kill_house_request_excel, \ + warehouse_archive_combined_excel +from .KillHouse.helpers import create_kill_house_free_bar +from .KillHouse.views import make_kill_request, get_hatching_kill_ingo, dashboard_monitoring_bar_and_killing, \ + dashboarad_bar_for_kill_house, dashboard_bar_difference_request, KillHousePerformanceDashboardViewSet, \ + KillHouseMarketInfoViewSet, KillHouseMarketInfoDashboardViewSet, KillHouseSalesInformationViewSet, \ + KillHouseForColdHouseAllocationViewSet, KillHouseForSegmentationViewSet, KillHouseComparativeInformationViewSet, \ + cancel_bar_and_province_request, ReturnProvinceKillRequestViewSet, ReturnRequestDashboardViewSet, fix_wage, \ + KillHouseRemainWeightViewSet, TotalKillHouseRemainWeightViewSet, TotalKillHouseWarehouseArchiveDashboardViewSet, \ + KillHouseLock +from .ProvinceOperator.excel_processing import kill_house_total_transactions_wage_payid_excel, \ + kill_house_total_transactions_wage_payid_super_admin_excel, kill_house_total_wage_excel_new, \ + payment_transactions_province_excel, general_free_bar_excel, out_province_poultry_request_buyers_excel, \ + chain_company_buyers_excel, bar_chain_excel, general_city_operator, \ + kill_house_total_transactions_wage_payid_admin_x_excel, poultry_request_report_excel, transacion_out_request_excel, \ + from_allocation_to_distribution_excel, all_distribution_province, login_user_excel, \ + sub_section_of_cooperative_share_detail, city_operator_for_sub_sector_excel, vet_for_sub_sector_excel, \ + guild_for_sub_sector_excel, all_guilds_transaction_excel, detail_guilds_transaction_excel, GetExcel, \ + management_hatching_excel, user_without_role_excel, sub_section_of_cooperative_share_detail_with_date_excel, \ + dashboard_monitoring_bar_and_killing_excel, steward_allocation_excel, free_sale_out_province_excel, \ + sevrence_kill_house_steward_allocation_excel, steward_free_sale_out_province_excel, total_steward_dashboard_excel, \ + detail_of_killing_and_warehouse_excel, management_all_poultry_and_warehouse, market_requests_excel, \ + get_more_than_one_role, return_province_request_excel, guilds_without_allocation_excel +from .ProvinceOperator.helpers import update_role_product, update_cooperative_share +from .ProvinceOperator.views import get_gate_way_payer_info, Rolesusers, get_all_pos_company, get_all_pos_version, \ + get_all_guilds, SegmentationDashboardViewSet, GetAllPoultryForPoultryScienceViewSet, \ + PoultryAndHatchingForPoultryScience, StewardSalesInformationViewSet, PosSalesInformationViewSet, \ + PosColdHouseViewSet, PosRemainWeightViewSet, StewardRemainWeightViewSet, PosRemainWeightWithDateViewSet, \ + update_guild_by_national_id, register_legal_guild, TotalStewardRemainWeightViewSet, \ + TotalGuildStewardWarehouseArchiveDashboardViewSet, check_steward_allocation_role_mismatch, get_dispenser_user_info +from .ReportingPanel.views import check_excel, find_gid_code, fix_duplicate_guilds_steward_allocation, \ + fix_image_voilation_hatching, \ + fix_image_voilation_hatching_return, send_sms_for_poultry_from_age_notification, api_update_poultry_hatching, \ + api_update_chicken_breed, fix_bar_without_quarantine, api_update_poultry_hatching_from_rsi, \ + get_gid_out_province_manual, dashboard_monitoring_view, remove_access_token_manual, \ + find_gid_code_manual, get_all_pos_transaction, send_clearance_code_to_rsi, api_send_clearance_code_to_rsi, \ + create_steward_allocation_from_excel, send_bar_info_from_ticket, all_clearance_code_to_rsi, \ + ticket_different_clearance_code_from_rsi, management_kill_house_dashboard, periodic_performance_report_dashboard, \ + fix_killing_age, get_bar_from_rsi_with_hatching, driver_from_rsi_excel, send_again_sms_for_register_code_guild, \ + send_again_sms_steward_allocation, fix_number_from_rsi, send_again_sms_steward_free_sale_bar, \ + send_again_sms_kill_house_free_sale_bar, send_again_sms_direct_buying_code, pos_send_again_sms_steward_allocation, \ + delete_guilds_without_allocation, save_mobile_numbers, auto_warehouse_steward_allocations, hatching_unknown, \ + import_poultry_science_from_excel, sync_guilds_user_profile_from_inquiry, \ + report_guilds_without_national_or_pos_transactions, get_guilds_for_update_or_create, \ + update_all_active_guilds_from_api, find_users_with_duplicate_national_id, fix_duplicate_national_id_users, \ + get_legal_person_unit_info, upload_image_to_server_for_poultry_science, poultry_science_for_bazresi +from .VetFarm.excel_processing import technical_responsible_performance_excel, \ + totoal_technical_responsible_performance_excel +from .excel_processing import user_excel_update, user_excel, vet_check_excel, kill_house_request_excel, \ + allocated_excel, poultry_kill_request_excel, request_registration_kill_house, \ + new_load_of_kill_house_vet, request_pending_allocation, car_allocation_excel, Test, Test1, excel_for_all_user, \ + inventory, Broadcast_management, guilds_excel, commerce_report_excel, commerce_bar_excel, \ + number_of_kills_excel, \ + single_hatching_age_range_excel, total_poultry_request_dashboard_excel, \ + total_poultry_hatching_dashboard_excel, doughnut_hatching_excel, forecast_hatching_left_over_excel, \ + manager_of_farm_excel, kill_house__request_vet_killing_process_excel, kill_house_percent_excel, \ + poultry_request_out_excel, doughnut_left_hatching_excel, \ + get_all_user_excel, stewards_excel, steward_excel, \ + kill_house_total_wage_not_payid_excel, all_kill_house_total_wage_excel, slaughterhouse_fee_excel, \ + slaughterhouse_fee_not_paid_excel, car_province_excel, kill_house_wage_archive_excel, \ + kill_house_total_wage_archive_excel, process_for_each_hatching, bar_management_kill_house_excel, \ + all_inventory_excel, daily_process_excel, daily_process_klling_proccess_excel, killing_process_from_date_excel, \ + discrepancy_report_excel, bar_for_each_persion_excel, poultry_excel, \ + bar_contradiction_of_quarantine_excel, detail_of_killing_excel, pos_excel, poultry_and_bar_daily_report_excel, \ + bar_free_excel, steward_ware_house_total_report_daily_excel, steward_ware_house_total_report_daily_detail_excel, \ + hatching_by_age_range, hatching_for_detail_killing_excel, bar_live_stock_support_excel, \ + successful_transactions_excel, unsuccessful_transactions_excel, \ + poultry_hatching_between_50age_70age_excel, number_of_times_with_quarantine_code_excel, \ + the_burden_of_quarantine_excel, bar_without_quarantine_code_excel, \ + loads_that_differ_in_quarantine_and_cooperation_excel, government_burden_excel, \ + goverment_bar_state_with_a_certified_quarantine_code_excel, free_loads_excel, \ + free_cargoes_obtained_from_quarantine_excel, free_loads_with_quarantine_code_excel, \ + loads_outside_the_province_excel, loads_entering_the_slaughterhouse_excel, veterinarian_unloaded_load_excel, \ + completed_slaughterhouse_loads_excel, unloaded_cargo_without_quarantine_code_excel, unloaded_load_excel, \ + loads_unloaded_and_not_completed_by_the_slaughterhouse_excel, hatching_date_range_excel, wallete_excel, \ + number_of_kills_weight_excel, kill_house_request_suspended_load_excel, chain_excel, test_excel, \ + test_all_excel_functions +from django.urls import include, path +from rest_framework.routers import DefaultRouter +from panel.CityOperator import views as city_views +from panel.poultry import views as poultry_views +from panel.ProvinceOperator import views as province_views +from panel.KillHouse import views as killhouse_views +from panel.VetFarm import views as vet_farm_views +from panel.ReportingPanel import views as report_views +from . import views as main_views +from .helper import get_country +from .pos_helper import pos_finder, pos_get_finder, Check_server, pos_login +from .poultry.excel_processing import management_poultry, hatching_excel, archive_hatching_excel, \ + hatching_age_range_excel, poultry_monitoring_excel, hatching_report_from_age_excel, \ + poultry_hatching_prediction_chart_excel, poultry_hatching_prediction_excel, bar_difference_reques_excel, \ + direct_buying_poultry_requests, hatching_for_every_age_range +from .poultry.helpers import create_update_chicken_commission_prices, create_update_chicken_commission_prices_manual, \ + add_poultry_request_quarantine_code, update_archive_date_poultry_hatching +from .poultry.views import Cancel_Poultry_Exchange_request, Check_Poultry_Auction_request_front, \ + city_operator_for_poultry, archive_hatching, GetAllPoultryViewSet, GetAllPoultryFoIncreaseHatchingViewSet, \ + HatchingDetailView, bulk_test_data, get_hatching_for_bazrasi, PoultryRequestForDirectBuyingViewSet, \ + PoultryHatchingForDirectBuyingViewSet, PoultryHatchingChartForDirectBuyingViewSet, get_poultry_for_bazrasi, \ + archive_poultry_hatching_with_archive_percent +from bot_eata import bot_eitaa_for_bar, bot_eitaa_free_bar, bot_eitaa_for_hatching_gt_50, \ + bot_eitaa_for_province_kill_request, daily_manual_transaction_for_eata, transaction_for_eata_new, \ + daily_report_for_each_vet_farm_manual,send_all_bar_to_eitaa +from django.conf import settings +from django.conf.urls.static import static + +router = DefaultRouter() +router.register( + r'city_operator', + city_views.CityOperatorViewSet, + basename="city_operator" +) +router.register( + r'city-operator-for-sub-sector', + city_views.CityOperatorForSubSectorViewSet, + basename="city-operator-for-sub-sector" +) +router.register( + r'city_operator_check_request', + city_views.CityOperatorCheckRequestViewSet, + basename="city_operator_check_request" +) +router.register( + r'management_request', + city_views.ManagementRequestViewSet, + basename="management-request" +) +router.register( + r'city_operator_check_request_new', + city_views.CityOperatorCheckRequestNewViewSet, + basename="city_operator_check_request_new" +) +router.register(r'Poultry', poultry_views.PoultryViewSet, basename="Poultry") +router.register(r'hatching-increase-request', poultry_views.HatchingIncreaseRequestViewSet, + basename="hatching-increase-request") +router.register(r'chain-company', poultry_views.ChainCompanyViewSet, + basename="chain-company") +router.register(r'chain-company-total-allocations', poultry_views.ChainCompanyForTotalWageAllocationViewSet, + basename="chain-company-total-allocations") +router.register(r'chain-company-total-transactions', poultry_views.ChainCompanyForTotalWageTransactionViewSet, + basename="chain-company-total-transactions") +router.register(r'chain-company-transaction', poultry_views.ChainCompanyTransactionViewSet, + basename="chain-company-transaction") +router.register(r'chain-allocation', poultry_views.ChainAllocationViewSet, + basename="chain-allocation") +router.register(r'hatching-loss-management', report_views.HatchingLossManagementViewSet, + basename="hatching-loss-management") +router.register(r'parent-company-chain-allocation', poultry_views.ParentCompanyChainAllocationViewSet, + basename="parent-company-chain-allocation") +router.register(r'dashboard-chain-allocation', poultry_views.DashboardChainAllocationViewSet, + basename="dashboard-chain-allocation") +router.register(r'parent-company-dashboard-chain-allocation', + poultry_views.ParentCompanyDashboardChainAllocationViewSet, + basename="parent-company-dashboard-chain-allocation") +router.register(r'chain-allocation-total-wage', poultry_views.ChainAllocationForWageViewSet, + basename="chain-allocation-total-wage") +router.register(r'poultry-choose-chain-company', poultry_views.PoultryChooseChainCompanyViewSet, + basename="poultry-choose-chain-company") +router.register(r'total_poultry', poultry_views.TotalPoultryViewSet, basename="total_poultry"), +router.register(r'edit_poultry', city_views.PoultryEditByCityOperatorViewSet, basename="edit_poultry"), +router.register(r'show_city_operator', city_views.ShowCityOperatorViewSet, basename="show_city_operator"), +router.register(r'vet_farm', vet_farm_views.VetFarmViewSet, basename="vet_farm"), +router.register(r'management_vet_farm', vet_farm_views.ManagementVetFarmViewSet, basename="management_vet_farm"), +router.register(r'vet_farm_inspection', vet_farm_views.VetFarmInspectionViewSet, basename="vet_farm_inspection"), +router.register(r'vet_for_sub_sector', vet_farm_views.VetForSubSectorViewSet, basename="vet_for_sub_sector"), +router.register(r'vet_for_sub_sector_transaction', vet_farm_views.VetForSubSectorTransactionViewSet, + basename="vet_for_sub_sector_transaction"), +router.register(r'vet_dashboard_wage', vet_farm_views.TotalVetSubSectorWageDashboardViewSet, + basename="vet_dashboard_wage"), +router.register(r'Poultry_tenant', poultry_views.PoultryTenantViewSet, basename="Poultry_tenant"), +router.register(r'out-province-poultry-request-buyers', poultry_views.OutProvincePoultryRequestBuyerViewSet, + basename="out-province-poultry-request-buyers"), +router.register(r'Poultry_Request', poultry_views.PoultryRequestViewSet, basename="Poultry_Request"), +router.register(r'poultry-request-quarantine-code', poultry_views.PoultryRequestQuarantineCodeViewSet, basename="poultry-request-quarantine-code"), +router.register(r'evacuation-hatching-details', poultry_views.EvacuationHatchingDetailViewSet, + basename="evacuation-hatching-details"), +router.register(r'cancel-out-poultry_request', poultry_views.CancelOutProvincePoultryRequestViewSet, + basename="cancel-out-poultry_request"), +router.register(r'out-province-poultry-requests-dashboard', poultry_views.OutProvincePoultryRequestDashboardViewSet, + basename="out-province-poultry-requests-dashboard"), +router.register(r'out-province-poultry-requests', poultry_views.OutProvincePoultryRequestViewSet, + basename="out-province-poultry-requests"), \ +router.register(r'parent-company-out-province-poultry-requests', + poultry_views.ParentCompanyOutProvincePoultryRequestViewSet, + basename="parent-company-out-province-poultry-requests"), +router.register(r'dashboard-out-province-poultry-requests', poultry_views.DashboardOutProvincePoultryRequestViewSet, + basename="dashboard-out-province-poultry-requests"), +router.register(r'parent-company-dashboard-out-province-poultry-requests', + poultry_views.ParentCompanyDashboardOutProvincePoultryRequestViewSet, + basename="parent-company-dashboard-out-province-poultry-requests"), +router.register(r'temporary-out-province-poultry-requests', poultry_views.TemporaryOutProvincePoultryRequestViewSet, + basename="temporary-out-province-poultry-requests"), +router.register(r'poultry_request_letter', killhouse_views.PoultryRequestLetterForProvinceVetViewSet, + basename="poultry_request_letter"), \ +router.register(r'province_request_letter', killhouse_views.ProvinceRequestLetterForProvinceViewSet, + basename="poultry_request_letter"), +router.register(r'poultry_request_letter_order_code', poultry_views.PoultryRequestForLetterViewSet, + basename="poultry_request_letter_order_code"),\ +router.register(r'chicken-commission-prices', poultry_views.ChickenCommissionPricesViewSet, + basename="chicken-commission-prices"), +# router.register(r'bars_for_kill_house', poultry_views.BarsForKillHouseViewSet, basename="bars_for_kill_house"), +router.register(r'total_poultry_request_quantity', poultry_views.TotalPoultryRequestQuantityViewSet, + basename="total_poultry_request_quantity"), +router.register(r'forecast_hatching_left_over', poultry_views.ForecastPoultryHatchingViewSet, + basename="forecast_hatching_left_over"), +router.register(r'hatching-for-dashboard', poultry_views.PoultryHatchingForDashBoardViewSet, + basename="hatching-for-dashboard"), +router.register(r'total_poultry_request_for_city_quantity', poultry_views.TotalPoultryRequestQuantityForCitryViewSet, + basename="total_poultry_request_for_city_quantity"), +router.register(r'Poultry_auction', poultry_views.PoultryRequestAuctionViewSet, basename="Poultry_auction"), +router.register(r'poultry_hatching', poultry_views.PoultryHatchingViewSet, basename="poultry_hatching"), +router.register(r'poultry_hatching_prediction', poultry_views.PoultryHatchingForPredictionViewSet, + basename="poultry_hatching_prediction"), +router.register(r'poultry_hatching_prediction_dashboard', poultry_views.PoultryHatchingForPredictionDashboardViewSet, + basename="poultry_hatching_prediction_dashboard"), +router.register(r'poultry_hatching_prediction_chart', poultry_views.PoultryHatchingForPredictionChartViewSet, + basename="poultry_hatching_prediction_chart"), +router.register(r'poultry_prediction', poultry_views.PoultryPredictionViewSet, basename="poultry_prediction"), +router.register(r'poultry_request_exchange', poultry_views.PoultryRequestExchangeViewSet, + basename="poultry_request_exchange"), +router.register(r'Poultry_Request_exchange_accept', poultry_views.PoultryRequestExchangeAcceptViewSet, + basename="Poultry_Request_exchange_accept"), +router.register(r'process', poultry_views.ProcessViewSet, basename="process"), +router.register(r'hatching_age_range', poultry_views.HatchingStatisticsDashboardViewSet, basename="hatching_age_range"), +router.register(r'doughnut_hatching', poultry_views.DoughnutHatchingStatisticsDashboardViewSet, + basename="doughnut_hatching"), +router.register(r'doughnut_left_hatching', poultry_views.DoughnutHatchingLeftOverStatisticsDashboardViewSet, + basename="doughnut_left_hatching"), +router.register(r'single_hatching_age_range', poultry_views.SingleAgeHatchingStatisticsDashboardViewSet, + basename="single_hatching_age_range"), +router.register(r'total_poultry_request_dashboard', poultry_views.TotalPoultryRequestStatisticsDashboardViewSet, + basename="total_poultry_request_dashboard"), +router.register(r'management_hatching_age_range', poultry_views.ManagementHatchingAgeRangeViewSet, + basename="management_hatching_age_range"), +router.register(r'total_file_poultry_request_dashboard', + poultry_views.TotalFilePoultryRequestStatisticsDashboardViewSet, + basename="total_file_poultry_request_dashboard"), +router.register(r'total_poultry_hatching_dashboard', poultry_views.TotalPoultryHatchingStatisticsDashboardViewSet, + basename="total_poultry_hatching_dashboard"), +router.register(r'poultry_request_killing_process', poultry_views.PoultryRequestProcessDashboardViewSet, + basename="poultry_request_killing_process"), +router.register(r'general-statistics-dashboard-for-cases', poultry_views.GeneralStatisticsdashboardForCasesViewSet, + basename="general-statistics-dashboard-for-cases"), +router.register(r'poultry_tenant_update', poultry_views.UpdatePoultryTenantViewSet, + basename="poultry_request_killing_process"), \ +router.register(r'poultry-loc', poultry_views.PoultryLocationViewSet, + basename="poultry-loc"), +router.register(r'province_kill_request_killing_process', poultry_views.ProvinceKillRequestProcessDashboardViewSet, + basename="province_kill_request_killing_process"), +router.register(r'kill_house__request_vetfarm_killing_process', + poultry_views.KillHouseRequestVetFarmProcessDashboardViewSet, + basename="kill_house__request_vetfarm_killing_process"), + +router.register(r'kill_house__request_vet_killing_process', + poultry_views.KillHouseRequestVetProcessDashboardViewSet, + basename="kill_house__request_vet_killing_process"), +router.register(r'number_of_kills', killhouse_views.KillHouseRequestStatisticsDashboardViewSet, + basename="number_of_kills"), \ +router.register(r'number_of_kills_weight', killhouse_views.KillHouseRequestWeightStatisticsDashboardViewSet, + basename="number_of_kills_weight"), +router.register(r'Poultry_Request_search', poultry_views.PoultryRequestSearchViewSet, + basename="Poultry_Request_search"), +router.register(r'poultry_request_index_weight', poultry_views.PoultryRequestWeightViewSet, + basename="poultry_request_index_weight"), +router.register(r'poultry_assignment_information', poultry_views.PoultryAssignmentInformationViewSet, + basename="poultry_assignment_information") +router.register(r'last_update', poultry_views.LastUpdateViewSet, + basename="last_update") +router.register(r'reporting-all-poultry-requests', report_views.ReportingAllPoultryRequests, + basename='reporting-all-poultry-requests') +router.register(r'detail_general_wage', report_views.DetailsGeneralWageViewSet, + basename='detail_general_wage') +router.register(r'detail_general_killhouse_wage', report_views.DetailsGeneralKillHoseWageViewSet, + basename='detail_general_wage') +router.register(r'new_detail_general_killhouse_wage', report_views.NewDetailsGeneralKillHoseWageViewSet, + basename='new_detail_general_killhouse_wage') +router.register(r'data_report_percentages', report_views.DataReportPercentagesViewSet, + basename='data_report_percentages') + +router.register(r'reporting-all-poultry', report_views.NewReportingAllPoultryRequests, + basename='reporting-all-poultry') +router.register(r'kill_house', killhouse_views.KillHouseViewSet, basename="kill_house"), +router.register(r'pos-kill-houses', killhouse_views.PosKillHouseViewSet, basename="pos-kill-houses"), +router.register(r'kill_house_free_bar_wage_total', killhouse_views.KillHouseFreeBarInformationforWageTotalViewSet, + basename="kill_house_free_bar_wage_total"), +router.register(r'province_wage', killhouse_views.ProvinceKillRequestProvinceWageViewSet, basename="province_wage"), +router.register(r'kill_house_images', killhouse_views.KillHouseAssignmentImagesViewSet, basename="kill_house_images"), +router.register(r'kill_house_ware_house', killhouse_views.KillHouseWareHouseViewSet, basename="kill_house_ware_house"), +router.register(r'kill_house_free_bar', killhouse_views.KillHouseFreeBarInformationViewSet, + basename="kill_house_free_bar"), +router.register(r'parent_company_kill_house_free_bar', killhouse_views.ParentCompanyKillHouseFreeBarInformationViewSet, + basename="parent_company_kill_house_free_bar"), + +router.register(r'kill_house_free_sale_bar', killhouse_views.KillHouseFreeSaleBarInformationViewSet, + basename="kill_house_free_sale_bar"), +router.register(r'pos-kill-house-free-sale-bar', killhouse_views.PosKillHouseFreeSaleBarInformationViewSet, + basename="pos-kill-house-free-sale-bar"), +router.register(r'bar-difference-request', killhouse_views.BarDifferenceRequestViewSet, + basename="bar-difference-request"), +router.register(r'dashboard_kill_house_free_sale_bar', killhouse_views.KillHouseFreeSaleBarInformationDashboardViewSet, + basename="dashboard_kill_house_free_sale_bar"), +router.register(r'kill_house-buyers-dashboard', + killhouse_views.KillHousebuyersDashboarForFreeSaleBarInformationdViewSet, + basename="kill_house-buyers-dashboard"), +router.register(r'dashboard_kill_house_free_bar', killhouse_views.DashboardKillHouseFreeBarInformationViewSet, + basename="dashboard_kill_house_free_bar"), +router.register(r'parent_company_dashboard_kill_house_free_bar', + killhouse_views.ParentCopmanyDashboardKillHouseFreeBarInformationViewSet, + basename="parent_company_dashboard_kill_house_free_bar"), +router.register(r'kill_house_operator', killhouse_views.KillHouseOperatorViewSet, basename="kill_house_operator") +router.register(r'kill_house_wage_dashbord', killhouse_views.KillHouseWageForTotalDashbordViewSet, + basename="kill_house_wage_dashbord") +router.register(r'kill_house_add_car', killhouse_views.KillHouseADDCARViewSet, basename="kill_house_add_car"), +router.register(r'driver', killhouse_views.DriverViewSet, basename="driver"), +# router.register(r'make_kill_request', killhouse_views.make_kill_request, basename="make_kill_request"), +router.register(r'driver_cancel', killhouse_views.DriverRequestCancelViewSet, basename="driver_cancel"), +router.register(r'poultry_requests_for_total_information', killhouse_views.PoultryRequestForTotalInformationViewSet, + basename="poultry_requests_for_total_information"), +router.register(r'poultry_requests_for_total_information_in_table', + killhouse_views.PoultryRequestForTotalInformationInTableViewSet, + basename="poultry_requests_for_total_information_intable"), +router.register(r'province_kill_request', killhouse_views.ProvinceKillRequestViewSet, + basename="province_kill_request"), \ +router.register(r'dahsnoard_province_kill_request', killhouse_views.DahsnoardProvinceKillRequestViewSet, + basename="dahsnoard_province_kill_request"), +router.register(r'reporting_province_kill_request_wage', killhouse_views.ReportingProvinceKillRequestsWageViewSet, + basename="reporting_province_kill_request_wage"), +router.register(r'kill_house_change', killhouse_views.KillHouseRequestChangeStateViewSet, basename="kill_house_change"), +router.register(r'kill_house_Request_exchange', killhouse_views.KillHouseRequestExchangeViewSet, + basename="kill_house_Request_exchange"), +router.register(r'kill_house_Request_exchange_reserve', killhouse_views.KillHouseRequestExchangeReserveViewSet, + basename="kill_house_Request_exchange_reserve"), +router.register(r'kill_house_Request_auction', killhouse_views.KillHouseRequestActionViewSet, + basename="kill_house_Request_auction"), +router.register(r'kill_house_Request_auction_winner', killhouse_views.KillHouseRequestActionWinnerViewSet, + basename="kill_house_Request_auction_winner"), +router.register(r'kill_house_Request_exchange_reserve_add_car', + killhouse_views.KillHouseRequestExchangeAddCarViewSet, + basename="kill_house_Request_exchange_reserve_add_car"), +router.register(r'kill_house_request_bar_management_wage', + killhouse_views.KillHouseRequestForBarManagementWageViewSet, + basename="kill_house_request_bar_management_wage"), \ +router.register(r'dashboard_delete_bar', + killhouse_views.DashboardDeleteBarView, + basename="dashboard_delete_bar"), +router.register(r'kill_house_request_bar_management', killhouse_views.KillHouseRequestForBarManagementViewSet, + basename="kill_house_request_bar_management") + +router.register(r'parent_company_kill_house_request_bar_management', + killhouse_views.ParentCompanyKillHouseRequestForBarManagementViewSet, + basename="parent_company_kill_house_request_bar_management") + +router.register(r'ware-house-accept-kill-house-request', + killhouse_views.KillHouseWareHouseAcceptedKillHouseRequestViewSet, + basename="ware-house-accept-kill-house-request") +router.register(r'dashboard_enter_load_information', + killhouse_views.DashboardEnterLoadInformationView, + basename="dashboard_enter_load_information") +router.register(r'bar-documents-status', killhouse_views.BarDocumentStatusViewset, basename="bar-documents-status") +router.register(r'bars_for_kill_house', killhouse_views.InputBarsForKillHouseViewSet, basename="bars_for_kill_house"), +router.register(r'bars_for_kill_house_dashboard', killhouse_views.InputBarsForKillHouseDashboardViewSet, + basename="bars_for_kill_house_dashboard"), +router.register(r'pricing', province_views.PricingViewSet, basename="pricing") +router.register(r'kill-house-losses', province_views.KillHousePercentageOfLossesViewset, basename="kill-house-losses") +router.register(r'vet_check_province_kill_request', province_views.VetCheckAllocationsViewSet, + basename="vet_check_province_kill_request") +router.register(r'poultry_science', province_views.PoultryScienceViewSet, + basename="poultry_science") +router.register(r'poultry_science_report', province_views.PoultryScienceReportViewSet, + basename="poultry_science_report") +router.register(r'guilds-configs', province_views.GuildsGeneralConfigsViewSet, + basename="guilds-configs") +router.register(r'guilds-for-configs', province_views.GuildsForGeneralConfigsViewSet, + basename="guilds-for-configs") +router.register(r'return-deleted-allocation', province_views.ReturnStewardAllocationViewSet, + basename="return-deleted-allocation") +router.register(r'vet_check_province_kill_request', province_views.VetCheckAllocationsViewSet, + basename="vet_check_province_kill_request") +router.register(r'aggregate-vet-check-province-kill-request', province_views.AggregateVetCheckAllocationsViewSet, + basename="aggregate-vet-check-province-kill-request") +router.register(r'province_percent', province_views.ProvincePercentLeftOverViewSet, basename="province_percent") +router.register(r'product', province_views.ProductViewSet, basename="product") +router.register(r'roles-products', province_views.RolesProductsViewset, basename="roles-products") +router.register(r'pos-roles-products', province_views.PosRolesProductsViewset, basename="pos-roles-products") +router.register(r'pos-other-products', province_views.PosPosOtherProductsViewset, basename="pos-other-products") +router.register(r'pos-combine-products', province_views.CombinedPosProductsViewSet, basename="pos-combine-products") +router.register(r'pos/new-pos-combine-products', province_views.NewCombinedPosProductsViewSet, basename="new-pos-combine-products") +router.register(r'pos-machine-transactions', province_views.GuildsForPosMachineTransactionsViewSet, + basename="pos-machine-transactions") +router.register(r'details-pos-machine-transactions', province_views.DetailsOfGuildsForPosMachineTransactionsViewSet, + basename="pos-machine-transactions") +router.register(r'dashboard-pos-machine-transactions', province_views.DashboardOfGuildsForPosMachineTransactionsViewSet, + basename="pos-machine-transactions") +router.register(r'cooperative-warehouse', province_views.CooperativeWarehouseDashboardViewSet, + basename="cooperative-warehouse") +router.register(r'cooperative-warehouse-dashboard', province_views.DashboardForCooperativeWarehouseViewSet, + basename="cooperative-warehouse-dashboard") +router.register(r'price-confirmation', province_views.PriceConfirmationViewset, + basename="price-confirmation") +router.register(r'beneficiary-accounts', province_views.CompanyBeneficiaryAccountViewset, + basename="beneficiary-accounts") +router.register(r'pos-machine-transactions-inspection', province_views.PosMachineTransactionsForInsPectionViewSet, + basename="pos-machine-transactions-inspection") +router.register(r'guild-ware-house-product', province_views.GuildsWareHouseProductViewSet, + basename="guild-ware-house-product") +router.register(r'guild-ware-house-total-product', province_views.GuildsWareHouseTotalProductViewSet, + basename="guild-ware-house-total-product") +router.register(r'cold-house', province_views.ColdHouseViewSet, + basename="cold-house") +router.register(r'total-cold-house-dashboard-roles', province_views.TotalColdHouseDashboardForRolesViewSet, + basename="total-cold-house-dashboard-roles") +router.register(r'cold-house-for-province', province_views.ColdHouseForProvinceViewSet, + basename="cold-house-for-province") + +router.register(r'cold-house-dashboard', province_views.ColdHouseDashboardViewSet, + basename="cold-house-dashboard") +router.register(r'cold-house-total-dashboard', province_views.ColdHouseTotalDashboardViewSet, + basename="cold-house-total-dashboard") +router.register(r'final-approval-out-province-poultry-request', province_views.FinalApprovalOutProvinceViewSet, + basename="final-approval-out-province-poultry-request") +router.register(r'cold-house-allocations', province_views.ColdHouseAllocationsViewSet, + basename="cold-house-allocations") + +router.register(r'check-cold-house-allocations', province_views.CheckColdHouseAllocationsViewSet, + basename="check-cold-house-allocations") +router.register(r'share-type', province_views.ShareTypeViewset, + basename="share-type") +router.register(r'wage-type', province_views.WageTypeViewset, + basename="wage-type") +router.register(r'poultry-out-province-wage-type', province_views.PoultryOutProvinceWageTypeViewset, + basename="poultry-out-province-wage-type") +router.register(r'wage-type-percentage', province_views.PercentageOfWageTypeViewset, + basename="wage-type-percentage") +router.register(r'sub-sector-wage-type-percentage', province_views.SubSectorPercentageOfWageTypeViewset, + basename="sub-sector-wage-type-percentage") +router.register(r'allow_direct_buying', province_views.ProvinceAllowKillHouseDirectBuyingViewset, + basename="allow_direct_buying") +router.register(r'poultry-export', province_views.PoultryExportViewset, + basename="poultry-export") +router.register(r'poultry-out-province-request', province_views.PoultryOutProvinceRequestViewset, + basename="poultry-out-province-request") +router.register(r'allow_direct_buying_total', province_views.ProvinceAllowKillHouseDirectBuyingTotalViewset, + basename="allow_direct_buying_total") + +router.register(r'allow_register_guilds', province_views.ProvinceAllowKillHouseRegisterGuildsViewset, + basename="allow_direct_buying") +router.register(r'pos-version', province_views.PosVersionViewSet, + basename="pos-version") +router.register(r'pos-error', province_views.POSIdViewSet, + basename="pos-error") +router.register(r'additional-products', province_views.AdditionalProductsViewSet, + basename="additional-products") +router.register(r'server-main-products', province_views.ServerMainProductsViewSet, + basename="server-main-products") +router.register(r'pos-item', province_views.PosItemViewSet, + basename="pos-item") +router.register(r'allow_register_guilds_total', province_views.ProvinceAllowKillHouseRegisterGuildsTotalViewset, + basename="allow_direct_buying_total") +router.register(r'wage_payment', province_views.WagePaymentViewset, basename="wage_payment") +router.register(r'wage-payment-total', province_views.WagePaymentTotalViewset, basename="wage-payment-total") +router.register(r'wage-payment-with-link', province_views.WagePaymentWithLinkViewset, basename="wage-payment-with-link") +router.register(r'wage_payment_based_on_weight', province_views.WagePaymentBasedOnWeightViewset, + basename="wage_payment_based_on_weight") +router.register(r'wage_payment_final_step', province_views.WagePaymentFinalStepViewset, + basename="wage_payment_final_step") +router.register(r'wage_payment_final_step_zarin_pal', province_views.WagePaymentFinalStepZarinPalViewset, + basename="wage_payment_final_step_zarin_pal") +router.register(r'wage_payment_with_link_final_step', province_views.WagePaymentWithLinkFinalStepViewset, + basename="wage_payment_with_link_final_step") +router.register(r'poultry_allow_city_province', province_views.PoultryAllowCityProvinceViewset, + basename="poultry_allow_city_province") +router.register(r'commerce', province_views.CommerceViewSet, + basename="commerce") +router.register(r'improving_livestock', province_views.ImprovingLivestockViewSet, + basename="improving_livestock") +router.register(r'observatory', province_views.ObservatoryViewSet, + basename="observatory") +router.register(r'check_direct_buying', province_views.ProvinceCheckDirectBuyingViewSet, + basename="check_direct_buying") +router.register(r'automatic-direct-buying-permission', province_views.AutomaticDirectBuyingPermissionViewSet, + basename="automatic-direct-buying-permission") +router.register(r'losses_permission', province_views.HatchingLossesPermissionViewSet, + basename="losses_permission") +router.register(r'city_commerce', province_views.CityCommerceViewSet, + basename="city_commerce") + +router.register(r'payment-gateway-percentage', province_views.PaymentGatewayPercentageViewset, + basename="payment-gateway-percentage") + +router.register(r'total-payment-gateway-percentage', province_views.TotalPaymentGatewayPercentageViewset, + basename="total-payment-gateway-percentage") + +router.register(r'province_supervisor', province_views.ProvinceSupervisorViewSet, + basename="province_supervisor") +router.register(r'city_supervisor', province_views.CitySupervisorViewSet, + basename="city_supervisor") +router.register(r'super-admin', province_views.SuperAdminViewSet, + basename="super-admin") +router.register(r'admin-x', province_views.AdminXViewSet, + basename="admin-x") +router.register(r'supporter', province_views.SupporterViewSet, + basename="supporter") +router.register(r'parent-company', province_views.ParentCompanyViewSet, + basename="parent-company") +router.register(r'city-guild', province_views.CityGuildViewSet, + basename="city-guild") +router.register(r'city-guild-wage-dashboard', province_views.CityGuildWageDashboardViewSet, + basename="city-guild-wage-dashboard") +router.register(r'city-guild-for-sub-sector', province_views.CityGuildForSubSectorViewSet, + basename="city-guild-for-sub-sector") +router.register(r'city-guild-for-sub-sector-transactions', province_views.CityGuildForSubSectorTransactionsViewSet, + basename="city-guild-for-sub-sector-transactions") +router.register(r'jahad_inspector', province_views.JahadInspectorViewSet, + basename="jahad_inspector") + +router.register(r'kill_request', killhouse_views.KillRequestViewSet, basename="kill_request") +router.register(r'dashboard_kill_request', killhouse_views.DashboardKillRequestViewSet, + basename="dashboard_kill_request") +router.register(r'delete-debtors-kill-requests', killhouse_views.DeleteDebtorsKillRequestsViewSet, + basename="delete-debtors-kill-requests") +router.register(r'kill_house_total_wage', killhouse_views.KillHouseForProvinceWageViewSet, + basename="kill_house_total_wage") +router.register(r'kill_house_total_transactions_wage', killhouse_views.KillHouseForTotalProvinceWageTransactionViewSet, + basename="kill_house_total_transactions_wage") +router.register(r'kill_house_free_bar_total_wage', killhouse_views.KillHouseForFreeBarWageViewSet, + basename="kill_house_free_bar_total_wage") +router.register(r'kill_house_for_free_sale_bar', killhouse_views.KillHouseForFreeSaleBarInformationViewSet, + basename="kill_house_for_free_sale_bar") +router.register(r'kill_house_creditors', killhouse_views.KillHouseCreditorsViewSet, basename="kill_house_creditors") +router.register(r'automatic_kill_request', killhouse_views.AutomaticKillRequestViewSet, + basename="automatic_kill_request") +router.register(r'kill_house_request', killhouse_views.KillHouseRequestViewSet, basename="kill_house_request") +router.register(r'kill_house_requests', killhouse_views.UpdateKillHouseRequestViewSet, basename="kill_house_requests") +router.register(r'kill_house_request_pricing', killhouse_views.KillHouseRequestPricingViewSet, basename="kill_house_request_pricing") +router.register(r'kill_house_request_complete_information', + killhouse_views.KillHouseRequestForCompleteInformationViewSet, + basename="kill_house_request_complete_information") +router.register(r'kill_house_request_aggregate_load', killhouse_views.KillHouseRequestForAggregateLoadsViewSet, + basename="kill_house_request_aggregate_load") +router.register(r'kill_house_wage_dashbord_in_weight', killhouse_views.KillHouseWageDashbordInWeightViewSet, + basename="kill_house_wage_dashbord_in_weight") +router.register(r'vet', killhouse_views.VetViewSet, basename="vet") +router.register(r'kill_house_vet', killhouse_views.KillHouseVetViewSet, basename="kill_house_vet") +router.register(r'kill_house_complaint', killhouse_views.KillHouseComplaintViewSet, basename="kill_house_complaint") +router.register(r'check_complaint', killhouse_views.CheckKillHouseComplaintViewSet, basename="check_complaint") +router.register(r'vet_check', killhouse_views.VetCheckRequestViewSet, basename="vet_check") +router.register(r'kill_house_check_request', killhouse_views.KillHouseCheckRequestViewSet, + basename="kill_house_check_request") +router.register(r'slaughter-house-transaction', killhouse_views.SlaughterHouseTransactionViewSet, + basename="slaughter-house-transaction") +router.register(r'kill_house_assignment_information', killhouse_views.KillHouseAssignmentInformationViewSet, + basename="kill_house_assignment_information") +router.register(r'kill_house_assignment_information_for_completed_loads', + killhouse_views.KillHouseAssignmentInformationForcompletedloadsViewSet, + basename="kill_house_assignment_information_for_completed_loads") +router.register(r'kill_house_assignment_information_aggregate_load', + killhouse_views.KillHouseAssignmentInformationForAggregateLoadViewSet, + basename="kill_house_assignment_information_aggregate_load") +router.register(r'kill_house_driver', killhouse_views.KillHouseDriverViewSet, + basename="kill_house_driver") +router.register(r'kill_house_driver_total_dashboard', killhouse_views.KillHouseDriverTotalDashboardViewSet, + basename="kill_house_driver_total_dashboard") +router.register(r'total-wage-exclusive-killer-information', killhouse_views.TotalWageInformationExclusiveKillerViewset, + basename="total-wage-exclusive-killer-information") +router.register(r'kill_request_for_poultry', killhouse_views.KillRequestForPoultryViewSet, + basename="kill_request_for_poultry") +router.register(r'kill_house_percent', killhouse_views.KillHousePercentageViewSet, + basename="kill_house_percent") +router.register(r'kill_request_factor', killhouse_views.KillRequestFactorViewSet, + basename="kill_request_factor") +router.register(r'kill_request_factor_payment', killhouse_views.KillRequestFactorPaymentViewSet, + basename="kill_request_factor_payment") +router.register(r'province_factor_to_kill_house', province_views.ProvinceFactorToKillHouseViewSet, + basename="province_factor_to_kill_house") +router.register(r'area-activity', province_views.AreaActivityViewSet, + basename="area-activity") +router.register(r'type-activity', province_views.TypeActivityViewSet, + basename="type-activity") +router.register(r'guilds', province_views.GuildsViewSet, + basename="guilds") + +router.register(r'real-guilds', province_views.RealGuildsViewSet, + basename="real-guilds") + +router.register(r'guild', province_views.RegisterGuildsViewSet, + basename="guild") +router.register(r'stewards-for-cold-house', province_views.StewardForColdHouseViewSet, + basename="stewards-for-cold-house") +router.register(r'steward-cold-houses', province_views.StewardColdHousesViewSet, + basename="steward-cold-houses") +router.register(r'pos-transaction', province_views.PosMachineTransactionViewSet, + basename="pos-transaction") +router.register(r'pos-ntransaction', province_views.NewPosMachineTransactionViewSet, + basename="pos-ntransaction") +router.register(r'live-stock-transactions', province_views.LiveStockTransactionViewSet, + basename="live-stock-transactions") +router.register(r'live-stock-transactions-dashboard', province_views.LiveStockTransactionDashboeardViewSet, + basename="live-stock-transactions-dashboard") +router.register(r'pos-allocation-transaction', province_views.PosAllocationTransactionsViewSet, + basename="pos-allocation-transaction") +router.register(r'broadcast-price', province_views.BroadcastPriceViewset, + basename="broadcast-price") +router.register(r'free-sale-limitation', province_views.OutProvinceSaleLimitationViewset, + basename="free-sale-limitation") +router.register(r'pos-broadcast-price', province_views.PosBroadcastPriceViewset, + basename="pos-broadcast-price") +router.register(r'new-pos-broadcast-price', province_views.NewPosBroadcastPriceViewset, + basename="new-pos-broadcast-price") +router.register(r'pos-guilds', province_views.PosGuildsViewSet, + basename="pos-guilds") +router.register(r'total-guilds-for-pos', province_views.TotalGuildsForPosViewSet, + basename="total-guilds-for-pos") + +router.register(r'cars', province_views.CarViewSet, + basename="cars") +router.register(r'check_guilds', province_views.ProvinceCheckKillHouseGuildsViewSet, + basename="check_guilds") +router.register(r'total_guilds', province_views.TotalGuildsViewSet, + basename="total_guilds") +router.register(r'total-guilds-distribution-management', province_views.TotalGuildsDistributionManagementViewSet, + basename="total-guilds-distribution-management") +router.register(r'test_total_guilds', province_views.TestTotalGuildsViewSet, + basename="test_total_guilds") +router.register(r'products-pricing-type', province_views.ProductPricingTypeViewset, + basename="products-pricing-type") +router.register(r'allow_register_code_for_guilds', province_views.AllowRegisterCodeForGuildsViewSet, + basename="allow_register_code_for_guilds") +router.register(r'steward-app-login', province_views.StewardAppLoginViewSet, + basename="steward-app-login") +router.register(r'total_guilds_for_companies', province_views.TotalGuildsForCompaniesViewSet, + basename="total_guilds_for_companies") +router.register(r'report-pos-device_session', province_views.ReportPosDeviceSessionViewSet, + basename="report-pos-device_session") +router.register(r'total_guilds_for_inspection', province_views.TotalGuildsForInspectionViewSet, + basename="total_guilds_for_inspection") +router.register(r'pos-for-inspection', province_views.POSMachineForInspectionViewSet, + basename="pos-for-inspection") +router.register(r'steward', province_views.StewardViewSet, + basename="steward") + +router.register(r'kill-house-price-permission', province_views.KillHousePricePermissionViewset, + basename="kill-house-price-permission") +router.register(r'pos-company', province_views.PosCompanyViewSet, + basename="pos-company") + +router.register(r'pos-machine', province_views.POSMachineViewSet, + basename="pos-machine") +router.register(r'new-pos-machine', province_views.FinalPOSMachineViewSet, + basename="new-pos-machine") +router.register(r'user-pos-machine', province_views.UserPOSMachineViewSet, + basename="user-pos-machine") + +router.register(r'cooperative-pos', province_views.POSMachineForLiveStackViewSet, + basename="cooperative-pos") + +router.register(r'pos_register_session', province_views.POSDeviceSessionViewSet, + basename="pos_register_session") +router.register(r'pos_register_session_inspection', province_views.POSDeviceSessionForInspectionViewSet, + basename="pos_register_session_inspection") + +router.register(r'pos_device_version', province_views.PosDeviceVersionViewSet, + basename="pos_device_version") +router.register(r'server-pos-machine', province_views.POSMachineForServerViewSet, + basename="server-pos-machine") +router.register(r'union-subsector-wage-dashboard', province_views.TotalCitySubSectorWageDashboardViewSet, + basename="union-subsector-wage-dashboard") +router.register(r'union-subsector-transaction-dashboard', province_views.TotalCitySubSectortransactionDashboardViewSet, + basename="union-subsector-transaction-dashboard") +router.register(r'sub-sector-transactions', province_views.SubSectorTransactionsViewSet, + basename="sub-sector-transactions") +router.register(r'pos-transactions', province_views.POSTransactionsViewSet, + basename="pos-transactions") +router.register(r'internal-transactions', province_views.InternalTransactionViewset, + basename="internal-transactions") +router.register(r'poultry-requests-transactions', province_views.PoultryRequestInternalTransactionViewset, + basename="poultry-requests-transactions") + +router.register(r'total-dashboard-poultry-requests-transactions', + province_views.TotalDashboardPoultryRequestInternalTransactionViewset, + basename="total-dashboard-poultry-requests-transactions") + +router.register(r'total-internal-transactions', province_views.TotalInternalTransactionViewset, + basename="total-internal-transactions") +router.register(r'parent-company-total-internal-transactions', + province_views.ParentCompanyTotalInternalTransactionViewset, + basename="parent-company-total-internal-transactions") +router.register(r'payer-internal-transactions', province_views.PayersInternalTransactionViewset, + basename="payer-internal-transactions") +router.register(r'steward_warehouse', province_views.StewardWareHouseViewSet, + basename="steward_warehouse") +router.register(r'steward_free_bar', province_views.StewardFreeBarInformationViewSet, + basename="steward_free_bar") +router.register(r'steward_free_bar_dashboard', province_views.StewardFreeBarInformationDashboardViewSet, + basename="steward_free_bar_dashboard") +router.register(r'pos-steward-free-bar', province_views.PosStewardFreeBarInformationViewSet, + basename="pos-steward-free-bar") +router.register(r'pos-segmentation', province_views.PosSegmentationViewSet, + basename="pos-segmentation") +router.register(r'new-pos-segmentation', province_views.NewPosSegmentationViewSet, + basename="new-pos-segmentation") +router.register(r'app-segmentation', province_views.AppSegmentationViewSet, + basename="app-segmentation") + +router.register(r'steward_free_sale_bar', province_views.StewardFreeSaleBarInformationViewSet, + basename="steward_free_sale_bar") +router.register(r'allow_register_code_for_steward_free_sale_bar_information', province_views.AllowRegisterCodeForStewardFreeSaleBarInformationViewSet, + basename="allow_register_code_for_steward_free_sale_bar_information") +router.register(r'allow_register_code_for_kill_house_free_sale_bar_information', province_views.AllowRegisterCodeForKillHouseFreeSaleBarInformationViewSet, + basename="allow_register_code_for_kill_house_free_sale_bar_information") +router.register(r'limitation_for_direct_purchase_and_bar_information', province_views.LimitationForDirectPurchaseAndBarInformationViewSet, + basename="limitation_for_direct_purchase_and_bar_information") +router.register(r'steward_free_sale_bar_dashboard', province_views.StewardFreeSaleBarInformationDashboardViewSet, + basename="steward_free_sale_bar_dashboard") +router.register(r'ware-house-archive', province_views.WarehouseArchiveViewSet, + basename="ware-house-archive") +router.register(r'guilds_warehouse', province_views.GuildsWareHouseViewSet, + basename="guilds_warehouse") + +router.register(r'steward-allocation', province_views.StewardAllocationViewSet, + basename="steward-allocation") +router.register(r'in-province-allocation-dashboard', province_views.InProvinceAllocationDashboardViewSet, + basename="in-province-allocation-dashboard") +router.register(r'in-province-allocation', province_views.InProvinceAllocationViewSet, + basename="in-province-allocation") +router.register(r'total-steward-dashboard', province_views.TotalStewardDashboardViewSet, + basename="total-steward-dashboard") +router.register(r'total-steward-dashboard-detail', province_views.TotalStewardDashboarDetailViewSet, + basename="total-steward-dashboard-detail") +router.register(r'batch-steward-allocation', province_views.BatchStewardAllocationViewSet, + basename="batch-steward-allocation") +router.register(r'upload-image-limit', province_views.UploadImageLimitationViewset, + basename="upload-image-limit") +router.register(r'apk-info', province_views.ApkInfoViewset, + basename="apk-info") +router.register(r'direct-buying-verification', province_views.DirectBuyingVerificationViewset, + basename="direct-buying-verification") +router.register(r'fine-permission', province_views.FinePermissionViewset, + basename="fine-permission") +router.register(r'show-market-requests', province_views.ShowMarketRequestViewset, + basename="show-market-requests") +router.register(r'market-daily-limitation', province_views.MarketDailyLimitationViewset, + basename="market-daily-limitation") +router.register(r'hatching-archive-percent', province_views.HatchingArchivePercentViewset, + basename="hatching-archive-percent") +router.register(r'index-weight-category', province_views.IndexWeightCategoryViewSet, + basename="index-weight-category") +router.register(r'drop-limit', province_views.PercentageDropLimitationViewset, + basename="drop-limit") +router.register(r'pos-allocations', province_views.PosStewardAllocationViewSet, + basename="pos-allocations") +router.register(r'new-pos-allocations', province_views.NewPosStewardAllocationViewSet, + basename="new-pos-allocations") +router.register(r'steward-guild-allocation', province_views.StewardGuildAllocationViewSet, + basename="steward-guild-allocation") + +router.register(r'automatic-steward-allocation', province_views.AutomaticStewardAllocationViewSet, + basename="automatic-steward-allocation") +router.register(r'first-automatic-steward-allocation', province_views.FirstAutomaticStewardAllocationViewSet, + basename="first-automatic-steward-allocation") + +router.register(r'kill_house_choose_steward_guilds', province_views.ProvinceAllowKillHouseChooseStewardGuildsViewset, + basename="kill_house_choose_steward_guilds") +router.register(r'province_check_kill_request', province_views.ProvinceCheckKillRequestViewSet, + basename="province_check_kill_request") +router.register(r'province_check_out_factors', province_views.ProvinceImportKillHouseOutFactorsViewSet, + basename="province_check_out_factors") +router.register(r'jahad', province_views.JahadViewSet, + basename="jahad") + +router.register(r'city_jahad', province_views.CityJahadViewSet, + basename="city_jahad") + +router.register(r'protein_guild', province_views.ProteinGuildViewSet, + basename="protein_guild") + +router.register(r'city-poultry', province_views.CityPoultryViewSet, + basename="city-poultry") + +router.register(r'dispenser', province_views.DispenserViewSet, + basename="dispenser") +router.register(r'dispenser-info', province_views.DispenserInformationViewSet, + basename="dispenser-info") +router.register(r'representative', province_views.RepresentativeViewSet, + basename="representative") +router.register(r'dispenser-dashboard', province_views.DispenserDashboardViewSet, + basename="dispenser-dashboard") +router.register(r'dispenser-allocations-dashboard', province_views.DispenserAllocationDashboardViewSet, + basename="dispenser-allocations-dashboard") +router.register(r'dispenser-allocations', province_views.DispenserAllocationViewSet, + basename="dispenser-allocations") +router.register(r'live_stock_support', province_views.LiveStockSupportViewSet, + basename="live_stock_support") +router.register(r'guild_room', province_views.GuildRoomViewSet, + basename="guild_room") +router.register(r'city_vet', province_views.CityVetViewSet, + basename="city_vet") +router.register(r'government', province_views.ProvincialGovernmentViewSet, + basename="government") +router.register(r'province_allow_kill_house_register_car', province_views.ProvinceAllowKillHouseRegisterCarViewset, + basename="province_allow_kill_house_register_car") +router.register(r'province_allow_poultry_choose_kill_house', province_views.ProvinceAllowPoultryChooseKillHouseViewset, + basename="province_allow_poultry_choose_kill_house") +router.register(r'province_allow_poultry_choose_kill_house_total', + province_views.ProvinceAllowPoultryChooseKillHouseTotalViewset, + basename="province_allow_poultry_choose_kill_house_total") + +router.register(r'province_allow_poultry_sell_free', province_views.ProvinceAllowPoultrySellFreeViewset, + basename="province_allow_poultry_sell_free") +router.register(r'province_allow_poultry_sell_free_total', province_views.ProvinceAllowPoultrySellFreeTotalViewset, + basename="province_allow_poultry_sell_free_total") + +router.register(r'province_operator', province_views.ProvinceOperatorViewSet, + basename="province_operator") + +router.register(r'total-wage-information', province_views.TotalWageInformationViewset, + basename="total-wage-information") + +router.register(r'parent-company-total-wage-information', province_views.ParentCompanyTotalWageInformationViewset, + basename="parent-company-total-wage-information") + +router.register(r'province_check_operator_request', province_views.ProvinceCheckOperatorRequestViewSet, + basename="province_check_operator_request") +router.register(r'province_check_operator_out_request', province_views.ProvinceCheckOperatorOutRequestViewSet, + basename="province_check_operator_out_request") +router.register(r'province_request_auction', province_views.ProvinceRequestActionViewSet, + basename="province_request_auction") +router.register(r'price_analysis', province_views.PriceAnalysisViewSet, + basename="price_analysis") +router.register(r'share', province_views.ShareOfAllocationViewSet, + basename="share") +router.register(r'province_check_info', province_views.ProvinceCheckInformationViewSet, + basename="province_check_info") +router.register(r'supervisor', province_views.VetSupervisorViewSet, + basename="supervisor") +router.register(r'province_factor_kill_house', province_views.ProvinceFactorToKillHouseViewSet, + basename="province_factor_kill_house") +router.register(r'province_factor_kill_house_for_poultry', province_views.ProvinceFactorToKillHouseForPoultryViewSet, + basename="province_factor_kill_house") +router.register(r'kill_house_list', province_views.KillHouseListForProvince, basename='kill_house_list') +router.register(r'activate_cars', province_views.ManageCarsByProvince, basename='activate_cars') +router.register(r'ware_house_factor', province_views.WareHouseFactorViewSet, + basename="ware_house_factor") +router.register(r'inspector_operator', province_views.InspectorOperatorViewSet, + basename="inspector_operator") +router.register(r'restriction_carcass_distribution', province_views.RestrictionCarcassDistributionViewSet, + basename="restriction_carcass_distribution") +router.register(r'inspector', province_views.PovinceInspectorViewSet, + basename="inspector") +router.register(r'sms_license', province_views.SmsLicenseViewset, + basename="sms_license") +router.register(r'province_check_requests_price', province_views.ProvinceCheckRequestsPriceViewSet, + basename="province_check_requests_price") +router.register(r'kill_house_factor_poultry', province_views.KillHouseFactorToPoultryViewSet, + basename="kill_house_factor_poultry") +router.register(r'kill_house_factor_province', province_views.KillHouseFactorToProvinceViewSet, + basename="kill_house_factor_province") +router.register(r'province_check_factor', province_views.ProvinceCheckKillHouseFactorViewSet, + basename="province_check_factor") + +router.register(r'chicken-age-range', province_views.ChickenAgeRangeViewset, + basename="chicken-age-range") + +router.register(r'time-range', province_views.TimeRangeViewset, + basename="time-range") + +router.register(r'evacuation_permit', province_views.EvacuationPermitViewSet, + basename="evacuation_permit") +router.register(r'sell-for-freezing', province_views.SellForFreezingViewSet, + basename="sell-for-freezing") +router.register(r'deposit_allocation', province_views.DepositAllocationViewSet, + basename="deposit_allocation") +router.register(r'deadline', province_views.PaymentDeadLineViewSet, + basename="deadline") +router.register(r'monthly_percent', province_views.MonthlyProfitPercentageViewSet, + basename="monthly_percent") + +router.register(r'rejected_requests', province_views.RejectedRequestsViewSet, + basename="rejected_requests") + +router.register(r'last-time-enter', main_views.OperatorLastTimeEnterViewSet, + basename="last-time-enter") + +router.register(r'reporting-role-limitation', main_views.ReportingFieldLimitationViewSet, + basename="reporting-role-limitation") + +router.register(r'wallet', province_views.WalletViewset, basename='wallet') +router.register(r'zarinpal-accounts', province_views.ZarinPalAccountsViewset, basename='zarinpal-accounts') +router.register(r'aggregate-permission', province_views.VetFarmAggregatePermissionViewset, + basename='aggregate-permission') +router.register(r'bar-limitation', province_views.KillHouseBarLimitationViewset, basename='bar-limitation') +router.register(r'out-province-carcasses-permission', province_views.OutOfProvinceSellingCarcassesPermissionViewset, + basename='out-province-carcasses-permission') +router.register(r'kill-house-distribution-management', + province_views.KillHouseDistributionManagementStewardGuildViewset, + basename='kill-house-distribution-management') +router.register(r'steward-distribution-management', province_views.StewardDistributionManagementGuildViewset, + basename='steward-distribution-management') +router.register(r'operation-limitation', province_views.OperationLimitationViewset, basename='operation-limitation') +router.register(r'approved-price', province_views.ApprovedPriceViewset, basename='approved-price') +router.register(r'announcements', province_views.AnnouncementsViewset, basename='announcements') +router.register(r'itransaction', province_views.ItransactionViewset, basename='itransaction') +router.register(r'debt', province_views.DebttViewset, basename='debt') +router.register(r'financial_transaction', province_views.FinancialTransactionViewset, basename='financial_transaction') +router.register(r'penalty', province_views.PenaltyViewset, basename='penalty') +router.register(r'deposit', province_views.DepositViewset, basename='deposit') +# router.register(r'iwallet', province_views.IwallletViewset, basename='iwallet') +router.register(r'financialdocument', province_views.FinancialDocumentViewset, basename='financialdocument') +router.register(r'searchwallet', province_views.ReportingAllwalletRequestsViewset, basename='searchwallet') +router.register(r'chikeninfotmation', poultry_views.Chicken_informationViewSet, basename='chikeninfotmation') +router.register(r'poultryinformation', poultry_views.PoultryRequestInformation, basename='poultryinformation') +router.register(r'chart', poultry_views.Chart_DashbourdViewSet, basename='chart') +router.register(r'typecheck', province_views.TypeCheckViewset, basename='typecheck') +router.register(r'automatic_allocation', province_views.ProvinceAutoAllocationViewset, + basename='automatic_allocation') +router.register(r'dashboard_detail_general_killhouse_wage', report_views.DashboardDetailsGeneralKillHoseWageViewSet, + basename='dashboard_detail_general_killhouse_wage') +router.register(r'forcast_hatching', report_views.ForcastViewSet, basename='forcast_hatching') +router.register(r'case_status', report_views.CasestatusViewSet, basename='case_status') +router.register(r'general_case_status', report_views.GeneralCasestatusViewSet, basename='general_case_status') +router.register(r'poultry_report', report_views.PoultryReporttViewSet, basename='poultry_report') +router.register(r'letter_report', report_views.PoultryRequestletterReportViewSet, basename='letter_report') +router.register(r'hatching_query', report_views.HatchingQueryViewSet, basename='letter_report') +router.register(r'buyer_remittance', report_views.BuyerRemittance, basename='buyer_remittance') +router.register(r'iran_province', report_views.IranProvinceViewSet, basename='iran_province') +router.register(r'age-notification-poultry', report_views.AgeNotificationPoultryViewSet, + basename='age-notification-poultry') +router.register(r'cookie-samasat', report_views.CookieSamasatViewSet, + basename='cookie-samasat') +router.register(r'iran_city', report_views.IranCityViewSet, basename='iran_city') +router.register(r'hour_limit', province_views.HourLimitViewset, + basename="hour_limit") +router.register(r'system-wallet', province_views.SystemWalletViewset, + basename="system-wallet") +router.register(r'get_one_pos_version', province_views.GetOnePosVersionViewSet, + basename="get_one_pos_version") + +router.register(r'commonly-used', province_views.CommonlyUsedViewSet, + basename="commonly-used") + +router.register(r'free_sale_within_province', province_views.FreeSaleWithinprovinceViewset, + basename="free_sale_within_province") +router.register(r'kill_house_hour_limit', province_views.KillHouseHourLimitViewset, + basename="kill_house_hour_limit") +router.register(r'auto_accept_province_kill_requests', province_views.AutoAcceptProvinceKillRequestViewset, + basename="auto_accept_province_kill_requests") +router.register(r'sms_recipient', province_views.SmsRecipientViewSet, + basename="sms_recipient") + +router.register(r'auto_make_kill_house_requests', province_views.AutoMakeKillHouseRequestViewset, + basename="auto_make_kill_house_requests") + +router.register(r'steward_ware_house_total_report_daily_broad_cast', + province_views.TotalReportOfStewardWareHouseForDailyBroadCastViewSet, + basename='steward_ware_house_total_report_daily_broad_cast') +router.register(r'steward_ware_house_total_report_daily_broad_cast_in_detail', + province_views.TotalReportOfStewardWareHouseForDailyBroadCastInDetailsViewSet, + basename='steward_ware_house_total_report_daily_broad_cast_in_detail') + +router.register(r'report-submission', province_views.ReportSubmissionTimeViewset, basename='report-submission') +router.register(r'out-province-carcasses-buyer', province_views.OutProvinceCarcassesBuyerViewSet, + basename='out-province-carcasses-buyer') +router.register(r'pos-out-province-carcasses-buyer', province_views.PosOutProvinceCarcassesBuyerViewSet, + basename='pos-out-province-carcasses-buyer') +router.register(r'base-out-province-carcasses-buyer', province_views.BaseOutProvinceCarcassesBuyerViewSet, + basename='base-out-province-carcasses-buyer') + +router.register(r'reports', province_views.ReportsViewset, basename='reports') +router.register(r'reports-users', province_views.ReportsUsersViewset, basename='reports-users') +router.register(r'user-reports', province_views.UserReportsViewset, basename='user-reports') +router.register(r'moving-text-dashboard', province_views.MovingTextDashboardStatusViewset, + basename='moving-text-dashboard') +router.register(r'moving-text', province_views.MovingTextViewset, basename='moving-text') +router.register(r'moving-text-with-role', province_views.MovingTextWithRoleViewset, basename='moving-text-with-role') + +router.register(r'bar_report', killhouse_views.KillHouseBarReportingViewSet, basename='bar_report') +router.register(r'kill-house-request-total-wage', killhouse_views.KillHouseForKillHouseRequestWageViewSet, + basename='kill-house-request-total-wage') +router.register(r'kill-house-new-wage', killhouse_views.KillHouseForNewWageInormationViewSet, + basename='kill-house-new-wage') +router.register(r'kill-house-cold-house', killhouse_views.KillHouseForColdHouseViewSet, + basename='kill-house-cold-house') +router.register(r'kill-house-cold-houses', killhouse_views.KillHouseColdHousesViewSet, + basename='kill-house-cold-houses') +router.register(r'parent-company-kill-house-new-wage', + killhouse_views.ParentCompanyKillHouseForNewWageInormationViewSet, + basename='parent-company-kill-house-new-wage') +router.register(r'kill-house-distribution-info', killhouse_views.KillHouseDistributionInormationViewSet, + basename='kill-house-distribution-info') +router.register(r'kill-house-dashboard-new-wage', killhouse_views.KillHouseTotalDashboardForNewWageInormationViewSet, + basename='kill-house-dashboard-new-wage') +router.register(r'wallet-wage-payment', killhouse_views.WalletWagePaymentViewSet, basename='wallet-wage-payment') +router.register(r'general_poultry_request_letter_report', killhouse_views.GeneralPoultryRequestLetterReportViewSet, + basename='general_poultry_request_letter_report') +router.register(r'killing_info_discrepancy_report', killhouse_views.KillingInformationDiscrepancyReportViewSet, + basename='killing_info_discrepancy_report') +router.register(r'total_report_daily_broad_cast', killhouse_views.TotalReportForDailyBroadCastViewSet, + basename='total_report_daily_broad_cast') + +router.register(r'kill_house_test', killhouse_views.KillHouseFortestViewSet, + basename='kill_house_test') + +router.register(r'kill_house_ware_house_total_report_daily_broad_cast', + killhouse_views.TotalReportOfKillHouseWareHouseForDailyBroadCastViewSet, + basename='kill_house_ware_house_total_report_daily_broad_cast') +router.register(r'kill_house_ware_house_total_report_daily_broad_cast_in_detail', + killhouse_views.TotalReportOfKillHouseWareHouseForDailyBroadCastInDetailsViewSet, + basename='kill_house_ware_house_total_report_daily_broad_cast_in_detail') +router.register(r'pre-cold-kill-house-ware-house', killhouse_views.PreColdKillHouseWareHouseViewSet, + basename='pre-cold-kill-house-ware-house') + +router.register(r'kill-house-warehouse-dashboard-for-province', + killhouse_views.KillHouseForProvinceWareHouseDashboardViewSet, + basename='kill-house-warehouse-dashboard-for-province') +router.register(r'total-kill-house-warehouse-dashboard-for-province', + killhouse_views.KillHouseForTotalProvinceWareHouseDashboardViewSet, + basename='total-kill-house-warehouse-dashboard-for-province') + +router.register(r'kill-house-ware-house-for-dispensers', killhouse_views.KillHouseWareHouseForDispensersViewSet, + basename='kill-house-ware-house-for-dispensers') + +router.register(r'kill_house_total_report_province_kill_requests', + killhouse_views.KillHouseForTotalReportAutomaticStewardAllocationViewSet, + basename='kill_house_total_report_province_kill_requests') +router.register(r'kill_house_total_province_kill_requests', + killhouse_views.KillHouseForAutomaticStewardAllocationViewSet, + basename='kill_house_total_province_kill_requests') +router.register(r'steward_guilds_allocations_for_statistical_profile', + killhouse_views.StewardGuildsAllocationsForStatisticalProfileViewSet, + basename='steward_guilds_allocations_for_statistical_profile') +router.register(r'kill_house_purchase_info', killhouse_views.KillHouseforPurchaseRequestViewSet, + basename='kill_house_purchase_info') +router.register(r'kill_house_purchase', killhouse_views.KillHousePurchaseRequestViewSet, basename='kill_house_purchase') +router.register(r'kill_house_purchase_permission', killhouse_views.KillHousePurchaseRequestPermissionViewSet, + basename='kill_house_purchase_permission') +router.register(r'allow_kill_house_vet', killhouse_views.KillHouseAllowVetViewSet, basename='allow_kill_house_vet') +router.register(r'check_losses', killhouse_views.CheckUnusualCasualtiesViewSet, basename='check_losses') +router.register(r'new', killhouse_views.KillHouseNewViewSet, basename='new') +router.register(r'detail_of_killing', killhouse_views.DetailOfKillingViewSet, basename='detail_of_killing') +router.register(r'dashboard_detail_of_killing', killhouse_views.DetailOfKillingDashboardView, + basename='dashboard_detail_of_killing') +router.register(r'parent_company_dashboard_detail_of_killing', + killhouse_views.ParentCompanyDetailOfKillingDashboardView, + basename='parent_company_dashboard_detail_of_killing') +router.register(r'comprehensive_report_of_slaughterhouse', + killhouse_views.ComprehensiveReportOfTheSlaughterhouseViewSet, + basename='comprehensive_report_of_slaughterhouse') +router.register(r'delete-bar', + killhouse_views.DeleteKillHouseRequest, + basename='detele_bar') + +router.register(r'non-receipt-request', + killhouse_views.NonReceiptKillHouseRequestViewSet, + basename='non-receipt-request') +router.register(r'return-kill-house-requests', + killhouse_views.ReturnKillHouseRequestViewSet, + basename='return-kill-house-request') +router.register(r'non-receipt-request-return', + killhouse_views.ReturnNonReceiptKillHouseRequestViewSet, + basename='non-receipt-request-return') + +router.register(r'direct-buying-payment', + killhouse_views.DirectBuyingPaymentViewSet, + basename='direct-buying-payment') + +router.register(r'direct-buying-requests', + killhouse_views.ProvinceKillRequestDirectBuyingViewSet, + basename='direct-buying-requests') + +router.register(r'market-requests', + killhouse_views.MarketKillRequestViewSet, + basename='market-requests') + +router.register(r'market-kill-houses', + killhouse_views.MarketKillHouseViewSet, + basename='market-kill-houses') + +# router.register(r'poultryamar', poultry_views.PoultryHatchingAmar, basename='poultryamar') + +# The API URLs are now determined automatically by the router. +urlpatterns = [ + path('', include(router.urls)), + path('update-excel/', user_excel_update), + path('add-excel/', user_excel), + path('cancel_poultry_exchange_request/', Cancel_Poultry_Exchange_request), + path('Check_Poultry_Auction_request_front/', Check_Poultry_Auction_request_front), + path('make_kill_request/', make_kill_request), + path('poultry_request_report_excel/', poultry_request_report_excel), + path('vet_check_excel/', vet_check_excel), + path('bar_excel/', bar_excel), + path('0/hatching_excel/', hatching_excel), + path('kill_house_excel/', kill_house_request_excel), + path('bar_excel_trash_true/', bar_excel_trash_true), + path('allocated_excel/', allocated_excel), + path('poultry_kill_request_excel/', poultry_kill_request_excel), + path('request_registration_kill_house/', request_registration_kill_house), + path('new_load_of_kill_house_vet/', new_load_of_kill_house_vet), + path('request_pending_allocation/', request_pending_allocation), + path('car_allocation_excel/', car_allocation_excel), + path('Test/', Test), + path('Test1/', Test1), + path('city_operator_for_poultry/', city_operator_for_poultry), + path('excel_for_all_user/', excel_for_all_user), + path('inventory/', inventory), + path('Broadcast_management/', Broadcast_management), + path('archive_hatching/', archive_hatching), + path('guilds_excel/', guilds_excel), + path('management_poultry/', management_poultry), + path('commerce_report_excel/', commerce_report_excel), + path('commerce_bar_excel/', commerce_bar_excel), + path('archive_hatching_excel/', archive_hatching_excel), + path('number_of_kills_weight_excel/', number_of_kills_weight_excel), + path('number_of_kills_excel/', number_of_kills_excel), + path('single_hatching_age_range_excel/', single_hatching_age_range_excel), + path('hatching_age_range_excel/', hatching_age_range_excel), + path('total_poultry_request_dashboard_excel/', total_poultry_request_dashboard_excel), + path('total_poultry_hatching_dashboard_excel/', total_poultry_hatching_dashboard_excel), + path('doughnut_hatching_excel/', doughnut_hatching_excel), + path('forecast_hatching_left_over_excel/', forecast_hatching_left_over_excel), + path('manager_of_farm_excel/', manager_of_farm_excel), + path('kill_house__request_vet_killing_process_excel/', kill_house__request_vet_killing_process_excel), + path('kill_house_percent_excel/', kill_house_percent_excel), + path('poultry_request_out_excel/', poultry_request_out_excel), + path('doughnut_left_hatching_excel/', doughnut_left_hatching_excel), + path('get_all_user_excel/', get_all_user_excel), + path('add_zero_for_user_mobile/', add_zero_for_user_mobile), + path('stewards_excel/', stewards_excel), + path('kill_house_total_wage_excel/', kill_house_total_wage_excel), + path('steward_excel/', steward_excel), + path('kill_house_total_wage_not_payid_excel/', kill_house_total_wage_not_payid_excel), + path('all_kill_house_total_wage_excel/', all_kill_house_total_wage_excel), + path('slaughterhouse_fee_excel/', slaughterhouse_fee_excel), + path('slaughterhouse_fee_not_paid_excel/', slaughterhouse_fee_not_paid_excel), + path('car_province_excel/', car_province_excel), + path('kill_house_wage_archive_excel/', kill_house_wage_archive_excel), + path('kill_house_total_wage_archive_excel/', kill_house_total_wage_archive_excel), + path('process-for-each-hatching/', process_for_each_hatching), + path('bar-management-kill-house-excel/', bar_management_kill_house_excel), + path('all_inventory_excel/', all_inventory_excel), + path('daily_process_excel/', daily_process_excel), + path('dpe/', daily_process_excel), + path('daily_process_klling_proccess_excel/', daily_process_klling_proccess_excel), + path('killing_process_from_date_excel/', killing_process_from_date_excel), + path('hatching_report_from_age_excel/', hatching_report_from_age_excel), + path('discrepancy_report_excel/', discrepancy_report_excel), + path('bar_for_each_persion_excel/', bar_for_each_persion_excel), + path('poultry_excel/', poultry_excel), + path('bar_contradiction_of_quarantine_excel/', bar_contradiction_of_quarantine_excel), + path('detail_of_killing_excel/', detail_of_killing_excel), + path('doke/', detail_of_killing_excel), + path('pos_excel/', pos_excel), + path('poultry_and_bar_daily_report_excel/', poultry_and_bar_daily_report_excel), + path('bar_free_excel/', bar_free_excel), + path('steward_ware_house_total_report_daily_excel/', steward_ware_house_total_report_daily_excel), + path('steward_ware_house_total_report_daily_detail_excel/', steward_ware_house_total_report_daily_detail_excel), + path('hatching_by_age_range/', hatching_by_age_range), + path('hatching_for_detail_killing_excel/', hatching_for_detail_killing_excel), + path('bar_live_stock_support_excel/', bar_live_stock_support_excel), + path('comprehensive_report_of_the_slaughterhouse_excel/', comprehensive_report_of_the_slaughterhouse_excel), + path('crotse/', comprehensive_report_of_the_slaughterhouse_excel), + path('successful_transactions_excel/', successful_transactions_excel), + path('unsuccessful_transactions_excel/', unsuccessful_transactions_excel), + path('poultry_hatching_between_50age_70age_excel/', poultry_hatching_between_50age_70age_excel), + path('number_of_times_with_quarantine_code_excel/', number_of_times_with_quarantine_code_excel), + path('the_burden_of_quarantine_excel/', the_burden_of_quarantine_excel), + path('bar_without_quarantine_code_excel/', bar_without_quarantine_code_excel), + path('loads_that_differ_in_quarantine_and_cooperation_excel/', + loads_that_differ_in_quarantine_and_cooperation_excel), + path('government_burden_excel/', government_burden_excel), + path('goverment_bar_state_with_a_certified_quarantine_code_excel/', + goverment_bar_state_with_a_certified_quarantine_code_excel), + path('free_loads_excel/', free_loads_excel), + path('free_cargoes_obtained_from_quarantine_excel/', free_cargoes_obtained_from_quarantine_excel), + path('free_loads_with_quarantine_code_excel/', free_loads_with_quarantine_code_excel), + path('loads_outside_the_province_excel/', loads_outside_the_province_excel), + path('loads_entering_the_slaughterhouse_excel/', loads_entering_the_slaughterhouse_excel), + path('veterinarian_unloaded_load_excel/', veterinarian_unloaded_load_excel), + path('completed_slaughterhouse_loads_excel/', completed_slaughterhouse_loads_excel), + path('unloaded_cargo_without_quarantine_code_excel/', unloaded_cargo_without_quarantine_code_excel), + path('unloaded_load_excel/', unloaded_load_excel), + path('loads_unloaded_and_not_completed_by_the_slaughterhouse_excel/', + loads_unloaded_and_not_completed_by_the_slaughterhouse_excel), + path('hatching_date_range_excel/', hatching_date_range_excel), + path('wallete_excel/', wallete_excel), + path('kill_house_request_suspended_load_excel/', kill_house_request_suspended_load_excel), + path('chain_excel/', chain_excel), + path('kill_house_total_transactions_wage_payid_excel/', kill_house_total_transactions_wage_payid_excel), + path('kill_house_total_transactions_wage_payid_super_admin_excel/', + kill_house_total_transactions_wage_payid_super_admin_excel), + path('kill_house_total_wage_excel_new/', kill_house_total_wage_excel_new), + path('kill_house_total_transactions_wage_payid_admin_x_excel/', + kill_house_total_transactions_wage_payid_admin_x_excel), + path('get-payer-info/', get_gate_way_payer_info), + path('direct_purchase_excel/', direct_purchase_excel), + path('direct_purchase_archive_excel/', direct_purchase_archive_excel), + path('payment_transactions_province_excel/', payment_transactions_province_excel), + path('general_free_bar_excel/', general_free_bar_excel), + path('out_province_poultry_request_buyers_excel/', out_province_poultry_request_buyers_excel), + path('chain_company_buyers_excel/', chain_company_buyers_excel), + path('bar_chain_excel/', bar_chain_excel), + path('kill_house_user_excel/', kill_house_user_excel), + path('general_city_operator/', general_city_operator), + path('poultry_monitoring_excel/', poultry_monitoring_excel), + path('get_country/', get_country), + path('export_kill_house_excel/', export_kill_house_excel), + path('monitor_loads_excel/', monitor_loads_excel), + path('kill_house_free_bar_excel/', kill_house_free_bar_excel), + path('check_excel/', check_excel), + path('find_gid_code/', find_gid_code), + path('roles-users/', Rolesusers), + path('technical_responsible_performance_excel/', technical_responsible_performance_excel), + path('totoal_technical_responsible_performance_excel/', totoal_technical_responsible_performance_excel), + path('bot_eitaa_for_bar/', bot_eitaa_for_bar), + path('bot_eitaa_free_bar/', bot_eitaa_free_bar), + path('bot_eitaa_for_hatching_gt_50/', bot_eitaa_for_hatching_gt_50), + path('transacion_out_request_excel/', transacion_out_request_excel), + path('bot_eitaa_for_province_kill_request/', bot_eitaa_for_province_kill_request), + path('out_province_carcasses_buyer_kill_house_excel/', out_province_carcasses_buyer_kill_house_excel), + path('kill_house_free_sale_bar_information_excel/', kill_house_free_sale_bar_information_excel), + path('kill_house_free_sale_bar_information_for_excel_excel/', kill_house_free_sale_bar_information_for_excel_excel), + path('fix_image_voilation_hatching/', fix_image_voilation_hatching), + path('fix_image_voilation_hatching_return/', fix_image_voilation_hatching_return), + path('from_allocation_to_distribution_excel/', from_allocation_to_distribution_excel), + path('pos-finder/', pos_finder), + path('check-server/', Check_server), + path('pos-get-finder/', pos_get_finder), + path('get_hatching_kill_ingo/', get_hatching_kill_ingo), + path('get-all-poultry/', GetAllPoultryViewSet.as_view()), + path('get-all-poultry-for-poultry-science/', GetAllPoultryForPoultryScienceViewSet.as_view()), + path('get-all-poultry-for-increase-hatching/', GetAllPoultryFoIncreaseHatchingViewSet.as_view()), + path('send_sms_for_poultry_from_age_notification/', send_sms_for_poultry_from_age_notification), + path('notentered_bars_for_kill_house_excel/', notentered_bars_for_kill_house_excel), + path('entered_bars_for_kill_house_excel/', entered_bars_for_kill_house_excel), + path('kill_house_free_bar_entered_for_warehouse_excel/', kill_house_free_bar_entered_for_warehouse_excel), + path('steward_allocation_for_warehouse_excel/', steward_allocation_for_warehouse_excel), + path('kill_house_free_bar_carcasses_for_warehouse_excel/', kill_house_free_bar_carcasses_for_warehouse_excel), + path('kill_house_inventory_data/', kill_house_inventory_data), + path('all_kill_house_inventory_data/', all_kill_house_inventory_data), + path('cold_house_excel/', cold_house_excel), + path('management_cold_house_excel/', management_cold_house_excel), + path('auto_warehouse_steward_allocations/', auto_warehouse_steward_allocations), + path('warehouse_archive_combined_excel/', warehouse_archive_combined_excel), + path('all_distribution_province/', all_distribution_province), + path('login_user_excel/', login_user_excel), + path('sub_section_of_cooperative_share_detail/', sub_section_of_cooperative_share_detail), + path('city_operator_for_sub_sector_excel/', city_operator_for_sub_sector_excel), + path('vet_for_sub_sector_excel/', vet_for_sub_sector_excel), + path('test_excel/', test_excel), + path('guild_for_sub_sector_excel/', guild_for_sub_sector_excel), + path('all_guilds_transaction_excel/', all_guilds_transaction_excel), + path('detail_guilds_transaction_excel/', detail_guilds_transaction_excel), + path('GetExcel/', GetExcel.as_view()), + path('management_hatching_excel/', management_hatching_excel), + path('user_without_role_excel/', user_without_role_excel), + path('poultry_hatching_prediction_chart_excel/', poultry_hatching_prediction_chart_excel), + path('poultry_hatching_prediction_excel/', poultry_hatching_prediction_excel), + path('bar_difference_reques_excel/', bar_difference_reques_excel), + path('api_update_poultry_hatching/', api_update_poultry_hatching), + path('api_update_chicken_breed/', api_update_chicken_breed), + path('create_kill_house_free_bar/', create_kill_house_free_bar), + path('fix_bar_without_quarantine/', fix_bar_without_quarantine), + path('get_gid_out_province_manual/', get_gid_out_province_manual), + path('get_all_pos_company/', get_all_pos_company), + path('update_role_product/', update_role_product), + path('create_update_chicken_commission_prices/', create_update_chicken_commission_prices), + path('update_cooperative_share/', update_cooperative_share), + path('dashboard_monitoring_view/', dashboard_monitoring_view), + path('create_update_chicken_commission_prices_manual/', create_update_chicken_commission_prices_manual), + path('api_update_poultry_hatching_from_rsi/', api_update_poultry_hatching_from_rsi), + path('get_all_pos_version/', get_all_pos_version), + path('dashboard_monitoring_bar_and_killing/', dashboard_monitoring_bar_and_killing), + path('dashboard_monitoring_bar_and_killing_excel/', dashboard_monitoring_bar_and_killing_excel), + path('remove_access_token_manual/', remove_access_token_manual), + path('find_gid_code_manual/', find_gid_code_manual), + path('dashboarad_bar_for_kill_house/', dashboarad_bar_for_kill_house), + path('dashboard_bar_difference_request/', dashboard_bar_difference_request), + path('daily_manual_transaction_for_eata/', daily_manual_transaction_for_eata), + path('get_all_pos_transaction/', get_all_pos_transaction), + path('send_clearance_code_to_rsi/', send_clearance_code_to_rsi), + path('api_send_clearance_code_to_rsi/', api_send_clearance_code_to_rsi), + path('create_steward_allocation_from_excel/', create_steward_allocation_from_excel), + path('send_bar_info_from_ticket/', send_bar_info_from_ticket), + path('steward_allocation_excel/', steward_allocation_excel), + path('free_sale_out_province_excel/', free_sale_out_province_excel), + path('get_all_guilds/', get_all_guilds), + path('steward_free_sale_out_province_excel/', steward_free_sale_out_province_excel), + path('sevrence_kill_house_steward_allocation_excel/', sevrence_kill_house_steward_allocation_excel), + path('total_steward_dashboard_excel/', total_steward_dashboard_excel), + path('sub_section_of_cooperative_share_detail_with_date_excel/', + sub_section_of_cooperative_share_detail_with_date_excel), + path('add_poultry_request_quarantine_code/', add_poultry_request_quarantine_code), + path('all_clearance_code_to_rsi/', all_clearance_code_to_rsi), + path('hatching-detail/', HatchingDetailView.as_view()), + path('direct-buying-poultry-requests/', PoultryRequestForDirectBuyingViewSet.as_view()), + path('direct-buying-poultry-hatching/', PoultryHatchingForDirectBuyingViewSet.as_view()), + path('direct-buying-poultry-requests-chart/', PoultryHatchingChartForDirectBuyingViewSet.as_view()), + path('kill-house-performance-dashboard/', KillHousePerformanceDashboardViewSet.as_view()), + path('kill-house-market-info/', KillHouseMarketInfoViewSet.as_view()), + path('kill-house-market-info-dashboard/', KillHouseMarketInfoDashboardViewSet.as_view()), + path('kill-house-sales-info-dashboard/', KillHouseSalesInformationViewSet.as_view()), + path('steward-sales-info-dashboard/', StewardSalesInformationViewSet.as_view()), + path('pos-sales-info/', PosSalesInformationViewSet.as_view()), + path('pos-cold-houses/', PosColdHouseViewSet.as_view()), + path('steward-remain-weight/', StewardRemainWeightViewSet.as_view()), + path('total-steward-remain-weight/', TotalStewardRemainWeightViewSet.as_view()), + path('pos-remain-weight/', PosRemainWeightViewSet.as_view()), + path('pos-remain-weight-date/', PosRemainWeightWithDateViewSet.as_view()), + path('kill-house-cold-house-allocations-info/', KillHouseForColdHouseAllocationViewSet.as_view()), + path('kill-house-segmentation-info/', KillHouseForSegmentationViewSet.as_view()), + path('kill-house-comparative-info/', KillHouseComparativeInformationViewSet.as_view()), + path('return-province-kill-requests/', ReturnProvinceKillRequestViewSet.as_view()), + path('return-requests-dashboard/', ReturnRequestDashboardViewSet.as_view()), + path('kill-house-remain-weight/', KillHouseRemainWeightViewSet.as_view()), + path('total-kill-house-remain-weight/', TotalKillHouseRemainWeightViewSet.as_view()), + path('total-kill-house-archive-dashboard/', TotalKillHouseWarehouseArchiveDashboardViewSet.as_view()), + path('total-guild-steward-archive-dashboard/', TotalGuildStewardWarehouseArchiveDashboardViewSet.as_view()), + path('segmentation-dashboard/', SegmentationDashboardViewSet.as_view()), + path('poultry_and_hatching_for_poultry_science/', PoultryAndHatchingForPoultryScience.as_view()), + path('kill-house-lock-info/', KillHouseLock.as_view()), + path('kill_request_pdf/', kill_request_pdf), + path('non_receipt_request_excel/', non_receipt_request_excel), + path('ticket_different_clearance_code_from_rsi/', ticket_different_clearance_code_from_rsi), + path('bulk_test_data/', bulk_test_data), + path('get_hatching_for_bazrasi/', get_hatching_for_bazrasi), + path('detail_of_killing_and_warehouse_excel/', detail_of_killing_and_warehouse_excel), + path('update_archive_date_poultry_hatching/', update_archive_date_poultry_hatching), + path('management_all_poultry_and_warehouse/', management_all_poultry_and_warehouse), + path('management_all_poultry_and_warehouse_pdf/', management_all_poultry_and_warehouse_pdf), + path('summary_report_pdf/', summary_report_pdf), + path('management_kill_house_dashboard/', management_kill_house_dashboard), + path('hatching_unknown/', hatching_unknown), + path('direct_buying_poultry_requests/', direct_buying_poultry_requests), + path('market_requests_excel/', market_requests_excel), + path('hatching_for_every_age_range/', hatching_for_every_age_range), + path('periodic_performance_report_dashboard/', periodic_performance_report_dashboard), + path('transaction_for_eata_new/', transaction_for_eata_new), + path('daily_report_for_each_vet_farm_manual/', daily_report_for_each_vet_farm_manual), + path('get_more_than_one_role/', get_more_than_one_role), + path('fix_killing_age/', fix_killing_age), + path('get_bar_from_rsi_with_hatching/', get_bar_from_rsi_with_hatching), + path('poultry_hatching_detail_pdf/', hatching_detail_pdf), + path('poultry_science_report_pdf/', poultry_science_report_pdf), + path('driver_from_rsi_excel/', driver_from_rsi_excel), + path('send_again_sms_for_register_code_guild/', send_again_sms_for_register_code_guild), + path('send_again_sms_steward_allocation/', send_again_sms_steward_allocation), + path('pos_send_again_sms_steward_allocation/', pos_send_again_sms_steward_allocation), + path('fix_number_from_rsi/', fix_number_from_rsi), + path('cancel_bar_and_province_request/', cancel_bar_and_province_request), + path('return_province_request_excel/', return_province_request_excel), + path('guilds_without_allocation_excel/', guilds_without_allocation_excel), + path('return_kill_house_request_excel/', return_kill_house_request_excel), + path('fix_wage/', fix_wage), + path('send_again_sms_steward_free_sale_bar/', send_again_sms_steward_free_sale_bar), + path('send_again_sms_kill_house_free_sale_bar/', send_again_sms_kill_house_free_sale_bar), + path('send_again_sms_direct_buying_code/', send_again_sms_direct_buying_code), + path('delete_guilds_without_allocation/', delete_guilds_without_allocation), + path('send_all_bar_to_eitaa/', send_all_bar_to_eitaa), + path('send_daily_slaughter_statistics_sms_manual/', send_daily_slaughter_statistics_sms_manual), + path('send_daily_distribution_report_sms_manual/', send_daily_distribution_report_sms_manual), + path('save_mobile_numbers/', save_mobile_numbers), + path('update_guild_by_national_id/', update_guild_by_national_id), + path('register_legal_guild/', register_legal_guild), + path('import_poultry_science_from_excel/', import_poultry_science_from_excel), + path('sync_guilds_user_profile_from_inquiry/', sync_guilds_user_profile_from_inquiry), + path('report_guilds_without_national_or_pos_transactions/', report_guilds_without_national_or_pos_transactions), + path('get_guilds_for_update_or_create/', get_guilds_for_update_or_create), + path('get_legal_person_unit_info/', get_legal_person_unit_info), + path('update_all_active_guilds_from_api/', update_all_active_guilds_from_api), + path('find_users_with_duplicate_national_id/', find_users_with_duplicate_national_id), + path('fix_duplicate_national_id_users/', fix_duplicate_national_id_users), + path('get_poultry_for_bazrasi/', get_poultry_for_bazrasi), + path('fix_duplicate_guilds_steward_allocation/', fix_duplicate_guilds_steward_allocation), + path('test_all_excel_functions/', test_all_excel_functions), + path('archive_poultry_hatching_with_archive_percent/', archive_poultry_hatching_with_archive_percent), + path('check_steward_allocation_role_mismatch/', check_steward_allocation_role_mismatch), + path('upload_image_to_server_for_poultry_science/', upload_image_to_server_for_poultry_science), + path('poultry_science_for_bazresi/', poultry_science_for_bazresi), + path('pos/pos_finder/', pos_login), + path('get_dispenser_user_info/', get_dispenser_user_info), + + +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) diff --git a/panel/validate_headers.py b/panel/validate_headers.py new file mode 100644 index 0000000..491594c --- /dev/null +++ b/panel/validate_headers.py @@ -0,0 +1,120 @@ +import datetime +import secrets +from django.http import JsonResponse + +from panel.models import PosDeviceVersion, PosCompany, POSDeviceSession, POSMachine + + +def make_pos_unique_id(): + while True: + random_number = '0' + ''.join(str(secrets.randbelow(10)) for _ in range(5)) + if not POSMachine.objects.filter(pos_unique_id=random_number).exists(): + return random_number + + +def get_client_ip(request): + x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') + if x_forwarded_for: + # اگر از پروکسی استفاده می‌شود، IP اول را برمی‌گردانیم + ip = x_forwarded_for.split(',')[0] + else: + # در غیر این صورت از REMOTE_ADDR استفاده می‌کنیم + ip = request.META.get('REMOTE_ADDR') + return ip + + +class PosDeviceValidator: + def __init__(self, request): + self.request = request + self.headers = request.headers + self.device_id = request.headers.get('device-id') + self.device_mac = request.headers.get('device-mac') + self.device_name = request.headers.get('device-name') + self.device_sdk = request.headers.get('device-sdk') + self.device_serial = request.headers.get('device-serial') + self.device_provider = request.headers.get('device-provider') + self.device_version = request.headers.get('device-version') + self.device_version_name = request.headers.get('device-vname') + self.device_lng = request.headers.get('device-lng') + self.device_lot = request.headers.get('device-lot') + self.role = request.headers.get('device-role') + + def validation_version(self): + if self.device_provider == "" or self.device_provider == None: + return JsonResponse({'result': 'پارامتر های ارسالی صحیح نمیباشد!'}, status=402) + + company = PosCompany.objects.filter(en_name=self.device_provider).first() + if not company: + return JsonResponse({'result': 'شرکت پرداخت الکترونیک پشتیبانی نمیشود!'}, status=402) + + if not company.active: + return JsonResponse({'result': 'شرکت پرداخت الکترونیک توسط مدیریت مسدود شده است!'}, status=402) + version = PosDeviceVersion.objects.filter(company=company).order_by('code') + if not version: + return JsonResponse({'result': ' هیچ نسخه معتبری برای این شرکت پرداخت الکترونیک منتشر نشده است!'}, + status=402) + + current_version = version.filter(code=self.device_version).first() + if not current_version or current_version.remove: + return JsonResponse({'result': f'نسخه {self.device_version_name} منقضی شده است لطفا بروز رسانی کنید '}, + status=402) + return None + + def validation_device(self): + pos_session = POSDeviceSession.objects.filter(pos__pos_id=self.device_id, mac=self.device_mac).first() + if not pos_session: + return None + else: + pos_session.session_last_seen_date = datetime.datetime.now() + pos_session.lng = self.device_lng + pos_session.lot = self.device_lot + pos_session.version = self.device_version + pos_session.ip = get_client_ip(self.request) + pos_session.save() + return pos_session.pos.pos_id + + def validation_pos(self): + pos = POSMachine.objects.filter(serial=self.device_serial, mac=self.device_mac).first() + if not pos: + return JsonResponse({"result": "دستگاه معتبر نمیباشد!"}, + status=401) + else: + + if not pos.owner: + return JsonResponse({"result": f"برای این دستگاه مالکی تعیین نشده!شناسه پوز:{pos.pos_unique_id}"}, + status=403) + + if not pos.active: + return JsonResponse({"result": f"دستگاه غیر فعال میباشد!شناسه پوز:{pos.pos_unique_id}"}, + status=403) + pos.last_check = datetime.datetime.now() + pos.Long = self.device_lng + pos.Lat = self.device_lot + pos.version = self.device_version + pos.ip = get_client_ip(self.request) + pos.save() + return pos + + def manage_device(self): + company = PosCompany.objects.get(en_name=self.device_provider, trash=False) + pos = POSMachine.objects.filter(serial=self.device_serial, mac=self.device_mac).first() + if not pos: + pos = POSMachine( + pos_company=company, + serial=self.device_serial, + mac=self.device_mac, + sdk=self.device_sdk, + version=self.device_version, + name=self.device_name, + Lat=self.device_lot, + Long=self.device_lng, + pos_unique_id=make_pos_unique_id(), + ip=get_client_ip(self.request) + ) + pos.save() + + if pos.pos_company.en_name != company.en_name: + pos.pos_company = company + pos.save(update_fields=['pos_company']) + + return pos diff --git a/panel/views.py b/panel/views.py new file mode 100644 index 0000000..921a9fd --- /dev/null +++ b/panel/views.py @@ -0,0 +1,77 @@ +from django.shortcuts import render +from django.contrib.auth.models import User +from rest_framework import viewsets +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, +) +from notification.models import NotificationType +from authentication.models import UserProfile, UserMessage +from panel.models import ( + PoultryRequest, + PoultryAssignmentInformation, + KillHouseCheckRequest, + KillHouseRequest, + ProvinceCheckOperatorRequest, + OperatorLastTimeEnter, + ReportingFieldRoleLimitation, + Group +) +from panel.poultry.serializers import ( + PoultryRequestSerializer, + PoultryAssignmentInformationSerializer +) +from panel.ReportingPanel.serializer import ( + ReportingFieldLimitationSerializer +) +from authentication.serializers import GroupSerializer +from rest_framework.response import Response +from rest_framework import status +from datetime import datetime + + +class OperatorLastTimeEnterViewSet(viewsets.ModelViewSet): + queryset = OperatorLastTimeEnter.objects.all() + permission_classes = [TokenHasReadWriteScope] + serializer_class = [] + + def update(self, request, *args, **kwargs): + time = request.data['time'] + + if UserProfile.objects.filter(user=request.user): + if not OperatorLastTimeEnter.objects.filter( + operator__exact=UserProfile.objects.get(user__exact=request.user)): + obj = OperatorLastTimeEnter() + else: + obj = OperatorLastTimeEnter.objects.get( + operator__exact=UserProfile.objects.get(user__exact=request.user)) + if UserProfile.objects.get(user=request.user).role.name == "CityOperator": + obj.city_operator_last_time_check = time + obj.operator = UserProfile.objects.get(user=request.user) + elif UserProfile.objects.get(user=request.user).role.name == "ProvinceOperator": + obj.province_operator_last_time_check = time + obj.operator = UserProfile.objects.get(user=request.user) + elif UserProfile.objects.get(user=request.user).role.name == "KillHouse": + obj.kill_house_last_time_check = time + obj.operator = UserProfile.objects.get(user=request.user) + obj.save() + return Response({'msg': 'Done'}, status=status.HTTP_200_OK) + + +class ReportingFieldLimitationViewSet(viewsets.ModelViewSet): + queryset = ReportingFieldRoleLimitation.objects.all() + serializer_class = ReportingFieldLimitationSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + group = Group.objects.get(name__exact=request.data['role_name']) + request.data.pop('role_name') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + obj = serializer.create(validated_data=request.data) + obj.role_name = group + obj.save() + serializer = self.serializer_class(obj) + return Response(serializer.data) + return Response(serializer.errors) + + diff --git a/pdf/__init__.py b/pdf/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pdf/views.py b/pdf/views.py new file mode 100644 index 0000000..7a055fa --- /dev/null +++ b/pdf/views.py @@ -0,0 +1,1391 @@ +import datetime +import io +from urllib.parse import quote + +import requests +from django.db.models import Sum, Count, Avg, Q +from django.http import HttpResponse +from django.template.loader import render_to_string +from weasyprint import HTML, CSS +from weasyprint.text.fonts import FontConfiguration + +from general_urls import base_url_for_sms_report +from panel.KillHouse.serializers import KillHouseRequestForHatchingDetailSerializer, \ + KillHouseRequestForBarManagementSerializer, ReturnProvinceKillRequestSerializer, BarDifferenceRequestSerializer +from panel.helper_excel import shamsi_date, to_locale_str +from panel.models import KillRequest, ProvinceKillRequest, PoultryHatching, KillHouseRequest, \ + KillHouseFreeBarInformation, KillHouse, StewardAllocation, KillHouseFreeSaleBarInformation, RolesProducts, \ + DirectBuyingPayment, PoultryRequest, ChainAllocation, BarDifferenceRequest, HatchingIncreaseRequest, \ + PoultryScienceReport +from panel.poultry.serializers import PoultryHatchingForDetailsSerializer, PoultryRequestForHatchingDetailSerializer, \ + ChainAllocationForHatchingDetailSerializer, HatchingIncreaseRequestSerializer, EvacuationHatchingDetailSerializer + + +def kill_request_pdf(request): + font_config = FontConfiguration() + kill_request = KillRequest.objects.filter(trash=False, key=request.GET['key']).select_related( + 'kill_house', 'poultry', 'poultry__address', 'poultry__user', 'kill_house__kill_house_operator' + ).only( + 'poultry__unit_name', + 'poultry__user__fullname', + 'poultry__user__mobile', + 'poultry__user__national_code', + 'poultry__breeding_unique_id', + 'poultry__breeding_unique_id', + 'poultry__address__address', + 'poultry__user__city__name', + 'kill_house__kill_house_operator__user__fullname', + 'kill_house__kill_house_operator__user__national_code', + 'kill_house__kill_house_operator__address__address', + 'kill_house__kill_house_operator__user__city__name', + 'kill_house__name', + 'kill_capacity', + 'amount', + 'recive_date', + 'Index_weight', + 'input_direct_buying_code', + 'direct_buying_state', + 'poultry_hatching__chicken_age', + 'poultry_hatching__licence_number', + 'payment_deadline_date', + 'payment_deadline_days', + 'direct_buying_intermediary_mobile', + + ).first() + recive_date = kill_request.recive_date + if isinstance(recive_date, str): + try: + recive_date = datetime.datetime.strptime(recive_date, '%Y-%m-%dT%H:%M:%S.%f') + except ValueError: + recive_date = datetime.datetime.strptime(recive_date, '%Y-%m-%dT%H:%M:%S') + + date = shamsi_date(recive_date.date(), in_value=True) + date_in_value = shamsi_date(recive_date.date()) + + if kill_request.market_state == 'accepted' or kill_request.input_direct_buying_code or \ + kill_request.direct_buying_state == 'accepted': + input_direct_buying_code = True + else: + input_direct_buying_code = False + if kill_request.market_final_accept or kill_request.final_accept: + final_accept = True + else: + final_accept = False + + if kill_request.kill_house.kill_house_operator.address.address is not None: + kill_house_address = kill_request.kill_house.kill_house_operator.address.address + elif kill_request.kill_house.kill_house_operator.user.city.name: + kill_house_address = kill_request.kill_house.kill_house_operator.user.city.name + else: + kill_house_address = '-' + + if kill_request.poultry.address.address: + poultry_address = kill_request.poultry.address.address + elif kill_request.poultry.user.city.name: + poultry_address = kill_request.poultry.user.city.name + else: + poultry_address = '-' + kill_house_request = KillHouseRequest.objects.filter(trash=False, kill_request=kill_request, + assignment_state_archive='True').aggregate( + total_quantity=Sum('accepted_real_quantity'), + total_weight=Sum('accepted_real_weight'), + ) + province_kill_req = ProvinceKillRequest.objects.filter(trash=False, kill_request=kill_request).only( + 'province_request__poultry_request__order_code' + ).first() + payments = DirectBuyingPayment.objects.filter(province_kill_request=province_kill_req, trash=False) + total_paid_amount = payments.aggregate(total=Sum('amount'))['total'] or 0 + avg_killed_weight = round((kill_house_request['total_weight'] or 0) / (kill_house_request['total_quantity'] or 0) + if (kill_house_request['total_quantity'] or 0) > 0 else 0, + 1) + html_content = render_to_string('Digital_agreement_for_buying_and_selling.html', { # noqa + 'date': date, + 'unit_name': kill_request.poultry.unit_name, + 'fullname': kill_request.poultry.user.fullname, + 'mobile': kill_request.poultry.user.mobile, + 'national_code': kill_request.poultry.user.national_code if kill_request.poultry.user.national_code else '-', + 'breeding_unique_id': kill_request.poultry.breeding_unique_id if + kill_request.poultry.breeding_unique_id else '-', + 'poultry_address': poultry_address, + 'kill_house_fullname': kill_request.kill_house.kill_house_operator.user.fullname, + 'kill_house_name': kill_request.kill_house.name, + 'kill_house_national_code': kill_request.kill_house.kill_house_operator.user.national_code if + kill_request.kill_house.kill_house_operator.user.national_code else '-', + 'kill_house_mobile': kill_request.kill_house.kill_house_operator.user.mobile, + 'kill_house_address': kill_house_address, + 'kill_capacity': to_locale_str(kill_request.kill_capacity), + 'date_in_value': date_in_value, + 'amount': to_locale_str(int(kill_request.amount)), + 'weight': to_locale_str(round(kill_request.Index_weight * kill_request.kill_capacity, 1)), + 'input_direct_buying_code': input_direct_buying_code, + 'direct_buying_state': final_accept, + 'Index_weight': kill_request.Index_weight, + 'chicken_age': kill_request.poultry_hatching.chicken_age, + 'licence_number': kill_request.poultry_hatching.licence_number if + kill_request.poultry_hatching.licence_number else '-', + 'max_time': shamsi_date(kill_request.payment_deadline_date) if kill_request.payment_deadline_date else '-', + 'payment_deadline_days': kill_request.payment_deadline_days, + 'number': province_kill_req.province_request.poultry_request.order_code if province_kill_req else '-', + 'total_killed_quantity': to_locale_str(kill_house_request['total_quantity'] or 0), + 'total_killed_weight': to_locale_str(kill_house_request['total_weight'] or 0), + 'avg_killed_weight': avg_killed_weight, + 'direct_buying_intermediary_mobile': kill_request.direct_buying_intermediary_mobile, + 'payment_deadline_state': province_kill_req.payment_deadline_state, + 'total_paid_amount': to_locale_str(total_paid_amount), + 'payment_deadline_checker_fullname': province_kill_req.payment_deadline_checker_fullname, + 'payment_deadline_check_date': shamsi_date(province_kill_req.payment_deadline_check_date) \ + if province_kill_req.payment_deadline_check_date else '-', + 'payment_deadline_archive_message': province_kill_req.payment_deadline_archive_message, + + }) + + html = HTML(string=html_content, base_url=request.build_absolute_uri()) # noqa + css = CSS(string=''' + ''', font_config=font_config) + + pdf_file = io.BytesIO() + html.write_pdf(pdf_file, stylesheets=[css], font_config=font_config) + pdf_file.seek(0) + + response = HttpResponse(pdf_file, content_type='application/pdf') + filename = 'توافق‌نامه {0}.pdf'.format( + province_kill_req.province_request.poultry_request.order_code if province_kill_req else "-") + encoded_filename = quote(filename) # کدگذاری نام فایل برای URL + response['Content-Disposition'] = f'attachment; filename*=UTF-8\'\'{encoded_filename}' + return response + + +def management_all_poultry_and_warehouse_pdf(request): + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + poultry_hatching = PoultryHatching.objects.filter(Q(date__date__gte=date1, date__date__lte=date2) | + Q(date__date__lte=date1, + archive_date__isnull=True) | Q(date__date__lte=date1, + archive_date__gte=date1, + archive_date__isnull=False), + trash=False).select_related('poultry', 'poultry__user__city') + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False + ).select_related('killhouse_user') + aggregate_kill_house_request = kill_house_request.aggregate( + total_id=Count('id'), + total_accepted_real_quantity=Sum('accepted_real_quantity'), + total_accepted_real_weight=Sum('accepted_real_weight'), + total_quantity_has_quarantine=Sum('accepted_real_quantity', filter=Q(quarantine_quantity__gt=0)), + total_count_has_quarantine=Count('id', filter=Q(quarantine_quantity__gt=0)), + total_quarantine_quantity=Sum('quarantine_quantity', filter=Q(quarantine_quantity__gt=0)), + + total_id_hasnt_code=Count('id', filter=Q(clearance_code__isnull=True)), + total_quantity_hasnt_code=Sum('accepted_real_quantity', filter=Q(clearance_code__isnull=True)), + total_weight_hasnt_code=Sum('accepted_real_weight', filter=Q(clearance_code__isnull=True)), + total_id_hasnt_warehouse=Count('id', filter=Q(ware_house_confirmation=False)), + total_quantity_hasnt_warehouse=Sum('accepted_real_quantity', filter=Q(ware_house_confirmation=False)), + total_weight_hasnt_warehouse=Sum('accepted_real_weight', filter=Q(ware_house_confirmation=False)), + total_id_hasnt_assignment_state_archive=Count('id', filter=Q(assignment_state_archive='pending')), + total_quantity_hasnt_assignment_state_archive=Sum('accepted_real_quantity', + filter=Q(assignment_state_archive='pending')), + total_weight_hasnt_assignment_state_archive=Sum('accepted_real_weight', + filter=Q(assignment_state_archive='pending')), + total_id_hasnt_killing_age=Count('id', filter=Q(province_request__poultry_request__killing_age__gte=60)), + total_quantity_hasnt_killing_age=Sum('accepted_real_quantity', + filter=Q(province_request__poultry_request__killing_age__gte=60)), + total_weight_hasnt_killing_age=Sum('accepted_real_weight', + filter=Q(province_request__poultry_request__killing_age__gte=60)), + + ) + kill_house_req_stats = kill_house_request.values('killhouse_user__name').annotate( + total_quantity=Sum('accepted_real_quantity'), + transaction_count=Count('id') + ).order_by('-total_quantity') + top_kill_house_req = kill_house_req_stats.first() if kill_house_req_stats else None + kill_house_name_req = "-" + total_quantity_top_inner = 0 + if top_kill_house_req: + kill_house_name_req = top_kill_house_req['killhouse_user__name'] + total_quantity_top_inner = top_kill_house_req['total_quantity'] + + poultry_req_stats = kill_house_request.values( + 'province_request__poultry_request__hatching__poultry__unit_name', + 'province_request__poultry_request__hatching__poultry__user__city__name') \ + .annotate(total_quantity=Sum('accepted_real_quantity'), + ).order_by('-total_quantity') + top_poultry_req_stats = poultry_req_stats.first() if poultry_req_stats else None + top_poultry_req_stats_total_quantity = 0 + poultry_req_name_req = "-" + poultry_city_req_name_req = "-" + if top_poultry_req_stats: + poultry_req_name_req = top_poultry_req_stats['province_request__poultry_request__hatching__poultry__unit_name'] + poultry_city_req_name_req = top_poultry_req_stats[ + 'province_request__poultry_request__hatching__poultry__user__city__name'] + top_poultry_req_stats_total_quantity = to_locale_str(top_poultry_req_stats['total_quantity'] or 0) + + poultry_hatching_gt_60 = poultry_hatching.filter(chicken_age__gt=60) + poultry_hatching_has_killed = PoultryRequest.objects.filter(state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), + trash=False, out=False, send_date__date__gte=date1, + send_date__date__lte=date2) + max_age_poultry = poultry_hatching_has_killed.order_by('-killing_age').first() + min_age_poultry = poultry_hatching_has_killed.order_by('killing_age').first() + aggregate_poultry_hatching_gt_60 = poultry_hatching_gt_60.aggregate( + total_quantity=Sum('quantity'), + left_over=Sum('left_over'), + ) + aggregate_hatching = poultry_hatching.aggregate( + total_quantity=Sum('quantity'), + total_losses_vet=Sum('losses'), + total_losses_union=Sum('direct_losses'), + total_losses=Sum('total_losses'), + killed_quantity=Sum('killed_quantity'), + total_killed_weight=Sum('total_killed_weight'), + left_over=Sum('left_over'), + total_killing_ave_age=Avg('poultry__killing_ave_age') + ) + top_total_killed_weight = poultry_hatching.values('id').annotate( + total_killed_weight=Sum('total_killed_weight'), + ).order_by('-total_killed_weight') + top_total_killed_weight_first = top_total_killed_weight.first() if top_total_killed_weight else None + + free_bars = KillHouseFreeBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, + trash=False, buy_type='live').select_related('kill_house') + kill_house_stats = free_bars.values('kill_house__name').annotate( + total_quantity=Sum('quantity'), + total_live_weight=Sum('live_weight'), + transaction_count=Count('id') + ).order_by('-total_quantity') + + top_kill_house = kill_house_stats.first() if kill_house_stats else None + kill_house_name = "-" + total_quantity_top_out = 0 + transaction_count = "-" + if top_kill_house: + kill_house_name = top_kill_house['kill_house__name'] + transaction_count = to_locale_str(top_kill_house['transaction_count'] or 0) + total_quantity_top_out = to_locale_str(top_kill_house['total_quantity'] or 0) + # + out_poultry_req_stats = free_bars.values('poultry_name', 'province', 'city').annotate( + total_quantity=Sum('quantity'), + ).order_by('-total_quantity') + top_out_poultry_req_stats = out_poultry_req_stats.first() if out_poultry_req_stats else None + out_top_poultry_req_stats_total_quantity = 0 + out_poultry_req_name_req = "-" + out_poultry_city_req_name_req = "-" + out_poultry_province_req_name_req = "-" + if top_out_poultry_req_stats: + out_poultry_req_name_req = top_out_poultry_req_stats['poultry_name'] + out_poultry_city_req_name_req = top_out_poultry_req_stats['city'] + out_poultry_province_req_name_req = top_out_poultry_req_stats['province'] + out_top_poultry_req_stats_total_quantity = to_locale_str(top_out_poultry_req_stats['total_quantity'] or 0) + + # + aggregate_free_bars = free_bars.aggregate( + id=Count('id'), + quantity=Sum('quantity'), + live_weight=Sum('live_weight'), + ) + + max_kill_day = free_bars.values('date__date').annotate( + daily_quantity=Sum('quantity') + ).order_by('-daily_quantity').first() + persian_date = '-' + daily_quantity = '-' + if max_kill_day: + persian_date = shamsi_date(max_kill_day['date__date']) + daily_quantity = to_locale_str(max_kill_day['daily_quantity']) + + max_kill_day_req = kill_house_request.values('kill_request__recive_date__date').annotate( + daily_quantity=Sum('accepted_real_quantity') + ).order_by('-daily_quantity').first() + persian_date_req = '-' + daily_quantity_req = '-' + if max_kill_day_req: + persian_date_req = shamsi_date(max_kill_day_req['kill_request__recive_date__date']) + daily_quantity_req = to_locale_str(max_kill_day_req['daily_quantity']) + + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).order_by('name') + kill_house_data = [] + duc_kill_house_data = [] + + for kh in kill_houses: + in_province_data = kill_house_request.filter( + killhouse_user=kh + ).aggregate( + load_count=Count('id'), + quantity=Sum('accepted_real_quantity'), + weight=Sum('accepted_real_weight') + ) + + out_province_data = free_bars.filter( + kill_house=kh + ).aggregate( + load_count=Count('id'), + quantity=Sum('quantity'), + live_weight=Sum('live_weight'), + ) + + in_qty = in_province_data.get('quantity', 0) or 0 + in_weight = in_province_data.get('weight', 0) or 0 + out_qty = out_province_data.get('quantity', 0) or 0 + out_weight = out_province_data.get('live_weight', 0) or 0 + total_quantity = in_qty + out_qty + total_weight = in_weight + out_weight + + in_loads = in_province_data.get('load_count', 0) or 0 + out_loads = out_province_data.get('load_count', 0) or 0 + total_loads = in_loads + out_loads + + if in_qty > 0 or out_qty > 0 or in_loads > 0 or out_loads > 0: + kill_house_data.append({ + 'name': kh.name, + 'load_count': to_locale_str(total_loads or 0), + 'in_province_quantity': to_locale_str(in_qty or 0), + 'in_province_wight': to_locale_str(in_weight or 0), + 'out_province_quantity': to_locale_str(out_qty or 0), + 'out_province_weight': to_locale_str(out_weight or 0), + 'total_quantity': to_locale_str(total_quantity or 0), + 'total_weight': to_locale_str(total_weight or 0), + }) + bar_assigment_pending_count1 = kill_house_request.filter(assignment_state_archive='True') \ + .exclude(bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + tomorrow_of_date1 = date1 + datetime.timedelta(days=1) + tomorrow_of_date2 = date2 + datetime.timedelta(days=1) + steward_allocations = StewardAllocation.objects.filter( + trash=False, + date__date__gte=tomorrow_of_date1, + date__date__lte=tomorrow_of_date2, + kill_house__in=kill_houses + ).values('kill_house_id').annotate( + total_quantity=Sum('real_weight_of_carcasses') + ) + + free_bars = KillHouseFreeSaleBarInformation.objects.filter( + trash=False, + date__date__gte=tomorrow_of_date1, + date__date__lte=tomorrow_of_date2, + kill_house__in=kill_houses + ).values('kill_house_id').annotate( + total_quantity=Sum('weight_of_carcasses') + ) + + in_province_data = kill_house_request.filter( + killhouse_user__in=kill_houses + ).values('killhouse_user_id').annotate( + total_quantity=Sum('accepted_real_weight') + ) + + in_warehouse_data = kill_house_request.filter( + killhouse_user__in=kill_houses, + ware_house_confirmation=True + ).values('killhouse_user_id').annotate( + total_quantity=Sum('ware_house_accepted_real_weight') + ) + + products = RolesProducts.objects.filter( + trash=False, + kill_house__in=kill_houses + ).values('kill_house_id', 'total_remain_weight') + + steward_dict = {item['kill_house_id']: item['total_quantity'] for item in steward_allocations} + free_bar_dict = {item['kill_house_id']: item['total_quantity'] for item in free_bars} + in_province_dict = {item['killhouse_user_id']: item['total_quantity'] for item in in_province_data} + in_warehouse_dict = {item['killhouse_user_id']: item['total_quantity'] for item in in_warehouse_data} + product_dict = {item['kill_house_id']: item['total_remain_weight'] for item in products} + + management_kill_house_data = [] + for kh in kill_houses: + kh_id = kh.id + + steward_qty = steward_dict.get(kh_id, 0) or 0 + free_bar_qty = free_bar_dict.get(kh_id, 0) or 0 + in_province_qty = in_province_dict.get(kh_id, 0) or 0 + in_warehouse_qty = in_warehouse_dict.get(kh_id, 0) or 0 + product_weight = product_dict.get(kh_id, 0) or 0 + + if any([in_province_qty, in_warehouse_qty, steward_qty, free_bar_qty]): + total = free_bar_qty + steward_qty + percent = round(total * 100 / in_province_qty, 1) if in_province_qty else 0 + + management_kill_house_data.append({ + 'name': kh.name, + 'in_province_quantity': to_locale_str(in_province_qty), + 'in_ware_house_quantity': to_locale_str(in_warehouse_qty), + 'steward_allocation_quantity': to_locale_str(steward_qty), + 'kill_house_free_bar_quantity': to_locale_str(free_bar_qty), + 'all_quantity': to_locale_str(total), + 'product': to_locale_str(product_weight), + 'percent': percent + }) + for kh in kill_houses: + kill_house_request1 = kill_house_request.filter( + killhouse_user=kh + ) + + bar_assigment_true_count = kill_house_request1.filter(assignment_state_archive='True') + bar_assigment_pending_count = kill_house_request1.filter(assignment_state_archive='pending').count() + bar_document_status_accepted = bar_assigment_true_count.filter( + bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + bar_document_status_rejected = bar_assigment_true_count.exclude( + bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + + if bar_assigment_true_count.count() > 0 or bar_assigment_pending_count > 0: + duc_kill_house_data.append({ + 'name': kh.name, + 'kill_house_request1_count': kill_house_request1.count(), + "bar_assigment_true_count": bar_assigment_true_count.count(), + "bar_assigment_pending_count": bar_assigment_pending_count, + "bar_document_status_accepted": bar_document_status_accepted, + "percent_bar_document_status_accepted": int((bar_document_status_accepted / + bar_assigment_true_count.count()) * 100) if + bar_assigment_true_count.count() > 0 else 0, + "bar_document_status_rejected": bar_document_status_rejected, + "percent_bar_document_status_rejected": int((bar_document_status_rejected / + bar_assigment_true_count.count()) * 100) if + bar_assigment_true_count.count() > 0 else 0, + + }) + if base_url_for_sms_report == 'ha': + province = 'همدان' + elif base_url_for_sms_report == 'ku': + province = 'کردستان' + elif base_url_for_sms_report == 'ma': + province = 'مرکزی' + elif base_url_for_sms_report == 'bu': + province = 'بوشهر' + else: + province = 'تست' + font_config = FontConfiguration() + different_bar = (aggregate_kill_house_request['total_quantity_has_quarantine'] or 0) \ + - (aggregate_kill_house_request['total_quarantine_quantity'] or 0) + different_bar_percent = int(different_bar / (aggregate_kill_house_request['total_quarantine_quantity'] or 0) * 100) \ + if (aggregate_kill_house_request['total_quarantine_quantity'] or 0) > 0 else 0 + + if different_bar < 0: + color_different_bar = '#FF0000' + else: + color_different_bar = None + html_content = render_to_string('management_all_poultry_and_warehouse.html', { # noqa + 'number': 1234, + 'province': province, + "date": shamsi_date(datetime.datetime.now().date(), in_value=True), + "date1": request.GET['date1'], + "date2": request.GET['date2'], + "from_date": shamsi_date(date1), + "to_date": shamsi_date(date2), + "poultry_count": len(poultry_hatching.values_list('poultry', flat=True).distinct()), + "chain_count": len( + poultry_hatching.filter(Q(UnionTypeName='زنجیره') | + Q(chain_company__isnull=False)).values_list('poultry', flat=True).distinct()), + "poultry_hatching_quantity": to_locale_str(aggregate_hatching['total_quantity'] or 0), + "poultry_hatching_losses_vet": to_locale_str(aggregate_hatching['total_losses_vet'] or 0), + "poultry_hatching_losses_union": to_locale_str(aggregate_hatching['total_losses_union'] or 0), + "poultry_hatching_total_losses": to_locale_str(aggregate_hatching['total_losses'] or 0), + "poultry_hatching_killed_quantity": to_locale_str(aggregate_hatching['killed_quantity'] or 0), + "poultry_hatching_total_killed_weight": to_locale_str(aggregate_hatching['total_killed_weight'] or 0), + "poultry_hatching_left_over": to_locale_str(aggregate_hatching['left_over'] or 0), + "poultry_hatching_gt_60": len(poultry_hatching_gt_60.values_list('poultry', flat=True).distinct()), + "poultry_hatching_gt_60_quantity": to_locale_str(aggregate_poultry_hatching_gt_60['total_quantity'] or 0), + "poultry_hatching_gt_60_left_over": to_locale_str(aggregate_poultry_hatching_gt_60['left_over'] or 0), + "max_age_poultry": max_age_poultry.killing_age or 0, + "max_age_poultry_name": max_age_poultry.hatching.poultry.unit_name or '-', + "max_age_poultry_city": max_age_poultry.hatching.poultry.user.city.name if max_age_poultry.hatching.poultry.user.city else '-', + "max_age_poultry_quantity": max_age_poultry.hatching.quantity or 0, + "max_age_poultry_killed_quantity": max_age_poultry.hatching.killed_quantity or 0, + "max_age_poultry_left_over": max_age_poultry.hatching.left_over or 0, + "min_age_poultry": min_age_poultry.killing_age or 0, + "min_age_poultry_name": min_age_poultry.hatching.poultry.unit_name or '-', + "min_age_poultry_city": min_age_poultry.hatching.poultry.user.city.name if min_age_poultry.hatching.poultry.user.city else '-', + "min_age_poultry_quantity": min_age_poultry.hatching.quantity or 0, + "min_age_poultry_killed_quantity": min_age_poultry.hatching.killed_quantity or 0, + "min_age_poultry_left_over": min_age_poultry.hatching.left_over or 0, + "kill_house_request_count": to_locale_str(aggregate_kill_house_request['total_id'] or 0), + "kill_house_request_quantity": to_locale_str(aggregate_kill_house_request['total_accepted_real_quantity'] or 0), + "kill_house_request_weight": to_locale_str(aggregate_kill_house_request['total_accepted_real_weight'] or 0), + "kill_house_request_average_weight": round( + aggregate_kill_house_request['total_accepted_real_weight'] / aggregate_kill_house_request[ + 'total_accepted_real_quantity'], 1) + if (aggregate_kill_house_request['total_accepted_real_quantity'] or 0) > 0 else 0, + "free_bars_count": to_locale_str(aggregate_free_bars['id'] or 0), + "free_bars_quantity": to_locale_str(aggregate_free_bars['quantity'] or 0), + "free_bars_live_weight": to_locale_str(aggregate_free_bars['live_weight'] or 0), + "kill_house_name": kill_house_name, + "transaction_count": transaction_count, + "persian_date": persian_date, + "daily_quantity": daily_quantity, + "persian_date_req": persian_date_req, + "daily_quantity_req": daily_quantity_req, + 'kill_houses_data': kill_house_data, + 'kill_house_name_req': kill_house_name_req, + 'poultry_req_name_req': poultry_req_name_req, + 'top_poultry_req_stats_total_quantity': top_poultry_req_stats_total_quantity, + 'poultry_city_req_name_req': poultry_city_req_name_req, + 'out_poultry_req_name_req': out_poultry_req_name_req, + 'out_poultry_city_req_name_req': out_poultry_city_req_name_req, + 'out_poultry_province_req_name_req': out_poultry_province_req_name_req, + 'out_top_poultry_req_stats_total_quantity': out_top_poultry_req_stats_total_quantity, + 'management_kill_house_data': management_kill_house_data, + 'duc_kill_house_data': duc_kill_house_data, + 'avg_losses': to_locale_str(int((aggregate_hatching['total_losses'] or 0) / poultry_hatching.count())), + 'avg_total_killed_weight': round( + (aggregate_hatching['total_killed_weight'] or 0) / (aggregate_hatching['killed_quantity'] or 0), 1), + 'total_killing_ave_age': int(aggregate_hatching['total_killing_ave_age'] or 0), + 'top_total_killed_weight': to_locale_str(top_total_killed_weight_first['total_killed_weight'] or 0), + 'total_quantity_top_inner': to_locale_str(total_quantity_top_inner), + 'total_quantity_top_out': total_quantity_top_out, + 'bar_assigment_pending_count1': to_locale_str(bar_assigment_pending_count1 or 0), + 'base_url': base_url_for_sms_report, + "total_quarantine_quantity": to_locale_str(aggregate_kill_house_request['total_quarantine_quantity'] or 0), + "total_count_has_quarantine": to_locale_str(aggregate_kill_house_request['total_count_has_quarantine'] or 0), + "total_quantity_has_quarantine": to_locale_str( + aggregate_kill_house_request['total_quantity_has_quarantine'] or 0), + "different": to_locale_str(different_bar or 0), + "total_weight_hasnt_code": to_locale_str(aggregate_kill_house_request['total_weight_hasnt_code'] or 0), + "total_quantity_hasnt_code": to_locale_str(aggregate_kill_house_request['total_quantity_hasnt_code'] or 0), + "total_id_hasnt_code": to_locale_str(aggregate_kill_house_request['total_id_hasnt_code'] or 0), + "total_weight_hasnt_warehouse": to_locale_str( + aggregate_kill_house_request['total_weight_hasnt_warehouse'] or 0), + "total_quantity_hasnt_warehouse": to_locale_str( + aggregate_kill_house_request['total_quantity_hasnt_warehouse'] or 0), + "total_id_hasnt_warehouse": to_locale_str(aggregate_kill_house_request['total_id_hasnt_warehouse'] or 0), + "total_weight_hasnt_assignment_state_archive": to_locale_str( + aggregate_kill_house_request['total_weight_hasnt_assignment_state_archive'] or 0), + "total_quantity_hasnt_assignment_state_archive": to_locale_str( + aggregate_kill_house_request['total_quantity_hasnt_assignment_state_archive'] or 0), + "total_id_hasnt_assignment_state_archive": to_locale_str( + aggregate_kill_house_request['total_id_hasnt_assignment_state_archive'] or 0), + "total_weight_hasnt_killing_age": to_locale_str( + aggregate_kill_house_request['total_weight_hasnt_killing_age'] or 0), + "total_quantity_hasnt_killing_age": to_locale_str( + aggregate_kill_house_request['total_quantity_hasnt_killing_age'] or 0), + "total_id_hasnt_killing_age": to_locale_str(aggregate_kill_house_request['total_id_hasnt_killing_age'] or 0), + 'color_different_bar': color_different_bar, + 'different_bar_percent': different_bar_percent, + 'tomorrow_of_date1': shamsi_date(tomorrow_of_date1), + 'tomorrow_of_date2': shamsi_date(tomorrow_of_date2), + + }) + + html = HTML(string=html_content, base_url=request.build_absolute_uri()) # noqa + css = CSS(string=''' + ''', font_config=font_config) + + pdf_file = io.BytesIO() + html.write_pdf(pdf_file, stylesheets=[css], font_config=font_config) + pdf_file.seek(0) + + response = HttpResponse(pdf_file, content_type='application/pdf') + filename = 'عملکرد کشتار زنجیره.pdf' + encoded_filename = quote(filename) # کدگذاری نام فایل برای URL + response['Content-Disposition'] = f'attachment; filename*=UTF-8\'\'{encoded_filename}' + return response + + +def summary_report_pdf(request): + if base_url_for_sms_report == 'ha': + province = 'همدان' + elif base_url_for_sms_report == 'ku': + province = 'کردستان' + elif base_url_for_sms_report == 'ma': + province = 'مرکزی' + elif base_url_for_sms_report == 'bu': + province = 'بوشهر' + else: + province = 'تست' + date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() + date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() + poultry_hatching = PoultryHatching.objects.filter(Q(date__date__gte=date1, date__date__lte=date2) | + Q(date__date__lte=date1, + archive_date__isnull=True) | Q(date__date__lte=date1, + archive_date__gte=date1, + archive_date__isnull=False), + trash=False).select_related('poultry', 'poultry__user__city') + kill_house_request = KillHouseRequest.objects.filter( + trash=False, + kill_request__recive_date__date__gte=date1, + kill_request__recive_date__date__lte=date2, + temporary_trash=False, + temporary_deleted=False + ).select_related('killhouse_user') + aggregate_kill_house_request = kill_house_request.aggregate( + id=Count('id'), + accepted_real_quantity=Sum('accepted_real_quantity'), + accepted_real_weight=Sum('accepted_real_weight'), + ) + kill_house_req_stats = kill_house_request.values('killhouse_user__name').annotate( + total_quantity=Sum('accepted_real_quantity'), + transaction_count=Count('id') + ).order_by('-total_quantity') + top_kill_house_req = kill_house_req_stats.first() if kill_house_req_stats else None + kill_house_name_req = "-" + transaction_count_req = 0 + total_quantity_top_inner = 0 + if top_kill_house_req: + kill_house_name_req = top_kill_house_req['killhouse_user__name'] + total_quantity_top_inner = top_kill_house_req['total_quantity'] + transaction_count_req = top_kill_house_req['transaction_count'] + + # max_kill_day_req = kill_house_request.values('kill_request__recive_date__date').annotate( + # daily_quantity=Sum('quantity') + # ).order_by('-daily_quantity').first() + # persian_date_req = '-' + # daily_quantity_req = '-' + # if max_kill_day_req: + # persian_date = shamsi_date(max_kill_day_req['date__date']) + # daily_quantity = to_locale_str(max_kill_day_req['daily_quantity']) + + poultry_req_stats = kill_house_request.values( + 'province_request__poultry_request__hatching__poultry__unit_name', + 'province_request__poultry_request__hatching__poultry__user__city__name') \ + .annotate(total_quantity=Sum('accepted_real_quantity'), + ).order_by('-total_quantity') + top_poultry_req_stats = poultry_req_stats.first() if poultry_req_stats else None + top_poultry_req_stats_total_quantity = 0 + poultry_req_name_req = "-" + poultry_city_req_name_req = "-" + if top_poultry_req_stats: + poultry_req_name_req = top_poultry_req_stats['province_request__poultry_request__hatching__poultry__unit_name'] + poultry_city_req_name_req = top_poultry_req_stats[ + 'province_request__poultry_request__hatching__poultry__user__city__name'] + top_poultry_req_stats_total_quantity = to_locale_str(top_poultry_req_stats['total_quantity'] or 0) + + poultry_hatching_gt_60 = poultry_hatching.filter(chicken_age__gt=60) + poultry_hatching_has_killed = poultry_hatching.filter(total_killed_weight__gt=0) + max_age_poultry = poultry_hatching_has_killed.order_by('-chicken_age').first() + min_age_poultry = poultry_hatching_has_killed.order_by('chicken_age').first() + aggregate_poultry_hatching_gt_60 = poultry_hatching_gt_60.aggregate( + total_quantity=Sum('quantity'), + left_over=Sum('left_over'), + ) + aggregate_hatching = poultry_hatching.aggregate( + total_quantity=Sum('quantity'), + total_losses_vet=Sum('losses'), + total_losses_union=Sum('direct_losses'), + total_losses=Sum('total_losses'), + killed_quantity=Sum('killed_quantity'), + total_killed_weight=Sum('total_killed_weight'), + left_over=Sum('left_over'), + total_killing_ave_age=Avg('poultry__killing_ave_age') + ) + top_total_killed_weight = poultry_hatching.values('id').annotate( + total_killed_weight=Sum('total_killed_weight'), + ).order_by('-total_killed_weight') + top_total_killed_weight_first = top_total_killed_weight.first() if top_total_killed_weight else None + + free_bars = KillHouseFreeBarInformation.objects.filter(date__date__gte=date1, + date__date__lte=date2, + trash=False).select_related('kill_house') + kill_house_stats = free_bars.values('kill_house__name').annotate( + total_quantity=Sum('quantity'), + total_live_weight=Sum('live_weight'), + transaction_count=Count('id') + ).order_by('-total_quantity') + + top_kill_house = kill_house_stats.first() if kill_house_stats else None + kill_house_name = "-" + total_quantity_top_out = 0 + transaction_count = "-" + if top_kill_house: + kill_house_name = top_kill_house['kill_house__name'] + transaction_count = to_locale_str(top_kill_house['transaction_count'] or 0) + total_quantity_top_out = to_locale_str(top_kill_house['total_quantity'] or 0) + # + out_poultry_req_stats = free_bars.values('poultry_name', 'province', 'city').annotate( + total_quantity=Sum('quantity'), + ).order_by('-total_quantity') + top_out_poultry_req_stats = out_poultry_req_stats.first() if out_poultry_req_stats else None + out_top_poultry_req_stats_total_quantity = 0 + out_poultry_req_name_req = "-" + out_poultry_city_req_name_req = "-" + out_poultry_province_req_name_req = "-" + if top_out_poultry_req_stats: + out_poultry_req_name_req = top_out_poultry_req_stats['poultry_name'] + out_poultry_city_req_name_req = top_out_poultry_req_stats['city'] + out_poultry_province_req_name_req = top_out_poultry_req_stats['province'] + out_top_poultry_req_stats_total_quantity = to_locale_str(top_out_poultry_req_stats['total_quantity'] or 0) + + # + aggregate_free_bars = free_bars.aggregate( + id=Count('id'), + quantity=Sum('quantity'), + live_weight=Sum('live_weight'), + ) + + max_kill_day = free_bars.values('date__date').annotate( + daily_quantity=Sum('quantity') + ).order_by('-daily_quantity').first() + persian_date = '-' + daily_quantity = '-' + if max_kill_day: + persian_date = shamsi_date(max_kill_day['date__date']) + daily_quantity = to_locale_str(max_kill_day['daily_quantity']) + + kill_houses = KillHouse.objects.filter(trash=False, out_province=False).order_by('name') + kill_house_data = [] + duc_kill_house_data = [] + + for kh in kill_houses: + in_province_data = kill_house_request.filter( + killhouse_user=kh + ).aggregate( + load_count=Count('id'), + quantity=Sum('accepted_real_quantity'), + weight=Sum('accepted_real_weight') + ) + + out_province_data = free_bars.filter( + kill_house=kh + ).aggregate( + load_count=Count('id'), + quantity=Sum('quantity'), + live_weight=Sum('live_weight'), + ) + + in_qty = in_province_data.get('quantity', 0) or 0 + out_qty = out_province_data.get('quantity', 0) or 0 + total_quantity = in_qty + out_qty + + in_loads = in_province_data.get('load_count', 0) or 0 + out_loads = out_province_data.get('load_count', 0) or 0 + total_loads = in_loads + out_loads + + if in_qty > 0 or out_qty > 0 or in_loads > 0 or out_loads > 0: + kill_house_data.append({ + 'name': kh.name, + 'load_count': to_locale_str(total_loads or 0), + 'in_province_quantity': to_locale_str(in_qty or 0), + 'out_province_quantity': to_locale_str(out_qty or 0), + 'total_quantity': to_locale_str(total_quantity or 0), + }) + bar_assigment_pending_count1 = kill_house_request.filter(assignment_state_archive='True') \ + .exclude(bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + + steward_allocations = StewardAllocation.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + kill_house__in=kill_houses + ).values('kill_house_id').annotate( + total_quantity=Sum('real_weight_of_carcasses') + ) + + steward_allocations_stats = steward_allocations.values('kill_house__name').annotate( + total_quantity=Sum('real_weight_of_carcasses'), + ).order_by('-total_quantity') + top_steward_allocations_stats = steward_allocations_stats.first() if steward_allocations_stats else None + + out_kill_house_top = "-" + out_weight_top = 0 + if top_steward_allocations_stats: + out_kill_house_top = top_steward_allocations_stats['kill_house__name'] + out_weight_top = to_locale_str(top_steward_allocations_stats['total_quantity'] or 0) + + free_bars = KillHouseFreeSaleBarInformation.objects.filter( + trash=False, + date__date__gte=date1, + date__date__lte=date2, + kill_house__in=kill_houses + ).values('kill_house_id', 'kill_house__name').annotate( + total_quantity=Sum('weight_of_carcasses') + ).order_by('-total_quantity') + + top_free_bars_stats = free_bars.first() if free_bars else None + + free_bars_kill_house_top = "-" + free_bars_weight_top = 0 + if top_free_bars_stats: + free_bars_kill_house_top = top_free_bars_stats['kill_house__name'] + free_bars_weight_top = to_locale_str(top_free_bars_stats['total_quantity'] or 0) + + in_province_data = kill_house_request.filter( + killhouse_user__in=kill_houses + ).values('killhouse_user_id').annotate( + total_quantity=Sum('accepted_real_weight') + ) + + in_warehouse_data = kill_house_request.filter( + killhouse_user__in=kill_houses, + ware_house_confirmation=True + ).values('killhouse_user_id').annotate( + total_quantity=Sum('ware_house_accepted_real_weight') + ) + + products = RolesProducts.objects.filter( + trash=False, + kill_house__in=kill_houses + ).values('kill_house_id', 'total_remain_weight') + + steward_dict = {item['kill_house_id']: item['total_quantity'] for item in steward_allocations} + free_bar_dict = {item['kill_house_id']: item['total_quantity'] for item in free_bars} + in_province_dict = {item['killhouse_user_id']: item['total_quantity'] for item in in_province_data} + in_warehouse_dict = {item['killhouse_user_id']: item['total_quantity'] for item in in_warehouse_data} + product_dict = {item['kill_house_id']: item['total_remain_weight'] for item in products} + + bar_assigment_true_count1 = kill_house_request.filter(assignment_state_archive='True') + bar_document_status_rejected1 = bar_assigment_true_count1.exclude( + bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + + percent_bar_document_status_rejected_all = int((bar_document_status_rejected1 / + bar_assigment_true_count1.count()) * 100) if \ + bar_assigment_true_count1.count() > 0 else 0 + + management_kill_house_data = [] + for kh in kill_houses: + kh_id = kh.id + + steward_qty = steward_dict.get(kh_id, 0) or 0 + free_bar_qty = free_bar_dict.get(kh_id, 0) or 0 + in_province_qty = in_province_dict.get(kh_id, 0) or 0 + in_warehouse_qty = in_warehouse_dict.get(kh_id, 0) or 0 + product_weight = product_dict.get(kh_id, 0) or 0 + + if any([in_province_qty, in_warehouse_qty, steward_qty, free_bar_qty]): + total = free_bar_qty + steward_qty + percent = round(total * 100 / in_province_qty, 1) if in_province_qty else 0 + + management_kill_house_data.append({ + 'name': kh.name, + 'in_province_quantity': to_locale_str(in_province_qty), + 'in_ware_house_quantity': to_locale_str(in_warehouse_qty), + 'steward_allocation_quantity': to_locale_str(steward_qty), + 'kill_house_free_bar_quantity': to_locale_str(free_bar_qty), + 'all_quantity': to_locale_str(total), + 'product': to_locale_str(product_weight), + 'percent': percent + }) + for kh in kill_houses: + kill_house_request1 = kill_house_request.filter( + killhouse_user=kh + ) + + bar_assigment_true_count = kill_house_request1.filter(assignment_state_archive='True') + bar_assigment_pending_count = kill_house_request1.filter(assignment_state_archive='pending').count() + bar_document_status_accepted = bar_assigment_true_count.filter( + bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + bar_document_status_rejected = bar_assigment_true_count.exclude( + bar_document_status__title__in=('تایید شده بدون کیفیت', 'تایید شد')).count() + + if bar_assigment_true_count.count() > 0 or bar_assigment_pending_count > 0: + duc_kill_house_data.append({ + 'name': kh.name, + 'kill_house_request1_count': kill_house_request1.count(), + "bar_assigment_true_count": bar_assigment_true_count.count(), + "bar_assigment_pending_count": bar_assigment_pending_count, + "bar_document_status_accepted": bar_document_status_accepted, + "percent_bar_document_status_accepted": int((bar_document_status_accepted / + bar_assigment_true_count.count()) * 100) if + bar_assigment_true_count.count() > 0 else 0, + "bar_document_status_rejected": bar_document_status_rejected, + "percent_bar_document_status_rejected": int((bar_document_status_rejected / + bar_assigment_true_count.count()) * 100) if + bar_assigment_true_count.count() > 0 else 0, + + }) + + font_config = FontConfiguration() + + html_content = render_to_string('summary_report.html', { # noqa + 'number': 1234, + 'province': province, + "date": shamsi_date(datetime.datetime.now().date(), in_value=True), + "date1": request.GET['date1'], + "date2": request.GET['date2'], + "from_date": shamsi_date(date1), + "to_date": shamsi_date(date2), + "out_kill_house_top": out_kill_house_top, + "out_weight_top": out_weight_top, + "free_bars_weight_top": free_bars_weight_top, + "free_bars_kill_house_top": free_bars_kill_house_top, + "steward_sum_weight_sale": to_locale_str(sum(steward_dict.values())), + "free_bar_sum_weight_sale": to_locale_str(sum(free_bar_dict.values())), + "poultry_count": len(poultry_hatching.values_list('poultry', flat=True).distinct()), + "chain_count": len( + poultry_hatching.filter(Q(UnionTypeName='زنجیره') | + Q(chain_company__isnull=False)).values_list('poultry', flat=True).distinct()), + "poultry_hatching_quantity": to_locale_str(aggregate_hatching['total_quantity'] or 0), + "poultry_hatching_total_losses": to_locale_str(aggregate_hatching['total_losses'] or 0), + "poultry_hatching_killed_quantity": to_locale_str(aggregate_hatching['killed_quantity'] or 0), + "poultry_hatching_left_over": to_locale_str(aggregate_hatching['left_over'] or 0), + "poultry_hatching_gt_60": len(poultry_hatching_gt_60.values_list('poultry', flat=True).distinct()), + "poultry_hatching_gt_60_quantity": to_locale_str(aggregate_poultry_hatching_gt_60['total_quantity'] or 0), + "poultry_hatching_gt_60_left_over": round(((aggregate_poultry_hatching_gt_60['left_over'] or 0) / + (aggregate_poultry_hatching_gt_60['total_quantity'] or 0) * 100, + 1) if + (aggregate_poultry_hatching_gt_60['total_quantity'] or 0) < 0 else + 0), + "max_age_poultry": to_locale_str(max_age_poultry.chicken_age or 0), + "max_age_poultry_name": max_age_poultry.poultry.unit_name or '-', + "max_age_poultry_city": max_age_poultry.poultry.user.city.name if max_age_poultry.poultry.user.city else '-', + "min_age_poultry": to_locale_str(min_age_poultry.chicken_age or 0), + "min_age_poultry_name": min_age_poultry.poultry.unit_name or '-', + "min_age_poultry_city": min_age_poultry.poultry.user.city.name if min_age_poultry.poultry.user.city else '-', + + "kill_house_request_count": to_locale_str(aggregate_kill_house_request['id'] or 0), + "kill_house_request_quantity": to_locale_str(aggregate_kill_house_request['accepted_real_quantity'] or 0), + "kill_house_request_weight": to_locale_str(aggregate_kill_house_request['accepted_real_weight'] or 0), + "kill_house_request_average_weight": round( + aggregate_kill_house_request['accepted_real_weight'] / aggregate_kill_house_request[ + 'accepted_real_quantity'], 1) + if (aggregate_kill_house_request['accepted_real_quantity'] or 0) > 0 else 0, + "free_bars_count": to_locale_str(aggregate_free_bars['id'] or 0), + "free_bars_quantity": to_locale_str(aggregate_free_bars['quantity'] or 0), + "free_bars_live_weight": to_locale_str(aggregate_free_bars['live_weight'] or 0), + "kill_house_name": kill_house_name, + "transaction_count": transaction_count, + "persian_date": persian_date, + "transaction_count_req": transaction_count_req, + "daily_quantity": daily_quantity, + 'kill_houses_data': kill_house_data, + 'kill_house_name_req': kill_house_name_req, + 'poultry_req_name_req': poultry_req_name_req, + 'top_poultry_req_stats_total_quantity': top_poultry_req_stats_total_quantity, + 'poultry_city_req_name_req': poultry_city_req_name_req, + 'out_poultry_req_name_req': out_poultry_req_name_req, + 'out_poultry_city_req_name_req': out_poultry_city_req_name_req, + 'out_poultry_province_req_name_req': out_poultry_province_req_name_req, + 'out_top_poultry_req_stats_total_quantity': out_top_poultry_req_stats_total_quantity, + 'management_kill_house_data': management_kill_house_data, + 'duc_kill_house_data': duc_kill_house_data, + 'avg_losses': to_locale_str(int((aggregate_hatching['total_losses'] or 0) / poultry_hatching.count())), + 'avg_total_killed_weight': round( + (aggregate_hatching['total_killed_weight'] or 0) / (aggregate_hatching['killed_quantity'] or 0), 1), + 'total_killing_ave_age': int(aggregate_hatching['total_killing_ave_age'] or 0), + 'top_total_killed_weight': to_locale_str(top_total_killed_weight_first['total_killed_weight'] or 0), + 'total_quantity_top_inner': to_locale_str(total_quantity_top_inner), + 'total_quantity_top_out': total_quantity_top_out, + 'bar_assigment_pending_count1': to_locale_str(bar_assigment_pending_count1 or 0), + 'base_url': base_url_for_sms_report, + 'percent_bar_document_status_rejected_all': percent_bar_document_status_rejected_all, + + }) + + html = HTML(string=html_content, base_url=request.build_absolute_uri()) # noqa + css = CSS(string=''' + ''', font_config=font_config) + + pdf_file = io.BytesIO() + html.write_pdf(pdf_file, stylesheets=[css], font_config=font_config) + pdf_file.seek(0) + + response = HttpResponse(pdf_file, content_type='application/pdf') + filename = 'عملکرد کشتار زنجیره.pdf' + encoded_filename = quote(filename) # کدگذاری نام فایل برای URL + response['Content-Disposition'] = f'attachment; filename*=UTF-8\'\'{encoded_filename}' + return response + + +def hatching_detail_pdf(request): + if base_url_for_sms_report == 'ha': + province = 'همدان' + elif base_url_for_sms_report == 'ku': + province = 'کردستان' + elif base_url_for_sms_report == 'ma': + province = 'مرکزی' + elif base_url_for_sms_report == 'bu': + province = 'بوشهر' + else: + province = 'تست' + hatching = PoultryHatching.objects.filter( + trash=False, + key=request.GET['key'] + ).select_related('poultry').first() + ser_data = PoultryHatchingForDetailsSerializer(hatching).data + kill_requests = KillHouseRequest.objects.filter( + trash=False, + province_request__poultry_request__hatching=hatching, + ware_house_confirmation=True + ).select_related( + 'killhouse_user', + 'killer', + 'province_request', + 'province_request__poultry_request', + 'kill_request' + ).order_by('-create_date') + ser_data_kill_request = KillHouseRequestForHatchingDetailSerializer(kill_requests, many=True).data + + poultry_requests = PoultryRequest.objects.filter(hatching=hatching, trash=False, + state_process__in=('pending', 'accepted'), + province_state__in=('pending', 'accepted'), out=True, + out_province_request_cancel=False, + temporary_trash=False, + temporary_deleted=False) + + ser_data_poultry_request = PoultryRequestForHatchingDetailSerializer(poultry_requests, many=True).data + + chain_allocation = ChainAllocation.objects.filter(trash=False, state='accepted', poultry_hatching=hatching) + ser_data_chain_allocation = ChainAllocationForHatchingDetailSerializer(chain_allocation, many=True).data + + evacuation_reports = [] + if hatching: + detail_qs = hatching.evacuation_details.filter(trash=False).order_by('-ReportDate', '-create_date') + evacuation_reports = EvacuationHatchingDetailSerializer(detail_qs, many=True).data + + poultry_hatching_licence_number = hatching.licence_number + response = requests.post( + f'https://rsibackend.rasadyar.com/app/send_different_bar_with_licence_number/?' + f'licence_number={poultry_hatching_licence_number}' + f'&date1={None}&date2={None}', + headers={'Content-Type': 'application/json'} + ) + + kill_requests_non_receipt = KillHouseRequest.objects.filter( + trash=False, + province_request__poultry_request__hatching=hatching, + non_receipt=True, main_non_receipt=True + ).select_related( + 'killhouse_user', + 'killer', + 'province_request', + 'province_request__poultry_request', + 'kill_request' + ).order_by('-create_date') + ser_data_non_receipt_kill_request = KillHouseRequestForHatchingDetailSerializer(kill_requests_non_receipt, + many=True).data + bar_requests = BarDifferenceRequest.objects.filter(trash=False, + state='accepted', hatching=hatching).order_by('id') + bar_request_serilizer = BarDifferenceRequestSerializer(bar_requests, many=True).data + + hatching_increase = HatchingIncreaseRequest.objects.filter(trash=False, hatching=hatching).order_by('-date') + hatching_increase_serilizer = HatchingIncreaseRequestSerializer(hatching_increase, many=True).data + filters = { + 'archive_wage': False, + 'state__in': ('pending', 'accepted'), + 'first_car_allocated_quantity': 0 + } + return_province_kill_requests = ProvinceKillRequest.objects.filter( + Q(trash=False, return_to_province=True) | Q(trash=True, return_trash=True), **filters, + province_request__poultry_request__hatching=hatching).order_by('id') + return_province_kill_requests_serializer = ReturnProvinceKillRequestSerializer(return_province_kill_requests, + many=True).data + + kill_house_requests_return = KillHouseRequest.objects.filter( + Q(non_receipt=True, main_non_receipt=True, non_receipt_state='accepted') | Q(trash=True, return_trash=True), + province_request__poultry_request__hatching=hatching) + kill_house_requests_return_serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests_return, + many=True).data + font_config = FontConfiguration() + + html_content = render_to_string('poultry_datail.html', { # noqa + 'province': province, + "shamsi_date": shamsi_date(datetime.datetime.now().date(), in_value=True), + "hatching_date": shamsi_date(hatching.date, in_value=True), + "create_date_hatching": shamsi_date(hatching.create_date, in_value=True), + "predicate_date_hatching": shamsi_date(hatching.predicate_date, + in_value=True) if hatching.predicate_date else '-', + **ser_data, + "bars": ser_data_kill_request[:20] if len(ser_data_kill_request) > 20 else ser_data_kill_request, + "bars2": ser_data_kill_request[20:] if len(ser_data_kill_request) > 20 else None, + 'outBars': ser_data_poultry_request[:20] if len(ser_data_poultry_request) > 20 else ser_data_poultry_request, + 'outBars2': ser_data_poultry_request[20:] if len(ser_data_poultry_request) > 20 else None, + 'chainAllocation': ser_data_chain_allocation[20:] if len( + ser_data_chain_allocation) > 20 else ser_data_chain_allocation, + 'chainAllocation2': ser_data_chain_allocation[20:] if len(ser_data_chain_allocation) > 20 else None, + 'percent_rasadyar1': round( + ((ser_data['killed_quantity'] + ser_data['total_losses']) * 100) / ser_data['quantity']) + if ser_data['quantity'] > 0 else 0, + 'active_kill1': 'دارد' if ser_data['active_kill']['active_kill'] else 'ندارد', + "differentBars": response.json()[:20], + "differentBars2": response.json()[20:], + "nonReceipt": ser_data_non_receipt_kill_request, + "returnProvinceRequest": return_province_kill_requests_serializer, + "returnKillHouseRequest": kill_house_requests_return_serializer, + "killingDifference": bar_request_serilizer, + "hatchingIncrease": hatching_increase_serilizer, + "evacuation_reports": evacuation_reports, + + }) + + html = HTML(string=html_content, base_url=request.build_absolute_uri()) # noqa + css = CSS(string=''' + ''', font_config=font_config) + + pdf_file = io.BytesIO() + html.write_pdf(pdf_file, stylesheets=[css], font_config=font_config) + pdf_file.seek(0) + + response = HttpResponse(pdf_file, content_type='application/pdf') + filename = 'عملکرد کشتار زنجیره.pdf' + encoded_filename = quote(filename) # کدگذاری نام فایل برای URL + response['Content-Disposition'] = f'attachment; filename*=UTF-8\'\'{encoded_filename}' + return response + + +def poultry_science_report_pdf(request): + """ + تولید PDF گزارش بازرسی مرغداری + ساختار JSON بر اساس کد React: + - generalConditionHall, casualties, technicalOfficer + - inputStatus, infrastructureEnergy, facilities, hr + - inspectionNotes, inspectionStatus + """ + font_config = FontConfiguration() + report = PoultryScienceReport.objects.filter( + trash=False, + key=request.GET['key'] + ).select_related( + 'hatching', + 'hatching__poultry', + 'hatching__poultry__user', + 'hatching__poultry__user__city', + 'hatching__poultry__address', + 'poultry_science', + 'poultry_science__user', + 'user' + ).first() + + if not report: + return HttpResponse("گزارش یافت نشد", status=404) + + report_data = report.report_information or {} + hatching = report.hatching + poultry = hatching.poultry if hatching else None + + # استخراج بخش‌های مختلف JSON (با snake_case) + general_condition = report_data.get('general_condition_hall', {}) or {} + casualties = report_data.get('casualties', {}) or {} + technical_officer = report_data.get('technical_officer', {}) or {} + input_status_data = report_data.get('input_status', {}) or {} + infrastructure_energy = report_data.get('infrastructure_energy', {}) or {} + facilities = report_data.get('facilities', {}) or {} + hr = report_data.get('hr', {}) or {} + + # تابع کمکی برای مقادیر + def safe_get(data, key, default='---'): + if not isinstance(data, dict): + return default + value = data.get(key) + return value if value not in [None, '', 'null'] else default + + def format_number(value): + if value is None: + return '---' + try: + return f"{int(value):,}" + except (ValueError, TypeError): + return str(value) if value else '---' + + # اطلاعات سربرگ + inspection_date = shamsi_date(report.date, in_value=True) if report.date else '---' + report_id = report.report_id or '---' + unit_name = poultry.unit_name if poultry else '---' + breeding_unique_id = poultry.breeding_unique_id if poultry else '---' + licence_number = hatching.licence_number if hatching else '---' + city = poultry.user.city.name if poultry and poultry.user and poultry.user.city else '---' + hatching_date = shamsi_date(hatching.date, in_value=True) if hatching and hatching.date else '---' + initial_quantity = format_number(hatching.quantity) if hatching else '---' + + # وضعیت بازرسی + status_map = {'pending': 'در انتظار', 'accepted': 'تایید شده', 'rejected': 'رد شده'} + inspection_status = status_map.get(report.state, report.state or 'در انتظار') + + # === بخش اطلاعات (informationData) === + health_permit = poultry.health_certificate_number if poultry and hasattr(poultry, + 'health_certificate_number') else '---' + epidemiological_code = poultry.epidemiological_code if poultry and hasattr(poultry, + 'epidemiological_code') else '---' + permit_validity = format_number(poultry.operating_licence_capacity) if poultry and hasattr(poultry, + 'operating_licence_capacity') else '---' + tenant_status = hatching.InteractTypeName if hatching and hatching.InteractTypeName else ( + 'دارد' if (hatching and hasattr(hatching, 'has_tenant') and hatching.has_tenant) else 'ندارد') + owner_name = poultry.user.fullname if poultry and poultry.user else '---' + ownership_type = hatching.InteractTypeName if hatching else '---' + owner_national_code = (poultry.user.national_id if hasattr(poultry.user, 'national_id') and poultry.user.national_id + else (poultry.user.national_code if hasattr(poultry.user, + 'national_code') else '---')) if poultry and poultry.user else '---' + province = poultry.address.province.name if poultry and poultry.address and hasattr(poultry.address, + 'province') and poultry.address.province else '---' + coordinates = f"{report.lat}, {report.log}" if report.lat and report.log else ( + f"{poultry.Lat}, {poultry.Long}" if poultry and hasattr(poultry, 'Lat') and poultry.Lat else '---') + owner_mobile = poultry.user.mobile if poultry and poultry.user else '---' + nominal_capacity = format_number(poultry.total_capacity) if poultry and hasattr(poultry, + 'total_capacity') else '---' + vet_quantity = format_number(hatching.quantity) if hatching else '---' + self_declared_quantity = format_number(hatching.quantity) if hatching else '---' + chick_source = safe_get(casualties, 'source_of_hatching') + chicken_age = f"{hatching.chicken_age} روز" if hatching and hatching.chicken_age else '---' + breed_type = hatching.chicken_breed if hatching else '---' + + # === بخش پایش سلامت (healthMonitoringData) === + health_status = safe_get(general_condition, 'health_status') + ventilation_status = safe_get(general_condition, 'ventilation_status') + bedding_status = safe_get(general_condition, 'bed_condition') + temperature_humidity = f"{general_condition.get('temperature')} درجه" if general_condition.get( + 'temperature') else '---' + water_quality = safe_get(general_condition, 'drinking_water_quality') + water_source = safe_get(general_condition, 'drinking_water_source') + normal_losses = format_number(casualties.get('normal_losses')) if casualties.get( + 'normal_losses') is not None else '---' + abnormal_losses = format_number(casualties.get('abnormal_losses')) if casualties.get( + 'abnormal_losses') is not None else '---' + abnormal_losses_reason = safe_get(casualties, 'cause_abnormal_losses') + disease_type = safe_get(casualties, 'type_disease') + sampling_done = 'بله' if casualties.get('sampling_done') else 'خیر' + sample_type = safe_get(casualties, 'type_sampling') + health_responsible = safe_get(technical_officer, 'technical_health_officer') + engineering_responsible = safe_get(technical_officer, 'technical_engineering_officer') + + # === بخش زیرساخت (infrastructureData) === + input_status = safe_get(input_status_data, 'input_status') + feed_type = safe_get(input_status_data, 'type_of_grain') + feed_quality = safe_get(input_status_data, 'grade_grain') + inventory_until_visit = safe_get(input_status_data, 'inventory_until_visit') + warehouse_inventory = safe_get(input_status_data, 'inventory_in_warehouse') + tracking_code = safe_get(input_status_data, 'tracking_code') + company_name = safe_get(input_status_data, 'company_name') + generator_type = safe_get(infrastructure_energy, 'generator_type') + generator_model = safe_get(infrastructure_energy, 'generator_model') + generator_count = safe_get(infrastructure_energy, 'generator_count') + fuel_type = safe_get(infrastructure_energy, 'fuel_type') + generator_capacity = format_number(infrastructure_energy.get('generator_capacity')) + emergency_fuel = format_number(infrastructure_energy.get('emergency_fuel_inventory')) + power_cut_history = 'بله' if infrastructure_energy.get('has_power_cut_history') else 'خیر' + power_cut_duration = f"{infrastructure_energy.get('power_cut_duration')} ساعت" if infrastructure_energy.get( + 'power_cut_duration') else '---' + power_cut_hour = safe_get(infrastructure_energy, 'power_cut_hour') + generator_status = safe_get(infrastructure_energy, 'generator_performance') + additional_notes = safe_get(infrastructure_energy, 'additional_notes') + + # نیروی انسانی + employee_count = safe_get(hr, 'number_employed') + local_employee_count = safe_get(hr, 'number_indigenous') + non_local_employee_count = safe_get(hr, 'number_non_indigenous') + worker_contract_status = safe_get(hr, 'contract_status') + health_training = 'بله' if hr.get('trained') else 'خیر' + + # تسهیلات + active_facilities = 'بله' if facilities.get('has_facilities') else 'خیر' + facility_type = safe_get(facilities, 'type_of_facility') + facility_amount = format_number(facilities.get('amount')) + repayment_status = safe_get(facilities, 'repayment_status') + new_request = safe_get(facilities, 'request_facilities') + facility_date = shamsi_date(facilities.get('date')) if facilities.get('date') else '---' + + # مستندات + hall_images = general_condition.get('images', []) or [] + warehouse_images = input_status_data.get('images', []) or [] + losses_images = casualties.get('images', []) or [] + violation_images = hatching.violation_image if hatching and hasattr(hatching, + 'violation_image') and hatching.violation_image else [] + + # توصیه‌ها + recommendations = report_data.get('inspection_notes', '---') or '---' + inspection_status_text = report_data.get('inspection_status', '---') or '---' + + # احراز مسئول سالن (از vet_farm جوجه‌ریزی) + vet_farm = None + if hatching: + from panel.models import VetFarm + vet_farm = VetFarm.objects.filter(poultry=poultry, trash=False).first() + + hall_responsible_present = 'بله' if (vet_farm and vet_farm.vet and vet_farm.vet.user) else 'خیر' + hall_responsible_name = vet_farm.vet.user.fullname if vet_farm and vet_farm.vet and vet_farm.vet.user else '---' + hall_responsible_phone = vet_farm.vet.user.mobile if vet_farm and vet_farm.vet and vet_farm.vet.user else '---' + + html_content = render_to_string('poultry_science_report.html', { + # سربرگ + 'inspection_date': inspection_date, + 'report_id': report_id, + 'unit_name': unit_name, + 'breeding_unique_id': breeding_unique_id, + 'licence_number': licence_number, + 'city': city, + 'hatching_date': hatching_date, + 'initial_quantity': initial_quantity, + 'inspection_status': inspection_status, + + # اطلاعات واحد + 'health_permit': health_permit, + 'hatching_licence': licence_number, + 'epidemiological_code': epidemiological_code, + 'permit_validity': permit_validity, + 'tenant_status': tenant_status, + 'owner_name': owner_name, + 'ownership_type': ownership_type, + 'owner_national_code': owner_national_code, + 'province': province, + 'coordinates': coordinates, + 'owner_mobile': owner_mobile, + 'nominal_capacity': nominal_capacity, + 'vet_quantity': vet_quantity, + 'self_declared_quantity': self_declared_quantity, + 'chick_source': chick_source, + 'chicken_age': chicken_age, + 'breed_type': breed_type, + + # پایش سلامت + 'health_status': health_status, + 'ventilation_status': ventilation_status, + 'bedding_status': bedding_status, + 'temperature_humidity': temperature_humidity, + 'water_quality': water_quality, + 'water_source': water_source, + 'normal_losses': normal_losses, + 'abnormal_losses': abnormal_losses, + 'abnormal_losses_reason': abnormal_losses_reason, + 'disease_type': disease_type, + 'sampling_done': sampling_done, + 'sample_type': sample_type, + 'health_responsible': health_responsible, + 'engineering_responsible': engineering_responsible, + + # زیرساخت + 'input_status': input_status, + 'feed_type': feed_type, + 'feed_quality': feed_quality, + 'inventory_until_visit': inventory_until_visit, + 'warehouse_inventory': warehouse_inventory, + 'tracking_code': tracking_code, + 'company_name': company_name, + 'generator_type': generator_type, + 'generator_model': generator_model, + 'generator_count': generator_count, + 'fuel_type': fuel_type, + 'generator_capacity': generator_capacity, + 'emergency_fuel': emergency_fuel, + 'power_cut_history': power_cut_history, + 'power_cut_duration': power_cut_duration, + 'power_cut_hour': power_cut_hour, + 'generator_status': generator_status, + 'additional_notes': additional_notes, + + # نیروی انسانی + 'employee_count': employee_count, + 'local_employee_count': local_employee_count, + 'non_local_employee_count': non_local_employee_count, + 'worker_contract_status': worker_contract_status, + 'health_training': health_training, + 'active_facilities': active_facilities, + 'facility_type': facility_type, + 'facility_amount': facility_amount, + 'repayment_status': repayment_status, + 'new_request': new_request, + 'facility_date': facility_date, + + # مستندات + 'hall_images': hall_images, + 'warehouse_images': warehouse_images, + 'losses_images': losses_images, + 'violation_images': violation_images, + + # توصیه‌ها و احراز + 'recommendations': recommendations, + 'inspection_status_text': inspection_status_text, + 'hall_responsible_present': hall_responsible_present, + 'hall_responsible_name': hall_responsible_name, + 'hall_responsible_phone': hall_responsible_phone, + }) + + html = HTML(string=html_content, base_url=request.build_absolute_uri()) + css = CSS(string='', font_config=font_config) + + pdf_file = io.BytesIO() + html.write_pdf(pdf_file, stylesheets=[css], font_config=font_config) + pdf_file.seek(0) + + response = HttpResponse(pdf_file, content_type='application/pdf') + filename = f'گزارش بازرسی {report_id}.pdf' + encoded_filename = quote(filename) + response['Content-Disposition'] = f'attachment; filename*=UTF-8\'\'{encoded_filename}' + return response diff --git a/province_orderid.py b/province_orderid.py new file mode 100644 index 0000000..2913609 --- /dev/null +++ b/province_orderid.py @@ -0,0 +1,5 @@ +test_order_id=10 +sha_order_id=15 +ha_order_id=18 +ar_order_id=91 +ma_order_id=47 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b5a5296 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,92 @@ +aiohttp==3.8.3 +aiosignal==1.3.1 +amqp==5.1.1 +asgiref==3.4.1 +async-timeout==4.0.2 +attrs==23.1.0 +backports.weakref==1.0.post1 +billiard==3.6.4.0 +boto3==1.22.2 +botocore==1.25.2 +beautifulsoup4==4.12.3 +cached-property==1.5.2 +celery==5.2.7 +certifi==2021.10.8 +cffi==1.15.0 +charset-normalizer==2.0.12 +click==8.1.3 +click-didyoumean==0.3.0 +click-plugins==1.1.1 +click-repl==0.2.0 +crypto==1.4.1 +cryptocode==0.1 +cryptography==36.0.2 +Deprecated==1.2.13 +Django==3.2.13 +django-cors-headers==3.10.1 +django-debug-toolbar==3.2.4 +django-environ==0.9.0 +django-extensions==3.1.5 +django-filter==21.1 +django-jalali==5.1.0 +django-oauth-toolkit==1.7.1 +django-oauth2-provider==0.2.6.1 +django-redis==5.2.0 +django-split-settings==1.2.0 +django-url-filter==0.3.15 +djangorestframework==3.13.1 +djangorestframework-recursive==0.1.2 +docopt==0.6.2 +enum-compat==0.0.3 +et-xmlfile==1.1.0 +frozenlist==1.3.3 +gunicorn==20.1.0 +idna==3.3 +importlib-metadata==4.8.3 +jdatetime==3.8.2 +jmespath==0.10.0 +jwcrypto==1.0 +kombu==5.2.4 +multidict==6.0.4 +Naked==0.1.31 +num2fawords==1.1 +oauth2-provider==0.0 +oauthlib==3.2.0 +openpyxl==3.1.2 +packaging==21.3 +Pillow==9.2.0 +prompt-toolkit==3.0.38 +psycopg2-binary==2.9.3 +pyasn1==0.4.8 +pycparser==2.21 +pycryptodomex==3.14.1 +pyOpenSSL==22.0.0 +pyparsing==3.0.8 +python-dateutil==2.8.2 +pytz==2022.1 +PyYAML==6.0 +python-dotenv +redis==4.2.2 +requests==2.27.1 +rsa==4.8 +s3transfer==0.5.2 +schedule==1.1.0 +semantic-version==2.9.0 +setuptools-rust==1.1.2 +shellescape==3.8.1 +shortuuid==1.0.8 +six==1.16.0 +sqlparse==0.4.2 +suds==1.1.1 +tablib==3.2.1 +typing-extensions==4.1.1 +urllib3==1.26.9 +vine==5.0.0 +wcwidth==0.2.6 +wrapt==1.14.0 +weasyprint==65.1 +xlrd==2.0.1 +XlsxWriter==3.0.3 +yarl==1.9.2 +zipp==3.6.0 +utm==0.7.0 \ No newline at end of file diff --git a/samasat_cron.py b/samasat_cron.py new file mode 100644 index 0000000..6ec5322 --- /dev/null +++ b/samasat_cron.py @@ -0,0 +1,10 @@ +import os +import django + + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "KuChicken.settings") + +django.setup() +from ticket.views import bot_eitaa_for_bar + +bot_eitaa_for_bar() diff --git a/static/assets/fonts/BNaznnBd.ttf b/static/assets/fonts/BNaznnBd.ttf new file mode 100644 index 0000000..8adddd0 Binary files /dev/null and b/static/assets/fonts/BNaznnBd.ttf differ diff --git a/static/assets/fonts/btitrb.ttf b/static/assets/fonts/btitrb.ttf new file mode 100644 index 0000000..b44e297 Binary files /dev/null and b/static/assets/fonts/btitrb.ttf differ diff --git a/static/assets/fonts/nazanin.ttf b/static/assets/fonts/nazanin.ttf new file mode 100644 index 0000000..bcc1f75 Binary files /dev/null and b/static/assets/fonts/nazanin.ttf differ diff --git a/static/assets/fonts/tits.ttf b/static/assets/fonts/tits.ttf new file mode 100644 index 0000000..b44e297 Binary files /dev/null and b/static/assets/fonts/tits.ttf differ diff --git a/static/assets/img/bazrasi.png b/static/assets/img/bazrasi.png new file mode 100644 index 0000000..ff08f88 Binary files /dev/null and b/static/assets/img/bazrasi.png differ diff --git a/static/assets/img/bg.png b/static/assets/img/bg.png new file mode 100644 index 0000000..5ad6f70 Binary files /dev/null and b/static/assets/img/bg.png differ diff --git a/static/assets/img/blue_bg.png b/static/assets/img/blue_bg.png new file mode 100644 index 0000000..ecb993a Binary files /dev/null and b/static/assets/img/blue_bg.png differ diff --git a/static/assets/img/killhouse.png b/static/assets/img/killhouse.png new file mode 100644 index 0000000..7d122d5 Binary files /dev/null and b/static/assets/img/killhouse.png differ diff --git a/static/assets/img/poultry.png b/static/assets/img/poultry.png new file mode 100644 index 0000000..03f78a7 Binary files /dev/null and b/static/assets/img/poultry.png differ diff --git a/static/assets/img/summary_report.png b/static/assets/img/summary_report.png new file mode 100644 index 0000000..c864be0 Binary files /dev/null and b/static/assets/img/summary_report.png differ diff --git a/static/css/styles.css b/static/css/styles.css new file mode 100644 index 0000000..575fa7c --- /dev/null +++ b/static/css/styles.css @@ -0,0 +1,199 @@ +@font-face { + font-family: "nazaninb"; + src: local("nazaninb"), url("/static/assets/fonts/BNaznnBd.ttf") format("truetype"); +} +@font-face { + font-family: "btitr"; + src: local("btitr"), url("/static/assets/fonts/btitrb.ttf") format("truetype"); +} +@font-face { + font-family: "nazanin"; + src: local("nazanin"), url("/static/assets/fonts/nazanin.ttf") format("truetype"); +} + +@page { + margin: 3mm; +} + +p { + font-size: 15px; + font-weight: 700; + font-family: nazanin; + +} +.nazanin-bold { + font-size: 16px; + font-weight: 700; + line-height: 23px !important; + font-family: nazaninb; + +} +.nazanin-bold-justify { + font-size: 16px; + font-weight: 700; + font-family: nazaninb; + line-height:8mm !important; + size:20pt; + text-align: justify !important; + +} + +body { + display: grid; + justify-content: center; + font-family: nazaninb; + margin: 0; + padding: 0; + background-color: #f0f0f0; + line-height: 15px; + +} + +.a4-container { + margin: 0; + width: 203.55mm; + height: 291mm; + background-image: url("/static/assets/img/bg.png"); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + position: relative; +} + +.text-overlay { + position: absolute; + top: 17mm; + right: 14mm; + left: 14mm; + font-size: 9pt; + color: #000; + padding: 10px; + border-radius: 5px; + text-align: center; + direction: rtl; + + +} + +.pagination { + position: absolute; + bottom: 7px; + left: 50%; + text-align: center; + padding: 5px; + border-radius: 50%; +} + +.page-number { + font-size: 14px; + text-align: center; +} + +.titles { + display: grid; + position: absolute; + left: 12mm; + color: #000; + font-size: 14px; + border-radius: 5px; + padding: 5px; + gap: 10px; +} + +.title { + font-size: 17px; + font-weight: 900; + text-align: center !important; +} + +.inner-title-titr { + font-size: 16px; + font-weight: 600; + text-align: right !important; + line-height: 13px; + margin-top: 30px; + font-family: btitr; + + +} +.inner-title { + font-size: 16px; + font-weight: 600; + text-align: right !important; + line-height: 13px; + margin-top: 30px; + font-family: nazaninb; + + +} + +.a4-container p { + text-align: right; + line-height: 10px; + + + +} + +.right-signature { + text-align: right !important; +} + +.left-signature { + text-align: left !important; +} + + +.highlight { + background-color: #ffeaa7; + font-weight: bold; +} + +table { + width: 100%; + border-collapse: collapse; + margin-top: 25px; + background: transparent; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +th, td { + border: 1px solid #ddd; + padding: 8px 10px; + text-align: center; + font-size: 12px; + background-color: transparent; +} + +th { + background-color: #38b589; + color: white; + font-weight: normal; + text-align: center; +} +.custom-h1 { + background-color: #4665AE; + color: white; + font-weight: normal; + text-align: center; +} + +.confirm-box { + display: inline-block; + padding: 15px; + margin: 30px; + text-align: center; + font-family: nazaninb; + min-height: 150px; + vertical-align: top; + position: relative; +} + +.resize-image { + width: 140px; +} + +.header_nazar { + line-height: 20px !important; + +} diff --git a/static/css/styles_for_hatching_detail.css b/static/css/styles_for_hatching_detail.css new file mode 100644 index 0000000..09520e1 --- /dev/null +++ b/static/css/styles_for_hatching_detail.css @@ -0,0 +1,284 @@ +@font-face { + font-family: "nazaninb"; + src: local("nazaninb"), url("/static/assets/fonts/BNaznnBd.ttf") format("truetype"); +} + +@font-face { + font-family: "btitr"; + src: local("btitr"), url("/static/assets/fonts/btitrb.ttf") format("truetype"); +} + +@font-face { + font-family: "nazanin"; + src: local("nazanin"), url("/static/assets/fonts/nazanin.ttf") format("truetype"); +} + +@page { + margin: 3mm; +} + +p { + font-size: 15px; + font-weight: 700; + font-family: nazanin; + +} + +.nazanin-bold { + font-size: 16px; + font-weight: 700; + line-height: 23px !important; + font-family: nazaninb; + +} + +.nazanin-bold-justify { + font-size: 16px; + font-weight: 700; + font-family: nazaninb; + line-height: 8mm !important; + size: 20pt; + text-align: justify !important; + +} + +body { + display: grid; + justify-content: center; + font-family: nazaninb; + margin: 0; + padding: 0; + background-color: #f0f0f0; + line-height: 15px; + +} + +.a4-container { + margin: 0; + width: 203.55mm; + height: 292mm; + background-image: url('/static/assets/img/blue_bg.png'); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + position: relative; +} + +.text-overlay { + position: absolute; + top: 17mm; + right: 14mm; + left: 14mm; + font-size: 9pt; + color: #000; + padding: 10px; + border-radius: 5px; + text-align: center; + direction: rtl; + + +} + +.pagination { + position: absolute; + bottom: 7px; + left: 50%; + text-align: center; + padding: 5px; + border-radius: 50%; +} + +.page-number { + font-size: 14px; + text-align: center; +} + +.titles { + display: grid; + position: absolute; + left: 12mm; + color: #000; + font-size: 14px; + border-radius: 5px; + padding: 5px; + gap: 10px; +} + +.title { + font-size: 17px; + font-weight: 900; + text-align: center !important; +} + +.inner-title-titr { + font-size: 16px; + font-weight: 600; + text-align: right !important; + line-height: 13px; + margin-top: 30px; + font-family: btitr; + + +} + +.inner-title { + font-size: 16px; + font-weight: 600; + text-align: right !important; + line-height: 13px; + margin-top: 30px; + font-family: nazaninb; + + +} + +.a4-container p { + text-align: right; + line-height: 10px; + + +} + +.right-signature { + text-align: right !important; +} + +.left-signature { + text-align: left !important; +} + + +.highlight { + background-color: #ffeaa7; + font-weight: bold; +} + +table { + width: 100%; + border-collapse: collapse; + margin-top: 25px; + background: transparent; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +th, td { + border: 1px solid #ddd; + padding: 4px 5px; + text-align: center; + font-size: 12px; + background-color: transparent; +} + +.chain-table-cell { + border: 1px solid #ddd; + padding: 1px 1px !important; + text-align: center; + font-size: 8px !important; + background-color: transparent; +} + +th { + background-color: #38b589; + color: white; + font-weight: normal; + text-align: center; +} + +.custom-h1 { + background-color: #4665AE; + color: white; + font-weight: normal; + text-align: center; +} + +.confirm-box { + display: inline-block; + padding: 15px; + margin: 30px; + text-align: center; + font-family: nazaninb; + min-height: 150px; + vertical-align: top; + position: relative; +} + +.resize-image { + width: 140px; +} + +.header_nazar { + line-height: 20px !important; + +} + + +.container { + display: flex; + align-items: flex-end; + position: relative; + margin: 10px; +} + +.text-element { + color: #2D5FFF; + background-color: #E0E7FF; + padding: 8px 16px; + border-radius: 4px 0 0 4px; + position: relative; + z-index: 2; + font-size: 0.9rem; + font-weight: 500; + margin-right: -3px; +} + +.line { + flex-grow: 1; + height: 2px; + background-color: #2D5FFF; + position: absolute; + bottom: 8px; + left: 0; + right: 0; +} + +.items-list { + display: flex; + flex-wrap: wrap; + direction: rtl; + justify-content: space-between; + +} + +.item { + width: 25%; + font-size: 14px; + text-align: right; + height: 60px; +} + +.item strong { + display: block; + margin-bottom: 5px; + color: #333; +} + +.item span { + display: block; +} + +@page { + @bottom-center { + content: "صفحه " counter(page) " از " counter(pages); + margin-top: -30px; + font-family: nazaninb; + } +} + + +.chain-table-cell2 { + border: 1px solid #ddd; + padding: 1px 1px !important; + text-align: center; + font-size: 6px !important; + background-color: transparent; +} \ No newline at end of file diff --git a/temp_functions.py b/temp_functions.py new file mode 100644 index 0000000..97322ae --- /dev/null +++ b/temp_functions.py @@ -0,0 +1,382 @@ + + +# ============ توابع جدید برای گزارشات پیامکی ============ + +def send_daily_slaughter_statistics_sms(): + # دریافت شماره های تلفن از دیتابیس + mobile_objects = SmsRecipient.objects.filter(is_active=True) + mobile_numbers = [obj.phone_number for obj in mobile_objects] + + # # شماره های hardcoded (اکنون از دیتابیس استفاده می شود) + # mobile_numbers = [ + # '09188176737', + # '09011110919', + # '09181112717', + # '09185914818', + # '09187040838', + # '09393946626', + # '09127687317', + # '09033073493', + # ] + + target_date = datetime.now().date() + date_shamsi = shamsi_date(target_date) + + if base_url_for_sms_report == 'ha': + province_name = 'همدان' + elif base_url_for_sms_report == 'ma': + province_name = 'مرکزی' + else: + province_name = 'تست' + + province_kill_requests = ProvinceKillRequest.objects.filter( + trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=target_date + ).aggregate( + total_orders=Sum('id'), + total_quantity=Sum('total_killed_quantity'), + total_live_weight=Sum('total_killed_weight'), + ) + + orders_count = ProvinceKillRequest.objects.filter( + trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=target_date + ).count() + + total_quantity = province_kill_requests['total_quantity'] or 0 + total_live_weight = province_kill_requests['total_live_weight'] or 0 + total_carcass_weight = int(total_live_weight * 0.75) + average_weight = round(total_live_weight / total_quantity, 1) if total_quantity > 0 else 0 + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date=target_date, + trash=False + ).aggregate( + total_quantity=Sum('accepted_real_quantity'), + total_weight=Sum('accepted_real_weight') + ) + + loads_count = KillHouseRequest.objects.filter( + kill_request__recive_date__date=target_date, + trash=False + ).count() + + loads_quantity = kill_house_requests['total_quantity'] or 0 + loads_weight = kill_house_requests['total_weight'] or 0 + + formatted_quantity = to_locale_str(int(total_quantity)) + formatted_live_weight = to_locale_str(int(total_live_weight)) + formatted_carcass_weight = to_locale_str(int(total_carcass_weight)) + formatted_loads_quantity = to_locale_str(int(loads_quantity)) + formatted_loads_weight = to_locale_str(int(loads_weight)) + + message = f'اطلاعات کشتار مرغ گوشتی مورخ {date_shamsi} استان {province_name}\n' \ + f'تعداد سفارشات: {orders_count}\n' \ + f'حجم سفارش کشتار: {formatted_quantity} قطعه\n' \ + f'وزن تقریبی زنده: {formatted_live_weight} کیلوگرم\n' \ + f'وزن تقریبی لاشه: {formatted_carcass_weight} کیلوگرم\n' \ + f'میانگین وزن زنده: {average_weight} کیلوگرم\n' \ + f'اطلاعات بارایجاد شده:\n' \ + f'تعداد بار: {loads_count}\n' \ + f'حجم بارها: {formatted_loads_quantity} قطعه\n' \ + f'وزن بارها(زنده): {formatted_loads_weight} کیلوگرم\n' \ + f'سامانه رصدیار' + + for mobile in mobile_numbers: + check_mobile = check_mobile_number(mobile) + if check_mobile: + try: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}" + f"&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + except Exception as e: + print(f"Error sending SMS to {mobile}: {str(e)}") + + +def send_daily_distribution_report_sms(): + # دریافت شماره های تلفن از دیتابیس + mobile_objects = SmsRecipient.objects.filter(is_active=True) + mobile_numbers = [obj.phone_number for obj in mobile_objects] + + # # شماره های hardcoded (اکنون از دیتابیس استفاده می شود) + # mobile_numbers = [ + # '09188176737', + # '09011110919', + # '09181112717', + # '09185914818', + # '09187040838', + # '09393946626', + # '09127687317', + # '09033073493', + # ] + + target_date = datetime.now().date() + date_shamsi = shamsi_date(target_date) + + if base_url_for_sms_report == 'ha': + province_name = 'همدان' + elif base_url_for_sms_report == 'ma': + province_name = 'مرکزی' + else: + province_name = 'تست' + + kill_houses = KillHouse.objects.filter(out_province=False, active=True, trash=False).order_by('name') + + distribution_data = [] + total_distribution_weight = 0 + + for kill_house in kill_houses: + kill_house_allocations = StewardAllocation.objects.filter( + kill_house=kill_house, + trash=False, + receiver_state__in=('pending', 'accepted'), + to_cold_house__isnull=True, + date__date=target_date, + warehouse=True + ).aggregate( + total_weight=Sum('real_weight_of_carcasses') + ) + + allocation_weight = kill_house_allocations['total_weight'] + + if allocation_weight and allocation_weight > 0: + distribution_data.append({ + 'name': kill_house.name, + 'weight': allocation_weight + }) + total_distribution_weight += allocation_weight + + if not distribution_data: + return + + message_lines = [f'گزارش توزیع گوشت مرغ داخل استان'] + message_lines.append(f'مورخ {date_shamsi} استان {province_name}') + + for item in distribution_data: + formatted_weight = to_locale_str(int(item['weight'])) + message_lines.append(f"{item['name']}: {formatted_weight} کیلوگرم") + + message_lines.append('-------------------------') + formatted_total = to_locale_str(int(total_distribution_weight)) + message_lines.append(f'مجموع کل توزیع: {formatted_total} کیلوگرم') + message_lines.append('سامانه رصدیار') + + message = '\n'.join(message_lines) + + for mobile in mobile_numbers: + check_mobile = check_mobile_number(mobile) + if check_mobile: + try: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}" + f"&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + except Exception as e: + print(f"Error sending SMS to {mobile}: {str(e)}") + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def send_daily_distribution_report_sms_manual(request): + # دریافت شماره های تلفن از دیتابیس + mobile_objects = SmsRecipient.objects.filter(is_active=True) + mobile_numbers = [obj.phone_number for obj in mobile_objects] + + # # شماره های hardcoded (اکنون از دیتابیس استفاده می شود) + # mobile_numbers = [ + # '09188176737', + # '09011110919', + # '09181112717', + # '09185914818', + # '09187040838', + # '09393946626', + # '09127687317', + # '09033073493', + # ] + + target_date = datetime.now().date() + date_shamsi = shamsi_date(target_date) + + if base_url_for_sms_report == 'ha': + province_name = 'همدان' + elif base_url_for_sms_report == 'ma': + province_name = 'مرکزی' + else: + province_name = 'تست' + + kill_houses = KillHouse.objects.filter(out_province=False, active=True, trash=False).order_by('name') + + distribution_data = [] + total_distribution_weight = 0 + + for kill_house in kill_houses: + kill_house_allocations = StewardAllocation.objects.filter( + kill_house=kill_house, + trash=False, + receiver_state__in=('pending', 'accepted'), + to_cold_house__isnull=True, + date__date=target_date, + warehouse=True + ).aggregate( + total_weight=Sum('real_weight_of_carcasses') + ) + + allocation_weight = kill_house_allocations['total_weight'] + + if allocation_weight and allocation_weight > 0: + distribution_data.append({ + 'name': kill_house.name, + 'weight': allocation_weight + }) + total_distribution_weight += allocation_weight + + if not distribution_data: + return HttpResponse('هیچ توزیعی برای امروز ثبت نشده است', status=status.HTTP_200_OK) + + message_lines = [f'گزارش توزیع گوشت مرغ داخل استان'] + message_lines.append(f'مورخ {date_shamsi} استان {province_name}') + + for item in distribution_data: + formatted_weight = to_locale_str(int(item['weight'])) + message_lines.append(f"{item['name']}: {formatted_weight} کیلوگرم") + + message_lines.append('-------------------------') + formatted_total = to_locale_str(int(total_distribution_weight)) + message_lines.append(f'مجموع کل توزیع: {formatted_total} کیلوگرم') + message_lines.append('سامانه رصدیار') + + message = '\n'.join(message_lines) + + success_count = 0 + failed_numbers = [] + + for mobile in mobile_numbers: + check_mobile = check_mobile_number(mobile) + if check_mobile: + try: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}" + f"&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + success_count += 1 + except Exception as e: + failed_numbers.append(mobile) + print(f"Error sending SMS to {mobile}: {str(e)}") + else: + failed_numbers.append(mobile) + + return HttpResponse(f'گزارش توزیع با موفقیت برای {success_count} شماره ارسال شد. تعداد کشتارگاه: {len(distribution_data)}. شماره های ناموفق: {failed_numbers if failed_numbers else "ندارد"}', status=status.HTTP_200_OK) + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def send_daily_slaughter_statistics_sms_manual(request): + # دریافت شماره های تلفن از دیتابیس + mobile_objects = SmsRecipient.objects.filter(is_active=True) + mobile_numbers = [obj.phone_number for obj in mobile_objects] + + # # شماره های hardcoded (اکنون از دیتابیس استفاده می شود) + # mobile_numbers = [ + # '09188176737', + # '09011110919', + # '09181112717', + # '09185914818', + # '09187040838', + # '09393946626', + # '09127687317', + # '09033073493', + # ] + + target_date = datetime.now().date() + date_shamsi = shamsi_date(target_date) + + if base_url_for_sms_report == 'ha': + province_name = 'همدان' + elif base_url_for_sms_report == 'ma': + province_name = 'مرکزی' + else: + province_name = 'تست' + + province_kill_requests = ProvinceKillRequest.objects.filter( + trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=target_date + ).aggregate( + total_orders=Sum('id'), + total_quantity=Sum('total_killed_quantity'), + total_live_weight=Sum('total_killed_weight'), + ) + + orders_count = ProvinceKillRequest.objects.filter( + trash=False, + return_to_province=False, + archive_wage=False, + state__in=('pending', 'accepted'), + kill_request__recive_date__date=target_date + ).count() + + total_quantity = province_kill_requests['total_quantity'] or 0 + total_live_weight = province_kill_requests['total_live_weight'] or 0 + total_carcass_weight = int(total_live_weight * 0.75) + average_weight = round(total_live_weight / total_quantity, 1) if total_quantity > 0 else 0 + + kill_house_requests = KillHouseRequest.objects.filter( + kill_request__recive_date__date=target_date, + trash=False + ).aggregate( + total_quantity=Sum('accepted_real_quantity'), + total_weight=Sum('accepted_real_weight') + ) + + loads_count = KillHouseRequest.objects.filter( + kill_request__recive_date__date=target_date, + trash=False + ).count() + + loads_quantity = kill_house_requests['total_quantity'] or 0 + loads_weight = kill_house_requests['total_weight'] or 0 + + formatted_quantity = to_locale_str(int(total_quantity)) + formatted_live_weight = to_locale_str(int(total_live_weight)) + formatted_carcass_weight = to_locale_str(int(total_carcass_weight)) + formatted_loads_quantity = to_locale_str(int(loads_quantity)) + formatted_loads_weight = to_locale_str(int(loads_weight)) + + message = f'اطلاعات کشتار مرغ گوشتی مورخ {date_shamsi} استان {province_name}\n' \ + f'تعداد سفارشات: {orders_count}\n' \ + f'حجم سفارش کشتار: {formatted_quantity} قطعه\n' \ + f'وزن تقریبی زنده: {formatted_live_weight} کیلوگرم\n' \ + f'وزن تقریبی لاشه: {formatted_carcass_weight} کیلوگرم\n' \ + f'میانگین وزن زنده: {average_weight} کیلوگرم\n' \ + f'اطلاعات بارایجاد شده:\n' \ + f'تعداد بار: {loads_count}\n' \ + f'حجم بارها: {formatted_loads_quantity} قطعه\n' \ + f'وزن بارها(زنده): {formatted_loads_weight} کیلوگرم\n' \ + f'سامانه رصدیار' + + success_count = 0 + failed_numbers = [] + + for mobile in mobile_numbers: + check_mobile = check_mobile_number(mobile) + if check_mobile: + try: + req = send_sms_request( + f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS}" + f"&password={PASSWORD_SMS}&from=30002501&to={mobile}&message={message}") + success_count += 1 + except Exception as e: + failed_numbers.append(mobile) + print(f"Error sending SMS to {mobile}: {str(e)}") + else: + failed_numbers.append(mobile) + + return HttpResponse(f'پیامک با موفقیت برای {success_count} شماره ارسال شد. شماره های ناموفق: {failed_numbers if failed_numbers else "ندارد"}', status=status.HTTP_200_OK) \ No newline at end of file diff --git a/temp_model.txt b/temp_model.txt new file mode 100644 index 0000000..93d7351 --- /dev/null +++ b/temp_model.txt @@ -0,0 +1,17 @@ + + +class SmsRecipient(BaseModel): + """مدل برای ذخیره شماره های تلفن دریافت کننده پیامک""" + phone_number = models.CharField(max_length=11, unique=True) + name = models.CharField(max_length=100) + is_active = models.BooleanField(default=True) + + def __str__(self): + return f"{self.name} - {self.phone_number}" + + def save(self, *args, **kwargs): + super(SmsRecipient, self).save(*args, **kwargs) + + class Meta: + verbose_name = "پیگیر پیامک" + verbose_name_plural = "پیگیران پیامک" \ No newline at end of file diff --git a/templates/Digital_agreement_for_buying_and_selling.html b/templates/Digital_agreement_for_buying_and_selling.html new file mode 100644 index 0000000..360d5d3 --- /dev/null +++ b/templates/Digital_agreement_for_buying_and_selling.html @@ -0,0 +1,259 @@ +{% extends "base.html" %} +{% block title %} + توافق‌نامه دیجیتال خرید و فروش مرغ زنده در سامانه رصدیار +{% endblock %} +{% block body %} +
+
+ +
+ {{ number }} +
+
+ {{ date }} +
+
+ - +
+
+
+

+ این توافق‌نامه با استناد به قوانین جاری جمهوری اسلامی ایران، از جمله قانون تجارت، قانون مدنی، قانون + جرایم رایانه‌ای، و با توجه به الزامات اجرایی سامانه ملی رصد و پایش زنجیره تأمین کالاهای اساسی (رصدیار)، + به صورت الکترونیکی و رسمی، میان طرفین ذیل منعقد می‌گردد: + +

+

+ ماده ۱ - طرفین قرارداد +

+

+ الف) مرغدار (فروشنده): +

+

+ نام و نام خانوادگی / مرغداری: {{ fullname }} / {{ unit_name }}({{ mobile }}) +

+ کد ملی / شناسه ملی: {{ national_code }} +

+

+ شناسه یکتای واحد: {{ breeding_unique_id }} +

+

+ شماره جواز جوجه ریزی: {{ licence_number }} +

+

+ آدرس فارم / مرغداری: {{ poultry_address }} +

+ {% if direct_buying_intermediary_mobile %} +

+ شماره واسط(دریافت کننده کد احراز): {{ direct_buying_intermediary_mobile }} +

+ + {% endif %} +

+ ب) کشتارگاه (خریدار): +

+

+ کشتارگاه: {{ kill_house_fullname }} +

+

+ نام کشتارگاه: {{ kill_house_name }}({{ kill_house_mobile }}) +

+

+ شناسه ملی: {{ kill_house_national_code }} +

+

+ آدرس کشتارگاه: {{ kill_house_address }} +

+ +

+ +

+ +

+ ماده ۲ - موضوع توافق‌نامه +

+

+ خرید و فروش مرغ زنده مطابق با اطلاعات ثبت‌شده در سامانه «رصدیار»، شامل: +

+

+ تاریخ خرید : {{ date_in_value }} +

+
+

حجم: {{ kill_capacity }} (قطعه)

+

وزن تقریبی: {{ weight }} (کیلوگرم)

+

میانگین وزنی: {{ Index_weight }} (کیلوگرم)

+

سن مرغ: {{ chicken_age }} روز

+
+

+ قیمت توافقی ثبت‌شده در سامانه: {{ amount }} ریال +

+

+ حداکثر زمان تسویه قرارداد: {{ max_time }} +

+

+ اطلاعات نهایی در کشتارگاه: +

+
+

حجم: {{ total_killed_quantity }} (قطعه)

+

وزن: {{ total_killed_weight }} (کیلوگرم)

+

میانگین وزنی: {{ avg_killed_weight }} (کیلوگرم)

+
+

+ ماده ۳ - تعهدات طرفین +

+

+ تعهدات مرغدار: +

+ الف) ارسال به‌موقع بار مطابق زمان، تعداد و وزن ثبت‌شده در سامانه. +

+

+ ب) اعلام دقیق وضعیت بهداشتی گله؛ در صورت وجود بیماری یا احتمال آلودگی، اطلاع‌رسانی فوری به کشتارگاه + الزامی است. +

+

+ ج) همکاری با مسئول فنی فارم و دامپزشکی در دریافت کد قرنطینه و تأییدیه حمل. +

+ +

+ تعهدات کشتارگاه: +

+

+ الف) ارسال وسیله نقلیه مجاز و تأییدشده برای حمل بار در موعد مقرر. +

+

+ ب) پرداخت وجه بار به شماره حساب اعلام‌شده توسط مرغدار ظرف مدت تعیین شده حداکثر {{ payment_deadline_days }} روز پس از تحویل بار. +

+

+ ج) ثبت اطلاعات بار (خودرو، باسکول، تحویل، پرداخت) در سامانه حداکثر تا 12 ساعت پس از کشتار. +

+ + +
+ + +
+ + +
+
+ +
+ {{ number }} +
+
+ {{ date }} +
+
+ - +
+
+
+

+ ماده ۴ - تخلفات و مسئولیت‌ها +

+

+ در صورت بروز تخلف از سوی هر یک از طرفین، شرایط زیر اعمال خواهد شد: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
نوع تخلفمسئولشرح پیامدجریمه / اقدام قانونی
عدم ارسال بار پس از ثبت در سامانهمرغدارایجاد اختلال در زنجیره تأمینتعلیق دسترسی به سامانه برای 7 روز / ارجاع به شورای حل اختلاف/ جریمه مالی
عدم ارسال وسیله نقلیه برای بارکشتارگاهتأخیر در حمل و کشتارلغو سفارش/ جریمه مالی/ ثبت در سابقه تخلفات
عدم پرداخت به‌موقع وجه بارمرغدارنقض تعهد مالیجریمه روزانه 1٪ از مبلغ فاکتور از روز تأخیر تا تسویه کامل / توقف خرید بعدی
ارسال مرغ بیمار یا آلوده بدون اعلامکشتارگاهتهدید سلامت عمومیارجاع پرونده به دامپزشکی و تعزیرات / مسدودسازی موقت در سامانه
ثبت اطلاعات خلاف واقع در سامانههریک از طرفیناختلال در راستی‌آزماییارجاع به شورای حل اختلاف سامانه در استان / حذف دسترسی موقت یا دائم/ارجاع پرونده به تعزیرات
+

+ ماده ۵ - اعتبار حقوقی و اجرایی +

+

+ این توافق‌نامه پس از ثبت الکترونیکی در سامانه «رصدیار» و تأیید دیجیتال هر دو طرف، دارای اعتبار رسمی، + اجرایی و قابل استناد در مراجع قانونی خواهد بود. + +
+

+ کلیه سوابق تراکنش، مکاتبات، زمان‌بندی‌ها و امضای دیجیتال در سامانه محفوظ و ملاک داوری می‌باشد. +

+
+

+ ماده ۶ - حل اختلاف +

+

+ در صورت بروز اختلاف، مرجع داوری اولیه اتحادیه مرغداران گوشتی استان بوده و در صورت عدم حل، موضوع به شورای + حل اختلاف صنفی یا مراجع قضایی ذی‌ربط ارجاع خواهد شد. +

+
+
+ +
+

تایید الکترونیکی مرغدار

+ {% if input_direct_buying_code is True %} + + {% endif %} + +
+
+

تایید الکترونیکی خریدار

+ {% if direct_buying_state is True %} + + {% endif %} +
+
+ {% if payment_deadline_state == 'accepted' %} +

+ اطلاعات تسویه حساب: +

+
+
+

مبلغ تسویه: {{ total_paid_amount }} (ریال)

+

بررسی کننده: {{ payment_deadline_checker_fullname }}

+

تاریخ بررسی: {{ payment_deadline_check_date }}

+

گزارش: {{ payment_deadline_archive_message }}

+
+ {% endif %} +
+ + +
+{% endblock %} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..b9200f0 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,17 @@ + + + + + + {% block title %}{% endblock %} + + + + + +{% block body %} + +{% endblock %} + + + \ No newline at end of file diff --git a/templates/management_all_poultry_and_warehouse.html b/templates/management_all_poultry_and_warehouse.html new file mode 100644 index 0000000..0bce510 --- /dev/null +++ b/templates/management_all_poultry_and_warehouse.html @@ -0,0 +1,500 @@ +{% extends "base.html" %} +{% block title %} + سامانه رصدیار +{% endblock title %} +{% block body %} +
+ +
+ +
+ {{ number }} +
+
+ {{ date }} +
+
+ - +
+
+
+

+ از تاریخ {{ from_date }} تا تاریخ {{ to_date }} استان {{ province}} +

+

+ گزارش فارم‌های فعال در بازه زمانی +

+ +

+ • تعداد فارم‌های فعال بر اساس جوجه‌ریزی: {{ poultry_count }} فارم +

+ • تعداد فارم‌های دارای زنجیره فعال: {{ chain_count }} فارم

+

+ • مجموع جوجه‌ریزی: {{ poultry_hatching_quantity }} قطعه

+

+ • مجموع تلفات دامپزشکی: {{ poultry_hatching_losses_vet }} قطعه

+

+ • مجموع تلفات اتحادیه: {{ poultry_hatching_losses_union }} قطعه

+

+ • مجموع تلفات کل: {{ poultry_hatching_total_losses }} قطعه +

+

+ • مجموع قطعه کشتار شده: {{ poultry_hatching_killed_quantity }}۰ قطعه +

+

+ • مجموع وزن کشتارشده: {{ poultry_hatching_total_killed_weight }} کیلوگرم +

+

+ • مانده در سالن: {{ poultry_hatching_left_over }} قطعه +

+

+ فارم‌های با سن بیشتر از ۶۰ روز +

+

+ • تعداد فارم‌های با سن بیش از 60 روز: {{ poultry_hatching_gt_60 }} مورد

+

+ • مجموع حجم فارم‌ها: {{ poultry_hatching_gt_60_quantity }}۰ قطعه

+

+ • مجموع مانده در سالن: {{ poultry_hatching_gt_60_left_over }} قطعه

+

+ بیشترین سن کشتار: {{ max_age_poultry }}روز

+

+ {{ max_age_poultry_name }} - {{ max_age_poultry_city }} - ( حجم جوجه ریزی: {{ max_age_poultry_quantity }} (قطعه) - حجم کشتار شده: {{ max_age_poultry_killed_quantity }} (قطعه) - حجم مانده در سالن: {{ max_age_poultry_left_over }} (قطعه) ) + +

+

+ کمترین سن کشتار: {{ min_age_poultry }} روز

+

+ {{ min_age_poultry_name }} - {{ min_age_poultry_city }} - ( حجم جوجه ریزی: {{ min_age_poultry_quantity }} (قطعه) - حجم کشتار شده: {{ min_age_poultry_killed_quantity }} (قطعه) - حجم مانده در سالن: {{ min_age_poultry_left_over }} (قطعه) ) +

+
+

+ بارهای کشتار شده داخل استان:

+ +

+ تعداد بارهای داخل استان {{ kill_house_request_count }} بار

+

+ مجموع کشتار داخل استان {{ kill_house_request_quantity }} قطعه +

+

+ مجموع وزن کشتار داخل استان {{ kill_house_request_weight }} کیلوگرم +

+

+ میانگین وزن هر قطعه {{ kill_house_request_average_weight }} کیلوگرم +

+

+ * نکته: بیشترین حجم کشتار داخل استان در {{ persian_date_req }} با {{ daily_quantity_req }} قطعه رخ داده است. +

+

+ بارهای خریداری شده خارج از استان

+

+ تعداد بارهای خریداری خارج از استان {{ free_bars_count }} بار +

+

+ مجموع قطعه کشتار خارج از استان {{ free_bars_quantity }} قطعه +

+

+ مجموع وزن کشتار خارج از استان {{ free_bars_live_weight }} کیلوگرم +

+

+ بیشترین خریدار:{{ kill_house_name }}({{ transaction_count }} بار) +

+

+ * نکته: بیشترین حجم کشتار خارج از استان در {{ persian_date }} با {{ daily_quantity }} قطعه رخ داده است. +

+ + +
+ + +
+
+
+ +
+ {{ number }} +
+
+ {{ date }} +
+
+ - +
+
+
+

+ عملکرد خریداران (بر اساس خرید زنده داخل/خارج استان) +

+ + + + + + + + + + + + + + + {% for kh in kill_houses_data %} + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
نام کشتارگاهتعداد بارحجم داخل استان(قطعه)وزن داخل استان(کیلوگرم)حجم خارج استان(قطعه)وزن خارج استان(کیلوگرم)حجم کل بارها(قطعه)وزن کل بارها(کیلوگرم)
{{ kh.name }}{{ kh.load_count }}{{ kh.in_province_quantity }}{{ kh.in_province_wight }}{{ kh.out_province_quantity }}{{ kh.out_province_weight }}{{ kh.total_quantity }}{{ kh.total_weight }}
هیچ داده‌ای یافت نشد
+

+ بیشترین خرید داخل استان: {{ kill_house_name_req}} +

+

+ بیشترین خرید خارج از استان: {{ kill_house_name }} +

+

+ بیشترین بار ارسالی مرغدار : +

+

+ داخل استان :مرغداری {{ poultry_req_name_req }} با {{ top_poultry_req_stats_total_quantity }} قطعه شهرستان + {{poultry_city_req_name_req}} +

+

+ خارج استان :مرغداری {{ out_poultry_req_name_req }} {{ out_top_poultry_req_stats_total_quantity }} قطعه استان {{ out_poultry_province_req_name_req }} شهر{{ out_poultry_city_req_name_req }} +

+

+ عملکرد کشتارگاه‌ها و توزیع لاشه در داخل استان +

+ + + + + + + + + + + + + + {% for kh in management_kill_house_data %} + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
نام کشتارگاهوزن بار زنده(کیلوگرم)وزن وارد شده به انبار(کیلوگرم)وزن توزیع داخل استان(کیلوگرم)وزن توزیع خارج استان(کیلوگرم)وزن کل وزن توزیع شده(کیلوگرم)وزن مانده در انبار فعلی(کیلوگرم)درصد توزیع
{{ kh.name }}{{ kh.in_province_quantity }}{{ kh.in_ware_house_quantity }}{{ kh.steward_allocation_quantity }}{{ kh.kill_house_free_bar_quantity }}{{ kh.all_quantity }}{{ kh.product }}%{{ kh.percent }}
هیچ داده‌ای یافت نشد
+

+ ! توجه اطلاعات توزیع لاشه از تاریخ {{ tomorrow_of_date1 }} تا تاریخ {{ tomorrow_of_date2 }} میباشد. +

+

+ * نکته: درصد توزیع نسبت به وزن ورودی به انبار در بازه مذکور محاسبه شده است. +

+
+ +
+
+
+ +
+ {{ number }} +
+
+ {{ date }} +
+
+ - +
+
+
+

+ گزارش بررسی اسناد و قبوض باسکول +

+ + + + + + + + + + + + + + {% for kh in duc_kill_house_data %} + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
نام کشتارگاهتعداد کل بارهاتعداد بار دارای سندتعداد بار بدون سندتعداد اسناد تایید شدهتعداد اسناد دارای مغایرتدرصد اسناد تایید شدهدرصد اسناد دارای مغایرت
{{ kh.name }}{{ kh.kill_house_request1_count }}{{ kh.bar_assigment_true_count }}{{ kh.bar_assigment_pending_count }}{{ kh.bar_document_status_accepted }}{{ kh.bar_document_status_rejected }}{{ kh.percent_bar_document_status_accepted }}%{{ kh.percent_bar_document_status_rejected }}%
هیچ داده‌ای یافت نشد
+

+ هشدار: بیش از ۵۰٪ بارها دارای سند مشکوک یا دست‌نویس هستند. +

+
+

+ اطلاعات بارهای دارای استعلام قرنطینه +

+
+

تعداد بارها: {{ total_count_has_quarantine }}

+

حجم بارهای رصدیار : {{ total_quarantine_quantity }} (قطعه)

+

حجم بارهای قرنطینه : {{ total_quantity_has_quarantine }} (قطعه)

+

+ اختلاف قطعه: + + {{ different }} + + (%{{ different_bar_percent }}) +

+
+ +
+

+ اطلاعات بارهای فاقد قرنطینه +

+
+

تعداد بارها: {{ total_id_hasnt_code }}

+

حجم بارها: {{ total_quantity_hasnt_code }} (قطعه)

+

وزن بارها: {{ total_weight_hasnt_code }} (کیلوگرم)

+ +
+
+

+ اطلاعات بارهای وارد نشده به انبار +

+
+

تعداد بارها: {{ total_id_hasnt_warehouse }}

+

حجم بارها: {{ total_quantity_hasnt_warehouse }} (قطعه)

+

وزن بارها: {{ total_weight_hasnt_warehouse }} (کیلوگرم)

+ +
+ +
+

+ اطلاعات بارهای تعیین تکلیف نشده(عدم تخلیه توسط کشتارگاه) +

+
+

تعداد بارها: {{ total_id_hasnt_assignment_state_archive }}

+

حجم بارها: {{ total_quantity_hasnt_assignment_state_archive }} (قطعه)

+

وزن بارها: {{ total_weight_hasnt_assignment_state_archive }} (کیلوگرم)

+ +
+
+

+ اطلاعات بارهای با سن کشتار بیش از 60 روز +

+
+

تعداد بارها: {{ total_id_hasnt_killing_age }}

+

حجم بارها: {{ total_quantity_hasnt_killing_age }} (قطعه)

+

وزن بارها: {{ total_weight_hasnt_killing_age }} (کیلوگرم)

+ +
+ +
+ + +
+
+
+ +
+ {{ number }} +
+
+ {{ date }} +
+
+ - +
+
+
+

+ جمع‌بندی و نتیجه‌گیری

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
تعداد فارم فعال{{poultry_count}} مورد
میانگین تلفات{{avg_losses}} قطعه
میانگین سن کشتار{{total_killing_ave_age}} روز
میانگین وزن کشتار{{ avg_total_killed_weight }} کیلوگرم
بیشترین کشتار{{top_total_killed_weight}} کیلوگرم
بیشترین خرید داخلی{{total_quantity_top_inner}}قطعه
بیشترین خرید خارجی{{total_quantity_top_out}} قطعه
تعداد سند‌های مشکوک{{bar_assigment_pending_count1}} مورد
+
+
+

+ جزییات گزارش عملکرد: + دانلود اکسل +

+
+ + +
+
+
+ +
+ {{ number }} +
+
+ {{ date }} +
+
+ - +
+
+
+

+ جمع‌بندی و نتیجه‌گیری

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
تعداد فارم فعال{{poultry_count}} مورد
میانگین تلفات{{avg_losses}} قطعه
میانگین سن کشتار{{total_killing_ave_age}} روز
میانگین وزن کشتار{{ avg_total_killed_weight }} کیلوگرم
بیشترین کشتار{{top_total_killed_weight}} کیلوگرم
بیشترین خرید داخلی{{total_quantity_top_inner}}قطعه
بیشترین خرید خارجی{{total_quantity_top_out}} قطعه
تعداد سند‌های مشکوک{{bar_assigment_pending_count1}} مورد
+
+
+

+ جزییات گزارش عملکرد: + دانلود اکسل +

+
+ + +
+{% endblock body %} \ No newline at end of file diff --git a/templates/poultry_datail.html b/templates/poultry_datail.html new file mode 100644 index 0000000..5c288f3 --- /dev/null +++ b/templates/poultry_datail.html @@ -0,0 +1,1485 @@ +{% load jalali_filters %} + + + + + + + + + + + +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
اطلاعات واحد گله
+
+
+ +
+
+ نام فارم: + {{ poultry.unit_name }} +
+
+ مرغدار: + {{ poultry.user.fullname }}({{ poultry.user.mobile }}) +
+
+ بهره برداری: + {{ InteractTypeName }} +
+
+ تاریخ جوجه ریزی: + {{ hatching_date }} +
+ +
+ حجم جوجه ریزی: + {{ quantity | toLocaleStr }} +
+
+ سن: + {{ chicken_age }} +
+
+ نژاد: + {{ chicken_breed }} +
+
+ وضعیت: + {% if violation %} + پیگیری + {% else %} + عادی + {% endif %} +
+ +
+ شماره مجوز جوجه ریزی: + {{ licence_number }} +
+
+ شناسه یکتا: + {{ poultry.breeding_unique_id }} +
+
+ مجوز بهداشتی جوجه ریزی: + {% if CertId %} + {{ CertId }} + {% else %} + - + {% endif %} +
+
+ ارتباط: + {% if UnionTypeName %} + {{ UnionTypeName }} + {% else %} + - + {% endif %} +
+ +
+ استان: + {{ poultry.address.province.name }} +
+
+ شهر: + {{ poultry.address.city.name }} +
+
+ دامپزشک فارم: + {{ vet_farm.vet_farm_full_name }}({{ vet_farm.vet_farm_mobile }}) +
+
+ سالن: + {{ hall }} +
+
+ دوره جوجه ریزی: + {{ period }} +
+ +
+ تاریخ ثبت جوجه ریزی: + {{ create_date_hatching }} +
+
+ میانگین سن کشتار: + {{ killing_ave_age }} +
+
+ پیش بینی تاریخ کشتار: + {{ predicate_date_hatching }} +
+
+ مالکیت: + {% if PersonTypeName %} + {{ PersonTypeName }} + {% else %} + - + {% endif %} +
+
+ حجم اختلاف کشتار: + {{ bar_difference_request_quantity|toLocaleStr }} +
+
+ وزن اختلاف کشتار + {{ bar_difference_request_weight|toLocaleStr }} +
+
+
+
اطلاعات کشتار و تلفات
+
+
+ +
+
+ تایید تخلیه در رصدیار: + %{{ percent_rasadyar1 }} +
+
+ تایید تخلیه در سماصط: + %{{ samasat_discharge_percentage }} +
+
+ حجم کشتار شده: + {{ killed_quantity|toLocaleStr}} +
+
+ حجم تخصیص بازگشتی: + {{ killing_info.return_province_kill_requests_quantity|toLocaleStr}} +
+
+ وزن تخصیص بازگشتی: + {{ killing_info.return_province_kill_requests_weight|toLocaleStr}} +
+
+ حجم بار بازگشتی: + {{ killing_info.return_kill_house_quantity|toLocaleStr}} +
+
+ وزن بارهای بازگشتی: + {{ killing_info.return_kill_house_weight|toLocaleStr}} +
+
+ حجم مانده در سالن: + {{ left_over|toLocaleStr }} +
+{#
#} +{# حجم بارهای عدم وصول:#} +{# {{ killing_info.non_receipt_kill_house_quantity|toLocaleStr}}#} +{#
#} +{#
#} +{# وزن بارهای عدم وصول:#} +{# {{ killing_info.non_receipt_kill_house_weight|toLocaleStr}}#} +{#
#} +
+ تلفات کل: + {{ total_losses|toLocaleStr}} +
+ +
+ تعداد بارها: + {{ killing_info.kill_house_requests|toLocaleStr }} +
+
+ حجم بارها: + {{ killing_info.kill_house_requests_first_quantity|toLocaleStr}} +
+
+ وزن بارها: + {{ killing_info.kill_house_requests_first_weight|toLocaleStr}} +
+
+ افت بارها: + {{ killing_info.ware_house_bars_weight_lose|toLocaleStr }}% +
+ +
+ حجم فروش به خارج استان: + {{ out_province_killed_quantity|int|toLocaleStr}} +
+
+ وزن فروش به خارج استان: + {{ out_province_killed_weight|toLocaleStr}} +
+
+ حجم بارهای تحویلی: + {{ killing_info.bar_complete_with_kill_house|toLocaleStr}} +
+
+ وزن بارهای تحویلی: + {{ killing_info.accepted_real_wight_final|toLocaleStr}} +
+ +
+ بارهای ورودی به انبار: + {{ killing_info.ware_house_bars|toLocaleStr }} +
+
+ حجم لاشه های انبار: + {{ killing_info.ware_house_bars_quantity|toLocaleStr }} +
+
+ وزن لاشه های انبار: + {{ killing_info.ware_house_bars_weight|toLocaleStr }} +
+
+ حجم افزایشی: + {{ increase_quantity|toLocaleStr }} +
+ +
+ تلفات دامپزشک: + {{ losses|toLocaleStr }} +
+
+ تلفات اتحادیه: + {{ direct_losses|toLocaleStr}} +
+
+ حجم تعهد دولتی: + {{ total_commitment_quantity|toLocaleStr }} +
+
+ حجم تعهد آزاد: + {{ total_free_commitment_quantity|toLocaleStr}} +
+ +
+ حجم کشتار دولتی: + {{ governmental_quantity|toLocaleStr}} +
+
+ حجم کشتار آزاد: + {{ free_quantity|toLocaleStr}} +
+
+ تخصیصات بدون بار: + {{ killing_info.province_kill_requests|toLocaleStr }} +
+
+ حجم تخصیصات بدون بار: + {{ killing_info.province_kill_requests_quantity|toLocaleStr }} +
+ +
+ وزن تخصیصات بدون بار: + {{ killing_info.province_kill_requests_weight|toLocaleStr }} +
+ +
+ وزن تعهد دولتی: + {{ total_commitment|toLocaleStr }} +
+
+ میانگین وزن کشتار: + {{ total_average_killed_weight|toLocaleStr }} +
+ +
+ وزن کل کشتار: + {{ total_killed_weight|toLocaleStr}} +
+
+ تعداد کشتار فعال: + {{ active_kill1 }} +
+
+ تعداد درخواست کشتار: + {{ active_kill.count_of_request|toLocaleStr }} +
+
+ آخرین تغییر: + {{ latest_hatching_change.full_name }} +
+
+
+ + + +
+
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
اطلاعات بارهای داخل استان
+
+
+ + + + + + + + + + + + + + + + + + + + + + {% for bar in bars %} + + + + {% if bar.poultry_request.free_sale_in_province == True %} + + {% else %} + + {% endif %} + + + + + + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
کدباروضعیتنوع فروشتاریخ کشتارخریدارتلفنکشتارکنسن مرغمحصولشهرکدقرنطینهاستعلام قرنطینهحجم زندهوزن زنده (کیلوگرم)حجم ورود به انباروزن ورود به انبار (کیلوگرم)
{{ bar.bar_code }}{{ bar.status }}آزاددولتی{{ bar.date|jalali }}{{ bar.buyer.name }}{{ bar.buyer.kill_house_operator.user.mobile }}{{ bar.killer_info.name }}({{ bar.killer_info.kill_house_operator.user.mobile }}){{ bar.poultry_request.age }}{{ bar.product }}{{ bar.buyer.kill_house_operator.address.city.name }}{{ bar.clearance_code|isNone }}{{ bar.quarantine_quantity|isNone }}{{ bar.accepted_real_quantity |int|toLocaleStr }}{{ bar.accepted_real_weight |int|toLocaleStr }}{{ bar.ware_house_accepted_real_quantity |int|toLocaleStr }}{{ bar.ware_house_accepted_real_weight |int|toLocaleStr }}
هیچ داده‌ای یافت نشد
+ +
+ + + +
+{% if bars2 %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
اطلاعات بارهای داخل استان
+
+
+ + + + + + + + + + + + + + + + + + + + + + {% for bar in bars %} + + + + {% if bar.poultry_request.free_sale_in_province == True %} + + {% else %} + + {% endif %} + + + + + + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
کدباروضعیتنوع فروشتاریخ کشتارخریدارتلفنکشتارکنسن مرغمحصولشهرکدقرنطینهاستعلام قرنطینهحجم زندهوزن زنده (کیلوگرم)حجم ورود به انباروزن ورود به انبار (کیلوگرم)
{{ bar.bar_code }}{{ bar.status }}آزاددولتی{{ bar.date|jalali }}{{ bar.buyer.name }}{{ bar.buyer.kill_house_operator.user.mobile }}{{ bar.killer_info.name }}({{ bar.killer_info.kill_house_operator.user.mobile }}){{ bar.poultry_request.age }}{{ bar.product }}{{ bar.buyer.kill_house_operator.address.city.name }}{{ bar.clearance_code|isNone }}{{ bar.quarantine_quantity|isNone }}{{ bar.accepted_real_quantity |int|toLocaleStr }}{{ bar.accepted_real_weight |int|toLocaleStr }}{{ bar.ware_house_accepted_real_quantity |int|toLocaleStr }}{{ bar.ware_house_accepted_real_weight |int|toLocaleStr }}
هیچ داده‌ای یافت نشد
+ +
+ + + +
+{% endif %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
اطلاعات بارهای خارج استان
+
+
+ + + + + + + + + + + + + + + {% for bar in outBars %} + + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
کدسفارشتاریخخریدارتلفناستان/شهرکدقرنطینهاستعلام قرنطینهحجم زندهوزن زنده (کیلوگرم)
{{ bar.order_code }}{{ bar.send_date|jalali }}{{ bar.buyer_fullname }}{{ bar.buyer_mobile }}{{ bar.buyer_province }}/{{ bar.buyer_city }}{{ bar.quarantine_code|isNone }}{{ bar.quarantine_quantity|int|toLocaleStr }}{{ bar.quantity |int|toLocaleStr }}{{ bar.weight |int|toLocaleStr }}
هیچ داده‌ای یافت نشد
+ +
+ + + +
+{% if outBars2 %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
اطلاعات بارهای خارج استان
+
+
+ + + + + + + + + + + + + + + {% for bar in outBars2 %} + + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
کدسفارشتاریخخریدارتلفناستان/شهرکدقرنطینهاستعلام قرنطینهحجم زندهوزن زنده (کیلوگرم)
{{ bar.order_code }}{{ bar.send_date|jalali }}{{ bar.buyer_fullname }}{{ bar.buyer_mobile }}{{ bar.buyer_province }}/{{ bar.buyer_city }}{{ bar.quarantine_code|isNone }}{{ bar.quarantine_quantity|int|toLocaleStr }}{{ bar.quantity |int|toLocaleStr }}{{ bar.weight |int|toLocaleStr }}
هیچ داده‌ای یافت نشد
+ +
+ + + +
+ +{% endif %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
مدیریت بار زنجیره
+
+
+ + + + + + + + + + + + + + + + + + + + {% for bar in chainAllocation %} + + {% if bar.state == 'accepted' %} + + {% elif bar.state == 'pending' %} + + {% else %} + + {% endif %} + + {% if bar.out_province == True %} + + {% else %} + + {% endif %} + + + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
وضعیتتاریخ سفارشنوع فروشثبت کننده سفارشخریدارشرکت زنجیرهکد بهداشتیکد قرنطینهرانندهنوع خودروپلاکحجممیانگین وزنوزن
تایید شده در انتظار تایید رد شده {{ bar.date|jalali }} خارج استان داخل استان {{ bar.registerer.fullname }}({{ bar.registerer.mobile }}) {{ bar.buyer_name }}({{ bar.buyer_mobile }}) {{ bar.chain_company.name }}({{ bar.chain_company.user.mobile }}) {{ bar.health_code|isNone }} {{ bar.quarantine_code|isNone }} {{ bar.driver_name }}({{ bar.driver_mobile }}) {{ bar.type_car }} {{ bar.pelak }} {{ bar.quantity |int|toLocaleStr }} {{ bar.index_weight }} {{ bar.weight |int|toLocaleStr }}
هیچ داده‌ای یافت نشد
+ +
+ + + +
+{% if chainAllocation2 %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
مدیریت بار زنجیره
+
+
+ + + + + + + + + + + + + + + + + + + + {% for bar in chainAllocation2 %} + + {% if bar.state == 'accepted' %} + + {% elif bar.state == 'pending' %} + + {% else %} + + {% endif %} + + {% if bar.out_province == True %} + + {% else %} + + {% endif %} + + + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
وضعیتتاریخ سفارشنوع فروشثبت کننده سفارشخریدارشرکت زنجیرهکد بهداشتیکد قرنطینهرانندهنوع خودروپلاکحجممیانگین وزنوزن
تایید شده در انتظار تایید رد شده {{ bar.date|jalali }} خارج استان داخل استان {{ bar.registerer.fullname }}({{ bar.registerer.mobile }}) {{ bar.buyer_name }}({{ bar.buyer_mobile }}) {{ bar.chain_company.name }}({{ bar.chain_company.user.mobile }}) {{ bar.health_code|isNone }} {{ bar.quarantine_code|isNone }} {{ bar.driver_name }}({{ bar.driver_mobile }}) {{ bar.type_car }} {{ bar.pelak }} {{ bar.quantity |int|toLocaleStr }} {{ bar.index_weight }} {{ bar.weight |int|toLocaleStr }}
هیچ داده‌ای یافت نشد
+ +
+ + + +
+ +{% endif %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
بارهای عدم وصول
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% for item in returnKillHouseRequest %} + + + + {% if item.return_trash == True %} + + {% else %} + + {% endif %} + {% if item.poultry_request.market %} + + {% elif item.poultry_request.direct_buying %} + + + {% elif item.warehouse %} + + {% else %} + + {% endif %} + {% if item.poultry_request.freezing %} + + + {% elif item.poultry_request.export %} + + + {% else %} + + + {% endif %} + + + + + + + {% if item.killer %} + + {% else %} + + {% endif %} + + + + + + + + {% if item.state == 'pending' %} + + {% elif item.state == 'accepted' %} + + {% else %} + + {% endif %} + + + {% if item.non_receipt %} + + {% else %} + + + {% endif %} + + {% if item.non_receipt and item.main_non_receipt %} + + {% else %} + + + {% endif %} + + + {% empty %} + + + + {% endfor %} + +
کد بارکدسفارشنوع بارنوع درخواستنوع کشتارنام فارمنام مرغدارشهر مرغدارتاریخ درخواست کشتارتعداد بارتاریخ ثبت بارنام کشتارگاهشهر کشتارگاهوزنمیانگین وزنیتعداد نهاییوزن نهاییقیمت مرغدارقیمت کشتارگاهوضعیت تاییدپلاک خودرونام رانندهعدم دریافتپیام عدم دریافت
{{ item.bar_code }}{{ item.poultry_request.order_code}}برگشتیعدم وصولپنل معاملاتخرید مستقیمانباراتحادیهانجمادصادراتعادی{{ item.poultry_request.poultry.unit_name }}{{ item.poultry_request.poultry.user.fullname }} ({{ item.poultry_request.poultry.user.mobile }}){{ item.poultry_request.poultry.address.city.name}}{{ item.kill_request.receive_date|jalali }}{{ item.quantity|toLocaleStr }}{{ item.create_date|jalali }}{{ item.killer.name}}{{ item.killhouse_user.name}}{{ item.killhouse_user.kill_house_operator.user.city.name }}{{ item.weight_info.weight|toLocaleStr }}{{ item.weight_info.index_weight|toLocaleStr}}{{ item.accepted_real_quantity|toLocaleStr }}{{ item.accepted_real_weight|toLocaleStr }}{{ item.poultry_request.amount|toLocaleStr }}{{ item.weight_info.kill_house_price|toLocaleStr }}در انتظار تاییدتایید شدهرد شده{{ item.car.pelak }}{{ item.car.driver_name }}داردندارد{{ item.non_receipt_message }} کاربر (item.modify_date|jalali)سیستم (item.modify_date|jalali)
هیچ داده‌ای یافت نشد
+ +
+ + + +
+{% if nonReceipt2 %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
بارهای عدم وصول
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% for item in returnKillHouseRequest %} + + + + {% if item.return_trash == True %} + + {% else %} + + {% endif %} + {% if item.poultry_request.market %} + + {% elif item.poultry_request.direct_buying %} + + + {% elif item.warehouse %} + + {% else %} + + {% endif %} + {% if item.poultry_request.freezing %} + + + {% elif item.poultry_request.export %} + + + {% else %} + + + {% endif %} + + + + + + + {% if item.killer %} + + {% else %} + + {% endif %} + + + + + + + + {% if item.state == 'pending' %} + + {% elif item.state == 'accepted' %} + + {% else %} + + {% endif %} + + + {% if item.non_receipt %} + + {% else %} + + + {% endif %} + + {% if item.non_receipt and item.main_non_receipt %} + + {% else %} + + + {% endif %} + + + {% empty %} + + + + {% endfor %} + +
کد بارکدسفارشنوع بارنوع درخواستنوع کشتارنام فارمنام مرغدارشهر مرغدارتاریخ درخواست کشتارتعداد بارتاریخ ثبت بارنام کشتارگاهشهر کشتارگاهوزنمیانگین وزنیتعداد نهاییوزن نهاییقیمت مرغدارقیمت کشتارگاهوضعیت تاییدپلاک خودرونام رانندهعدم دریافتپیام عدم دریافت
{{ item.bar_code }}{{ item.poultry_request.order_code}}برگشتیعدم وصولپنل معاملاتخرید مستقیمانباراتحادیهانجمادصادراتعادی{{ item.poultry_request.poultry.unit_name }}{{ item.poultry_request.poultry.user.fullname }} ({{ item.poultry_request.poultry.user.mobile }}){{ item.poultry_request.poultry.address.city.name}}{{ item.kill_request.receive_date|jalali }}{{ item.quantity|toLocaleStr }}{{ item.create_date|jalali }}{{ item.killer.name}}{{ item.killhouse_user.name}}{{ item.killhouse_user.kill_house_operator.user.city.name }}{{ item.weight_info.weight|toLocaleStr }}{{ item.weight_info.index_weight|toLocaleStr}}{{ item.accepted_real_quantity|toLocaleStr }}{{ item.accepted_real_weight|toLocaleStr }}{{ item.poultry_request.amount|toLocaleStr }}{{ item.weight_info.kill_house_price|toLocaleStr }}در انتظار تاییدتایید شدهرد شده{{ item.car.pelak }}{{ item.car.driver_name }}داردندارد{{ item.non_receipt_message }} کاربر (item.modify_date|jalali)سیستم (item.modify_date|jalali)
هیچ داده‌ای یافت نشد
+ +
+ + + +
+{% endif %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
اطلاعات بارهای قرنطینه
+
+
+ + + + + + + + + + + + + + + {% for bar in differentBars %} + + + {% if bar.Out == True %} + + {% else %} + + {% endif %} + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
تاریخ کشتارنوع بارسن مرغوضعیتخریدارمحصولشهرکدقرنطینهحجم
{{ bar.Date|jalali }}خارج استانداخل استان{{ bar.Age }}{{ bar.TrackingStatusDescription }}{{ bar.DesUnitName }}{{ bar.GoodName }}{{ bar.City }}{{ bar.TrackingCode|isNone }}{{ bar.GoodAmount |int|toLocaleStr }}
هیچ داده‌ای یافت نشد
+ +
+ + + +
+{% if differentBars2 %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
اطلاعات بارهای قرنطینه
+
+
+ + + + + + + + + + + + + + + {% for bar in differentBars %} + + + {% if bar.Out == True %} + + {% else %} + + {% endif %} + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
تاریخ کشتارنوع بارسن مرغوضعیتخریدارمحصولشهرکدقرنطینهحجم
{{ bar.Date|jalali }}خارج استانداخل استان{{ bar.Age }}{{ bar.TrackingStatusDescription }}{{ bar.DesUnitName }}{{ bar.GoodName }}{{ bar.City }}{{ bar.TrackingCode|isNone }}{{ bar.GoodAmount |int|toLocaleStr }}
هیچ داده‌ای یافت نشد
+ +
+ + +
+ +{% endif %} +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
تخصیص‌های بازگشتی
+
+
+ + + + + + + + + + + + + + + + + + + + + + + {% for item in return_province_request %} + + + + {% if item.market %} + + {% elif item.direct_buying %} + + {% elif item.warehouse %} + + {% else %} + + {% endif %} + + + + + + + + + + + + + + {% if item.state == "pending" %} + + {% elif item.state == "accepted" %} + + {% else %} + + {% endif %} + + {% if item.first_car_allocated_quantity > 0 %} + + {% else %} + + {% endif %} + + + {% with diff=item.quantity|add:item.total_killed_quantity|floatformat:-1 %} + + {% endwith %} + + + + {% empty %} + + + + {% endfor %} + +
کدسفارشنوع درخواستنام فارمنام مرغدارشهر مرغدارتاریخ کشتارتعداد درخواستتاریخ ثبت تخصیصنام کشتارگاهشهر کشتارگاهقیمت مرغدارقیمت کشتارگاهتعداد تخصیصوضعیت تاییدوضعیت تخصیص ماشینمانده قابل تخصیصبرگشت دهنده
{{ item.order_code|default:"-" }}پنل معاملاتخرید مستقیمانباراتحادیه{{ item.poultry_unit_name }} + {{ item.poultry_fullname }} ({{ item.poultry_mobile }}) + {{ item.poultry_city }}{{ item.killing_date|jalali }}{{ item.poultry_request_quantity|toLocaleStr }}{{ item.create_date|jalali }}{{ item.killhouse_user.name|default:"-" }}{{ item.killhouse_user.city|default:"-" }}{{ item.poultry_amount|toLocaleStr }} ﷼{{ item.kill_house_price|toLocaleStr }} ﷼{{ item.quantity|toLocaleStr }}در انتظار تاییدتایید شدهرد شدهداردندارد + {{ diff|floatformat:0|toLocaleStr }} + + {% if item.returner %} + {{ item.returner.fullname }} ({{ item.returner.mobile }}) + {% else %} + سیستم + {% endif %} + {{ item.modify_date|jalali }} +
هیچ داده‌ای یافت نشد
+ +
+ + + +
+ +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
اختلاف کشتار
+
+
+ + + + + + + + + + + + + + + + + {% for item in killingDifference %} + + + + + + + + + + + + + {% if item.state == "pending" %} + + {% elif item.state == "accepted" %} + + {% else %} + + {% endif %} + + {% endfor %} + +
ثبت کنندهتاریخ ثبتمرغدارکشتارگاهحجم کم شده از سالن مرغداروزن تقریبی کشتار (کیلوگرم)حجم سفارشات دریافتی توسط کشتارگاهاختلاف کشتار(حجم)اختلاف حجماختلاف وزنوضعیت
{{ item.register_fullname|default:"-" }}{{ item.create_date|jalali }}{{ item.hatching.poultry.unit_name|default:"-" }}{{ item.kill_house.name|default:"-" }}{{ item.quantity|toLocaleStr }}{{ item.weight|toLocaleStr }}{{ item.real_quantity|toLocaleStr }}{{ item.bar_info.difference_quantity|toLocaleStr }}{{ item.quantity|toLocaleStr }}{{ item.weight|toLocaleStr }}در انتظار تاییدتایید شدهرد شده
+ +
+ + + +
+ +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
افزایش حجم جوجه ریزی
+
+
+ + + + + + + + + + + + + + + + + + {% for item in hatchingIncrease %} + + + + + + + + + + + + + + {% endfor %} + +
مرغدارشماره مجوز جوجه ریزیشناسه یکتا فارمحجم جوجه ریزیحجم کشتارحجم تلفاتمانده در سالنحجم افزایشیثبت کنندهتاریخ ثبتپیغام
{{ item.hatching.poultry.unit_name|default:"-" }}{{ item.hatching.licence_number|default:"-" }}{{ item.hatching.breeding_unique_id|default:"-" }}{{ item.hatching_quantity|toLocaleStr }}{{ item.hatching_kill_quantity|toLocaleStr }}{{ item.hatching_losses|toLocaleStr }}{{ item.hatching_left_over|toLocaleStr }}{{ item.quantity|toLocaleStr }}{{ item.registerer_name|default:"-" }}{{ item.date|jalali }}{{ item.message|default:"-" }}
+ +
+ + + +
+ + +
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
گزارشات تلفات
+
+
+ + + + + + + + + + + + {% if evacuation_reports %} + {% for report in evacuation_reports %} + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
شماره گزارشنوع گزارشتاریخ معدوم‌سازیتعدادتاریخ ثبت
{{ report.MoReportId|default:"-" }}{{ report.ReportTypeString|default:"-" }}{{ report.MoDateShamsi|default:"-" }}{{ report.GoodCount|default_if_none:0|int|toLocaleStr }}{{ report.RegDateShamsiWithTime }}
گزارشی ثبت نشده است
+
+ + +
+
+
+ +
+ {{ licence_number }} +
+
+ {{ shamsi_date }} +
+
+ - +
+
+
+
+
گزارشات تلفات
+
+
+ + + + + + + + + + + + {% if evacuation_reports %} + {% for report in evacuation_reports %} + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
شماره گزارشنوع گزارشتاریخ معدوم‌سازیتعدادتاریخ ثبت
{{ report.MoReportId|default:"-" }}{{ report.ReportTypeString|default:"-" }}{{ report.MoDateShamsi|default:"-" }}{{ report.GoodCount|default_if_none:0|int|toLocaleStr }}{{ report.RegDateShamsiWithTime|default:report.RegDateShamsi|default:"-" }}
گزارشی ثبت نشده است
+
+ + +
+ diff --git a/templates/poultry_science_report.html b/templates/poultry_science_report.html new file mode 100644 index 0000000..96a327e --- /dev/null +++ b/templates/poultry_science_report.html @@ -0,0 +1,440 @@ +{% extends "base.html" %} +{% block title %} +گزارش بازرسی مرغداری - سامانه رصدیار +{% endblock %} +{% block body %} +
+
+
{{ report_id }}
+
{{ inspection_date }}
+
-
+
+
+

+ گزارش بازرسی مرغداری +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
تاریخ بازرسیشناسه بازرسینام فارمشناسه یکتاشناسه جوجه ریزیشهرستانتاریخ جوجه ریزیتعداد جوجه ریزیوضعیت بازرسی
{{ inspection_date }}{{ report_id }}{{ unit_name }}{{ breeding_unique_id }}{{ licence_number }}{{ city }}{{ hatching_date }}{{ initial_quantity }}{{ inspection_status }}
+ + +

اطلاعات

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
نام واحد + مرغداری{{ unit_name }}کد یکتا / + شناسه واحد{{ breeding_unique_id }}
پروانه بهداشتی + {{ health_permit }}مجوز جوجه ریزی + {{ hatching_licence }}
کد اپیدمیولوژیک + {{ epidemiological_code }}اعتبار پروانه بهره + برداری{{ permit_validity }}
وضعیت مستاجر + {{ tenant_status }}نام مالک / بهره + بردار{{ owner_name }}
نوع مالکیت{{ ownership_type }}کد ملی بهره + بردار{{ owner_national_code }}
استان{{ province }}شهر{{ city }}
مختصات جغرافیایی + {{ coordinates }}شماره تماس بهره + بردار{{ owner_mobile }}
ظرفیت اسمی + واحدها{{ nominal_capacity }}تاریخ جوجه ریزی + {{ hatching_date }}
تاریخ بازدید + {{ inspection_date }}تعداد جوجه ریزی + اولیه{{ initial_quantity }}
تعداد جوجه ریزی توسط + دامپزشکی{{ vet_quantity }}تعداد جوجه طبق خود اظهاری + مرغدار{{ self_declared_quantity }}
منبع تهیه جوجه + {{ chick_source }}سن جوجه در زمان + بازدید{{ chicken_age }}
نوع نژاد{{ breed_type }}
+ + +

پایش سلامت

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
وضعیت بهداشتی + سالن{{ health_status }}وضعیت + تهویه{{ ventilation_status }}
وضعیت بستر{{ bedding_status }}دما و رطوبت سالن با توجه + به سن جوجه{{ temperature_humidity }}
کیفیت آب مصرفی + {{ water_quality }}منبع آب مصرفی + {{ water_source }}
تعداد تلفات عادی + دوره{{ normal_losses }}تلفات غیر عادی + {{ abnormal_losses }}
علت تلفات غیر + عادی{{ abnormal_losses_reason }}نوع بیماری + تشخیصی{{ disease_type }}
نمونه برداری انجام + شده{{ sampling_done }}نوع نمونه{{ sample_type }}
نام مسئول فنی + بهداشتی{{ health_responsible }}نام مسئول فنی نظام + مهندسی{{ engineering_responsible }}
+ +
+ +
+ + +
+
+
{{ report_id }}
+
{{ inspection_date }}
+
-
+
+
+ + +

زیرساخت

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
وضعیت + نهاده{{ input_status }}نوع + دان{{ feed_type }}
کیفیت دانه{{ feed_quality }}موجودی تا روز + بازدید{{ inventory_until_visit }}
موجودی در انبار + {{ warehouse_inventory }}کد رهگیری{{ tracking_code }}
نام شرکت{{ company_name }}نوع ژنراتور{{ generator_type }}
مدل ژنراتور{{ generator_model }}تعداد ژنراتور + {{ generator_count }}
نوع سوخت{{ fuel_type }}ظرفیت ژنراتور + {{ generator_capacity }}
میزان موجودی سوخت اضطراری + (لیتر){{ emergency_fuel }}سابقه قطعی برق دوره + جاری{{ power_cut_history }}
مدت زمان قطعی + {{ power_cut_duration }}ساعت قطعی{{ power_cut_hour }}
عملکرد ژنراتور + {{ generator_status }}توضیحات تکمیلی + {{ additional_notes }}
+ + +

نیروی انسانی و تسهیلات

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
تعداد افراد + شاغل{{ employee_count }}تعداد افراد + بومی{{ local_employee_count }}
تعداد افراد غیر + بومی{{ non_local_employee_count }}وضعیت قرارداد + کارگران{{ worker_contract_status }}
آموزش دیده در حوزه بهداشت + و امنیت زیستی{{ health_training }}تسهیلات دریافتی + فعال{{ active_facilities }}
نوع تسهیلات{{ facility_type }}مبلغ تسهیلات + {{ facility_amount }}
وضعیت بازپرداخت + {{ repayment_status }}درخواست جدید بهره + بردار{{ new_request }}
تاریخ تسهیلات + {{ facility_date }}
+ + +

مستندات

+ + + + + + + + + + + + + + + + + +
+ وضعیت کلی سالن + {% if hall_images %} + {% for img in hall_images %} + + {% endfor %} + {% else %} + تصویری موجود نیست + {% endif %} +
+ انبار نهاده ها + {% if warehouse_images %} + {% for img in warehouse_images %} + + {% endfor %} + {% else %} + تصویری موجود نیست + {% endif %} +
+ تلفات + {% if losses_images %} + {% for img in losses_images %} + + {% endfor %} + {% else %} + تصویری موجود نیست + {% endif %} +
+ تصاویر تخلف + {% if violation_images %} + {% for img in violation_images %} + + {% endfor %} + {% else %} + تصویری موجود نیست + {% endif %} +
+ + +

توصیه ها / اخطارها / اقدامات اصلاحی +

+
+

وضعیت: {{ inspection_status_text }}

+

{{ recommendations }}

+
+ + +

احراز مسئول سالن

+ + + + + + + + + + + +
مسئول سالن + حضور دارد؟{{ hall_responsible_present }}نام مسئول + سالن در زمان بازدید{{ hall_responsible_name }}
تلفن مسئول سالن + {{ hall_responsible_phone }}
+ +
+ +
+ +{% endblock %} \ No newline at end of file diff --git a/templates/summary_report.html b/templates/summary_report.html new file mode 100644 index 0000000..b070c33 --- /dev/null +++ b/templates/summary_report.html @@ -0,0 +1,91 @@ +{% extends "base.html" %} +{% block title %} + سامانه رصدیار +{% endblock title %} +{% block body %} +
+ +
+ +
+ {{ number }} +
+
+ {{ date }} +
+
+ - +
+
+
+

+ از تاریخ {{ from_date }} تا تاریخ {{ to_date }} استان {{ province }} +

+ +

+ به اطلاع می‌رساند : +

+

+ تعداد {{ poultry_count }} فارم فعال در سطح استان شناسایی شده که از این تعداد {{ chain_count }} فارم + دارای زنجیره هستند. مجموع جوجه‌ریزی + در این بازه زمانی به بیش از {{ poultry_hatching_quantity }} قطعه رسیده که با احتساب تلفات دامپزشکی و + اتحادیه({{ poultry_hatching_total_losses }} قطعه)، + حدود {{ poultry_hatching_killed_quantity }} قطعه کشتار شده و بیش از{{ poultry_hatching_left_over }} قطعه + نیز همچنان در سالن‌ها باقی مانده‌اند. تعداد + {{ poultry_hatching_gt_60 }} + فارم با سن بیش از ۶۰ روز شناسایی شده که حجم کلی آن‌ها حدود {{ poultry_hatching_gt_60_quantity }} قطعه + بوده و میانگین مانده در سالن + آن‌ها حدود {{ poultry_hatching_gt_60_left_over }} درصد است. بیشترین سن کشتار به + فارم {{ max_age_poultry_name }} در + {{ max_age_poultry_city }} با + {{ max_age_poultry }} روز و کمترین سن + کشتار به فارم {{ min_age_poultry_name }} در {{ min_age_poultry_city }} با {{ min_age_poultry }} روز تعلق + دارد. +

+

+ در مجموع {{ kill_house_request_count }} بار کشتار در داخل استان ثبت شده که منجر به کشتار بیش + از {{ kill_house_request_quantity }} قطعه با وزنی حدود + {{ kill_house_request_weight }} + کیلوگرم شده است. همچنین {{ free_bars_count }} بار خریداری از خارج استان انجام شده که + شامل {{ free_bars_quantity }} قطعه با وزن + {{ free_bars_live_weight }} کیلوگرم بوده که بیشترین خریدار در این حوزه، {{ kill_house_name }} + با {{ transaction_count }} بار بوده است. +

+

+ از نظر عملکرد خریداران، {{ kill_house_name_req }} با {{ transaction_count_req }} بار + و {{ total_quantity_top_inner }} قطعه بیشترین خرید داخل استان را داشته و + {{ kill_house_name }} + با {{ total_quantity_top_out }} قطعه بیشترین حجم خرید از خارج استان را انجام داده است. بیشترین بار + ارسالی از داخل + استان مربوط به مرغداری {{ poultry_req_name_req }} {{ poultry_city_req_name_req }} + با {{ top_poultry_req_stats_total_quantity }} قطعه و از خارج استان مربوط به + مرغداری {{ out_poultry_req_name_req }} + در {{ out_poultry_province_req_name_req }} شهر {{ out_poultry_city_req_name_req }} + با {{ out_top_poultry_req_stats_total_quantity }} قطعه است. +

+

+ در خصوص توزیع لاشه، مجموع وزن لاشه فروش رفته از انبارها به میزان {{ steward_sum_weight_sale }} کیلوگرم به داخل استان و + {{ free_bar_sum_weight_sale }} کیلوگرم به خارج از استان صورت گرفته است. مهم‌ترین واحد‌ توزیع‌کننده لاشه درون استان + {{ out_kill_house_top }} + با وزن {{ out_weight_top }} کیلوگرم که بخش عمده‌ای از فروش داخلی را بر عهده داشته‌است. + و {{ free_bars_kill_house_top }} با وزن {{ free_bars_weight_top }} کیلوگرم توزیع به خارج استان بیشترین گوشت را از استان خارج کرده است. +

+

+ از نظر اسناد و قبوض باسکول، {{percent_bar_document_status_rejected_all}} درصد از بارها دارای سند مشکوک یا عدم احراز اصالت می باشند. +

+

+ جزییات گزارش عملکرد: + دانلود اکسل +

+ +
+ + +
+ +{% endblock body %} \ No newline at end of file diff --git a/templatetags/__init__.py b/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/templatetags/jalali_filters.py b/templatetags/jalali_filters.py new file mode 100644 index 0000000..5098a0c --- /dev/null +++ b/templatetags/jalali_filters.py @@ -0,0 +1,47 @@ +from django import template +from datetime import datetime + +from panel.helper_excel import shamsi_date, to_locale_str + +register = template.Library() + + +@register.filter(name='jalali') +def jalali(value): + if not value: + return "" + + try: + if isinstance(value, str): + try: + value = datetime.fromisoformat(value) + except: + return '-' + + if hasattr(value, 'date'): + value = value.date() + + return shamsi_date(value,in_value=True) + except: + return '-' + + +@register.filter(name='isNone') +def is_none(value): + if value is None: + return "-" + return value + + +@register.filter(name='toLocaleStr') +def to_locale_string(value): + if value is None: + return "-" + return to_locale_str(value) + + +@register.filter(name='int') +def to_int(value): + if value is None: + return "-" + return int(value) diff --git a/ticket/__init__.py b/ticket/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ticket/admin.py b/ticket/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/ticket/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/ticket/apps.py b/ticket/apps.py new file mode 100644 index 0000000..1b423f8 --- /dev/null +++ b/ticket/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class TicketConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'ticket' diff --git a/ticket/bucket.py b/ticket/bucket.py new file mode 100644 index 0000000..262f1c2 --- /dev/null +++ b/ticket/bucket.py @@ -0,0 +1,97 @@ +from botocore.exceptions import NoCredentialsError +import boto3 +import logging +from PIL import Image +import io +import base64 + +LIARA_ENDPOINT = 'https://storage.c2.liara.space' +LIARA_BUCKET_NAME = 'ticket-rasadyar' +LIARA_ACCESS_KEY = "gvqohestrakmqi6n" +LIARA_SECRET_KEY = '7240fdd8-59bc-4f02-b5e6-4a124e37fa0e' + +RASADYAR_ENDPOINT = 'https://s3.rasadyar.com' +RASADYAR_BUCKET_NAME = 'rasadyar' +RASADYAR_ACCESS_KEY = "zG3ewsbYsTqCmuws" +RASADYAR_SECRET_KEY = 'RInUMB78zlQZp6CNf8+sRoSh2cNDHcGQhXrLnTJ1AuI=' + + +def upload_to_liara(image, name): + s3 = boto3.client( + 's3', + endpoint_url=RASADYAR_ENDPOINT, + aws_access_key_id=RASADYAR_ACCESS_KEY, + aws_secret_access_key=RASADYAR_SECRET_KEY + ) + + s3.upload_fileobj( + image, + RASADYAR_BUCKET_NAME, + name, + ExtraArgs={'ACL': 'public-read'} # دسترسی عمومی + ) + + return f"{RASADYAR_ENDPOINT}/{RASADYAR_BUCKET_NAME}/{name}" + +def connect(): + logging.basicConfig(level=logging.INFO) + + try: + s3 = boto3.client( + 's3', + endpoint_url=LIARA_ENDPOINT, + aws_access_key_id=LIARA_ACCESS_KEY, + aws_secret_access_key=LIARA_SECRET_KEY + ) + except Exception as exc: + logging.info(exc) + return s3 + + +def upload_object_resize_to_liara(image_data, object_name): + try: + imgdata = base64.b64decode(image_data) + img = Image.open(io.BytesIO(imgdata)) + + img.thumbnail((500, 500)) + + buffer = io.BytesIO() + img.save(buffer, format="PNG") + buffer.seek(0) + + s3_resource = boto3.resource( + 's3', + endpoint_url=LIARA_ENDPOINT, + aws_access_key_id=LIARA_ACCESS_KEY, + aws_secret_access_key=LIARA_SECRET_KEY + ) + + bucket = s3_resource.Bucket(LIARA_BUCKET_NAME) + bucket.put_object( + ACL='public-read', + Body=buffer, + Key=object_name, + ContentType='image/png' + ) + + return f"{LIARA_ENDPOINT}/{LIARA_BUCKET_NAME}/{object_name}" + + except Exception as e: + raise Exception(f"خطا در آپلود فایل: {e}") + + +def delete_file_from_liara(file_name): + try: + s3 = boto3.client( + 's3', + endpoint_url=LIARA_ENDPOINT, + aws_access_key_id=LIARA_ACCESS_KEY, + aws_secret_access_key=LIARA_SECRET_KEY + ) + + s3.delete_object(Bucket=LIARA_BUCKET_NAME, Key=file_name) + + except NoCredentialsError: + raise Exception("اعتبارنامه‌های AWS معتبر نیستند") + except Exception as e: + raise Exception(f"خطا در آپلود فایل: {e}") diff --git a/ticket/customer_views.py b/ticket/customer_views.py new file mode 100644 index 0000000..a8a7323 --- /dev/null +++ b/ticket/customer_views.py @@ -0,0 +1,127 @@ +import random + +from rest_framework import viewsets +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, +) +from .models import ( + Ticket, + TicketContent, + Answer, + Question, + SupportUnit, + Group, + SystemUserProfile +) +from .serializers import ( + TicketSerializer, + TicketContentSerializer, + TicketAnswerSerializer, + TicketQuestionSerializer, + SupportUnitSerializer +) +from rest_framework.response import Response +from .helper import upload_listed_image +from rest_framework import status +from datetime import datetime + + +class CustomerTicketViewSet(viewsets.ModelViewSet): + queryset = Ticket.objects.all() + serializer_class = TicketSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + # get user object + user = SystemUserProfile.objects.get(user=request.user) + + # different style of ticket information + if 'pending' in request.GET: + ticket = self.queryset.filter(customer=user, state='pending') + serializer = self.serializer_class(ticket, many=True) + elif 'responded' in request.GET: + ticket = self.queryset.filter(customer=user, state='responded') + serializer = self.serializer_class(ticket, many=True) + elif 'closed' in request.GET: + ticket = self.queryset.filter(customer=user, state='closed') + serializer = self.serializer_class(ticket, many=True) + elif 'all' in request.GET: + ticket = self.queryset.filter(customer=user) + serializer = self.serializer_class(ticket, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def retrieve(self, request, *args, **kwargs): + ticket = self.queryset.get(key=request.data['key']) + serializer = self.serializer_class(ticket) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + + if 'ticket_key' in request.data.keys(): + ticket_key = request.data['ticket_key'] + request.data.pop('ticket_key') + else: + ticket_key = None + + # get group unit information + group = Group.objects.get( + name__exact=request.data['support_unit'] + ) + request.data.pop('support_unit') # pop this block from body data + + # get support unit object information + support_unit = SupportUnit.objects.get( + unit=group + ) + + # ticket number + ticket_id = random.randint(1000000, 9999999) + + # process list of images + req = upload_listed_image(req=request, field='image') + + # create ticket content + content_serializer = TicketContentSerializer(data=req.data) + if content_serializer.is_valid(): + content_obj = content_serializer.create(validated_data=req.data) + + # create question from customer + question = Question( + questioner=SystemUserProfile.objects.get(user=request.user), + content=content_obj + ) + question.save() + + if ticket_key is not None: + ticket = Ticket.objects.get(key=ticket_key) + ticket.question.add(question) + ticket.state = 'pending' + ticket.save() + else: + # create final ticket + ticket = Ticket( + customer=SystemUserProfile.objects.get(user=request.user), + support_unit=support_unit, + state='pending', + ticket_id=ticket_id + ) + ticket.save() + ticket.question.add(question) + + serializer = self.serializer_class(ticket) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + def update(self, request, *args, **kwargs): + ticket = self.queryset.get(key=request.data['ticket_key']) # contains ticket object + request.data.pop('ticket_key') + + # send ticket object to serializer for update + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + ticket_updated = serializer.update(validated_data=request.data, instance=ticket) + serializer = self.serializer_class(ticket_updated) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors) + + def destroy(self, request, *args, **kwargs): + pass diff --git a/ticket/helper.py b/ticket/helper.py new file mode 100644 index 0000000..5a7b566 --- /dev/null +++ b/ticket/helper.py @@ -0,0 +1,75 @@ +import base64 +import io +import os +import random +import string + +import boto3 +from PIL import Image + +from ticket.bucket import RASADYAR_ENDPOINT, RASADYAR_BUCKET_NAME, RASADYAR_ACCESS_KEY, RASADYAR_SECRET_KEY + +ARVAN_TICKET_GALLERY = "https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/" +# ARVAN_TICKET_GALLERY = "https://ticketgallery.s3.ir-thr-at1.arvanstorage.com/" +ARVAN_User_Image_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' + + +def send_image_to_server(image): + ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15)) + imgdata = base64.b64decode(image) + img = Image.open(io.BytesIO(imgdata)) + + img.thumbnail((500, 500)) + + buffer = io.BytesIO() + img.save(buffer, format="PNG") + buffer.seek(0) + + s3_resource = boto3.resource( + 's3', + endpoint_url=RASADYAR_ENDPOINT, + aws_access_key_id=RASADYAR_ACCESS_KEY, + aws_secret_access_key=RASADYAR_SECRET_KEY + ) + + bucket = s3_resource.Bucket(RASADYAR_BUCKET_NAME) + bucket.put_object( + ACL='public-read', + Body=buffer, + Key=ran + '.jpg', + ContentType='image/png' + ) + + image_url = f"{RASADYAR_ENDPOINT}/{RASADYAR_BUCKET_NAME}/{ran + '.jpg'}" + + return image_url + + +def upload_listed_image(req=None, field=None): + image_list = [] + if req.data[field] != []: + for item in req.data[field]: + image_list.append(send_image_to_server(item)) + req.data.pop(field) + req.data[field] = image_list + elif req.data[field] == "": + req.data[field] = "empty" + return req + + +def send_image_to_server_for_poultry_science(image, name): + s3 = boto3.client( + 's3', + endpoint_url=RASADYAR_ENDPOINT, + aws_access_key_id=RASADYAR_ACCESS_KEY, + aws_secret_access_key=RASADYAR_SECRET_KEY + ) + + s3.upload_fileobj( + image, + RASADYAR_BUCKET_NAME, + name, + ExtraArgs={'ACL': 'public-read'} # دسترسی عمومی + ) + + return f"{RASADYAR_ENDPOINT}/{RASADYAR_BUCKET_NAME}/{name}" diff --git a/ticket/migrations/0001_initial.py b/ticket/migrations/0001_initial.py new file mode 100644 index 0000000..49f2f7f --- /dev/null +++ b/ticket/migrations/0001_initial.py @@ -0,0 +1,150 @@ +# Generated by Django 3.2.13 on 2023-09-18 19:32 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('authentication', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Answer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.CharField(max_length=100, null=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('state', models.CharField(max_length=100, null=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SupportUnit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supportunit_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supportunit_modifiedby', to=settings.AUTH_USER_MODEL)), + ('unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='support_unit', to='auth.group')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='TicketContent', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(max_length=200, null=True)), + ('content', models.TextField(max_length=2000, null=True)), + ('image', models.JSONField(default=dict)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticketcontent_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticketcontent_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Ticket', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, null=True, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('ticket_id', models.BigIntegerField(default=0)), + ('state', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticket_createdby', to=settings.AUTH_USER_MODEL)), + ('customer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticket_customer', to='authentication.systemuserprofile')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticket_modifiedby', to=settings.AUTH_USER_MODEL)), + ('operator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticket_operator', to='authentication.systemuserprofile')), + ('question', models.ManyToManyField(related_name='ticket_question', to='ticket.Question')), + ('respond', models.ManyToManyField(related_name='ticket_respond', to='ticket.Answer')), + ('support_unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticket_unit', to='ticket.supportunit')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='question', + name='content', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='questioner_content', to='ticket.ticketcontent'), + ), + migrations.AddField( + model_name='question', + name='created_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='question_createdby', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='question', + name='modified_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='question_modifiedby', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='question', + name='questioner', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='questioner', to='authentication.systemuserprofile'), + ), + migrations.AddField( + model_name='answer', + name='content', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='answer_content', to='ticket.ticketcontent'), + ), + migrations.AddField( + model_name='answer', + name='created_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='answer_createdby', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='answer', + name='modified_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='answer_modifiedby', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='answer', + name='question', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='answer_question', to='ticket.question'), + ), + migrations.AddField( + model_name='answer', + name='responder', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='answer', to='authentication.systemuserprofile'), + ), + ] diff --git a/ticket/migrations/0002_auto_20240612_0954.py b/ticket/migrations/0002_auto_20240612_0954.py new file mode 100644 index 0000000..793e16d --- /dev/null +++ b/ticket/migrations/0002_auto_20240612_0954.py @@ -0,0 +1,66 @@ +# Generated by Django 3.2.13 on 2024-06-12 09:54 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0035_auto_20240612_0954'), + ('ticket', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='answer', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='question', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='supportunit', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='ticket', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.AlterField( + model_name='ticketcontent', + name='key', + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + migrations.CreateModel( + name='TicketSupport', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('userlocation', models.CharField(max_length=250, null=True)), + ('title', models.CharField(max_length=100, null=True)), + ('picture', models.CharField(max_length=250, null=True)), + ('text', models.TextField(null=True)), + ('ticket_id', models.BigIntegerField(default=0)), + ('state', models.CharField(default='open', max_length=100)), + ('type', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticketsupport_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticketsupport_modifiedby', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticket_support', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/ticket/migrations/0003_alter_ticketsupport_ticket_id.py b/ticket/migrations/0003_alter_ticketsupport_ticket_id.py new file mode 100644 index 0000000..e124ece --- /dev/null +++ b/ticket/migrations/0003_alter_ticketsupport_ticket_id.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-06-12 09:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0002_auto_20240612_0954'), + ] + + operations = [ + migrations.AlterField( + model_name='ticketsupport', + name='ticket_id', + field=models.BigIntegerField(default=1), + ), + ] diff --git a/ticket/migrations/0004_auto_20240612_1936.py b/ticket/migrations/0004_auto_20240612_1936.py new file mode 100644 index 0000000..d9a52b8 --- /dev/null +++ b/ticket/migrations/0004_auto_20240612_1936.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.13 on 2024-06-12 19:36 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0037_auto_20240612_1936'), + ('ticket', '0003_alter_ticketsupport_ticket_id'), + ] + + operations = [ + migrations.RenameField( + model_name='ticketsupport', + old_name='state', + new_name='status', + ), + migrations.CreateModel( + name='MessageSupport', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.TextField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='authentication.systemuserprofile')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='replies', to='ticket.messagesupport')), + ('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='ticket.ticketsupport')), + ], + ), + ] diff --git a/ticket/migrations/0005_messagesupport_sender.py b/ticket/migrations/0005_messagesupport_sender.py new file mode 100644 index 0000000..fbd3dea --- /dev/null +++ b/ticket/migrations/0005_messagesupport_sender.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-06-15 14:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0004_auto_20240612_1936'), + ] + + operations = [ + migrations.AddField( + model_name='messagesupport', + name='sender', + field=models.CharField(default='user', max_length=50), + ), + ] diff --git a/ticket/migrations/0006_auto_20240615_1418.py b/ticket/migrations/0006_auto_20240615_1418.py new file mode 100644 index 0000000..8c49756 --- /dev/null +++ b/ticket/migrations/0006_auto_20240615_1418.py @@ -0,0 +1,35 @@ +# Generated by Django 3.2.13 on 2024-06-15 14:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0005_messagesupport_sender'), + ] + + operations = [ + migrations.RemoveField( + model_name='ticketsupport', + name='picture', + ), + migrations.RemoveField( + model_name='ticketsupport', + name='text', + ), + migrations.RemoveField( + model_name='ticketsupport', + name='userlocation', + ), + migrations.AddField( + model_name='messagesupport', + name='picture', + field=models.CharField(max_length=250, null=True), + ), + migrations.AddField( + model_name='messagesupport', + name='user_location', + field=models.CharField(max_length=250, null=True), + ), + ] diff --git a/ticket/migrations/0007_ticketsupport_to_user.py b/ticket/migrations/0007_ticketsupport_to_user.py new file mode 100644 index 0000000..df5189c --- /dev/null +++ b/ticket/migrations/0007_ticketsupport_to_user.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.13 on 2024-08-30 10:34 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0045_auto_20240830_1034'), + ('ticket', '0006_auto_20240615_1418'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='to_user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='to_user_ticket', to='authentication.systemuserprofile'), + ), + ] diff --git a/ticket/migrations/0008_messagesupport_send_message.py b/ticket/migrations/0008_messagesupport_send_message.py new file mode 100644 index 0000000..1d72e85 --- /dev/null +++ b/ticket/migrations/0008_messagesupport_send_message.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-08-31 08:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0007_ticketsupport_to_user'), + ] + + operations = [ + migrations.AddField( + model_name='messagesupport', + name='send_message', + field=models.BooleanField(default=False), + ), + ] diff --git a/ticket/migrations/0009_ticketsupport_is_read.py b/ticket/migrations/0009_ticketsupport_is_read.py new file mode 100644 index 0000000..0be9a5a --- /dev/null +++ b/ticket/migrations/0009_ticketsupport_is_read.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-09-07 10:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0008_messagesupport_send_message'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='is_read', + field=models.BooleanField(default=False), + ), + ] diff --git a/ticket/migrations/0010_remove_ticketsupport_is_read.py b/ticket/migrations/0010_remove_ticketsupport_is_read.py new file mode 100644 index 0000000..31fba7f --- /dev/null +++ b/ticket/migrations/0010_remove_ticketsupport_is_read.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2024-09-07 13:47 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0009_ticketsupport_is_read'), + ] + + operations = [ + migrations.RemoveField( + model_name='ticketsupport', + name='is_read', + ), + ] diff --git a/ticket/migrations/0011_ticketsupport_last_message.py b/ticket/migrations/0011_ticketsupport_last_message.py new file mode 100644 index 0000000..0efd1bf --- /dev/null +++ b/ticket/migrations/0011_ticketsupport_last_message.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-09-07 13:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0010_remove_ticketsupport_is_read'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='last_message', + field=models.CharField(max_length=100, null=True), + ), + ] diff --git a/ticket/migrations/0012_auto_20240907_1417.py b/ticket/migrations/0012_auto_20240907_1417.py new file mode 100644 index 0000000..f3bbc0a --- /dev/null +++ b/ticket/migrations/0012_auto_20240907_1417.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.13 on 2024-09-07 14:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0011_ticketsupport_last_message'), + ] + + operations = [ + migrations.RemoveField( + model_name='messagesupport', + name='user_location', + ), + migrations.RemoveField( + model_name='ticketsupport', + name='type', + ), + ] diff --git a/ticket/migrations/0013_ticketpermission.py b/ticket/migrations/0013_ticketpermission.py new file mode 100644 index 0000000..c5f9bd6 --- /dev/null +++ b/ticket/migrations/0013_ticketpermission.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2024-09-10 13:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('ticket', '0012_auto_20240907_1417'), + ] + + operations = [ + migrations.CreateModel( + name='TicketPermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('from_role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='from_role', to='auth.group')), + ('to_role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='to_role', to='auth.group')), + ], + ), + ] diff --git a/ticket/migrations/0014_auto_20240911_0853.py b/ticket/migrations/0014_auto_20240911_0853.py new file mode 100644 index 0000000..573ed01 --- /dev/null +++ b/ticket/migrations/0014_auto_20240911_0853.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.13 on 2024-09-11 08:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('ticket', '0013_ticketpermission'), + ] + + operations = [ + migrations.RemoveField( + model_name='ticketpermission', + name='from_role', + ), + migrations.RemoveField( + model_name='ticketpermission', + name='to_role', + ), + migrations.AddField( + model_name='ticketpermission', + name='role', + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name='ticketpermission', + name='roles', + field=models.ManyToManyField(null=True, related_name='to_role', to='auth.Group'), + ), + ] diff --git a/ticket/migrations/0015_auto_20240912_1105.py b/ticket/migrations/0015_auto_20240912_1105.py new file mode 100644 index 0000000..ff85c6a --- /dev/null +++ b/ticket/migrations/0015_auto_20240912_1105.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.13 on 2024-09-12 11:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('authentication', '0047_auto_20240912_1105'), + ('ticket', '0014_auto_20240911_0853'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='to_role', + field=models.ManyToManyField(null=True, related_name='to_role_ticket', to='auth.Group'), + ), + migrations.AddField( + model_name='ticketsupport', + name='type_ticket', + field=models.CharField(default='single', max_length=100), + ), + migrations.RemoveField( + model_name='ticketsupport', + name='to_user', + ), + migrations.AddField( + model_name='ticketsupport', + name='to_user', + field=models.ManyToManyField(null=True, related_name='to_user_ticket', to='authentication.SystemUserProfile'), + ), + ] diff --git a/ticket/migrations/0016_ticketsupport_picture.py b/ticket/migrations/0016_ticketsupport_picture.py new file mode 100644 index 0000000..4aeea4d --- /dev/null +++ b/ticket/migrations/0016_ticketsupport_picture.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-09-12 11:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0015_auto_20240912_1105'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='picture', + field=models.CharField(max_length=250, null=True), + ), + ] diff --git a/ticket/migrations/0017_auto_20240912_1118.py b/ticket/migrations/0017_auto_20240912_1118.py new file mode 100644 index 0000000..21fab76 --- /dev/null +++ b/ticket/migrations/0017_auto_20240912_1118.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.13 on 2024-09-12 11:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0048_auto_20240912_1118'), + ('auth', '0012_alter_user_first_name_max_length'), + ('ticket', '0016_ticketsupport_picture'), + ] + + operations = [ + migrations.AlterField( + model_name='ticketpermission', + name='roles', + field=models.ManyToManyField(related_name='to_role', to='auth.Group'), + ), + migrations.AlterField( + model_name='ticketsupport', + name='to_role', + field=models.ManyToManyField(related_name='to_role_ticket', to='auth.Group'), + ), + migrations.AlterField( + model_name='ticketsupport', + name='to_user', + field=models.ManyToManyField(related_name='to_user_ticket', to='authentication.SystemUserProfile'), + ), + ] diff --git a/ticket/migrations/0018_auto_20240912_1258.py b/ticket/migrations/0018_auto_20240912_1258.py new file mode 100644 index 0000000..ea654d0 --- /dev/null +++ b/ticket/migrations/0018_auto_20240912_1258.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.13 on 2024-09-12 12:58 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0017_auto_20240912_1118'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='parent', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='ticket.ticketsupport'), + ), + migrations.AddField( + model_name='ticketsupport', + name='read_only', + field=models.BooleanField(default=True), + ), + ] diff --git a/ticket/migrations/0019_remove_ticketsupport_picture.py b/ticket/migrations/0019_remove_ticketsupport_picture.py new file mode 100644 index 0000000..0fc190c --- /dev/null +++ b/ticket/migrations/0019_remove_ticketsupport_picture.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2024-09-14 09:26 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0018_auto_20240912_1258'), + ] + + operations = [ + migrations.RemoveField( + model_name='ticketsupport', + name='picture', + ), + ] diff --git a/ticket/migrations/0020_ticketsupport_role.py b/ticket/migrations/0020_ticketsupport_role.py new file mode 100644 index 0000000..ed27f1a --- /dev/null +++ b/ticket/migrations/0020_ticketsupport_role.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-09-14 09:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0019_remove_ticketsupport_picture'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='role', + field=models.CharField(max_length=100, null=True), + ), + ] diff --git a/ticket/migrations/0021_messagesupport_last_seen.py b/ticket/migrations/0021_messagesupport_last_seen.py new file mode 100644 index 0000000..5cdc4dc --- /dev/null +++ b/ticket/migrations/0021_messagesupport_last_seen.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-09-14 10:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0020_ticketsupport_role'), + ] + + operations = [ + migrations.AddField( + model_name='messagesupport', + name='last_seen', + field=models.DateTimeField(null=True), + ), + ] diff --git a/ticket/migrations/0022_auto_20240917_0951.py b/ticket/migrations/0022_auto_20240917_0951.py new file mode 100644 index 0000000..50c9ac9 --- /dev/null +++ b/ticket/migrations/0022_auto_20240917_0951.py @@ -0,0 +1,22 @@ +# Generated by Django 3.2.13 on 2024-09-17 09:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0021_messagesupport_last_seen'), + ] + + operations = [ + migrations.RemoveField( + model_name='ticketsupport', + name='id', + ), + migrations.AlterField( + model_name='ticketsupport', + name='ticket_id', + field=models.AutoField(primary_key=True, serialize=False), + ), + ] \ No newline at end of file diff --git a/ticket/migrations/0023_auto_20241228_0919.py b/ticket/migrations/0023_auto_20241228_0919.py new file mode 100644 index 0000000..443c45c --- /dev/null +++ b/ticket/migrations/0023_auto_20241228_0919.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.13 on 2024-12-28 09:19 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0022_auto_20240917_0951'), + ] + + operations = [ + migrations.RemoveField( + model_name='messagesupport', + name='ticket', + ), + migrations.DeleteModel( + name='TicketSupport', + ), + ] diff --git a/ticket/migrations/0024_ticketsupport.py b/ticket/migrations/0024_ticketsupport.py new file mode 100644 index 0000000..dd95db4 --- /dev/null +++ b/ticket/migrations/0024_ticketsupport.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.13 on 2024-12-28 09:26 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('auth', '0012_alter_user_first_name_max_length'), + ('authentication', '0054_auto_20241228_0926'), + ('ticket', '0023_auto_20241228_0919'), + ] + + operations = [ + migrations.CreateModel( + name='TicketSupport', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('title', models.CharField(max_length=100, null=True)), + ('ticket_id', models.IntegerField(null=True, unique=True)), + ('status', models.CharField(default='open', max_length=100)), + ('last_message', models.CharField(max_length=100, null=True)), + ('type_ticket', models.CharField(default='single', max_length=100)), + ('read_only', models.BooleanField(default=True)), + ('role', models.CharField(max_length=100, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticketsupport_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticketsupport_modifiedby', to=settings.AUTH_USER_MODEL)), + ('parent', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='ticket.ticketsupport')), + ('to_role', models.ManyToManyField(related_name='to_role_ticket', to='auth.Group')), + ('to_user', models.ManyToManyField(related_name='to_user_ticket', to='authentication.SystemUserProfile')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticket_support', to='authentication.systemuserprofile')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/ticket/migrations/0025_messagesupport_ticket.py b/ticket/migrations/0025_messagesupport_ticket.py new file mode 100644 index 0000000..602efaa --- /dev/null +++ b/ticket/migrations/0025_messagesupport_ticket.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2024-12-28 09:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0024_ticketsupport'), + ] + + operations = [ + migrations.AddField( + model_name='messagesupport', + name='ticket', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='ticket.ticketsupport'), + ), + ] diff --git a/ticket/migrations/0026_messagesupport_file.py b/ticket/migrations/0026_messagesupport_file.py new file mode 100644 index 0000000..582a85c --- /dev/null +++ b/ticket/migrations/0026_messagesupport_file.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-12-29 21:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0025_messagesupport_ticket'), + ] + + operations = [ + migrations.AddField( + model_name='messagesupport', + name='file', + field=models.TextField(null=True), + ), + ] diff --git a/ticket/migrations/0027_ticketsupport_unread_message.py b/ticket/migrations/0027_ticketsupport_unread_message.py new file mode 100644 index 0000000..ce514d6 --- /dev/null +++ b/ticket/migrations/0027_ticketsupport_unread_message.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2024-12-31 21:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0026_messagesupport_file'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='unread_message', + field=models.BooleanField(default=False), + ), + ] diff --git a/ticket/migrations/0028_messagesupport_read_by.py b/ticket/migrations/0028_messagesupport_read_by.py new file mode 100644 index 0000000..d96394d --- /dev/null +++ b/ticket/migrations/0028_messagesupport_read_by.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2025-01-18 14:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0056_auto_20250118_1418'), + ('ticket', '0027_ticketsupport_unread_message'), + ] + + operations = [ + migrations.AddField( + model_name='messagesupport', + name='read_by', + field=models.ManyToManyField(blank=True, related_name='read_messages', to='authentication.SystemUserProfile'), + ), + ] diff --git a/ticket/migrations/0029_auto_20250126_2046.py b/ticket/migrations/0029_auto_20250126_2046.py new file mode 100644 index 0000000..175a168 --- /dev/null +++ b/ticket/migrations/0029_auto_20250126_2046.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.13 on 2025-01-26 20:46 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0058_auto_20250126_2046'), + ('ticket', '0028_messagesupport_read_by'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='is_referred', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='ticketsupport', + name='referred_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='referred_by_me', to='authentication.systemuserprofile'), + ), + migrations.AddField( + model_name='ticketsupport', + name='referred_to', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='referred_tickets', to='authentication.systemuserprofile'), + ), + ] diff --git a/ticket/migrations/0030_auto_20250126_2122.py b/ticket/migrations/0030_auto_20250126_2122.py new file mode 100644 index 0000000..ea5c9bd --- /dev/null +++ b/ticket/migrations/0030_auto_20250126_2122.py @@ -0,0 +1,29 @@ +# Generated by Django 3.2.13 on 2025-01-26 21:22 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0059_auto_20250126_2122'), + ('ticket', '0029_auto_20250126_2046'), + ] + + operations = [ + migrations.RemoveField( + model_name='ticketsupport', + name='referred_to', + ), + migrations.AddField( + model_name='ticketsupport', + name='referred_to', + field=models.ManyToManyField(related_name='referred_tickets', to='authentication.SystemUserProfile'), + ), + migrations.AlterField( + model_name='ticketsupport', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ticket_support', to='authentication.systemuserprofile'), + ), + ] diff --git a/ticket/migrations/0031_ticketsupport_referred_date.py b/ticket/migrations/0031_ticketsupport_referred_date.py new file mode 100644 index 0000000..49a58e9 --- /dev/null +++ b/ticket/migrations/0031_ticketsupport_referred_date.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2025-02-01 12:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0030_auto_20250126_2122'), + ] + + operations = [ + migrations.AddField( + model_name='ticketsupport', + name='referred_date', + field=models.DateTimeField(auto_now=True, null=True), + ), + ] diff --git a/ticket/migrations/0032_ticketclosepermission.py b/ticket/migrations/0032_ticketclosepermission.py new file mode 100644 index 0000000..28e7bc9 --- /dev/null +++ b/ticket/migrations/0032_ticketclosepermission.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.13 on 2025-05-25 09:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0031_ticketsupport_referred_date'), + ] + + operations = [ + migrations.CreateModel( + name='TicketClosePermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('active', models.BooleanField(default=False)), + ('day', models.SmallIntegerField(default=1)), + ], + ), + ] diff --git a/ticket/migrations/__init__.py b/ticket/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ticket/models.py b/ticket/models.py new file mode 100644 index 0000000..e0cf9c2 --- /dev/null +++ b/ticket/models.py @@ -0,0 +1,190 @@ +from django.db import models +from authentication.models import ( + SystemUserProfile, + BaseModel, + Group +) +from panel.models import ProvinceOperator + + +# Create your models here. + +class Ticket(BaseModel): + customer = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name='ticket_customer', + null=True + ) + operator = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name='ticket_operator', + null=True + ) + question = models.ManyToManyField( + 'Question', + related_name="ticket_question", + ) + respond = models.ManyToManyField( + 'Answer', + related_name="ticket_respond" + ) + support_unit = models.ForeignKey( + 'SupportUnit', + on_delete=models.CASCADE, + related_name="ticket_unit", + null=True + ) + ticket_id = models.BigIntegerField(default=0) + state = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(Ticket, self).save(*args, **kwargs) + + +class TicketContent(BaseModel): + title = models.CharField(max_length=200, null=True) + content = models.TextField(max_length=2000, null=True) + image = models.JSONField(default=dict) + + def save(self, *args, **kwargs): + super(TicketContent, self).save(*args, **kwargs) + + +class Question(BaseModel): + questioner = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="questioner", + null=True + ) + content = models.ForeignKey( + TicketContent, + on_delete=models.CASCADE, + related_name="questioner_content" + ) + state = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(Question, self).save(*args, **kwargs) + + +class Answer(BaseModel): + responder = models.ForeignKey( + SystemUserProfile, + on_delete=models.CASCADE, + related_name="answer", + null=True + ) + question = models.ForeignKey( + Question, + on_delete=models.CASCADE, + related_name='answer_question', + null=True + ) + content = models.ForeignKey( + TicketContent, + on_delete=models.CASCADE, + related_name='answer_content', + null=True + ) + state = models.CharField(max_length=100, null=True) + + def save(self, *args, **kwargs): + super(Answer, self).save(*args, **kwargs) + + +class SupportUnit(BaseModel): + name = models.CharField(max_length=100, null=True) + unit = models.ForeignKey( + Group, + on_delete=models.CASCADE, + related_name="support_unit", + null=True + ) + + def save(self, *args, **kwargs): + super(SupportUnit, self).save(*args, **kwargs) + + +class TicketSupport(BaseModel): + user = models.ForeignKey( + SystemUserProfile, + on_delete=models.SET_NULL, + related_name='ticket_support', + null=True + ) + referred_to = models.ManyToManyField( + SystemUserProfile, + related_name='referred_tickets', + ) + referred_by = models.ForeignKey( + SystemUserProfile, + on_delete=models.SET_NULL, + related_name='referred_by_me', + null=True, + ) + to_user=models.ManyToManyField( + SystemUserProfile, + related_name='to_user_ticket', + ) + + to_role = models.ManyToManyField( + Group, + related_name='to_role_ticket', + ) + + parent=models.ForeignKey('TicketSupport',on_delete=models.CASCADE,null=True) + title = models.CharField(max_length=100, null=True) + ticket_id = models.IntegerField(unique=True, null=True) + status = models.CharField(max_length=100, default='open') + last_message = models.CharField(max_length=100, null=True) + type_ticket = models.CharField(default='single',max_length=100) + read_only = models.BooleanField(default=True) + role = models.CharField(max_length=100, null=True) + unread_message=models.BooleanField(default=False) + is_referred = models.BooleanField(default=False) + referred_date = models.DateTimeField(auto_now=True,null=True) + + + def save(self, *args, **kwargs): + if not self.ticket_id: + last_ticket = TicketSupport.objects.order_by('-ticket_id').first() + self.ticket_id = last_ticket.ticket_id + 1 if last_ticket else 1 + super(TicketSupport, self).save(*args, **kwargs) + + +class MessageSupport(models.Model): + ticket = models.ForeignKey(TicketSupport, related_name='messages', on_delete=models.CASCADE,null=True) + created_by = models.ForeignKey(SystemUserProfile, on_delete=models.CASCADE) + parent = models.ForeignKey('self', null=True, blank=True, related_name='replies', on_delete=models.CASCADE) + message = models.TextField() + created_at = models.DateTimeField(auto_now_add=True) + sender = models.CharField(max_length=50,default='user') + picture = models.CharField(max_length=250, null=True) + send_message = models.BooleanField(default=False) + last_seen=models.DateTimeField(null=True) + file=models.TextField( null=True) + read_by = models.ManyToManyField(SystemUserProfile, related_name='read_messages', blank=True) + + + + def save(self, *args, **kwargs): + super(MessageSupport,self).save(*args, **kwargs) + + +class TicketPermission(models.Model): + role=models.CharField(max_length=200,null=True) + roles=models.ManyToManyField(Group,related_name='to_role') + + def save(self, *args, **kwargs): + super(TicketPermission,self).save(*args, **kwargs) + + +class TicketClosePermission(models.Model): + active = models.BooleanField(default=False) + day = models.SmallIntegerField(default=1) + + def save(self, *args, **kwargs): + super(TicketClosePermission, self).save(*args, **kwargs) diff --git a/ticket/operator_views.py b/ticket/operator_views.py new file mode 100644 index 0000000..e993040 --- /dev/null +++ b/ticket/operator_views.py @@ -0,0 +1,117 @@ +from rest_framework import viewsets +from oauth2_provider.contrib.rest_framework import ( + TokenHasReadWriteScope, +) +from .models import ( + Ticket, + TicketContent, + Answer, + Question, + SupportUnit, + Group, + SystemUserProfile +) +from .serializers import ( + TicketSerializer, + TicketContentSerializer, + TicketAnswerSerializer, + TicketQuestionSerializer, + SupportUnitSerializer +) +from rest_framework.response import Response +from .helper import upload_listed_image +from rest_framework import status +from datetime import datetime + + +class OperatorTicketViewSet(viewsets.ModelViewSet): + queryset = Ticket.objects.all() + serializer_class = TicketSerializer + permission_classes = [TokenHasReadWriteScope] + + def ticket_by_flag(self, request, state): + ticket_list = [] + roles = SystemUserProfile.objects.get(user=request.user).role.all() + if state is not None: + ticket = self.queryset.filter(state=state) + else: + ticket = self.queryset.all() + for item in ticket: + for role in roles: + if item.support_unit.unit == role: + ticket_list.append(item) + return ticket_list + + def list(self, request, *args, **kwargs): + # get user object + user = SystemUserProfile.objects.get(user=request.user) + + # different style of ticket information + if 'pending' in request.GET: + ticket_list = self.ticket_by_flag(request=request, state='pending') + serializer = self.serializer_class(ticket_list, many=True) + elif 'responded' in request.GET: + ticket = self.queryset.filter(operator=user, state='responded') + serializer = self.serializer_class(ticket, many=True) + elif 'closed' in request.GET: + ticket = self.queryset.filter(operator=user, state='closed') + serializer = self.serializer_class(ticket, many=True) + elif 'all' in request.GET: + ticket_list = self.ticket_by_flag(request=request, state=None) + serializer = self.serializer_class(ticket_list, many=True) + + return Response(serializer.data, status=status.HTTP_200_OK) + + def retrieve(self, request, *args, **kwargs): + ticket = self.queryset.get(key=request.data['key']) + serializer = self.serializer_class(ticket) + return Response(serializer.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + ticket = self.queryset.get(key=request.data['ticket_key']) # contains ticket object + request.data.pop('ticket_key') + + # get question object + # question = Question.objects.get(key=request.data['question_key']) + # request.data.pop('question_key') + question = ticket.question.all().last() + + # create list of images + req = upload_listed_image(req=request, field='image') + + # create content object information + content_serializer = TicketContentSerializer(data=req.data) + if content_serializer.is_valid(): + content_obj = content_serializer.create(validated_data=req.data) + + # create responder object information + answer = Answer( + responder=SystemUserProfile.objects.get(user=request.user), + content=content_obj, + question=question + ) + answer.save() + + # set respond for ticket questioner + ticket.operator = SystemUserProfile.objects.get(user=request.user) + ticket.state = 'responded' + ticket.save() + ticket.respond.add(answer) + + serializer = self.serializer_class(ticket) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + def update(self, request, *args, **kwargs): + ticket = self.queryset.get(key=request.data['ticket_key']) # contains ticket object + request.data.pop('ticket_key') + + # send ticket object to serializer for update + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + ticket_updated = serializer.update(validated_data=request.data, instance=ticket) + serializer = self.serializer_class(ticket_updated) + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors) + + def destroy(self, request, *args, **kwargs): + pass diff --git a/ticket/serializers.py b/ticket/serializers.py new file mode 100644 index 0000000..894d0cc --- /dev/null +++ b/ticket/serializers.py @@ -0,0 +1,163 @@ +from rest_framework import serializers + +from authentication.models import SystemUserProfile +from .models import ( + Ticket, + TicketContent, + Question, + Answer, + SupportUnit, TicketSupport, MessageSupport, TicketPermission, TicketClosePermission +) +from authentication.serializer.serializer import ( + SystemUserProfileSerializer, + GroupSerializer, SystemUserProfileBaseInfoForTicketSerializer +) + + +class TicketContentSerializer(serializers.ModelSerializer): + class Meta: + model = TicketContent + exclude = ( + 'id', + 'modify_date', + 'created_by', + 'modified_by', + 'trash', + ) + + +class TicketQuestionSerializer(serializers.ModelSerializer): + content = TicketContentSerializer(required=False) + + class Meta: + model = Question + fields = ( + 'key', + 'content' + ) + + +class TicketAnswerSerializer(serializers.ModelSerializer): + content = TicketContentSerializer(required=False) + + # question = TicketQuestionSerializer(required=False) + + class Meta: + model = Answer + fields = ( + 'key', + 'content', + # 'question' + ) + + +class SupportUnitSerializer(serializers.ModelSerializer): + unit = GroupSerializer(required=False) + + class Meta: + model = SupportUnit + fields = ( + 'unit', + ) + + +class TicketSerializer(serializers.ModelSerializer): + customer = SystemUserProfileSerializer(required=False) + operator = SystemUserProfileSerializer(required=False) + support_unit = SupportUnitSerializer(required=False) + # question = TicketQuestionSerializer(required=False, many=True) + # respond = TicketAnswerSerializer(required=False, many=True) + title = serializers.SerializerMethodField('get_title') + data = serializers.SerializerMethodField('get_responds') + + class Meta: + model = Ticket + exclude = ( + 'id', + 'created_by', + 'modified_by', + 'trash', + 'question', + 'respond', + ) + + def get_title(self, instance): + title = instance.question.all() + title = title[0].content.title + return title + + def get_responds(self, instance): + data = [] + for i in instance.question.all(): + question = TicketQuestionSerializer(i).data + question['type'] = 'customer' + data.append(question) + for j in instance.respond.filter(question=i): + answer = TicketAnswerSerializer(j).data + answer['type'] = 'operator' + data.append(answer) + return data + + def update(self, instance, validated_data): + instance.state = validated_data.get('state', instance.state) + instance.save() + return instance + + +class SystemUserProfileForTicketPermissionSerializer(serializers.ModelSerializer): + class Meta: + model = SystemUserProfile + fields=['key','fullname','mobile'] + + +class TicketClosePermissionSerializer(serializers.ModelSerializer): + class Meta: + model = TicketClosePermission + fields = '__all__' + + +class TicketSupportSerializer(serializers.ModelSerializer): + user = SystemUserProfileForTicketPermissionSerializer(read_only=True) + to_user = SystemUserProfileForTicketPermissionSerializer(read_only=True,many=True) + referred_by = SystemUserProfileForTicketPermissionSerializer(read_only=True) + referred_to = SystemUserProfileForTicketPermissionSerializer(read_only=True,many=True) + to_role = GroupSerializer(read_only=True,many=True) + + class Meta: + model = TicketSupport + fields = '__all__' + + +class MessageSupportSerializer(serializers.ModelSerializer): + created_by = SystemUserProfileForTicketPermissionSerializer(read_only=True) + parent = SystemUserProfileForTicketPermissionSerializer(read_only=True) + read_by = SystemUserProfileForTicketPermissionSerializer(read_only=True,many=True) + ticket= TicketSupportSerializer(read_only=True) + + class Meta: + model = MessageSupport + fields = '__all__' + + +class MessageSupportWithoutReadBySerializer(serializers.ModelSerializer): + created_by = SystemUserProfileForTicketPermissionSerializer(read_only=True) + parent = SystemUserProfileForTicketPermissionSerializer(read_only=True) + # read_by = SystemUserProfileForTicketPermissionSerializer(read_only=True,many=True) + + class Meta: + model = MessageSupport + exclude = ('read_by',) + depth=1 + +class TicketPermissionSerializer(serializers.ModelSerializer): + roles=serializers.SerializerMethodField() + + class Meta: + model = TicketPermission + fields = ['id','role','roles'] + + def get_roles(self,obj): + permissions = TicketPermission.objects.filter(role=obj.role).prefetch_related('roles') + roles = [role.name for permission in permissions for role in permission.roles.all()] + return roles + diff --git a/ticket/tests.py b/ticket/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/ticket/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/ticket/urls.py b/ticket/urls.py new file mode 100644 index 0000000..a36aad4 --- /dev/null +++ b/ticket/urls.py @@ -0,0 +1,22 @@ +from django.urls import include, path +from rest_framework.routers import DefaultRouter +from . import customer_views, operator_views,views +from .views import get_num_message, closed_unread_ticket, get_unread_ticket_for_dashboard + +router = DefaultRouter() +router.register('create_ticket', customer_views.CustomerTicketViewSet, basename='create_ticket') +router.register('respond', operator_views.OperatorTicketViewSet, basename='respond') +router.register(r'ticket', views.TicketSupportViewSet, basename='ticket') +router.register(r'message', views.MessageSupportViewSet, basename='message') +router.register(r'message-for-role', views.MessageForRoleViewSet, basename='message_for_role') +router.register(r'ticket-permission', views.TicketPermissionViewSet, basename='ticket-permission') +router.register(r'get-user-from-role', views.GetUserFromRoleViewSet, basename='get_user_from_role') +router.register(r'ticket-close-permission', views.TicketClosePermissionViewSet, basename='ticket-close-permission') + + +urlpatterns = [ + path('', include(router.urls)), + path('get_num_message/', get_num_message), + path('closed_unread_ticket/', closed_unread_ticket), + path('get_unread_ticket_for_dashboard/', get_unread_ticket_for_dashboard), +] diff --git a/ticket/views.py b/ticket/views.py new file mode 100644 index 0000000..b6f740d --- /dev/null +++ b/ticket/views.py @@ -0,0 +1,512 @@ +import datetime +import random +import string + +import requests +from django.db.models import Q, Count +from django.http import HttpResponse +from django.views.decorators.csrf import csrf_exempt +from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope +from rest_framework import status +from rest_framework import viewsets +from rest_framework.decorators import api_view, permission_classes +from rest_framework.pagination import PageNumberPagination +from rest_framework.permissions import AllowAny +from rest_framework.response import Response + +from authentication.models import SystemUserProfile, Group +from authentication.sms_management import ticket_answered +from helper_eata import token, chat_id +from panel.filterset import TicketsFilterSet +from panel.helper import build_query +from ticket.models import TicketSupport, MessageSupport, TicketPermission, TicketClosePermission +from ticket.serializers import TicketSupportSerializer, MessageSupportSerializer, TicketPermissionSerializer, \ + SystemUserProfileForTicketPermissionSerializer, MessageSupportWithoutReadBySerializer, \ + TicketClosePermissionSerializer +from .bucket import upload_to_liara +from .helper import send_image_to_server + + +class CustomPagination(PageNumberPagination): + page_size = 10 + + +def update_unread_ticket(tickets, user): + user_roles = list(user.role.all()) + + unread_ticket_ids = MessageSupport.objects.filter( + Q(ticket__user=user) | + Q(ticket__to_user=user) | + Q(ticket__to_role__in=user_roles) | + Q(ticket__referred_by=user) | + Q(ticket__referred_to=user.id), + ~Q(created_by=user), + ~Q(read_by=user.id), + ticket__in=tickets + ).values_list('ticket_id', flat=True).distinct() + + unread_set = set(unread_ticket_ids) + + for ticket in tickets: + ticket.unread_message = ticket.id in unread_set + + TicketSupport.objects.bulk_update(tickets, ['unread_message']) + + +class TicketSupportViewSet(viewsets.ModelViewSet): + queryset = TicketSupport.objects.filter(trash=False).select_related( + 'user', 'referred_by' + ).prefetch_related( + 'to_role', 'referred_to', 'to_user').order_by('-unread_message', '-create_date') + serializer_class = TicketSupportSerializer + permission_classes = [TokenHasReadWriteScope] + pagination_class = CustomPagination + filterset_class = TicketsFilterSet + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + role_list = list(user.role.values_list('id', flat=True).distinct()) + role_check = any(role in ['AdminX', 'SuperAdmin'] for role in user.role.values_list('name', flat=True)) + type_param = request.GET.get('type', None) + status = request.GET.get('status', 'open') + base_filter = Q(user=user) | Q(to_user=user.id) | Q(to_role__in=role_list) | Q(referred_to=user.id) | Q( + referred_by=user) + + if role_check: + if type_param: + query = self.queryset.filter(type_ticket=type_param, + status=status).distinct() if type_param else self.queryset + else: + query = self.queryset.filter(status=status).distinct() + + else: + if type_param: + query = self.queryset.filter(base_filter, type_ticket=type_param, status=status).distinct() + else: + query = self.queryset.filter(base_filter, status=status) + + value = request.GET.get('value') + search = request.GET.get('search') + if value and search == 'filter': + if value != 'undefined' and value.strip(): + query = query.filter( + build_query(self.filterset_class, value) + ) + update_unread_ticket(query, user) + query = query.order_by('-unread_message', '-create_date') + page_size = request.query_params.get('page_size', None) + if page_size: + self.pagination_class.page_size = int(page_size) + page = self.paginate_queryset(query) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + ser_data = self.serializer_class(query, many=True) + return Response(ser_data.data, status=status.HTTP_200_OK) + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + type_ticket = request.data.get('type_ticket') + read_only = request.data.get('read_only') + to_user_data = request.data.get('to_user') + if request.data.get('image') is not None: + image = send_image_to_server(request.data['image']) + else: + image = None + if request.FILES.get('file'): + file_obj = request.FILES.get('file') + file_url = upload_to_liara(file_obj, file_obj.name) + else: + file_url = None + if to_user_data: + to_users = SystemUserProfile.objects.filter(key__in=request.data['to_user']) + ticket = TicketSupport( + user=user, + title=request.data['title'], + status='open', + read_only=read_only, + type_ticket=type_ticket, + role=request.data.get('role'), + ) + ticket.save() + ticket.to_user.set(to_users) + + else: + to_role = Group.objects.filter(name__in=request.data.get('to_role')) + if ((SystemUserProfile.objects.filter(trash=False, role__in=to_role).count() < 2)): + return Response({'result': 'برای نقش انتخابی، لطفاً تیکت شخصی ثبت کنید!'}, + status=status.HTTP_403_FORBIDDEN) + ticket = TicketSupport( + user=user, + title=request.data['title'], + status='open', + read_only=read_only, + type_ticket=type_ticket, + role=request.data.get('role'), + ) + ticket.save() + ticket.to_role.set(to_role) + msg = MessageSupport( + ticket=ticket, + message=request.data['message'], + created_by=user, + sender=request.data.get('sender'), + picture=image, + file=file_url) + msg.save() + return Response({'msg': 'با موفقیت انجام شد.'}, status=status.HTTP_201_CREATED) + + def update(self, request, *args, **kwargs): + ticket_id = request.data.get('ticket') + ticket = self.queryset.filter(ticket_id=int(ticket_id)).first() + + if ticket: + if 'referred_to' in request.data: + referred_to = SystemUserProfile.objects.filter(key__in=request.data['referred_to']) + ticket.referred_by = SystemUserProfile.objects.get(user=request.user) + ticket.status = 'open' + ticket.is_referred = True + ticket.save() + referrer_name = [] + for user in referred_to: + if not ticket.referred_to.filter(id=user.id).exists(): + ticket.referred_to.add(user) + referrer_name.append(user.fullname) + if len(referrer_name) > 1: + names = ' و '.join(referrer_name) + else: + names = referrer_name[0] if referrer_name else '' + if referrer_name: + MessageSupport.objects.create( + ticket=ticket, + message=f"تیکت شماره {ticket.ticket_id} به ({names}) ارجاع داده شد.", + created_by=SystemUserProfile.objects.get(user=request.user), + sender='Admin' + ) + return Response({'message': 'تیکت با موفقیت ارجاع داده شد.'}, status=200) + + else: + ticket.status = 'closed' + ticket.save() + return Response({'result': 'تیکت با موفقیت پایان یافت.'}, status=status.HTTP_200_OK) + return Response({'result': 'تیکت وجود ندارد!'}, status=status.HTTP_400_BAD_REQUEST) + + +class MessageSupportViewSet(viewsets.ModelViewSet): + queryset = MessageSupport.objects.all().select_related('ticket').order_by('created_at') + serializer_class = MessageSupportSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + user = SystemUserProfile.objects.get(user=request.user) + ticket_id = request.GET.get('ticket') + role_list = list(user.role.values_list('id', flat=True).distinct()) + role_check = any( + role in ['AdminX', 'SuperAdmin', 'ProvinceOperator'] for role in user.role.values_list('name', flat=True)) + query = self.queryset.filter(ticket__ticket_id=int(ticket_id)).order_by('-created_at') + if query.filter(Q(ticket__user=user) | Q(ticket__to_user=user.id) | Q(ticket__to_role__in=role_list) | Q( + ticket__referred_by=user) | Q(ticket__referred_to=user.id)).exists(): + unseen_messages = query.filter(~Q(created_by=user), last_seen__isnull=True) + unseen_messages.update(last_seen=datetime.datetime.now()) + + for message in query.filter(~Q(created_by=user)): + if not message.read_by.filter(id=user.id).exists(): + message.read_by.add(user) + + query = query.defer('message') + if role_check: + srz_data = self.serializer_class(query, many=True).data + else: + srz_data = MessageSupportWithoutReadBySerializer(query, many=True).data + return Response(srz_data) + + def create(self, request, *args, **kwargs): + user = SystemUserProfile.objects.select_related('user').filter(user=request.user).first() + ticket_id = request.data.get('ticket') + ticket = TicketSupport.objects.get(ticket_id=int(ticket_id)) + + if ticket.status == 'closed': + return Response({'result': 'این تیکت بسته شده است!'}, status=status.HTTP_403_FORBIDDEN) + + if ticket.read_only == False and ticket.type_ticket == 'public' and ticket.parent is None \ + and ticket.user != user: + new_ticket = TicketSupport( + user=user, + title=ticket.title, + status='open', + read_only=False, + type_ticket='single', + parent=ticket, + last_message=request.data.get('sender'), + role=request.data.get('role'), + ) + new_ticket.save() + new_ticket.to_user.add(ticket.user) + + msg = MessageSupport( + ticket=new_ticket, + message=request.data.get('message'), + created_by=user, + sender=request.data.get('sender') + ) + else: + msg = MessageSupport( + ticket=ticket, + message=request.data.get('message'), + created_by=user, + sender=request.data.get('sender') + ) + ticket.last_message = request.data.get('sender') + ticket.save() + if request.data['send_message'] == True: + ticket_answered(ticket.user.mobile) + msg.send_message = True + if request.data.get('image') is not None: + # ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15)) + # upload_object_resize(image_data=request.data['image'], bucket_name="profileimagedefault", + # object_name="{0}.jpg".format(str(ran))) + msg.picture = send_image_to_server(request.data['image']) + if request.FILES.get('file'): + file_obj = request.FILES.get('file') + file_url = upload_to_liara(file_obj, file_obj.name) + msg.file = file_url + msg.save() + ser_data = self.serializer_class(msg) + return Response(ser_data.data, status=status.HTTP_201_CREATED) + + def update(self, request, *args, **kwargs): + msg_id = request.data.get('message_id') + instance = self.get_queryset().get(id=msg_id) + request.data.pop('message_id') + serializer = self.get_serializer(instance, data=request.data, partial=True) + if serializer.is_valid(): + serializer.save() + return Response({'result': "با موفقیت انجام شد."}, status=status.HTTP_200_OK) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class MessageForRoleViewSet(viewsets.ModelViewSet): + queryset = MessageSupport.objects.all() + serializer_class = MessageSupportSerializer + permission_classes = [TokenHasReadWriteScope] + + def create(self, request, *args, **kwargs): + user_sender = SystemUserProfile.objects.get(user=request.user) + if 'role' in request.data.keys(): + to_user = SystemUserProfile.objects.filter(trash=False, role__name__in=request.data['role']) + relations = [ + TicketSupport( + user=user_sender, + title=request.data['title'], + status='open', + to_user=user + ) + for user in to_user + ] + TicketSupport.objects.bulk_create(relations) + + return Response({'msg': 'با موفقیت ارسال شد'}, status=status.HTTP_201_CREATED) + + +class TicketPermissionViewSet(viewsets.ModelViewSet): + queryset = TicketPermission.objects.all() + serializer_class = TicketPermissionSerializer + permission_classes = [AllowAny] + + def create(self, request, *args, **kwargs): + role = request.data['role'] + group = request.data['roles'] + roles = Group.objects.filter(name__in=group) + ticket = TicketPermission.objects.get(role=role) + ticket.roles.set(roles) + ser_data = self.serializer_class(ticket) + return Response(ser_data.data, status=status.HTTP_201_CREATED) + + def list(self, request, *args, **kwargs): + if 'role' in request.GET: + role = request.GET['role'] + query = self.queryset.get(role=role) + ser_data = self.serializer_class(query).data + return Response(ser_data, status=status.HTTP_200_OK) + else: + query = self.queryset + ser_data = self.serializer_class(query, many=True).data + return Response(ser_data, status=status.HTTP_200_OK) + + +class GetUserFromRoleViewSet(viewsets.ModelViewSet): + queryset = SystemUserProfile.objects.all() + serializer_class = SystemUserProfileForTicketPermissionSerializer + permission_classes = [TokenHasReadWriteScope] + + def list(self, request, *args, **kwargs): + role = request.GET['role'] + user = SystemUserProfile.objects.filter(~Q(user=request.user), trash=False, role__name=role, ) + ser_data = self.serializer_class(user, many=True) + return Response(ser_data.data, status=status.HTTP_200_OK) + + +class TicketClosePermissionViewSet(viewsets.ModelViewSet): + queryset = TicketClosePermission.objects.all().first() + serializer_class = TicketClosePermissionSerializer + permission_classes = [TokenHasReadWriteScope] + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def get_num_message(request): + user = SystemUserProfile.objects.get(user=request.user) + message = MessageSupport.objects.filter( + Q(ticket__user=user) | Q(ticket__to_user=user) | Q(ticket__to_role__in=user.role.all()) | Q( + ticket__referred_by=user) | Q(ticket__referred_to=user.id) + , ~Q(created_by=user)).exclude(read_by=user.id).values('ticket').annotate( + ticket_count=Count('ticket', distinct=True) + ).distinct() + state = True if message.count() > 0 else False + return Response({ + 'state': state, + 'num': message.count(), + }) + + +# @api_view(["PUT"]) +# @csrf_exempt +# @permission_classes([AllowAny]) +# def FileUploadView(request): +# # queryset = TicketSupport.objects.all() +# # permission_classes = [AllowAny] +# # serializer_class = TicketSupportSerializer +# # +# # def create(self, request, *args, **kwargs): +# file_obj = request.FILES.get('file') +# if not file_obj: +# return Response({"error": "فایلی ارسال نشده است"}, status=status.HTTP_400_BAD_REQUEST) +# +# try: +# file_url = upload_to_liara(file_obj, file_obj.name) +# return Response({"file_url": file_url}, status=status.HTTP_201_CREATED) +# except Exception as e: +# return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +def bot_eitaa_for_bar(): + url = f'https://eitaayar.ir/api/{token}/sendMessage' + data = { + "cookie": "ASP.NET_SessionId=w1jadrzcqgznxugnjee1xrkj; .ASPXAUTH=4CC27FD1BAB0CA729584056577AA51209F731F22CDF4B95F9FEE33AD12F1DFFF960C77B0A237D5733E336195A2CA6DB1C1F2CA2EDCD079EC0B3C3092A2BF1BA8811D7C44263B1E5EB84430C0906024A55D51AF1FE5852F406C358A051715BB9270475D58228F44380D12FA075A4DF0E029220F0C809AEDDDF58FFE9568064DD9D397B038D19DC1757232A92EA63571EA7B47E1706F677528E539301417093B523B6C2BFD340AA33DC32D50E7853E3D14D93924313B9B1EB36320C90A2303BB852841EE0DE1D844B281B4CD6D7E95D593CF2E2F0C3816687C529B7702863F75CD6549F49D346C7C88F22F033C75C357BE9E91AD170A2502731BC03AE2DF09F594417646FE332B8BAB70673E584A23AD45CADC285C554B66FD29DD989F85962891A11C06FC84832DD8FB03933CF26E190601D493B0430A742544B8BC0A8639E4E5788432AA401FAFFD3A1C6793FB24909A992405D07E53B81DF546AB07ED90314735518C37E9291F10E2B723B795B8BB838C2810CE103A4EF893211BFDBB605ADBE0E3B9B35438A5FE3506937D020EC2EF061B6D1E3AAFB3A9A138CC219A4A556CEB6A2E44C18D53C85666A5C0C9663F8314EFD97FFF5C1844C0FEB4362A781E2138785D832EEFD1AEDAD1271C2513A6F4EC1174EF107AC2E9FEFF8A9A111CC6D6189CCC66E93224EE4D30813AAD9DCDE1CFC530B08CB67827C351DCE4C2AFD4E3FB12E85EA0CD6E2D3D4CC8753D74E863A37C5675D82C9977518A942786EF055F0DBFC809B9F9B6A45B269526FC9D8B5E888B1C6E40C6ACE8EB37ED7E1F9F266A018936F3228A3C8E20C1BD869CC657D1CE19FFEA8C8B979DE5077E17AE5FA1F085B3A424C91DA19D3743871A2A9440937B2C4E076EC99AE4DEE1A7AF601448F2F763FC2DF85ED8902287DDD0ED5B9E649A4490900B4BF64F639CDD761326AC08D1B540CBD853B42F556FFB8FD5BC33A54E68125CD20278B191A1896BF955FFA1B4CC5308E12A84003B64B0EE532079563DC334FB9AEB9B742803EBE35C82CA14E5D0D84CA736AB9A2E07EECFF98657561C029ECE3C1249DA843B4236E41BD745E54B1A86ED2CE4EA0FDDBB3B4B2B97A87548B23298283F6D09094F7BC709FAABE59CC84138F83B083EAB15BE0B032481; leggedOut=-" + } + r = requests.post(url='https://pay.rasadyar.net/transporting-chickens/', data=data) + + data = { + 'chat_id': chat_id, + 'text': r.status_code, + } + response = requests.post(url, data=data, verify=False) + + return HttpResponse(response.status_code) + + +# def close_ticket_cron_job(): +# ticket=TicketSupport.objects.filter(Q(unread_message=False,read_only=True)|Q(unread_message=True,read_only=False),trash=False,status='open') +# for t in ticket: +# two_day_ago =datetime.datetime.now().date() - datetime.timedelta(days=2) +# if (t.create_date.date() - datetime.datetime.now().date()).days > 2: +# t.status='closed' +# t.to_role=None +# t.title=None +# t.trash=False +# t.create_date=datetime.datetime.now() +# t.save() +# else: +# continue + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([AllowAny]) +def closed_unread_ticket(request): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + two_day_ago = datetime.datetime.now() - datetime.timedelta(days=2) + ten_day_ago = datetime.datetime.now() - datetime.timedelta(days=10) + tickets = TicketSupport.objects.filter( + trash=False, + status='open', + type_ticket='single' + ) + text_two_day_ago_message = 'به دلیل عدم دریافت پیام جدید در مدت 48 ساعت، این تیکت توسط سامانه به صورت خودکار بسته شد.' + text_ten_day_ago_message = 'به دلیل خوانده نشدن پیام در مدت 10 روز، این تیکت توسط سامانه به صورت خودکار بسته شد.' + for ticket in tickets: + message = MessageSupport.objects.filter(ticket=ticket).last() + if not message: + continue + if message.read_by.exists() and message.last_seen.date() <= two_day_ago.date(): + msg = MessageSupport( + ticket=ticket, + message=text_two_day_ago_message, + created_by=user) + msg.save() + ticket.status = 'closed' + ticket.save() + + if not message.read_by.exists() and message.created_at.date() <= ten_day_ago.date(): + msg = MessageSupport( + ticket=ticket, + message=text_ten_day_ago_message, + created_by=user) + msg.save() + ticket.status = 'closed' + ticket.save() + + return HttpResponse('ok') + + +def closed_unread_ticket_cron(): + user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first() + two_day_ago = datetime.datetime.now() - datetime.timedelta(days=2) + ten_day_ago = datetime.datetime.now() - datetime.timedelta(days=10) + tickets = TicketSupport.objects.filter( + trash=False, + status='open', + type_ticket='single' + ) + text_two_day_ago_message = 'به دلیل عدم دریافت پیام جدید در مدت 48 ساعت، این تیکت توسط سامانه به صورت خودکار بسته شد.' + # text_ten_day_ago_message = 'به دلیل خوانده نشدن پیام در مدت 10 روز، این تیکت توسط سامانه به صورت خودکار بسته شد.' + for ticket in tickets: + message = MessageSupport.objects.filter(ticket=ticket).last() + if not message: + continue + if message.read_by.exists() and message.last_seen.date() <= two_day_ago.date(): + msg = MessageSupport( + ticket=ticket, + message=text_two_day_ago_message, + created_by=user) + msg.save() + ticket.status = 'closed' + ticket.save() + + # if not message.read_by.exists() and message.created_at.date() <= ten_day_ago.date(): + # msg = MessageSupport( + # ticket=ticket, + # message=text_ten_day_ago_message, + # created_by=user) + # msg.save() + # ticket.status = 'closed' + # ticket.save() + + +@api_view(["GET"]) +@csrf_exempt +@permission_classes([TokenHasReadWriteScope]) +def get_unread_ticket_for_dashboard(request): + user = SystemUserProfile.objects.get(user=request.user) + role_list = list(user.role.values_list('id', flat=True).distinct()) + base_filter = Q(user=user) | Q(to_user=user.id) | Q(to_role__in=role_list) | Q(referred_to=user.id) | Q( + referred_by=user) + query = TicketSupport.objects.filter(base_filter, status='open',trash=False).select_related( + 'user', 'referred_by' + ).prefetch_related( + 'to_role', 'referred_to', 'to_user').order_by('-create_date') + update_unread_ticket(query, user) + query1 = query.filter(unread_message=True) + ser_data = TicketSupportSerializer(query1, many=True) + return Response(ser_data.data, status=status.HTTP_200_OK) \ No newline at end of file